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())
Comment thread
BeekeeperAlex marked this conversation as resolved.
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;
Comment thread
BeekeeperAlex marked this conversation as resolved.

#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 @@ -62,6 +64,7 @@ class VolumeControl;
class YouTubeAppDock;
#endif
class QMessageBox;
class QShowEvent;
class QWidgetAction;
struct QuickTransition;

Expand Down Expand Up @@ -438,6 +441,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 @@ -450,8 +456,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()});
Comment thread
BeekeeperAlex marked this conversation as resolved.

// 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