diff --git a/src/BigPictureTV.py b/src/BigPictureTV.py
index 5534767..2e661d9 100644
--- a/src/BigPictureTV.py
+++ b/src/BigPictureTV.py
@@ -33,6 +33,7 @@ def __init__(self):
self.settings = {}
self.first_run = False
self.paused = False
+ self.use_displayswitch = False
self.timer = QTimer()
self.gamemode_screen = "/external"
self.desktop_screen = "/internal"
@@ -53,13 +54,14 @@ def __init__(self):
def initialize_ui(self):
self.ui.disableAudioCheckbox.stateChanged.connect(self.on_disableAudioCheckbox_stateChanged)
self.ui.startupCheckBox.stateChanged.connect(self.on_startupCheckBox_stateChanged)
- self.ui.steamEntry.textChanged.connect(self.on_settings_changed)
- self.ui.gamemodeEntry.textChanged.connect(self.on_settings_changed)
- self.ui.desktopEntry.textChanged.connect(self.on_settings_changed)
- self.ui.checkRateSpinBox.valueChanged.connect(self.on_settings_changed)
+ self.ui.steamEntry.textChanged.connect(self.save_settings)
+ self.ui.gamemodeEntry.textChanged.connect(self.save_settings)
+ self.ui.desktopEntry.textChanged.connect(self.save_settings)
+ self.ui.checkRateSpinBox.valueChanged.connect(self.save_settings)
self.ui.startupCheckBox.setChecked(self.check_startup_shortcut())
- self.ui.desktopVideoBox.currentIndexChanged.connect(self.on_settings_changed)
- self.ui.gamemodeVideoBox.currentIndexChanged.connect(self.on_settings_changed)
+ self.ui.desktopVideoBox.currentIndexChanged.connect(self.save_settings)
+ self.ui.gamemodeVideoBox.currentIndexChanged.connect(self.save_settings)
+ self.ui.displayswitchBox.stateChanged.connect(self.on_displayswitchBox_stateChanged)
self.apply_settings()
@@ -96,6 +98,11 @@ def populate_monitor_comboboxes(self):
self.ui.gamemodeVideoBox.addItem(monitor_name, monitor_id)
self.ui.desktopVideoBox.addItem(monitor_name, monitor_id)
+ def on_displayswitchBox_stateChanged(self):
+ self.use_displayswitch = self.ui.displayswitchBox.isChecked()
+ self.toggle_video_settings(not self.use_displayswitch)
+ self.save_settings()
+
def on_disableAudioCheckbox_stateChanged(self, state):
self.toggle_audio_settings(not state)
self.save_settings()
@@ -103,15 +110,18 @@ def on_disableAudioCheckbox_stateChanged(self, state):
def on_startupCheckBox_stateChanged(self, state):
self.manage_startup_shortcut(state)
- def on_settings_changed(self):
- self.save_settings()
-
def toggle_audio_settings(self, enabled):
self.ui.desktopEntry.setEnabled(enabled)
self.ui.desktopLabel.setEnabled(enabled)
self.ui.gamemodeEntry.setEnabled(enabled)
self.ui.gamemodeLabel.setEnabled(enabled)
+ def toggle_video_settings(self, enabled):
+ self.ui.desktopVideoBox.setEnabled(enabled)
+ self.ui.gamemodeVideoBox.setEnabled(enabled)
+ self.ui.desktopVideoLabel.setEnabled(enabled)
+ self.ui.gamemodeVideoLabel.setEnabled(enabled)
+
def create_default_settings(self):
self.settings = {
"BIG_PICTURE_KEYWORDS": ["Steam", "mode", "Big", "Picture"],
@@ -144,6 +154,9 @@ def apply_settings(self):
gamemode_monitor = self.settings.get('GAMEMODE_MONITOR', '')
desktop_monitor = self.settings.get('DESKTOP_MONITOR', '')
+ self.use_displayswitch = self.settings.get('UseDisplaySwitch', False)
+ self.ui.displayswitchBox.setChecked(self.use_displayswitch)
+ self.toggle_video_settings(not self.use_displayswitch)
index = self.ui.gamemodeVideoBox.findText(gamemode_monitor)
if index != -1:
@@ -161,7 +174,8 @@ def save_settings(self):
"DisableAudioSwitch": self.ui.disableAudioCheckbox.isChecked(),
"CheckRate": self.ui.checkRateSpinBox.value(),
"GAMEMODE_MONITOR": self.ui.gamemodeVideoBox.currentText(),
- "DESKTOP_MONITOR": self.ui.desktopVideoBox.currentText()
+ "DESKTOP_MONITOR": self.ui.desktopVideoBox.currentText(),
+ "UseDisplaySwitch": self.ui.displayswitchBox.isChecked()
}
os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)
with open(SETTINGS_FILE, 'w') as f:
@@ -190,6 +204,12 @@ def switch_mode(self, mode):
self.update_tray_icon()
def switch_screen(self, mode):
+ if self.use_displayswitch:
+ print("Using displayswitch.exe to switch screens")
+ mode == "/external" if Mode.GAMEMODE else "/internal"
+ subprocess.run(["displayswitch.exe", mode], check=True)
+ return
+
selected_monitor_id = None
if mode == self.gamemode_screen:
selected_monitor_id = self.ui.gamemodeVideoBox.currentData()
diff --git a/src/design.py b/src/design.py
index 92e0916..f655735 100644
--- a/src/design.py
+++ b/src/design.py
@@ -12,7 +12,7 @@
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(495, 443)
+ MainWindow.resize(495, 480)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
@@ -86,50 +86,60 @@ def setupUi(self, MainWindow):
self.gridLayout_5.setSpacing(12)
self.gridLayout_5.setObjectName("gridLayout_5")
spacerItem = QtWidgets.QSpacerItem(0, 25, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_5.addItem(spacerItem, 3, 1, 1, 1)
- self.checkRateSpinBox = QtWidgets.QSpinBox(parent=self.gridFrame2)
- self.checkRateSpinBox.setMinimumSize(QtCore.QSize(90, 25))
- self.checkRateSpinBox.setFrame(False)
- self.checkRateSpinBox.setMinimum(1)
- self.checkRateSpinBox.setMaximum(1000)
- self.checkRateSpinBox.setProperty("value", 1000)
- self.checkRateSpinBox.setObjectName("checkRateSpinBox")
- self.gridLayout_5.addWidget(self.checkRateSpinBox, 3, 2, 1, 1)
- self.label_6 = QtWidgets.QLabel(parent=self.gridFrame2)
- self.label_6.setMinimumSize(QtCore.QSize(0, 25))
- self.label_6.setObjectName("label_6")
- self.gridLayout_5.addWidget(self.label_6, 1, 0, 1, 1)
+ self.gridLayout_5.addItem(spacerItem, 4, 1, 1, 1)
self.label = QtWidgets.QLabel(parent=self.gridFrame2)
self.label.setMinimumSize(QtCore.QSize(0, 25))
self.label.setAutoFillBackground(False)
self.label.setObjectName("label")
- self.gridLayout_5.addWidget(self.label, 2, 0, 1, 1)
+ self.gridLayout_5.addWidget(self.label, 3, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.gridFrame2)
self.label_5.setMinimumSize(QtCore.QSize(0, 25))
self.label_5.setObjectName("label_5")
self.gridLayout_5.addWidget(self.label_5, 0, 0, 1, 1)
+ self.startupCheckBox = QtWidgets.QCheckBox(parent=self.gridFrame2)
+ self.startupCheckBox.setMinimumSize(QtCore.QSize(0, 25))
+ self.startupCheckBox.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
+ self.startupCheckBox.setText("")
+ self.startupCheckBox.setObjectName("startupCheckBox")
+ self.gridLayout_5.addWidget(self.startupCheckBox, 0, 1, 1, 2)
+ self.disableAudioCheckbox = QtWidgets.QCheckBox(parent=self.gridFrame2)
+ self.disableAudioCheckbox.setMinimumSize(QtCore.QSize(0, 25))
+ self.disableAudioCheckbox.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
+ self.disableAudioCheckbox.setText("")
+ self.disableAudioCheckbox.setObjectName("disableAudioCheckbox")
+ self.gridLayout_5.addWidget(self.disableAudioCheckbox, 1, 1, 1, 2)
+ self.label_6 = QtWidgets.QLabel(parent=self.gridFrame2)
+ self.label_6.setMinimumSize(QtCore.QSize(0, 25))
+ self.label_6.setObjectName("label_6")
+ self.gridLayout_5.addWidget(self.label_6, 1, 0, 1, 1)
self.steamEntry = QtWidgets.QLineEdit(parent=self.gridFrame2)
self.steamEntry.setMinimumSize(QtCore.QSize(0, 25))
self.steamEntry.setAutoFillBackground(False)
self.steamEntry.setFrame(True)
self.steamEntry.setObjectName("steamEntry")
- self.gridLayout_5.addWidget(self.steamEntry, 2, 1, 1, 2)
+ self.gridLayout_5.addWidget(self.steamEntry, 3, 1, 1, 2)
+ self.checkRateSpinBox = QtWidgets.QSpinBox(parent=self.gridFrame2)
+ self.checkRateSpinBox.setMinimumSize(QtCore.QSize(90, 25))
+ self.checkRateSpinBox.setFrame(False)
+ self.checkRateSpinBox.setMinimum(1)
+ self.checkRateSpinBox.setMaximum(1000)
+ self.checkRateSpinBox.setProperty("value", 1000)
+ self.checkRateSpinBox.setObjectName("checkRateSpinBox")
+ self.gridLayout_5.addWidget(self.checkRateSpinBox, 4, 2, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.gridFrame2)
self.label_4.setMinimumSize(QtCore.QSize(0, 25))
self.label_4.setObjectName("label_4")
- self.gridLayout_5.addWidget(self.label_4, 3, 0, 1, 1)
- self.disableAudioCheckbox = QtWidgets.QCheckBox(parent=self.gridFrame2)
- self.disableAudioCheckbox.setMinimumSize(QtCore.QSize(0, 25))
- self.disableAudioCheckbox.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
- self.disableAudioCheckbox.setText("")
- self.disableAudioCheckbox.setObjectName("disableAudioCheckbox")
- self.gridLayout_5.addWidget(self.disableAudioCheckbox, 1, 1, 1, 2)
- self.startupCheckBox = QtWidgets.QCheckBox(parent=self.gridFrame2)
- self.startupCheckBox.setMinimumSize(QtCore.QSize(0, 25))
- self.startupCheckBox.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
- self.startupCheckBox.setText("")
- self.startupCheckBox.setObjectName("startupCheckBox")
- self.gridLayout_5.addWidget(self.startupCheckBox, 0, 1, 1, 2)
+ self.gridLayout_5.addWidget(self.label_4, 4, 0, 1, 1)
+ self.displayswitchLabel = QtWidgets.QLabel(parent=self.gridFrame2)
+ self.displayswitchLabel.setMinimumSize(QtCore.QSize(0, 25))
+ self.displayswitchLabel.setObjectName("displayswitchLabel")
+ self.gridLayout_5.addWidget(self.displayswitchLabel, 2, 0, 1, 1)
+ self.displayswitchBox = QtWidgets.QCheckBox(parent=self.gridFrame2)
+ self.displayswitchBox.setMinimumSize(QtCore.QSize(0, 25))
+ self.displayswitchBox.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
+ self.displayswitchBox.setText("")
+ self.displayswitchBox.setObjectName("displayswitchBox")
+ self.gridLayout_5.addWidget(self.displayswitchBox, 2, 2, 1, 1)
self.gridLayout_2.addWidget(self.gridFrame2, 1, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_3.setMinimumSize(QtCore.QSize(0, 25))
@@ -153,14 +163,6 @@ def setupUi(self, MainWindow):
self.gridLayout_6.setContentsMargins(9, 9, 9, 9)
self.gridLayout_6.setHorizontalSpacing(12)
self.gridLayout_6.setObjectName("gridLayout_6")
- self.gamemodeVideoLabel = QtWidgets.QLabel(parent=self.gridFrame3)
- self.gamemodeVideoLabel.setMinimumSize(QtCore.QSize(0, 25))
- self.gamemodeVideoLabel.setObjectName("gamemodeVideoLabel")
- self.gridLayout_6.addWidget(self.gamemodeVideoLabel, 0, 0, 1, 1)
- self.gamemodeVideoBox = QtWidgets.QComboBox(parent=self.gridFrame3)
- self.gamemodeVideoBox.setMinimumSize(QtCore.QSize(0, 25))
- self.gamemodeVideoBox.setObjectName("gamemodeVideoBox")
- self.gridLayout_6.addWidget(self.gamemodeVideoBox, 0, 1, 1, 1)
self.desktopVideoLabel = QtWidgets.QLabel(parent=self.gridFrame3)
self.desktopVideoLabel.setMinimumSize(QtCore.QSize(0, 25))
self.desktopVideoLabel.setObjectName("desktopVideoLabel")
@@ -169,6 +171,14 @@ def setupUi(self, MainWindow):
self.desktopVideoBox.setMinimumSize(QtCore.QSize(0, 25))
self.desktopVideoBox.setObjectName("desktopVideoBox")
self.gridLayout_6.addWidget(self.desktopVideoBox, 1, 1, 1, 1)
+ self.gamemodeVideoLabel = QtWidgets.QLabel(parent=self.gridFrame3)
+ self.gamemodeVideoLabel.setMinimumSize(QtCore.QSize(0, 25))
+ self.gamemodeVideoLabel.setObjectName("gamemodeVideoLabel")
+ self.gridLayout_6.addWidget(self.gamemodeVideoLabel, 0, 0, 1, 1)
+ self.gamemodeVideoBox = QtWidgets.QComboBox(parent=self.gridFrame3)
+ self.gamemodeVideoBox.setMinimumSize(QtCore.QSize(0, 25))
+ self.gamemodeVideoBox.setObjectName("gamemodeVideoBox")
+ self.gridLayout_6.addWidget(self.gamemodeVideoBox, 0, 1, 1, 1)
self.gridLayout_2.addWidget(self.gridFrame3, 5, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
@@ -181,14 +191,22 @@ def retranslateUi(self, MainWindow):
self.gamemodeLabel.setText(_translate("MainWindow", "Gamemode"))
self.desktopLabel.setText(_translate("MainWindow", "Desktop"))
self.label_2.setText(_translate("MainWindow", "Settings"))
- self.label_6.setText(_translate("MainWindow", "Disable audio switching"))
self.label.setText(_translate("MainWindow", "Steam Big Picture keywords"))
self.label_5.setText(_translate("MainWindow", "Run at startup"))
+ self.label_6.setText(_translate("MainWindow", "Disable audio switching"))
self.label_4.setText(_translate("MainWindow", "Window check rate"))
+ self.displayswitchLabel.setToolTip(_translate("MainWindow", "Use windows built in displayswitch.exe to switch monitors.\n"
+"\n"
+"This should offer a smoother transition.\n"
+"\n"
+"You should use it if you only have 2 monitors.\n"
+"\n"
+"For 3 monitors or more, it is recommended to specify your outputs."))
+ self.displayswitchLabel.setText(_translate("MainWindow", "Use old screen switch ⚠️"))
self.label_3.setText(_translate("MainWindow", "Audio output"))
self.label_7.setText(_translate("MainWindow", "Video output"))
- self.gamemodeVideoLabel.setText(_translate("MainWindow", "Gamemode"))
self.desktopVideoLabel.setText(_translate("MainWindow", "Desktop"))
+ self.gamemodeVideoLabel.setText(_translate("MainWindow", "Gamemode"))
if __name__ == "__main__":
diff --git a/src/ui/design.ui b/src/ui/design.ui
index b02bd9f..c3b09ae 100644
--- a/src/ui/design.ui
+++ b/src/ui/design.ui
@@ -7,7 +7,7 @@
0
0
495
- 443
+ 480
@@ -196,7 +196,7 @@
12
- -
+
-
@@ -215,59 +215,69 @@
- -
-
+
-
+
- 90
+ 0
25
-
+
false
-
- 1
+
+ Steam Big Picture keywords
-
- 1000
+
+
+ -
+
+
+
+ 0
+ 25
+
-
- 1000
+
+ Run at startup
- -
-
+
-
+
0
25
+
+ Qt::LayoutDirection::RightToLeft
+
- Disable audio switching
+
- -
-
+
-
+
0
25
-
- false
+
+ Qt::LayoutDirection::RightToLeft
- Steam Big Picture keywords
+
- -
-
+
-
+
0
@@ -275,11 +285,11 @@
- Run at startup
+ Disable audio switching
- -
+
-
@@ -295,7 +305,29 @@
- -
+
-
+
+
+
+ 90
+ 25
+
+
+
+ false
+
+
+ 1
+
+
+ 1000
+
+
+ 1000
+
+
+
+ -
@@ -308,24 +340,30 @@
- -
-
+
-
+
0
25
-
- Qt::LayoutDirection::RightToLeft
+
+ Use windows built in displayswitch.exe to switch monitors.
+
+This should offer a smoother transition.
+
+You should use it if you only have 2 monitors.
+
+For 3 monitors or more, it is recommended to specify your outputs.
-
+ Use old screen switch ⚠️
- -
-
+
-
+
0
@@ -403,8 +441,8 @@
12
-
-
-
+
-
+
0
@@ -412,12 +450,12 @@
- Gamemode
+ Desktop
- -
-
+
-
+
0
@@ -426,8 +464,8 @@
- -
-
+
-
+
0
@@ -435,12 +473,12 @@
- Desktop
+ Gamemode
- -
-
+
-
+
0