diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp
index 5acdf16..bd9fb4d 100644
--- a/include/global/DataStore.hpp
+++ b/include/global/DataStore.hpp
@@ -87,6 +87,7 @@ namespace Configs {
int stats_tab = 0; // either connection or log
int speed_test_mode = TestConfig::FULL;
QString simple_dl_url = "http://cachefly.cachefly.net/1mb.test";
+ bool allow_beta_update = false;
// Subscription
QString user_agent = ""; // set at main.cpp
diff --git a/include/ui/mainwindow.h b/include/ui/mainwindow.h
index 977dfa4..dd4bf3a 100644
--- a/include/ui/mainwindow.h
+++ b/include/ui/mainwindow.h
@@ -66,7 +66,7 @@ public:
void profile_start(int _id = -1);
- void profile_stop(bool crash = false, bool sem = false, bool manual = false);
+ void profile_stop(bool crash = false, bool block = false, bool manual = false);
void set_spmode_system_proxy(bool enable, bool save = true);
@@ -189,7 +189,6 @@ private:
QMutex mu_starting;
QMutex mu_stopping;
QMutex mu_exit;
- QSemaphore sem_stopped;
int exit_reason = 0;
//
QMutex mu_download_update;
diff --git a/include/ui/profile/dialog_edit_profile.ui b/include/ui/profile/dialog_edit_profile.ui
index aa7da63..8a8df6f 100644
--- a/include/ui/profile/dialog_edit_profile.ui
+++ b/include/ui/profile/dialog_edit_profile.ui
@@ -7,7 +7,7 @@
0
0
1000
- 802
+ 885
@@ -121,99 +121,6 @@
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Custom Outbound Settings
-
-
-
-
-
-
- Edit
-
-
-
-
-
-
- -
-
-
- Custom Config Settings
-
-
-
-
-
-
- Edit
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- Apply settings to this group
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Qt::Orientation::Horizontal
-
-
- QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok
-
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 400
- 0
-
-
-
-
-
-
-
- QLayout::SizeConstraint::SetDefaultConstraint
-
-
@@ -419,6 +326,99 @@
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Custom Outbound Settings
+
+
+
-
+
+
+ Edit
+
+
+
+
+
+
+ -
+
+
+ Custom Config Settings
+
+
+
-
+
+
+ Edit
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+ Apply settings to this group
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Orientation::Horizontal
+
+
+ QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok
+
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 400
+ 0
+
+
+
+
+
+
+
+ QLayout::SizeConstraint::SetDefaultConstraint
+
-
diff --git a/include/ui/setting/dialog_basic_settings.ui b/include/ui/setting/dialog_basic_settings.ui
index d5c4687..bb06225 100644
--- a/include/ui/setting/dialog_basic_settings.ui
+++ b/include/ui/setting/dialog_basic_settings.ui
@@ -208,6 +208,13 @@
+ -
+
+
+ Allow updating to beta versions
+
+
+
diff --git a/src/global/Configs.cpp b/src/global/Configs.cpp
index 1231839..44badbb 100644
--- a/src/global/Configs.cpp
+++ b/src/global/Configs.cpp
@@ -310,6 +310,7 @@ namespace Configs {
_add(new configItem("enable_tun_routing", &enable_tun_routing, itemType::boolean));
_add(new configItem("speed_test_mode", &speed_test_mode, itemType::integer));
_add(new configItem("use_mozilla_certs", &use_mozilla_certs, itemType::boolean));
+ _add(new configItem("allow_beta_update", &allow_beta_update, itemType::boolean));
}
void DataStore::UpdateStartedId(int id) {
diff --git a/src/sys/Process.cpp b/src/sys/Process.cpp
index 8bf749c..2c3238a 100644
--- a/src/sys/Process.cpp
+++ b/src/sys/Process.cpp
@@ -5,6 +5,8 @@
#include
#include
+#include "include/ui/mainwindow.h"
+
namespace Configs_sys {
CoreProcess::~CoreProcess() {
}
@@ -59,7 +61,8 @@ namespace Configs_sys {
if (failed_to_start) return; // no retry
if (restarting) return;
- MW_dialog_message("ExternalProcess", "CoreCrashed");
+ MW_show_log("[Fatal] " + QObject::tr("Core exited, cleaning up..."));
+ GetMainWindow()->profile_stop(true, true);
// Retry rate limit
if (coreRestartTimer.isValid()) {
@@ -74,7 +77,7 @@ namespace Configs_sys {
// Restart
start_profile_when_core_is_up = Configs::dataStore->started_id;
- MW_show_log("[Fatal] " + QObject::tr("Core exited, restarting."));
+ MW_show_log("[Warn] " + QObject::tr("Restarting the core ..."));
setTimeout([=,this] { Restart(); }, this, 200);
}
});
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp
index 34b4bee..e4a087c 100644
--- a/src/ui/mainwindow.cpp
+++ b/src/ui/mainwindow.cpp
@@ -765,8 +765,6 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info)
} else if (sender == "ExternalProcess") {
if (info == "Crashed") {
profile_stop();
- } else if (info == "CoreCrashed") {
- profile_stop(true);
} else if (info.startsWith("CoreStarted")) {
Configs::IsAdmin(true);
if (Configs::dataStore->remember_enable || Configs::dataStore->flag_restart_tun_on) {
@@ -879,7 +877,6 @@ void MainWindow::prepare_exit()
//
Configs::dataStore->save_control_no_save = true; // don't change datastore after this line
profile_stop(false, true);
- sem_stopped.acquire();
QMutex coreKillMu;
coreKillMu.lock();
@@ -2413,6 +2410,7 @@ void MainWindow::CheckUpdate() {
QJsonArray array = QString2QJsonArray(resp.data);
for (const QJsonValue value : array) {
QJsonObject release = value.toObject();
+ if (release["prerelease"].toBool() && !Configs::dataStore->allow_beta_update) continue;
for (const QJsonValue asset : release["assets"].toArray()) {
if (asset["name"].toString().contains(search) && asset["name"].toString().section('.', -1) == QString("zip")) {
note_pre_release = release["prerelease"].toBool() ? " (Pre-release)" : "";
diff --git a/src/ui/mainwindow_grpc.cpp b/src/ui/mainwindow_grpc.cpp
index b8a7ad7..687f059 100644
--- a/src/ui/mainwindow_grpc.cpp
+++ b/src/ui/mainwindow_grpc.cpp
@@ -524,8 +524,7 @@ void MainWindow::profile_start(int _id) {
runOnNewThread([=, this] {
// stop current running
if (running != nullptr) {
- runOnUiThread([=,this] { profile_stop(false, true, true); });
- sem_stopped.acquire();
+ profile_stop(false, true, true);
}
// do start
MW_show_log(">>>>>>>> " + tr("Starting profile %1").arg(ent->bean->DisplayTypeAndName()));
@@ -564,12 +563,11 @@ void MainWindow::set_spmode_system_proxy(bool enable, bool save) {
refresh_status();
}
-void MainWindow::profile_stop(bool crash, bool sem, bool manual) {
- auto id = Configs::dataStore->started_id;
- if (id < 0) {
- if (sem) sem_stopped.release();
+void MainWindow::profile_stop(bool crash, bool block, bool manual) {
+ if (running == nullptr) {
return;
}
+ auto id = running->id;
auto profile_stop_stage2 = [=,this] {
if (!crash) {
@@ -586,9 +584,10 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) {
};
if (!mu_stopping.tryLock()) {
- if (sem) sem_stopped.release();
return;
}
+ QMutex blocker;
+ if (block) blocker.lock();
// timeout message
auto restartMsgbox = new QMessageBox(QMessageBox::Question, software_name, tr("If there is no response for a long time, it is recommended to restart the software."),
@@ -612,7 +611,7 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) {
restartMsgboxTimer->deleteLater();
restartMsgbox->deleteLater();
- runOnNewThread([=, this] {
+ runOnNewThread([=, this, &blocker] {
// do stop
MW_show_log(">>>>>>>> " + tr("Stopping profile %1").arg(running->bean->DisplayTypeAndName()));
if (!profile_stop_stage2()) {
@@ -623,13 +622,19 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) {
Configs::dataStore->need_keep_vpn_off = false;
running = nullptr;
- if (sem) sem_stopped.release();
+ if (block) blocker.unlock();
- runOnUiThread([=, this] {
+ runOnUiThread([=, this, &blocker] {
refresh_status();
refresh_proxy_list_impl_refresh_data(id, true);
mu_stopping.unlock();
});
});
+
+ if (block)
+ {
+ blocker.lock();
+ blocker.unlock();
+ }
}
diff --git a/src/ui/setting/dialog_basic_settings.cpp b/src/ui/setting/dialog_basic_settings.cpp
index 3682b56..76c2d6c 100644
--- a/src/ui/setting/dialog_basic_settings.cpp
+++ b/src/ui/setting/dialog_basic_settings.cpp
@@ -37,6 +37,7 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent)
D_LOAD_BOOL(disable_tray)
ui->speedtest_mode->setCurrentIndex(Configs::dataStore->speed_test_mode);
ui->simple_down_url->setText(Configs::dataStore->simple_dl_url);
+ ui->allow_beta->setChecked(Configs::dataStore->allow_beta_update);
connect(ui->custom_inbound_edit, &QPushButton::clicked, this, [=,this] {
C_EDIT_JSON_ALLOW_EMPTY(custom_inbound)
@@ -174,6 +175,7 @@ void DialogBasicSettings::accept() {
Configs::dataStore->proxy_scheme = ui->proxy_scheme->currentText().toLower();
Configs::dataStore->speed_test_mode = ui->speedtest_mode->currentIndex();
Configs::dataStore->simple_dl_url = ui->simple_down_url->text();
+ Configs::dataStore->allow_beta_update = ui->allow_beta->isChecked();
// Style