X-Git-Url: https://git.ralfj.de/lilass.git/blobdiff_plain/a9394222c323143c0fea03848a3f1daf79017a00..HEAD:/gui.py diff --git a/gui.py b/gui.py index 6dabe0f..4847668 100644 --- a/gui.py +++ b/gui.py @@ -1,5 +1,5 @@ # DSL - easy Display Setup for Laptops -# Copyright (C) 2012 Ralf Jung +# Copyright (C) 2012-2015 Ralf Jung # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,55 +16,44 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # This file abstracts GUI stuff away, so that the actual dsl.py does not have to deal with it -import sys ''' This module implements two functions: def error(message): - This function displays the error message to the user in some appropriate fassion + This function displays the error message to the user in some appropriate fassion def setup(internalResolutions, externalResolutions): - Both arguments are lists of (width, height) tuples of resolutions. You can use dsl.res2user to obtain a user-readable representation of a resolution tuple. - The user should be asked about his display setup preferences. - The function returns None if the user cancelled, and an instance of dsl.ScreenSetup otherwise. + Both arguments are lists of (width, height) tuples of resolutions. You can use dsl.res2user to obtain a user-readable representation of a resolution tuple. + The user should be asked about his display setup preferences. + The function returns None if the user cancelled, and an instance of dsl.ScreenSetup otherwise. ''' - -# frontend detectors -def qtAvailable(): - try: - import PyQt4 - return True - except ImportError: - return False - -def zenityAvailable(): - try: - from dsl import processOutputIt - processOutputIt("zenity", "--version") - return True - except Exception: - return False - -# actual frontends -if qtAvailable(): - from PyQt4 import QtGui - from qt_dialogue import PositionSelection - app = QtGui.QApplication(sys.argv) - - def error(message): - QtGui.QMessageBox.critical(None, 'Fatal error', message) - - def setup(internalResolutions, externalResolutions): - return PositionSelection(internalResolutions, externalResolutions).run() - -elif zenityAvailable(): - import subprocess - from zenity_dialogue import run as setup # this provides the setup function - - def error(message): - '''Displays a fatal error to the user''' - subprocess.check_call(["zenity", "--error", "--text="+message]) - -else: - print >> sys.stderr, 'No GUI frontend available, please make sure PyQt4 or Zenity is installed' +import collections + +from qt_frontend import QtFrontend +from cli_frontend import CLIFrontend +from zenity_frontend import ZenityFrontend + + +# list of available frontends +frontends = collections.OrderedDict() +frontends["qt"] = QtFrontend +frontends["zenity"] = ZenityFrontend +frontends["cli"] = CLIFrontend + +# get a frontend +def getFrontend(name = None): + # by name + if name is not None: + if name in frontends: + if frontends[name].isAvailable(): + return frontends[name]() # call constructor + else: + raise Exception("Frontend %s not available" % name) + # frontend not found + raise Exception("Frontend %s not found" % name) + # auto-detect + for frontend in frontends.values(): + if frontend.isAvailable(): + return frontend() # call constructor + raise Exception("No frontend is available - this should not happen")