Browse Source

UI: Add option to make projectors always on top

Closes jp9000/obs-studio#563
cg2121 9 years ago
parent
commit
89d6d5ffce

+ 1 - 0
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"

+ 18 - 11
obs/forms/OBSBasicSettings.ui

@@ -185,21 +185,21 @@
            </property>
           </widget>
          </item>
-         <item row="6" column="1">
+         <item row="7" column="1">
           <widget class="QCheckBox" name="recordWhenStreaming">
            <property name="text">
             <string>Basic.Settings.General.RecordWhenStreaming</string>
            </property>
           </widget>
          </item>
-         <item row="8" column="1">
+         <item row="9" column="1">
           <widget class="QCheckBox" name="systemTrayEnabled">
            <property name="text">
             <string>Basic.Settings.General.SysTrayEnabled</string>
            </property>
           </widget>
          </item>
-         <item row="9" column="1">
+         <item row="10" column="1">
           <widget class="QCheckBox" name="systemTrayWhenStarted">
            <property name="enabled">
             <bool>false</bool>
@@ -209,14 +209,14 @@
            </property>
           </widget>
          </item>
-         <item row="10" column="0" colspan="2">
+         <item row="11" column="0" colspan="2">
           <widget class="Line" name="line_4">
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
            </property>
           </widget>
          </item>
-         <item row="11" column="0" colspan="2">
+         <item row="12" column="0" colspan="2">
           <widget class="QGroupBox" name="groupBox_10">
            <property name="enabled">
             <bool>true</bool>
@@ -316,7 +316,7 @@
            </property>
           </widget>
          </item>
-         <item row="7" column="1">
+         <item row="8" column="1">
           <widget class="QCheckBox" name="keepRecordStreamStops">
            <property name="enabled">
             <bool>false</bool>
@@ -326,6 +326,13 @@
            </property>
           </widget>
          </item>
+         <item row="6" column="1">
+          <widget class="QCheckBox" name="projectorAlwaysOnTop">
+           <property name="text">
+            <string>Basic.Settings.General.ProjectorAlwaysOnTop</string>
+           </property>
+          </widget>
+         </item>
         </layout>
        </widget>
        <widget class="QWidget" name="streamPage">
@@ -2538,8 +2545,8 @@
              <rect>
               <x>0</x>
               <y>0</y>
-              <width>98</width>
-              <height>28</height>
+              <width>80</width>
+              <height>16</height>
              </rect>
             </property>
            </widget>
@@ -2903,9 +2910,9 @@
             <property name="geometry">
              <rect>
               <x>0</x>
-              <y>-206</y>
-              <width>803</width>
-              <height>820</height>
+              <y>0</y>
+              <width>559</width>
+              <height>681</height>
              </rect>
             </property>
             <layout class="QVBoxLayout" name="verticalLayout_16">

+ 2 - 2
obs/platform-osx.mm

@@ -132,12 +132,12 @@ vector<string> 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();
 

+ 2 - 2
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,

+ 2 - 2
obs/platform-x11.cpp

@@ -148,12 +148,12 @@ vector<string> 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();
 

+ 3 - 3
obs/platform.hpp

@@ -22,7 +22,7 @@
 #include <string>
 #include <vector>
 
-class QMainWindow;
+class QWidget;
 
 struct MonitorInfo {
 	int32_t  x, y;
@@ -45,8 +45,8 @@ std::string GetDefaultVideoSavePath();
 
 std::vector<std::string> 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();

+ 8 - 0
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",

+ 5 - 0
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)