Skip to content

Commit

Permalink
added ability to use displayswitch.exe
Browse files Browse the repository at this point in the history
  • Loading branch information
Odizinne committed Jul 22, 2024
1 parent ff4f8e4 commit 01f06c6
Show file tree
Hide file tree
Showing 3 changed files with 167 additions and 91 deletions.
40 changes: 30 additions & 10 deletions src/BigPictureTV.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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()

Expand Down Expand Up @@ -96,22 +98,30 @@ 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()

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"],
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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()
Expand Down
96 changes: 57 additions & 39 deletions src/design.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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))
Expand All @@ -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")
Expand All @@ -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)

Expand All @@ -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__":
Expand Down
Loading

0 comments on commit 01f06c6

Please sign in to comment.