From 6895277c1f24aa9381822a0cbb20259b97cd075f Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 7 Oct 2012 14:45:29 +0200 Subject: [PATCH] abstract the dialogue away so it can be implementing using an abritrary GUI frontend (or even a CLI, for that matter) --- dsl.py | 23 ++++++++++++++--------- gui.py | 12 ++++++++++++ selector_window.py => qt_dialogue.py | 26 ++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 13 deletions(-) rename selector_window.py => qt_dialogue.py (86%) diff --git a/dsl.py b/dsl.py index e1a945e..1c4ec1e 100755 --- a/dsl.py +++ b/dsl.py @@ -17,12 +17,17 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, re, subprocess -from selector_window import PositionSelection import gui # for auto-config: common names of internal connectors commonInternalConnectorNames = ['LVDS', 'LVDS0', 'LVDS1', 'LVDS-0', 'LVDS-1'] +# this is as close as one can get to an enum in Python +class RelativeScreenPosition: + LEFT = 0 + RIGHT = 1 + EXTERNAL_ONLY = 2 + # Load a section-less config file: maps parameter names to space-separated lists of strings (with shell quotation) def loadConfigFile(file): import shlex @@ -142,25 +147,25 @@ def main(): if usedExternalConnector is not None: # there's an external screen connected, we need to ask what to do internalResolutions = connectors[internalConnector] externalResolutions = connectors[usedExternalConnector] - extPosition = PositionSelection(usedExternalConnector, map(res2user, internalResolutions), map(res2user, externalResolutions)) - extPosition.exec_() - if not extPosition.result(): sys.exit(1) # the user canceled - extResolution = res2xrandr(externalResolutions[extPosition.extResolutions.currentIndex()]) - intResolution = res2xrandr(internalResolutions[extPosition.intResolutions.currentIndex()]) + dialogue = gui.getDialogue(usedExternalConnector, map(res2user, internalResolutions), map(res2user, externalResolutions)) + if not dialogue.run(): sys.exit(1) # the user canceled + extResolution = res2xrandr(externalResolutions[dialogue.getExtResolutionIndex()]) + intResolution = res2xrandr(internalResolutions[dialogue.getIntResolutionIndex()]) + relPosition = dialogue.getRelativeScreenPosition() # build command-line args[usedExternalConnector] = ["--mode", extResolution] # set external screen to desired resolution - if extPosition.extOnly.isChecked(): + if relPosition == RelativeScreenPosition.EXTERNAL_ONLY: args[usedExternalConnector] += ["--primary"] else: # there are two screens args[internalConnector] = ["--mode", intResolution] # set internal screen to desired resolution # set position - if extPosition.posLeft.isChecked(): + if relPosition == RelativeScreenPosition.LEFT: args[usedExternalConnector] += ["--left-of", internalConnector] else: args[usedExternalConnector] += ["--right-of", internalConnector] # set primary screen - if extPosition.primExt.isChecked(): + if dialogue.externalIsPrimary(): args[usedExternalConnector] += ["--primary"] else: args[internalConnector] += ["--primary"] diff --git a/gui.py b/gui.py index a85f2d5..b6906e1 100644 --- a/gui.py +++ b/gui.py @@ -18,7 +18,19 @@ # This file bstracts GUI stuff away, so that the actual dsl.py does not have to deal with it import sys from PyQt4 import QtGui +from qt_dialogue import PositionSelection app = QtGui.QApplication(sys.argv) def error(message): + '''Displays a fatal error to the user''' QtGui.QMessageBox.critical(None, 'Fatal error', message) + +def getDialogue(externalName, internalResolutions, externalResolutions): + '''Returns a class implementing the following functions: + * run() opens the dialogue. returns True if it was accepted, False otherwise + * getRelativeScreenPosition() returns one of the RelativeScreenPosition values (see dsl.py) + * getIntResolutionIndex() returns the index of an element in the internalResolutions list + * getExtResolutionIndex() returns the index of an element in the externalResolutions list + * externalIsPrimary() returns whether the external screen is the primary one (True) or the internal one (False) + ''' + return PositionSelection(externalName, internalResolutions, externalResolutions) diff --git a/selector_window.py b/qt_dialogue.py similarity index 86% rename from selector_window.py rename to qt_dialogue.py index 556158c..4ebcd62 100644 --- a/selector_window.py +++ b/qt_dialogue.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program (gpl.txt); if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from dsl import RelativeScreenPosition from PyQt4 import QtCore, QtGui def makeLayout(layout, members): @@ -25,10 +26,6 @@ def makeLayout(layout, members): return layout class PositionSelection(QtGui.QDialog): - LEFT = 10 - RIGHT = 20 - EXTERNAL_ONLY = 30 - def __init__(self, externalName, internalResolutions, externalResolutions): # set up main window super(PositionSelection, self).__init__() @@ -76,3 +73,24 @@ class PositionSelection(QtGui.QDialog): # add them all to the window self.setLayout(makeLayout(QtGui.QVBoxLayout(), [posBox, primBox, resBox, buttons])) + + def run(self): + self.exec_() + return True if self.result() else False + + def getRelativeScreenPosition(self): + if self.posLeft.isChecked(): + return RelativeScreenPosition.LEFT + elif self.posRight.isChecked(): + return RelativeScreenPosition.RIGHT + else: + return RelativeScreenPosition.EXTERNAL_ONLY + + def getIntResolutionIndex(self): + return self.intResolutions.currentIndex() + + def getExtResolutionIndex(self): + return self.extResolutions.currentIndex() + + def externalIsPrimary(self): + return self.primExt.isChecked() -- 2.30.2