From ebe4dbebfc71f6b19a2b93d80fc6590bbb7a01d9 Mon Sep 17 00:00:00 2001 From: Chev Date: Mon, 27 Apr 2026 21:10:59 -0600 Subject: [PATCH] frontend: Defer extra dock visibility on hidden start --- frontend/oauth/TwitchAuth.cpp | 2 +- frontend/widgets/OBSBasic.cpp | 1 + frontend/widgets/OBSBasic.hpp | 14 ++++++ frontend/widgets/OBSBasic_Docks.cpp | 68 ++++++++++++++++++++++++++++- 4 files changed, 83 insertions(+), 2 deletions(-) diff --git a/frontend/oauth/TwitchAuth.cpp b/frontend/oauth/TwitchAuth.cpp index 3b35e7291545c7..14f6902a2d4c68 100644 --- a/frontend/oauth/TwitchAuth.cpp +++ b/frontend/oauth/TwitchAuth.cpp @@ -396,7 +396,7 @@ void TwitchAuth::LoadSecondaryUIPanes() const char *dockStateStr = config_get_string(main->Config(), service(), "DockState"); QByteArray dockState = QByteArray::fromBase64(QByteArray(dockStateStr)); - if (main->isVisible() || !main->isMaximized()) + if (main->IsDeferringExtraDockVisibility() || main->isVisible() || !main->isMaximized()) main->restoreState(dockState); } } diff --git a/frontend/widgets/OBSBasic.cpp b/frontend/widgets/OBSBasic.cpp index e3277eb5f445dc..fba55000e1c353 100644 --- a/frontend/widgets/OBSBasic.cpp +++ b/frontend/widgets/OBSBasic.cpp @@ -1152,6 +1152,7 @@ void OBSBasic::OBSInit() bool sysTrayWhenStarted = config_get_bool(App()->GetUserConfig(), "BasicWindow", "SysTrayWhenStarted"); bool hideWindowOnStart = QSystemTrayIcon::isSystemTrayAvailable() && sysTrayEnabled && (opt_minimize_tray || sysTrayWhenStarted); + deferExtraDockVisibility = hideWindowOnStart; #ifdef _WIN32 SetWin32DropStyle(this); diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index 2561a7c107fc47..f4db215631967e 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -40,9 +40,11 @@ #include #include +#include #include #include +#include extern volatile bool recording_paused; @@ -61,6 +63,7 @@ class VolumeControl; class YouTubeAppDock; #endif class QMessageBox; +class QShowEvent; class QWidgetAction; struct QuickTransition; @@ -437,6 +440,9 @@ public slots: QByteArray startingDockLayout; QStringList extraDockNames; QList> extraDocks; + bool deferExtraDockVisibility = false; + bool hidingDeferredExtraDock = false; + QList, bool>> deferredExtraDockVisibility; QStringList extraCustomDockNames; QList> extraCustomDocks; @@ -449,8 +455,16 @@ public slots: void RemoveDockWidget(const QString &name); bool IsDockObjectNameUsed(const QString &name); void AddCustomDockWidget(QDockWidget *dock); + bool IsDeferringExtraDockVisibility() const { return deferExtraDockVisibility; } void setDockCornersVertical(bool vertical); +protected: + void showEvent(QShowEvent *event) override; + +private: + void DeferExtraDockVisibility(QDockWidget *dock); + void RestoreDeferredExtraDockVisibility(); + private slots: void on_resetDocks_triggered(bool force = false); void on_lockDocks_toggled(bool lock); diff --git a/frontend/widgets/OBSBasic_Docks.cpp b/frontend/widgets/OBSBasic_Docks.cpp index b35839ef0079b5..6e61c0783029b6 100644 --- a/frontend/widgets/OBSBasic_Docks.cpp +++ b/frontend/widgets/OBSBasic_Docks.cpp @@ -21,6 +21,8 @@ #include +#include + void setupDockAction(QDockWidget *dock) { QAction *action = dock->toggleViewAction(); @@ -160,8 +162,10 @@ void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool ex else ui->menuDocks->addAction(dock->toggleViewAction()); - if (extraBrowser) + if (extraBrowser) { + DeferExtraDockVisibility(dock); return; + } #else UNUSED_PARAMETER(extraBrowser); @@ -170,6 +174,7 @@ void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool ex extraDockNames.push_back(dock->objectName()); extraDocks.push_back(std::shared_ptr(dock)); + DeferExtraDockVisibility(dock); } void OBSBasic::RemoveDockWidget(const QString &name) @@ -218,6 +223,67 @@ void OBSBasic::AddCustomDockWidget(QDockWidget *dock) extraCustomDockNames.push_back(dock->objectName()); extraCustomDocks.push_back(dock); + DeferExtraDockVisibility(dock); +} + +void OBSBasic::DeferExtraDockVisibility(QDockWidget *dock) +{ + if (!deferExtraDockVisibility || !dock) + return; + + for (auto &deferredDock : deferredExtraDockVisibility) { + if (deferredDock.first == dock) + return; + } + + deferredExtraDockVisibility.append({dock, dock->isVisible()}); + + // When OBS starts hidden to tray, restoreState() can make floating + // extra docks visible before the main window is ever shown. + connect(dock, &QDockWidget::visibilityChanged, this, [this, dock](bool visible) { + if (!deferExtraDockVisibility || hidingDeferredExtraDock) + return; + + for (auto &deferredDock : deferredExtraDockVisibility) { + if (deferredDock.first != dock) + continue; + + deferredDock.second = visible; + if (visible && !isVisible()) { + hidingDeferredExtraDock = true; + dock->setVisible(false); + hidingDeferredExtraDock = false; + } + return; + } + }); + + if (dock->isVisible() && !isVisible()) { + hidingDeferredExtraDock = true; + dock->setVisible(false); + hidingDeferredExtraDock = false; + } +} + +void OBSBasic::RestoreDeferredExtraDockVisibility() +{ + if (!deferExtraDockVisibility) + return; + + deferExtraDockVisibility = false; + + for (auto &deferredDock : deferredExtraDockVisibility) { + if (deferredDock.first) + deferredDock.first->setVisible(deferredDock.second); + } + + deferredExtraDockVisibility.clear(); +} + +void OBSBasic::showEvent(QShowEvent *event) +{ + OBSMainWindow::showEvent(event); + RestoreDeferredExtraDockVisibility(); } void OBSBasic::setDockCornersVertical(bool vertical)