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