def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: prop = target.property_get(name) if not prop or len(prop)!=3 or len(prop[2])!=1: return None log("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception as e: log.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)
def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: name_atom = Gdk.Atom.intern(name, False) type_atom = Gdk.Atom.intern("CARDINAL", False) prop = Gdk.property_get(target, name_atom, type_atom, 0, 9999, False) if not prop or len(prop)!=3 or len(prop[2])!=1: return None log("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception as e: log.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)
def xget_u32_property(self, target, name): if HAS_X11_BINDINGS: return GTKClientWindowBase.xget_u32_property(self, target, name) #pure Gdk lookup: try: name_atom = Gdk.Atom.intern(name, False) type_atom = Gdk.Atom.intern("CARDINAL", False) prop = Gdk.property_get(target, name_atom, type_atom, 0, 9999, False) if not prop or len(prop)!=3 or len(prop[2])!=1: return None metalog("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception as e: metalog.error("xget_u32_property error on %s / %s: %s", target, name, e)
class ClientWindow(GTKClientWindowBase): WINDOW_POPUP = Gtk.WindowType.POPUP WINDOW_TOPLEVEL = Gtk.WindowType.TOPLEVEL #where have those values gone? #gi/pygtk3 docs are terrible for this WINDOW_EVENT_MASK = 0 OR_TYPE_HINTS = [] NAME_TO_HINT = {} SCROLL_MAP = {} WINDOW_STATE_FULLSCREEN = Gdk.WindowState.FULLSCREEN WINDOW_STATE_MAXIMIZED = Gdk.WindowState.MAXIMIZED WINDOW_STATE_ICONIFIED = Gdk.WindowState.ICONIFIED def init_window(self, metadata): #TODO: no idea how to do the window-type with gtk3 #maybe not even be possible.. Gtk.Window.__init__(self) GTKClientWindowBase.init_window(self, metadata) # tell KDE/oxygen not to intercept clicks # see: https://bugs.kde.org/show_bug.cgi?id=274485 # does not work with gtk3? what the?? #self.set_data(strtobytes("_kde_no_window_grab"), 1) def new_backing(self, w, h): self._backing = self.make_new_backing(CairoBacking, w, h) def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: name_atom = Gdk.Atom.intern(name, False) type_atom = Gdk.Atom.intern("CARDINAL", False) prop = Gdk.property_get(target, name_atom, type_atom, 0, 9999, False) if not prop or len(prop) != 3 or len(prop[2]) != 1: return None log("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception, e: log.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)
class ClientWindow(GTKClientWindowBase): #WINDOW_POPUP = Gtk.WindowType.POPUP #WINDOW_TOPLEVEL = Gtk.WindowType.TOPLEVEL WINDOW_EVENT_MASK = GTK3_WINDOW_EVENT_MASK BUTTON_MASK = GTK3_BUTTON_MASK SCROLL_MAP = GTK3_SCROLL_MAP OR_TYPE_HINTS = GTK3_OR_TYPE_HINTS NAME_TO_HINT = GTK3_NAME_TO_HINT WINDOW_STATE_FULLSCREEN = Gdk.WindowState.FULLSCREEN WINDOW_STATE_MAXIMIZED = Gdk.WindowState.MAXIMIZED WINDOW_STATE_ICONIFIED = Gdk.WindowState.ICONIFIED def init_window(self, metadata): #TODO: no idea how to do the window-type with gtk3 #maybe not even be possible.. window_type = Gtk.WindowType.TOPLEVEL if self._override_redirect: window_type = Gtk.WindowType.POPUP Gtk.Window.__init__(self, type=window_type, decorated=not self._override_redirect, app_paintable=True) GTKClientWindowBase.init_window(self, metadata) # tell KDE/oxygen not to intercept clicks # see: https://bugs.kde.org/show_bug.cgi?id=274485 # does not work with gtk3? what the?? #self.set_data(strtobytes("_kde_no_window_grab"), 1) def motion(w, event): self.do_motion_notify_event(event) self.connect("motion-notify-event", motion) def press(w, event): self.do_button_press_event(event) self.connect("button-press-event", press) def release(w, event): self.do_button_release_event(event) self.connect("button-release-event", release) def scroll(w, event): self.do_scroll_event(event) self.connect("scroll-event", scroll) def get_backing_class(self): return CairoBacking def gdk_window(self): return self.get_window() def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: name_atom = Gdk.Atom.intern(name, False) type_atom = Gdk.Atom.intern("CARDINAL", False) prop = Gdk.property_get(target, name_atom, type_atom, 0, 9999, False) if not prop or len(prop) != 3 or len(prop[2]) != 1: return None log("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception, e: log.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)
class GTK2WindowBase(GTKClientWindowBase): WINDOW_EVENT_MASK = GTK2_WINDOW_EVENT_MASK OR_TYPE_HINTS = GTK2_OR_TYPE_HINTS NAME_TO_HINT = GTK2_NAME_TO_HINT SCROLL_MAP = GTK2_SCROLL_MAP BUTTON_MASK = GTK2_BUTTON_MASK WINDOW_STATE_FULLSCREEN = gdk.WINDOW_STATE_FULLSCREEN WINDOW_STATE_MAXIMIZED = gdk.WINDOW_STATE_MAXIMIZED WINDOW_STATE_ICONIFIED = gdk.WINDOW_STATE_ICONIFIED def init_window(self, metadata): if self._override_redirect: gtk.Window.__init__(self, gtk.WINDOW_POPUP) else: gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) GTKClientWindowBase.init_window(self, metadata) # tell KDE/oxygen not to intercept clicks # see: https://bugs.kde.org/show_bug.cgi?id=274485 self.set_data("_kde_no_window_grab", 1) def setup_window(self): #preserve screen: if not self._override_redirect: display = gtk.gdk.display_get_default() screen_num = self._client_properties.get("screen", -1) n = display.get_n_screens() log("setup_window() screen=%s, nscreens=%s", screen_num, n) if screen_num>=0 and screen_num<n: screen = display.get_screen(screen_num) if screen: self.set_screen(screen) GTKClientWindowBase.setup_window(self) def set_alpha(self): #by default, only RGB (no transparency): #rgb_formats = list(BACKING_CLASS.RGB_MODES) self._client_properties["encodings.rgb_formats"] = ["RGB", "RGBX"] if not self._has_alpha: self._client_properties["encoding.transparency"] = False return if self._has_alpha and not self.is_realized(): screen = self.get_screen() rgba = screen.get_rgba_colormap() if rgba is None: self._has_alpha = False self._client_properties["encoding.transparency"] = False log.error("cannot handle window transparency on screen %s", screen) else: log("set_alpha() using rgba colormap for %s, realized=%s", self._id, self.is_realized()) self.set_colormap(rgba) self._client_properties["encodings.rgb_formats"] = ["RGBA", "RGB", "RGBX"] def set_modal(self, modal): #with gtk2 setting the window as modal would prevent #all other windows we manage from receiving input #including other unrelated applications #what we want is "window-modal" log("set_modal(%s) swallowed", modal) def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: prop = target.property_get(name) if not prop or len(prop)!=3 or len(prop[2])!=1: return None log("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception, e: log.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)
class ClientWindow(GTKClientWindowBase): WINDOW_EVENT_MASK = gdk.STRUCTURE_MASK | gdk.KEY_PRESS_MASK | gdk.KEY_RELEASE_MASK \ | gdk.POINTER_MOTION_MASK | gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK \ | gdk.PROPERTY_CHANGE_MASK OR_TYPE_HINTS = [ gdk.WINDOW_TYPE_HINT_DIALOG, gdk.WINDOW_TYPE_HINT_MENU, gdk.WINDOW_TYPE_HINT_TOOLBAR, #gdk.WINDOW_TYPE_HINT_SPLASHSCREEN, gdk.WINDOW_TYPE_HINT_UTILITY, #gdk.WINDOW_TYPE_HINT_DOCK, gdk.WINDOW_TYPE_HINT_DESKTOP, gdk.WINDOW_TYPE_HINT_DROPDOWN_MENU, gdk.WINDOW_TYPE_HINT_POPUP_MENU, gdk.WINDOW_TYPE_HINT_TOOLTIP, #gdk.WINDOW_TYPE_HINT_NOTIFICATION, gdk.WINDOW_TYPE_HINT_COMBO, gdk.WINDOW_TYPE_HINT_DND ] NAME_TO_HINT = { "NORMAL": gdk.WINDOW_TYPE_HINT_NORMAL, "DIALOG": gdk.WINDOW_TYPE_HINT_DIALOG, "MENU": gdk.WINDOW_TYPE_HINT_MENU, "TOOLBAR": gdk.WINDOW_TYPE_HINT_TOOLBAR, "SPLASH": gdk.WINDOW_TYPE_HINT_SPLASHSCREEN, "UTILITY": gdk.WINDOW_TYPE_HINT_UTILITY, "DOCK": gdk.WINDOW_TYPE_HINT_DOCK, "DESKTOP": gdk.WINDOW_TYPE_HINT_DESKTOP, "DROPDOWN_MENU": gdk.WINDOW_TYPE_HINT_DROPDOWN_MENU, "POPUP_MENU": gdk.WINDOW_TYPE_HINT_POPUP_MENU, "TOOLTIP": gdk.WINDOW_TYPE_HINT_TOOLTIP, "NOTIFICATION": gdk.WINDOW_TYPE_HINT_NOTIFICATION, "COMBO": gdk.WINDOW_TYPE_HINT_COMBO, "DND": gdk.WINDOW_TYPE_HINT_DND } # Map scroll directions back to mouse buttons. Mapping is taken from # gdk/x11/gdkevents-x11.c. SCROLL_MAP = { gdk.SCROLL_UP: 4, gdk.SCROLL_DOWN: 5, gdk.SCROLL_LEFT: 6, gdk.SCROLL_RIGHT: 7, } WINDOW_STATE_FULLSCREEN = gdk.WINDOW_STATE_FULLSCREEN WINDOW_STATE_MAXIMIZED = gdk.WINDOW_STATE_MAXIMIZED def init_window(self, metadata): if self._override_redirect: gtk.Window.__init__(self, gtk.WINDOW_POPUP) else: gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) GTKClientWindowBase.init_window(self, metadata) # tell KDE/oxygen not to intercept clicks # see: https://bugs.kde.org/show_bug.cgi?id=274485 self.set_data("_kde_no_window_grab", 1) def setup_window(self): #preserve screen: if not self._override_redirect: display = gtk.gdk.display_get_default() screen_num = self._client_properties.get("screen") if screen_num is not None and screen_num >= 0 and screen_num < display.get_n_screens( ): screen = display.get_screen(screen_num) if screen: self.set_screen(screen) GTKClientWindowBase.setup_window(self) def set_alpha(self): #by default, only RGB (no transparency): self._client_properties["encodings.rgb_formats"] = ["RGB"] if not HAS_ALPHA: self._client_properties["encoding.transparency"] = False self._has_alpha = False return if self._has_alpha and not self.is_realized(): screen = self.get_screen() rgba = screen.get_rgba_colormap() if rgba is None: self._has_alpha = False self._client_properties["encoding.transparency"] = False self.error("cannot handle window transparency on screen %s", screen) else: self.debug( "set_alpha() using rgba colormap for %s, realized=%s", self._id, self.is_realized()) self.set_colormap(rgba) self._client_properties["encodings.rgb_formats"] = ["RGBA"] def set_modal(self, modal): #with gtk2 setting the window as modal would prevent #all other windows we manage from receiving input #including other unrelated applications #what we want is "window-modal" self.debug("set_modal(%s) swallowed", modal) def new_backing(self, w, h): self._backing = self.make_new_backing(BACKING_CLASS, w, h) def xget_u32_property(self, target, name): try: if not HAS_X11_BINDINGS: prop = target.property_get(name) if not prop or len(prop) != 3 or len(prop[2]) != 1: return None self.debug("xget_u32_property(%s, %s)=%s", target, name, prop[2][0]) return prop[2][0] except Exception, e: self.error("xget_u32_property error on %s / %s: %s", target, name, e) return GTKClientWindowBase.xget_u32_property(self, target, name)