xephyr.py

Go to the documentation of this file.
00001 # Copyright 2005, 2006  Timo Savola
00002 #
00003 # This program is free software; you can redistribute it and/or modify
00004 # it under the terms of the GNU Lesser General Public License as published
00005 # by the Free Software Foundation; either version 2.1 of the License, or
00006 # (at your option) any later version.
00007 
00008 import os
00009 import signal
00010 import gobject
00011 import gtk
00012 import gtk.glade
00013 from gettext import gettext
00014 
00015 import environment
00016 import view
00017 import config
00018 
00019 datadir = None
00020 
00021 def init_extension(d):
00022         global datadir
00023         datadir = d
00024 
00025 ##
00026 ## Launcher
00027 
00028 class Launcher (environment.LauncherExtension):
00029         def __init__(self):
00030                 environment.LauncherExtension.__init__(self)
00031 
00032                 label = gettext('Xephyr X server')
00033                 self.action = gtk.Action(None, label, None, None)
00034                 self.action.set_visible(True)
00035 
00036         def get_action(self):
00037                 return self.action
00038 
00039         def create(self):
00040                 return View()
00041 
00042 gobject.type_register(Launcher)
00043 
00044 ##
00045 ## View
00046 
00047 class View (view.AbstractView):
00048         command = 'Xephyr'
00049         options = []
00050 
00051         def __init__(self):
00052                 view.AbstractView.__init__(self)
00053 
00054                 path = os.path.join(datadir, 'encode', 'xephyr.glade')
00055                 self.glade = gtk.glade.XML(path)
00056                 self.glade.signal_autoconnect(self)
00057 
00058                 self.config = config.Directory('encode/xephyr')
00059                 self.config.add_string ('command', self.set_command)
00060                 self.config.add_strings('options', self.set_options)
00061                 self.config.add_int    ('display', self.set_display)
00062                 self.config.add_ints   ('size',    self.set_size)
00063                 self.config.add_int    ('depth',   self.set_depth)
00064                 self.config.add_int    ('dpi',     self.set_dpi)
00065 
00066                 self.pid = None
00067 
00068         # Configuration
00069 
00070         def set_command(self, value):
00071                 self.command = value
00072 
00073         def set_options(self, values):
00074                 self.options = values
00075 
00076         def set_display(self, value):
00077                 self._set_value('display_spin', value)
00078 
00079         def set_size(self, values):
00080                 if len(values) == 2:
00081                         width, height = values
00082 
00083                         self._set_value('width_spin', width)
00084                         self._set_value('height_spin', height)
00085 
00086                         self._resize(width, height)
00087 
00088         def set_depth(self, value):
00089                 self._set_value('depth_spin', value)
00090 
00091         def set_dpi(self, value):
00092                 self._set_value('dpi_spin', value)
00093 
00094         # UI actions
00095 
00096         def on_run_toggled(self, button):
00097                 start = button.get_active()
00098                 if not (start ^ bool(self.pid)):
00099                         return
00100 
00101                 if start:
00102                         parent = self._get_id()
00103 
00104                         display = self._get_value('display_spin')
00105                         width   = self._get_value('width_spin')
00106                         height  = self._get_value('height_spin')
00107                         depth   = self._get_value('depth_spin')
00108                         dpi     = self._get_value('dpi_spin')
00109 
00110                         display_arg = ':%d' % display
00111                         parent_arg  = '%d' % parent
00112                         screen_arg  = '%dx%dx%d' % (width, height, depth)
00113                         dpi_arg     = '%d' % dpi
00114 
00115                         args = [self.command, display_arg, '-parent', parent_arg, '-screen', screen_arg, '-dpi', dpi_arg]
00116                         args += self.options
00117 
00118                         try:
00119                                 self.pid = os.spawnvp(os.P_NOWAIT, self.command, args)
00120                         except:
00121                                 button.set_active(False)
00122                                 raise
00123                 else:
00124                         try:
00125                                 os.kill(self.pid, signal.SIGTERM)
00126                                 os.waitpid(self.pid, 0)
00127                         finally:
00128                                 self.pid = None
00129 
00130                 for name in 'display_box', 'size_box', 'depth_box', 'dpi_box':
00131                         widget = self.glade.get_widget(name)
00132                         widget.set_sensitive(not start)
00133 
00134                 self.notify('relocatable')
00135 
00136         # UI events
00137 
00138         def on_size_changed(self, spinbutton):
00139                 width  = self._get_value('width_spin')
00140                 height = self._get_value('height_spin')
00141 
00142                 self._resize(width, height)
00143 
00144         def on_scrolledwindow_destroy(self, scrolledwindow):
00145                 self.config.remove_all()
00146 
00147                 if self.pid:
00148                         os.kill(self.pid, signal.SIGTERM)
00149                         os.waitpid(self.pid, 0)
00150 
00151         # View
00152 
00153         def is_relocatable(self):
00154                 return self.pid is None
00155 
00156         def get_label(self):
00157                 return self.glade.get_widget('title')
00158 
00159         def get_widget(self):
00160                 return self.glade.get_widget('scrolledwindow')
00161 
00162         # Display
00163 
00164         def _get_display(self):
00165                 if self.pid:
00166                         return self._get_value('display_spin')
00167                 else:
00168                         return None
00169 
00170         # SpinButton helpers
00171 
00172         def _set_value(self, name, value):
00173                 widget = self.glade.get_widget(name)
00174                 widget.set_value(value)
00175 
00176         def _get_value(self, name):
00177                 widget = self.glade.get_widget(name)
00178                 return widget.get_value_as_int()
00179 
00180         # Placeholder helpers
00181 
00182         def _resize(self, width, height):
00183                 viewport = self.glade.get_widget('viewport')
00184                 viewport.set_size_request(width, height)
00185 
00186         def _get_id(self):
00187                 placeholder = self.glade.get_widget('placeholder')
00188                 return placeholder.window.xid
00189 
00190 gobject.type_register(View)

Generated on Thu Jan 18 09:47:40 2007 for Encode by  doxygen 1.4.7