00001
00002
00003
00004
00005
00006
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
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
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
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
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
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
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
00163
00164 def _get_display(self):
00165 if self.pid:
00166 return self._get_value('display_spin')
00167 else:
00168 return None
00169
00170
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
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)