Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion frontend/oauth/TwitchAuth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Twitch loads these panes late, so we still need to restore their saved layout before the generic dock hiding kicks in.

main->restoreState(dockState);
}
}
Expand Down
1 change: 1 addition & 0 deletions frontend/widgets/OBSBasic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reuse the same startup-hidden condition so docks know OBS is intentionally hidden, not just mid-startup.


#ifdef _WIN32
SetWin32DropStyle(this);
Expand Down
14 changes: 14 additions & 0 deletions frontend/widgets/OBSBasic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@
#include <util/util.hpp>

#include <QAccessible>
#include <QPointer>
#include <QSystemTrayIcon>

#include <deque>
#include <utility>

extern volatile bool recording_paused;

Expand All @@ -61,6 +63,7 @@ class VolumeControl;
class YouTubeAppDock;
#endif
class QMessageBox;
class QShowEvent;
class QWidgetAction;
struct QuickTransition;

Expand Down Expand Up @@ -437,6 +440,9 @@ public slots:
QByteArray startingDockLayout;
QStringList extraDockNames;
QList<std::shared_ptr<QDockWidget>> extraDocks;
bool deferExtraDockVisibility = false;
bool hidingDeferredExtraDock = false;
QList<std::pair<QPointer<QDockWidget>, bool>> deferredExtraDockVisibility;

QStringList extraCustomDockNames;
QList<QPointer<QDockWidget>> extraCustomDocks;
Expand All @@ -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);
Expand Down
68 changes: 67 additions & 1 deletion frontend/widgets/OBSBasic_Docks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#include <qt-wrappers.hpp>

#include <QShowEvent>

void setupDockAction(QDockWidget *dock)
{
QAction *action = dock->toggleViewAction();
Expand Down Expand Up @@ -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);

Expand All @@ -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<QDockWidget>(dock));
DeferExtraDockVisibility(dock);
}

void OBSBasic::RemoveDockWidget(const QString &name)
Expand Down Expand Up @@ -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()});
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Record the restored visibility before hiding, so floating docks come back exactly as saved once OBS is shown.


// 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)
Expand Down
Loading