From a897b75ef5b3b11cf586fa126610f671acbe4f03 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 15 Aug 2025 13:24:29 +0330 Subject: [PATCH 1/3] fix profile edit UI --- include/ui/profile/dialog_edit_profile.ui | 188 +++++++++++----------- 1 file changed, 94 insertions(+), 94 deletions(-) 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 + From 0af30d53a292b250438f35dd881ce5ebf96b5932 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 15 Aug 2025 13:39:59 +0330 Subject: [PATCH 2/3] add option to allow beta updates --- include/global/DataStore.hpp | 1 + include/ui/setting/dialog_basic_settings.ui | 7 +++++++ src/global/Configs.cpp | 1 + src/ui/mainwindow.cpp | 1 + src/ui/setting/dialog_basic_settings.cpp | 2 ++ 5 files changed, 12 insertions(+) diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp index 339a203..19b863b 100644 --- a/include/global/DataStore.hpp +++ b/include/global/DataStore.hpp @@ -86,6 +86,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/setting/dialog_basic_settings.ui b/include/ui/setting/dialog_basic_settings.ui index 6c329e2..09904b7 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 7791e54..8578529 100644 --- a/src/global/Configs.cpp +++ b/src/global/Configs.cpp @@ -314,6 +314,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/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index c4ef275..373f647 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -2469,6 +2469,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/setting/dialog_basic_settings.cpp b/src/ui/setting/dialog_basic_settings.cpp index fd7f089..da36961 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) @@ -201,6 +202,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 From f6bf4eeed0c9ee12aa356ce0e4bb62d606efca76 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 15 Aug 2025 16:52:10 +0330 Subject: [PATCH 3/3] fix profile stop --- include/ui/mainwindow.h | 3 +-- src/sys/Process.cpp | 7 +++++-- src/ui/mainwindow.cpp | 3 --- src/ui/mainwindow_grpc.cpp | 25 +++++++++++++++---------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/ui/mainwindow.h b/include/ui/mainwindow.h index 18d6dde..47393b3 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); @@ -193,7 +193,6 @@ private: QMutex mu_starting; QMutex mu_stopping; QMutex mu_exit; - QSemaphore sem_stopped; int exit_reason = 0; // QMutex mu_download_assets; 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 373f647..9ba5d76 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -772,8 +772,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(); diff --git a/src/ui/mainwindow_grpc.cpp b/src/ui/mainwindow_grpc.cpp index e36b0f5..805944e 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(); + } }