properly open and close processes
[lilass.git] / gui.py
1 # DSL - easy Display Setup for Laptops
2 # Copyright (C) 2012 Ralf Jung <post@ralfj.de>
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 # This file abstracts GUI stuff away, so that the actual dsl.py does not have to deal with it
19 import sys
20
21 '''
22 This module implements two functions:
23
24 def error(message):
25         This function displays the error message to the user in some appropriate fassion
26
27 def setup(internalResolutions, externalResolutions):
28         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.
29         The user should be asked about his display setup preferences.
30         The function returns None if the user cancelled, and an instance of dsl.ScreenSetup otherwise.
31 '''
32
33 # frontend detectors
34 def qtAvailable():
35         try:
36                 import PyQt4
37                 return True
38         except ImportError:
39                 return False
40
41 def zenityAvailable():
42         try:
43                 from dsl import processOutputIt
44                 processOutputIt("zenity", "--version")
45                 return True
46         except Exception:
47                 return False
48
49 # actual frontends
50 if qtAvailable():
51         from PyQt4 import QtGui
52         from qt_dialogue import PositionSelection
53         app = QtGui.QApplication(sys.argv)
54         
55         def error(message):
56                 QtGui.QMessageBox.critical(None, 'Fatal error', message)
57         
58         def setup(internalResolutions, externalResolutions):
59                 return PositionSelection(internalResolutions, externalResolutions).run()
60
61 elif zenityAvailable():
62         import subprocess
63         from zenity_dialogue import run as setup # this provides the setup function
64         
65         def error(message):
66                 '''Displays a fatal error to the user'''
67                 subprocess.check_call(["zenity", "--error", "--text="+message])
68
69 else:
70         print >> sys.stderr, 'No GUI frontend available, please make sure PyQt4 or Zenity is installed'