def __init__(self, name, replace_other_wm, display=None): gobject.GObject.__init__(self) self._name = name if display is None: display = gtk.gdk.display_manager_get().get_default_display() self._display = display self._alt_display = gtk.gdk.Display(self._display.get_name()) self._root = self._display.get_default_screen().get_root_window() self._ewmh_window = None self._windows = {} # EWMH says we have to know the order of our windows oldest to # youngest... self._windows_in_order = [] # Become the Official Window Manager of this year's display: self._wm_selection = wimpiggy.selection.ManagerSelection( self._display, "WM_S0") self._wm_selection.connect("selection-lost", self._lost_wm_selection) # May throw AlreadyOwned: if replace_other_wm: mode = self._wm_selection.FORCE else: mode = self._wm_selection.IF_UNOWNED self._wm_selection.acquire(mode) # (If we become a compositing manager, then we will want to do the # same thing with the _NET_WM_CM_S0 selection (says EWMH). AFAICT # this basically will just be used by clients to know that they can # use RGBA visuals.) # Set up the necessary EWMH properties on the root window. self._setup_ewmh_window() prop_set(self._root, "_NET_SUPPORTED", ["atom"], self._NET_SUPPORTED) prop_set(self._root, "_NET_DESKTOP_VIEWPORT", ["u32"], [0, 0]) # Load up our full-screen widget self._world_window = WorldWindow() self._world_window.set_screen(self._display.get_default_screen()) self.notify("toplevel") self._world_window.show_all() # Okay, ready to select for SubstructureRedirect and then load in all # the existing clients. add_event_receiver(self._root, self) substructureRedirect(self._root) for w in get_children(self._root): # Checking for FOREIGN here filters out anything that we've # created ourselves (like, say, the world window), and checking # for mapped filters out any withdrawn windows. if (w.get_window_type() == gtk.gdk.WINDOW_FOREIGN and not is_override_redirect(w) and is_mapped(w)): log("Wm managing pre-existing child") self._manage_client(w) # Also watch for focus change events on the root window selectFocusChange(self._root) selectBellNotification(self._root, True)
def test_configureAndNotify(self): self.conf_ev = None l.substructureRedirect(self.root()) l.add_event_receiver(self.root(), self) # Need to hold onto a handle to this, so connection doesn't get # dropped: client = self.clone_display() w1_client = self.window(client) gtk.gdk.flush() w1_wm = l.get_pywindow(self.display, l.get_xwindow(w1_client)) l.configureAndNotify(w1_client, 11, 12, 13, 14) gtk.main() assert self.conf_ev is not None assert self.conf_ev.delivered_to is self.root() assert self.conf_ev.window is w1_wm assert self.conf_ev.x == 11 assert self.conf_ev.y == 12 assert self.conf_ev.width == 13 assert self.conf_ev.height == 14 assert self.conf_ev.border_width == 0 assert self.conf_ev.value_mask == (l.const["CWX"] | l.const["CWY"] | l.const["CWWidth"] | l.const["CWHeight"] | l.const["CWBorderWidth"]) partial_mask = l.const["CWWidth"] | l.const["CWStackMode"] l.configureAndNotify(w1_client, 11, 12, 13, 14, partial_mask) gtk.main() assert self.conf_ev is not None assert self.conf_ev.delivered_to is self.root() assert self.conf_ev.window is w1_wm assert self.conf_ev.width == 13 assert self.conf_ev.border_width == 0 assert self.conf_ev.value_mask == (l.const["CWWidth"] | l.const["CWBorderWidth"])
def test_substructure_redirect(self): self.map_ev = None self.conf_ev = None root = self.root() d2 = self.clone_display() w2 = self.window(d2) gtk.gdk.flush() w1 = l.get_pywindow(self.display, l.get_xwindow(w2)) l.add_event_receiver(root, self) l.substructureRedirect(root) gtk.gdk.flush() # gdk_window_show does both a map and a configure (to raise the # window) print("showing w2") w2.show() # Can't just call gtk.main() twice, the two events may be delivered # together and processed in a single mainloop iteration. while None in (self.map_ev, self.conf_ev): gtk.main() assert self.map_ev.delivered_to is root assert self.map_ev.window is w1 assert self.conf_ev.delivered_to is root assert self.conf_ev.window is w1 for field in ("x", "y", "width", "height", "border_width", "above", "detail", "value_mask"): print(field) assert hasattr(self.conf_ev, field) self.map_ev = None self.conf_ev = None w2.move_resize(1, 2, 3, 4) gtk.main() assert self.map_ev is None assert self.conf_ev is not None assert self.conf_ev.delivered_to is root assert self.conf_ev.window is w1 assert self.conf_ev.x == 1 assert self.conf_ev.y == 2 assert self.conf_ev.width == 3 assert self.conf_ev.height == 4 assert self.conf_ev.value_mask == (l.const["CWX"] | l.const["CWY"] | l.const["CWWidth"] | l.const["CWHeight"]) self.map_ev = None self.conf_ev = None w2.move(5, 6) gtk.main() assert self.map_ev is None assert self.conf_ev.x == 5 assert self.conf_ev.y == 6 assert self.conf_ev.value_mask == (l.const["CWX"] | l.const["CWY"]) self.map_ev = None self.conf_ev = None w2.raise_() gtk.main() assert self.map_ev is None assert self.conf_ev.detail == l.const["Above"] assert self.conf_ev.value_mask == l.const["CWStackMode"]
def __init__(self, name, replace_other_wm, display=None): gobject.GObject.__init__(self) self._name = name if display is None: display = gtk.gdk.display_manager_get().get_default_display() self._display = display self._alt_display = gtk.gdk.Display(self._display.get_name()) self._root = self._display.get_default_screen().get_root_window() self._ewmh_window = None self._windows = {} # EWMH says we have to know the order of our windows oldest to # youngest... self._windows_in_order = [] # Become the Official Window Manager of this year's display: self._wm_selection = wimpiggy.selection.ManagerSelection(self._display, "WM_S0") self._wm_selection.connect("selection-lost", self._lost_wm_selection) # May throw AlreadyOwned: if replace_other_wm: mode = self._wm_selection.FORCE else: mode = self._wm_selection.IF_UNOWNED self._wm_selection.acquire(mode) # (If we become a compositing manager, then we will want to do the # same thing with the _NET_WM_CM_S0 selection (says EWMH). AFAICT # this basically will just be used by clients to know that they can # use RGBA visuals.) # Set up the necessary EWMH properties on the root window. self._setup_ewmh_window() prop_set(self._root, "_NET_SUPPORTED", ["atom"], self._NET_SUPPORTED) prop_set(self._root, "_NET_DESKTOP_VIEWPORT", ["u32"], [0, 0]) # Load up our full-screen widget self._world_window = WorldWindow() self._world_window.set_screen(self._display.get_default_screen()) self.notify("toplevel") self._world_window.show_all() # Okay, ready to select for SubstructureRedirect and then load in all # the existing clients. add_event_receiver(self._root, self) substructureRedirect(self._root) for w in get_children(self._root): # Checking for FOREIGN here filters out anything that we've # created ourselves (like, say, the world window), and checking # for mapped filters out any withdrawn windows. if (w.get_window_type() == gtk.gdk.WINDOW_FOREIGN and not is_override_redirect(w) and is_mapped(w)): log("Wm managing pre-existing child") self._manage_client(w) # Also watch for focus change events on the root window selectFocusChange(self._root) selectBellNotification(self._root, True)