diff --git a/frontend/OBSApp.cpp b/frontend/OBSApp.cpp
index fb5f8dd20f634d..bae69309eb6103 100644
--- a/frontend/OBSApp.cpp
+++ b/frontend/OBSApp.cpp
@@ -362,7 +362,7 @@ void OBSApp::InitUserConfigDefaults()
config_set_default_bool(userConfig, "BasicWindow", "ShowContextToolbars", true);
config_set_default_bool(userConfig, "BasicWindow", "StudioModeLabels", true);
- config_set_default_bool(userConfig, "BasicWindow", "VerticalVolControl", false);
+ config_set_default_bool(userConfig, "BasicWindow", "VerticalVolControl", true);
config_set_default_bool(userConfig, "BasicWindow", "MultiviewMouseSwitch", true);
diff --git a/frontend/forms/OBSBasic.ui b/frontend/forms/OBSBasic.ui
index e3c0600e59104e..82d125c2883567 100644
--- a/frontend/forms/OBSBasic.ui
+++ b/frontend/forms/OBSBasic.ui
@@ -7,8 +7,8 @@
0
0
- 1086
- 729
+ 1280
+ 960
@@ -703,7 +703,7 @@
0
0
- 1086
+ 1280
22
@@ -1289,7 +1289,7 @@
0
0
- 322
+ 380
16
@@ -2213,7 +2213,7 @@
true
- false
+ true
Basic.MainMenu.Docks.SideDocks
diff --git a/frontend/widgets/OBSBasic.cpp b/frontend/widgets/OBSBasic.cpp
index b0698b29b54755..28d629aa01f362 100644
--- a/frontend/widgets/OBSBasic.cpp
+++ b/frontend/widgets/OBSBasic.cpp
@@ -285,7 +285,6 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new
controlsDock->setWindowTitle(QTStr("Basic.Main.Controls"));
/* Parenting is done there so controls will be deleted alongside controlsDock */
controlsDock->setWidget(controls);
- addDockWidget(Qt::BottomDockWidgetArea, controlsDock);
connect(controls, &OBSBasicControls::StreamButtonClicked, this, &OBSBasic::StreamActionTriggered);
@@ -342,6 +341,17 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new
connect(ui->transitionDuration, &QSpinBox::valueChanged, this,
[this](int value) { SetTransitionDuration(value); });
+ /* Main window default layout */
+ setDockCornersVertical(true);
+
+ /* Scenes and Sources dock on left
+ * This specific arrangement can't be set up in Qt Designer */
+ addDockWidget(Qt::LeftDockWidgetArea, ui->scenesDock);
+ splitDockWidget(ui->scenesDock, ui->sourcesDock, Qt::Vertical);
+ int sideDockWidth = std::min(width() * 30 / 100, 320);
+ resizeDocks({ui->scenesDock, ui->sourcesDock}, {sideDockWidth, sideDockWidth}, Qt::Horizontal);
+ addDockWidget(Qt::BottomDockWidgetArea, controlsDock);
+
startingDockLayout = saveState();
statsDock = new OBSDock();
@@ -1229,10 +1239,8 @@ void OBSBasic::OBSInit()
ui->lockDocks->blockSignals(false);
bool sideDocks = config_get_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks");
- on_sideDocks_toggled(sideDocks);
- ui->sideDocks->blockSignals(true);
ui->sideDocks->setChecked(sideDocks);
- ui->sideDocks->blockSignals(false);
+ setDockCornersVertical(sideDocks);
SystemTray(true);
diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp
index ca213433e0beb8..9a616645cbd3ad 100644
--- a/frontend/widgets/OBSBasic.hpp
+++ b/frontend/widgets/OBSBasic.hpp
@@ -444,6 +444,7 @@ public slots:
void RemoveDockWidget(const QString &name);
bool IsDockObjectNameUsed(const QString &name);
void AddCustomDockWidget(QDockWidget *dock);
+ void setDockCornersVertical(bool vertical);
private slots:
void on_resetDocks_triggered(bool force = false);
diff --git a/frontend/widgets/OBSBasic_Docks.cpp b/frontend/widgets/OBSBasic_Docks.cpp
index 670ed5a25f730d..dbe20bca931ba0 100644
--- a/frontend/widgets/OBSBasic_Docks.cpp
+++ b/frontend/widgets/OBSBasic_Docks.cpp
@@ -74,21 +74,12 @@ void OBSBasic::on_resetDocks_triggered(bool force)
#undef RESET_DOCKLIST
restoreState(startingDockLayout);
+ ui->sideDocks->setChecked(true);
int cx = width();
- int cy = height();
+ int bottomDocksHeight = height();
- int cx22_5 = cx * 225 / 1000;
- int cx5 = cx * 5 / 100;
- int cx21 = cx * 21 / 100;
-
- cy = cy * 225 / 1000;
-
- int mixerSize = cx - (cx22_5 * 2 + cx5 + cx21);
-
- QList docks{ui->scenesDock, ui->sourcesDock, ui->mixerDock, ui->transitionsDock, controlsDock};
-
- QList sizes{cx22_5, cx22_5, mixerSize, cx5, cx21};
+ bottomDocksHeight = bottomDocksHeight * 225 / 1000;
ui->scenesDock->setVisible(true);
ui->sourcesDock->setVisible(true);
@@ -98,8 +89,13 @@ void OBSBasic::on_resetDocks_triggered(bool force)
statsDock->setVisible(false);
statsDock->setFloating(true);
- resizeDocks(docks, {cy, cy, cy, cy, cy}, Qt::Vertical);
- resizeDocks(docks, sizes, Qt::Horizontal);
+ QList bottomDocks{ui->mixerDock, ui->transitionsDock, controlsDock};
+
+ resizeDocks(bottomDocks, {bottomDocksHeight, bottomDocksHeight, bottomDocksHeight}, Qt::Vertical);
+ resizeDocks(bottomDocks, {cx * 45 / 100, cx * 14 / 100, cx * 16 / 100}, Qt::Horizontal);
+
+ int sideDockWidth = std::min(width() * 30 / 100, 280);
+ resizeDocks({ui->scenesDock, ui->sourcesDock}, {sideDockWidth, sideDockWidth}, Qt::Horizontal);
activateWindow();
}
@@ -135,17 +131,9 @@ void OBSBasic::on_lockDocks_toggled(bool lock)
void OBSBasic::on_sideDocks_toggled(bool side)
{
- if (side) {
- setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
- setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
- setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
- setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
- } else {
- setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea);
- setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea);
- setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea);
- setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
- }
+ config_set_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks", side);
+
+ setDockCornersVertical(side);
}
void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool extraBrowser)
@@ -232,6 +220,21 @@ void OBSBasic::AddCustomDockWidget(QDockWidget *dock)
extraCustomDocks.push_back(dock);
}
+void OBSBasic::setDockCornersVertical(bool vertical)
+{
+ if (vertical) {
+ setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
+ setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
+ setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
+ setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
+ } else {
+ setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea);
+ setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea);
+ setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea);
+ setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
+ }
+}
+
void OBSBasic::RepairCustomExtraDockName()
{
QDockWidget *dock = reinterpret_cast(sender());
diff --git a/plugins/obs-browser b/plugins/obs-browser
index a776dd6a1a0ded..5ee805695d337c 160000
--- a/plugins/obs-browser
+++ b/plugins/obs-browser
@@ -1 +1 @@
-Subproject commit a776dd6a1a0ded4a8a723f2f572f3f8a9707f5a8
+Subproject commit 5ee805695d337cbea4180fd25e5b86bfff4af33b
diff --git a/plugins/obs-websocket b/plugins/obs-websocket
index 1c9306b1e20070..c542622d7b6d41 160000
--- a/plugins/obs-websocket
+++ b/plugins/obs-websocket
@@ -1 +1 @@
-Subproject commit 1c9306b1e200704ebe192e06c893dfc06b097c43
+Subproject commit c542622d7b6d41ce5875f54efdab1d4ac2967ef4