diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index 38b254c5c..ebb7ecb94 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -197,7 +197,8 @@ QByteArray Settings::serialize() const { } stream << qint32(_disableOpenGL ? 1 : 0) - << qint32(_groupCallNoiseSuppression ? 1 : 0); + << qint32(_groupCallNoiseSuppression ? 1 : 0) + << _workMode.current(); } return result; } @@ -275,6 +276,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { base::flat_map emojiVariants; qint32 disableOpenGL = _disableOpenGL ? 1 : 0; qint32 groupCallNoiseSuppression = _groupCallNoiseSuppression ? 1 : 0; + qint32 workMode = static_cast(_workMode.current()); stream >> themesAccentColors; if (!stream.atEnd()) { @@ -409,6 +411,9 @@ void Settings::addFromSerialized(const QByteArray &serialized) { if (!stream.atEnd()) { stream >> groupCallNoiseSuppression; } + if (!stream.atEnd()) { + stream >> workMode; + } if (stream.status() != QDataStream::Ok) { LOG(("App Error: " "Bad data for Core::Settings::constructFromSerialized()")); @@ -520,6 +525,12 @@ void Settings::addFromSerialized(const QByteArray &serialized) { || Ui::Integration::Instance().openglLastCheckFailed()); } _groupCallNoiseSuppression = (groupCallNoiseSuppression == 1); + const auto uncheckedWorkMode = static_cast(workMode); + switch (uncheckedWorkMode) { + case dbiwmWindowAndTray: + case dbiwmTrayOnly: + case dbiwmWindowOnly: _workMode = uncheckedWorkMode; break; + } } QString Settings::getSoundPath(const QString &key) const { @@ -779,6 +790,8 @@ void Settings::resetOnLastLogout() { _recentEmojiPreload.clear(); _recentEmoji.clear(); _emojiVariants.clear(); + + _workMode = dbiwmWindowAndTray; } bool Settings::ThirdColumnByDefault() { diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index d70c79709..d9d50f1d7 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -521,6 +521,18 @@ public: void setWindowPosition(const WindowPosition &position) { _windowPosition = position; } + void setWorkMode(DBIWorkMode value) { + _workMode = value; + } + [[nodiscard]] DBIWorkMode workMode() const { + return _workMode.current(); + } + [[nodiscard]] rpl::producer workModeValue() const { + return _workMode.value(); + } + [[nodiscard]] rpl::producer workModeChanges() const { + return _workMode.changes(); + } struct RecentEmoji { EmojiPtr emoji = nullptr; @@ -641,6 +653,7 @@ private: rpl::variable _systemDarkModeEnabled = false; WindowPosition _windowPosition; // per-window bool _disableOpenGL = false; + rpl::variable _workMode = dbiwmWindowAndTray; bool _tabbedReplacedWithInfo = false; // per-window rpl::event_stream _tabbedReplacedWithInfoValue; // per-window diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index cb8378730..058eb27b5 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -344,8 +344,6 @@ struct Data { MTP::ProxyData::Settings ProxySettings = MTP::ProxyData::Settings::System; bool UseProxyForCalls = false; base::Observable ConnectionTypeChanged; - - base::Variable WorkMode = { dbiwmWindowAndTray }; }; } // namespace internal @@ -375,6 +373,4 @@ DefineVar(Global, MTP::ProxyData::Settings, ProxySettings); DefineVar(Global, bool, UseProxyForCalls); DefineRefVar(Global, base::Observable, ConnectionTypeChanged); -DefineRefVar(Global, base::Variable, WorkMode); - } // namespace Global diff --git a/Telegram/SourceFiles/facades.h b/Telegram/SourceFiles/facades.h index 38b69dd04..0179974be 100644 --- a/Telegram/SourceFiles/facades.h +++ b/Telegram/SourceFiles/facades.h @@ -102,6 +102,4 @@ DeclareVar(MTP::ProxyData::Settings, ProxySettings); DeclareVar(bool, UseProxyForCalls); DeclareRefVar(base::Observable, ConnectionTypeChanged); -DeclareRefVar(base::Variable, WorkMode); - } // namespace Global diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 6c4341cdb..233e21f85 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -174,7 +174,8 @@ void MainWindow::createTrayIconMenu() { } void MainWindow::applyInitialWorkMode() { - Global::RefWorkMode().setForced(Global::WorkMode().value(), true); + const auto workMode = Core::App().settings().workMode(); + workmodeUpdated(workMode); if (Core::App().settings().windowPosition().maximized) { DEBUG_LOG(("Window Pos: First show, setting maximized.")); @@ -187,8 +188,7 @@ void MainWindow::applyInitialWorkMode() { const auto minimizeAndHide = [=] { DEBUG_LOG(("Window Pos: First show, setting minimized after.")); setWindowState(windowState() | Qt::WindowMinimized); - if (Global::WorkMode().value() == dbiwmTrayOnly - || Global::WorkMode().value() == dbiwmWindowAndTray) { + if (workMode == dbiwmTrayOnly || workMode == dbiwmWindowAndTray) { hide(); } }; diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp index 73b9c8ede..e0199862f 100644 --- a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "mainwindow.h" #include "core/application.h" +#include "core/core_settings.h" #include "core/sandbox.h" #include "boxes/peer_list_controllers.h" #include "boxes/about_box.h" @@ -28,7 +29,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/event_filter.h" #include "ui/widgets/popup_menu.h" #include "ui/widgets/input_fields.h" -#include "facades.h" #include "app.h" #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION @@ -809,7 +809,7 @@ void MainWindow::handleSNIHostRegistered() { _sniAvailable = true; - if (Global::WorkMode().value() == dbiwmWindowOnly) { + if (Core::App().settings().workMode() == dbiwmWindowOnly) { return; } @@ -825,7 +825,7 @@ void MainWindow::handleSNIHostRegistered() { SkipTaskbar( windowHandle(), - Global::WorkMode().value() == dbiwmTrayOnly); + Core::App().settings().workMode() == dbiwmTrayOnly); } void MainWindow::handleSNIOwnerChanged( @@ -834,7 +834,7 @@ void MainWindow::handleSNIOwnerChanged( const QString &newOwner) { _sniAvailable = IsSNIAvailable(); - if (Global::WorkMode().value() == dbiwmWindowOnly) { + if (Core::App().settings().workMode() == dbiwmWindowOnly) { return; } @@ -860,7 +860,8 @@ void MainWindow::handleSNIOwnerChanged( SkipTaskbar( windowHandle(), - (Global::WorkMode().value() == dbiwmTrayOnly) && trayAvailable()); + (Core::App().settings().workMode() == dbiwmTrayOnly) + && trayAvailable()); } void MainWindow::handleAppMenuOwnerChanged( @@ -1330,7 +1331,7 @@ void MainWindow::handleNativeSurfaceChanged(bool exist) { if (exist) { SkipTaskbar( windowHandle(), - (Global::WorkMode().value() == dbiwmTrayOnly) + (Core::App().settings().workMode() == dbiwmTrayOnly) && trayAvailable()); } diff --git a/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm b/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm index 594d7228f..19a4d559d 100644 --- a/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm +++ b/Telegram/SourceFiles/platform/mac/notifications_manager_mac.mm @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "platform/mac/notifications_manager_mac.h" +#include "core/application.h" +#include "core/core_settings.h" #include "base/platform/base_platform_info.h" #include "platform/platform_specific.h" #include "base/platform/mac/base_utilities_mac.h" @@ -15,7 +17,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/empty_userpic.h" #include "main/main_session.h" #include "mainwindow.h" -#include "facades.h" #include "styles/style_window.h" #include @@ -172,7 +173,7 @@ void Create(Window::Notifications::System *system) { } } -class Manager::Private : public QObject, private base::Subscriber { +class Manager::Private : public QObject { public: Private(Manager *manager); @@ -224,20 +225,22 @@ private: ClearFinish>; std::vector _clearingTasks; + rpl::lifetime _lifetime; + }; Manager::Private::Private(Manager *manager) : _managerId(openssl::RandomValue()) , _managerIdString(QString::number(_managerId)) , _delegate([[NotificationDelegate alloc] initWithManager:manager managerId:_managerId]) { - updateDelegate(); - subscribe(Global::RefWorkMode(), [this](DBIWorkMode mode) { + Core::App().settings().workModeValue( + ) | rpl::start_with_next([=](DBIWorkMode mode) { // We need to update the delegate _after_ the tray icon change was done in Qt. // Because Qt resets the delegate. crl::on_main(this, [=] { updateDelegate(); }); - }); + }, _lifetime); } void Manager::Private::showNotification( diff --git a/Telegram/SourceFiles/settings/settings_advanced.cpp b/Telegram/SourceFiles/settings/settings_advanced.cpp index ac0f18121..5c9246948 100644 --- a/Telegram/SourceFiles/settings/settings_advanced.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced.cpp @@ -343,7 +343,7 @@ void SetupSystemIntegrationContent( }; if (Platform::TrayIconSupported()) { const auto trayEnabled = [] { - const auto workMode = Global::WorkMode().value(); + const auto workMode = Core::App().settings().workMode(); return (workMode == dbiwmTrayOnly) || (workMode == dbiwmWindowAndTray); }; @@ -352,7 +352,7 @@ void SetupSystemIntegrationContent( trayEnabled()); const auto taskbarEnabled = [] { - const auto workMode = Global::WorkMode().value(); + const auto workMode = Core::App().settings().workMode(); return (workMode == dbiwmWindowOnly) || (workMode == dbiwmWindowAndTray); }; @@ -369,10 +369,10 @@ void SetupSystemIntegrationContent( : dbiwmTrayOnly) : dbiwmWindowOnly; if ((newMode == dbiwmWindowAndTray || newMode == dbiwmTrayOnly) - && Global::WorkMode().value() != newMode) { + && Core::App().settings().workMode() != newMode) { cSetSeenTrayTooltip(false); } - Global::RefWorkMode().set(newMode); + Core::App().settings().setWorkMode(newMode); Local::writeSettings(); }; diff --git a/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp b/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp index 281fafdd8..5ec2ded4c 100644 --- a/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp +++ b/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp @@ -422,19 +422,21 @@ bool ReadSetting( context.sessionSettings().addFromSerialized(v); } break; - case dbiWorkMode: { + case dbiWorkModeOld: { qint32 v; stream >> v; if (!CheckStreamStatus(stream)) return false; - auto newMode = [v] { + const auto newMode = [v] { switch (v) { case dbiwmTrayOnly: return dbiwmTrayOnly; case dbiwmWindowOnly: return dbiwmWindowOnly; }; return dbiwmWindowAndTray; - }; - Global::RefWorkMode().set(newMode()); + }(); + Core::App().settings().setWorkMode(newMode); + + context.legacyRead = true; } break; case dbiTxtDomainStringOldOld: { diff --git a/Telegram/SourceFiles/storage/details/storage_settings_scheme.h b/Telegram/SourceFiles/storage/details/storage_settings_scheme.h index 32996c661..2462cd09c 100644 --- a/Telegram/SourceFiles/storage/details/storage_settings_scheme.h +++ b/Telegram/SourceFiles/storage/details/storage_settings_scheme.h @@ -86,7 +86,7 @@ enum { dbiAutoStart = 0x06, dbiStartMinimized = 0x07, dbiSoundFlashBounceNotifyOld = 0x08, - dbiWorkMode = 0x09, + dbiWorkModeOld = 0x09, dbiSeenTrayTooltip = 0x0a, dbiDesktopNotifyOld = 0x0b, dbiAutoUpdate = 0x0c, diff --git a/Telegram/SourceFiles/storage/localstorage.cpp b/Telegram/SourceFiles/storage/localstorage.cpp index bdb62effb..1558b546e 100644 --- a/Telegram/SourceFiles/storage/localstorage.cpp +++ b/Telegram/SourceFiles/storage/localstorage.cpp @@ -491,7 +491,6 @@ void writeSettings() { data.stream << quint32(dbiAutoStart) << qint32(cAutoStart()); data.stream << quint32(dbiStartMinimized) << qint32(cStartMinimized()); data.stream << quint32(dbiSendToMenu) << qint32(cSendToMenu()); - data.stream << quint32(dbiWorkMode) << qint32(Global::WorkMode().value()); data.stream << quint32(dbiSeenTrayTooltip) << qint32(cSeenTrayTooltip()); data.stream << quint32(dbiAutoUpdate) << qint32(cAutoUpdate()); data.stream << quint32(dbiLastUpdateCheck) << qint32(cLastUpdateCheck()); diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp index 1be16cb48..dbe11fa5b 100644 --- a/Telegram/SourceFiles/window/main_window.cpp +++ b/Telegram/SourceFiles/window/main_window.cpp @@ -178,9 +178,10 @@ MainWindow::MainWindow(not_null controller) updateUnreadCounter(); }, lifetime()); - subscribe(Global::RefWorkMode(), [=](DBIWorkMode mode) { + Core::App().settings().workModeChanges( + ) | rpl::start_with_next([=](DBIWorkMode mode) { workmodeUpdated(mode); - }); + }, lifetime()); Ui::Toast::SetDefaultParent(_body.data()); @@ -209,7 +210,8 @@ bool MainWindow::hideNoQuit() { if (App::quitting()) { return false; } - if (Global::WorkMode().value() == dbiwmTrayOnly || Global::WorkMode().value() == dbiwmWindowAndTray) { + const auto workMode = Core::App().settings().workMode(); + if (workMode == dbiwmTrayOnly || workMode == dbiwmWindowAndTray) { if (minimizeToTray()) { if (const auto controller = sessionController()) { Ui::showChatsList(&controller->session()); @@ -314,7 +316,8 @@ void MainWindow::handleStateChanged(Qt::WindowState state) { controller().updateIsActiveFocus(); } Core::App().updateNonIdle(); - if (state == Qt::WindowMinimized && Global::WorkMode().value() == dbiwmTrayOnly) { + if (state == Qt::WindowMinimized + && (Core::App().settings().workMode() == dbiwmTrayOnly)) { minimizeToTray(); } savePosition(state); diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index a317f60c7..f5bb9cba3 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -316,7 +316,7 @@ void Controller::updateIsActive() { } void Controller::minimize() { - if (Global::WorkMode().value() == dbiwmTrayOnly) { + if (Core::App().settings().workMode() == dbiwmTrayOnly) { _widget.minimizeToTray(); } else { _widget.setWindowState(_widget.windowState() | Qt::WindowMinimized);