class Parti(object): def __init__(self, options): self._wm = Wm("Parti", options.replace) self._wm.connect("new-window", self._new_window_signaled) self._wm.connect("quit", self._wm_quit) self._trays = TraySet() self._trays.connect("changed", self._desktop_list_changed) # Create our display stage self._world_organizer = WorldOrganizer(self._trays) self._wm.get_property("toplevel").add(self._world_organizer) self._world_organizer.show_all() ltray = options.tray.lower() # __import__ returns topmost module and getattr will not get sub-modules not imported # thus (using these two functions) the module path must be specified twice dynmodule = getattr( getattr(__import__('parti.trays.' + ltray), 'trays'), ltray) dynclass = getattr(dynmodule, options.tray + "Tray") self._trays.new(u("default"), dynclass) self._root_hotkeys = HotkeyManager(gtk.gdk.get_default_root_window()) self._root_hotkeys.add_hotkeys({"<shift><alt>r": "repl"}) self._root_hotkeys.connect("hotkey::repl", lambda *args: self.spawn_repl_window()) for window in self._wm.get_property("windows"): self._add_new_window(window) # Start providing D-Bus api self._dbus = PartiDBusService(self) def main(self): gtk.main() def _wm_quit(self, *args): gtk_main_quit_really() def _new_window_signaled(self, wm, window): self._add_new_window(window) def _add_new_window(self, window): # FIXME: be less stupid self._trays.trays[0].add(window) def _desktop_list_changed(self, *args): self._wm.emit("desktop-list-changed", self._trays.tags()) def spawn_repl_window(self): spawn_repl_window( self._wm, { "parti": self, "wm": self._wm, "windows": self._wm.get_property("windows"), "trays": self._trays, "lowlevel": wimpiggy.lowlevel })
class Parti(object): def __init__(self, options): self._wm = Wm("Parti", options.replace) self._wm.connect("new-window", self._new_window_signaled) self._wm.connect("quit", self._wm_quit) self._trays = TraySet() self._trays.connect("changed", self._desktop_list_changed) # Create our display stage self._world_organizer = WorldOrganizer(self._trays) self._wm.get_property("toplevel").add(self._world_organizer) self._world_organizer.show_all() ltray = options.tray.lower() # __import__ returns topmost module and getattr will not get sub-modules not imported # thus (using these two functions) the module path must be specified twice dynmodule = getattr(getattr(__import__('parti.trays.' + ltray), 'trays'), ltray) dynclass = getattr(dynmodule, options.tray + "Tray") self._trays.new(u("default"), dynclass) self._root_hotkeys = HotkeyManager(gtk.gdk.get_default_root_window()) self._root_hotkeys.add_hotkeys({"<shift><alt>r": "repl"}) self._root_hotkeys.connect("hotkey::repl", lambda *args: self.spawn_repl_window()) for window in self._wm.get_property("windows"): self._add_new_window(window) # Start providing D-Bus api self._dbus = PartiDBusService(self) def main(self): gtk.main() def _wm_quit(self, *args): gtk_main_quit_really() def _new_window_signaled(self, wm, window): self._add_new_window(window) def _add_new_window(self, window): # FIXME: be less stupid self._trays.trays[0].add(window) def _desktop_list_changed(self, *args): self._wm.emit("desktop-list-changed", self._trays.tags()) def spawn_repl_window(self): spawn_repl_window(self._wm, {"parti": self, "wm": self._wm, "windows": self._wm.get_property("windows"), "trays": self._trays, "lowlevel": wimpiggy.lowlevel})
class Parti(object): def __init__(self, replace_other_wm): self._wm = Wm("Parti", replace_other_wm) self._wm.connect("new-window", self._new_window_signaled) self._wm.connect("quit", self._wm_quit) self._trays = TraySet() self._trays.connect("changed", self._desktop_list_changed) # Create our display stage self._world_organizer = WorldOrganizer(self._trays) self._wm.get_property("toplevel").add(self._world_organizer) self._world_organizer.show_all() # FIXME: be less stupid #self._trays.new(u"default", SimpleTabTray) from parti.trays.compositetest import CompositeTest self._trays.new(u"default", CompositeTest) self._root_hotkeys = HotkeyManager(gtk.gdk.get_default_root_window()) self._root_hotkeys.add_hotkeys({"<shift><alt>r": "repl"}) self._root_hotkeys.connect("hotkey::repl", lambda *args: self.spawn_repl_window()) for window in self._wm.get_property("windows"): self._add_new_window(window) # Start providing D-Bus api self._dbus = PartiDBusService(self) def main(self): gtk.main() def _wm_quit(self, *args): gtk_main_quit_really() def _new_window_signaled(self, wm, window): self._add_new_window(window) def _add_new_window(self, window): # FIXME: be less stupid self._trays.trays[0].add(window) def _desktop_list_changed(self, *args): self._wm.emit("desktop-list-changed", self._trays.tags()) def spawn_repl_window(self): spawn_repl_window(self._wm, {"parti": self, "wm": self._wm, "windows": self._wm.get_property("windows"), "trays": self._trays, "lowlevel": wimpiggy.lowlevel})
class XpraServer(gobject.GObject, X11ServerBase): __gsignals__ = { "wimpiggy-child-map-event": one_arg_signal, "wimpiggy-cursor-event": one_arg_signal, } def __init__(self, clobber, sockets, opts): self._tray = None gobject.GObject.__init__(self) X11ServerBase.__init__(self, clobber, sockets, opts) def x11_init(self, clobber): X11ServerBase.x11_init(self, clobber) init_x11_filter() self._has_focus = 0 # Do this before creating the Wm object, to avoid clobbering its # selecting SubstructureRedirect. root = gtk.gdk.get_default_root_window() root.set_events(root.get_events() | gtk.gdk.SUBSTRUCTURE_MASK) root.property_change(gtk.gdk.atom_intern("XPRA_SERVER", False), gtk.gdk.atom_intern("STRING", False), 8, gtk.gdk.PROP_MODE_REPLACE, xpra.__version__) add_event_receiver(root, self) ### Create the WM object self._wm = Wm("Xpra", clobber) self._wm.connect("new-window", self._new_window_signaled) self._wm.connect("window-resized", self._window_resized_signaled) self._wm.connect("bell", self._bell_signaled) self._wm.connect("quit", lambda _: self.quit(True)) self.default_cursor_data = None self.last_cursor_serial = None self.send_cursor_pending = False self.cursor_data = None def get_default_cursor(): self.default_cursor_data = get_cursor_image() log("get_default_cursor=%s", self.default_cursor_data) trap.swallow_synced(get_default_cursor) self._wm.enableCursors(True) def set_workarea(self, workarea): self._wm.set_workarea(workarea.x, workarea.y, workarea.width, workarea.height) def get_transient_for(self, window): return self._desktop_manager.get_transient_for(window, self._window_to_id) def is_shown(self, window): return self._desktop_manager.is_shown(window) def cleanup(self, *args): if self._tray: self._tray.cleanup() self._tray = None X11ServerBase.cleanup(self) def load_existing_windows(self, system_tray): # Tray handler: if system_tray: try: self._tray = SystemTray() except Exception, e: log.error("cannot setup tray forwarding: %s", e, exc_info=True) ### Create our window managing data structures: self._desktop_manager = DesktopManager() self._wm.get_property("toplevel").add(self._desktop_manager) self._desktop_manager.show_all() ### Load in existing windows: for window in self._wm.get_property("windows"): self._add_new_window(window) root = gtk.gdk.get_default_root_window() for window in get_children(root): if is_override_redirect(window) and is_mapped(window): self._add_new_or_window(window)
class XpraServer(gobject.GObject): __gsignals__ = { "wimpiggy-child-map-event": one_arg_signal, } def __init__(self, clobber, sockets): gobject.GObject.__init__(self) # Do this before creating the Wm object, to avoid clobbering its # selecting SubstructureRedirect. root = gtk.gdk.get_default_root_window() root.set_events(root.get_events() | gtk.gdk.SUBSTRUCTURE_MASK) add_event_receiver(root, self) ### Create the WM object self._wm = Wm("Xpra", clobber) self._wm.connect("new-window", self._new_window_signaled) self._wm.connect("quit", lambda _: self.quit(True)) ### Create our window managing data structures: self._desktop_manager = DesktopManager() self._wm.get_property("toplevel").add(self._desktop_manager) self._desktop_manager.show_all() self._window_to_id = {} self._id_to_window = {} # Window id 0 is reserved for "not a window" self._max_window_id = 1 ### Load in existing windows: for window in self._wm.get_property("windows"): self._add_new_window(window) for window in get_children(root): if (is_override_redirect(window) and is_mapped(window)): self._add_new_or_window(window) ### Set up keymap: self._keymap = gtk.gdk.keymap_get_default() self._keymap.connect("keys-changed", self._keys_changed) self._keys_changed() try: xmodmap = subprocess.Popen(["xmodmap", "-"], stdin=subprocess.PIPE) except OSError, e: sys.stderr.write("Error running xmodmap: %s\n" % (e,)) xmodmap.communicate("""clear Lock clear Shift clear Control clear Mod1 clear Mod2 clear Mod3 clear Mod4 clear Mod5 keycode any = Shift_L keycode any = Control_L keycode any = Meta_L keycode any = Alt_L keycode any = Hyper_L keycode any = Super_L add Shift = Shift_L Shift_R add Control = Control_L Control_R add Mod1 = Meta_L Meta_R add Mod2 = Alt_L Alt_R add Mod3 = Hyper_L Hyper_R add Mod4 = Super_L Super_R """ # Really stupid hack to force backspace to work. # Remove this once we have real keymap support. + "keycode any = BackSpace") self._keyname_for_mod = { "shift": "Shift_L", "control": "Control_L", "meta": "Meta_L", "super": "Super_L", "hyper": "Hyper_L", "alt": "Alt_L", } ### Clipboard handling: self._clipboard_helper = ClipboardProtocolHelper(self._send) ### Misc. state: self._has_focus = 0 self._upgrading = False ### All right, we're ready to accept customers: self._protocol = None self._potential_protocols = [] for sock in sockets: self.add_listen_socket(sock)