# 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
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"]
# 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)
# 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):
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__()
# 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()