From 89d6d5ffce0f74ff66e94cda81589f9e83f7fec5 Mon Sep 17 00:00:00 2001 From: cg2121 Date: Sun, 21 Aug 2016 16:11:32 -0700 Subject: [PATCH] UI: Add option to make projectors always on top Closes jp9000/obs-studio#563 --- obs/data/locale/en-US.ini | 1 + obs/forms/OBSBasicSettings.ui | 29 ++++++++++++++++++----------- obs/platform-osx.mm | 4 ++-- obs/platform-windows.cpp | 4 ++-- obs/platform-x11.cpp | 4 ++-- obs/platform.hpp | 6 +++--- obs/window-basic-settings.cpp | 8 ++++++++ obs/window-projector.cpp | 5 +++++ 8 files changed, 41 insertions(+), 20 deletions(-) diff --git a/obs/data/locale/en-US.ini b/obs/data/locale/en-US.ini index f3467f4d2..0c47e9deb 100644 --- a/obs/data/locale/en-US.ini +++ b/obs/data/locale/en-US.ini @@ -376,6 +376,7 @@ Basic.Settings.General.Language="Language" Basic.Settings.General.WarnBeforeStartingStream="Show confirmation dialog when starting streams" Basic.Settings.General.WarnBeforeStoppingStream="Show confirmation dialog when stopping streams" Basic.Settings.General.HideProjectorCursor="Hide cursor over projectors" +Basic.Settings.General.ProjectorAlwaysOnTop="Make projectors always on top" Basic.Settings.General.Snapping="Source Alignment Snapping" Basic.Settings.General.ScreenSnapping="Snap Sources to edge of screen" Basic.Settings.General.CenterSnapping="Snap Sources to horizontal and vertical center" diff --git a/obs/forms/OBSBasicSettings.ui b/obs/forms/OBSBasicSettings.ui index 64ce0fd1c..ff50261bf 100644 --- a/obs/forms/OBSBasicSettings.ui +++ b/obs/forms/OBSBasicSettings.ui @@ -185,21 +185,21 @@ - + Basic.Settings.General.RecordWhenStreaming - + Basic.Settings.General.SysTrayEnabled - + false @@ -209,14 +209,14 @@ - + Qt::Horizontal - + true @@ -316,7 +316,7 @@ - + false @@ -326,6 +326,13 @@ + + + + Basic.Settings.General.ProjectorAlwaysOnTop + + + @@ -2538,8 +2545,8 @@ 0 0 - 98 - 28 + 80 + 16 @@ -2903,9 +2910,9 @@ 0 - -206 - 803 - 820 + 0 + 559 + 681 diff --git a/obs/platform-osx.mm b/obs/platform-osx.mm index ec02bbec4..d60f8ab92 100644 --- a/obs/platform-osx.mm +++ b/obs/platform-osx.mm @@ -132,12 +132,12 @@ vector GetPreferredLocales() return result; } -bool IsAlwaysOnTop(QMainWindow *window) +bool IsAlwaysOnTop(QWidget *window) { return (window->windowFlags() & Qt::WindowStaysOnTopHint) != 0; } -void SetAlwaysOnTop(QMainWindow *window, bool enable) +void SetAlwaysOnTop(QWidget *window, bool enable) { Qt::WindowFlags flags = window->windowFlags(); diff --git a/obs/platform-windows.cpp b/obs/platform-windows.cpp index fb4c99759..4afde448f 100644 --- a/obs/platform-windows.cpp +++ b/obs/platform-windows.cpp @@ -203,13 +203,13 @@ void SetAeroEnabled(bool enable) func(enable ? DWM_EC_ENABLECOMPOSITION : DWM_EC_DISABLECOMPOSITION); } -bool IsAlwaysOnTop(QMainWindow *window) +bool IsAlwaysOnTop(QWidget *window) { DWORD exStyle = GetWindowLong((HWND)window->winId(), GWL_EXSTYLE); return (exStyle & WS_EX_TOPMOST) != 0; } -void SetAlwaysOnTop(QMainWindow *window, bool enable) +void SetAlwaysOnTop(QWidget *window, bool enable) { HWND hwnd = (HWND)window->winId(); SetWindowPos(hwnd, enable ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, diff --git a/obs/platform-x11.cpp b/obs/platform-x11.cpp index 582d626d3..1cca5da51 100644 --- a/obs/platform-x11.cpp +++ b/obs/platform-x11.cpp @@ -148,12 +148,12 @@ vector GetPreferredLocales() return {}; } -bool IsAlwaysOnTop(QMainWindow *window) +bool IsAlwaysOnTop(QWidget *window) { return (window->windowFlags() & Qt::WindowStaysOnTopHint) != 0; } -void SetAlwaysOnTop(QMainWindow *window, bool enable) +void SetAlwaysOnTop(QWidget *window, bool enable) { Qt::WindowFlags flags = window->windowFlags(); diff --git a/obs/platform.hpp b/obs/platform.hpp index a25e4a8d8..d5e02d161 100644 --- a/obs/platform.hpp +++ b/obs/platform.hpp @@ -22,7 +22,7 @@ #include #include -class QMainWindow; +class QWidget; struct MonitorInfo { int32_t x, y; @@ -45,8 +45,8 @@ std::string GetDefaultVideoSavePath(); std::vector GetPreferredLocales(); -bool IsAlwaysOnTop(QMainWindow *window); -void SetAlwaysOnTop(QMainWindow *window, bool enable); +bool IsAlwaysOnTop(QWidget *window); +void SetAlwaysOnTop(QWidget *window, bool enable); #ifdef _WIN32 uint32_t GetWindowsVersion(); diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index 3bd064881..73d3ab58f 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -272,6 +272,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->warnBeforeStreamStart,CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->warnBeforeStreamStop, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->hideProjectorCursor, CHECK_CHANGED, GENERAL_CHANGED); + HookWidget(ui->projectorAlwaysOnTop, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->recordWhenStreaming, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->keepRecordStreamStops,CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->systemTrayEnabled, CHECK_CHANGED, GENERAL_CHANGED); @@ -887,6 +888,10 @@ void OBSBasicSettings::LoadGeneralSettings() "BasicWindow", "HideProjectorCursor"); ui->hideProjectorCursor->setChecked(hideProjectorCursor); + bool projectorAlwaysOnTop = config_get_bool(GetGlobalConfig(), + "BasicWindow", "ProjectorAlwaysOnTop"); + ui->projectorAlwaysOnTop->setChecked(projectorAlwaysOnTop); + loading = false; } @@ -2236,6 +2241,9 @@ void OBSBasicSettings::SaveGeneralSettings() config_set_bool(GetGlobalConfig(), "BasicWindow", "HideProjectorCursor", ui->hideProjectorCursor->isChecked()); + config_set_bool(GetGlobalConfig(), "BasicWindow", + "ProjectorAlwaysOnTop", + ui->projectorAlwaysOnTop->isChecked()); if (WidgetChanged(ui->recordWhenStreaming)) config_set_bool(GetGlobalConfig(), "BasicWindow", diff --git a/obs/window-projector.cpp b/obs/window-projector.cpp index 172e7be0f..5e3ecf972 100644 --- a/obs/window-projector.cpp +++ b/obs/window-projector.cpp @@ -53,6 +53,11 @@ void OBSProjector::Init(int monitor) setGeometry(mi.x, mi.y, mi.cx, mi.cy); + bool alwaysOnTop = config_get_bool(GetGlobalConfig(), + "BasicWindow", "ProjectorAlwaysOnTop"); + if (alwaysOnTop) + SetAlwaysOnTop(this, true); + show(); if (source)