Example #1
0
    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)
Example #2
0
 def destroy(self):
     self.cancel_show_pointer_overlay_timer()
     self.cancel_remove_pointer_overlay_timer()
     if self.recheck_focus_timer>0:
         self.source_remove(self.recheck_focus_timer)
         self.recheck_focus_timer = -1
     GTKClientWindowBase.destroy(self)
Example #3
0
    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)
Example #4
0
 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)
Example #5
0
 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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 def setup_window(self, *args):
     #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%s screen=%s, nscreens=%s", args, screen_num, n)
         if screen_num>=0 and screen_num<n and n>0:
             screen = display.get_screen(screen_num)
             if screen:
                 self.set_screen(screen)
     GTKClientWindowBase.setup_window(self, *args)
Example #9
0
 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)
Example #10
0
 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)
     #add platform hooks
     self.connect("realize", self.on_realize)
     self.connect('unrealize', self.on_unrealize)
Example #11
0
 def on_realize(self, widget):
     GTKClientWindowBase.on_realize(self, widget)
     #hook up the X11 gdk event notifications so we can get focus-out when grabs are active:
     if add_event_receiver:
         self._focus_latest = None
         grablog("adding event receiver so we can get FocusIn and FocusOut events whilst grabbing the keyboard")
         add_event_receiver(self.get_window(), self)
     #other platforms should bet getting regular focus events instead:
     def focus_in(window, event):
         grablog("focus-in-event for wid=%s", self._id)
         self.do_xpra_focus_in_event(event)
     def focus_out(window, event):
         grablog("focus-out-event for wid=%s", self._id)
         self.do_xpra_focus_out_event(event)
     self.connect("focus-in-event", focus_in)
     self.connect("focus-out-event", focus_out)
Example #12
0
 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)
Example #13
0
 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)
Example #14
0
 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)
Example #15
0
 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)
Example #16
0
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)
Example #17
0
 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)
Example #18
0
 def init_drawing_area(self):
     GTKClientWindowBase.init_drawing_area(self)
     self.drawing_area.connect("expose-event",
                               self.do_drawing_area_expose_event)
Example #19
0
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)
Example #20
0
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)
Example #21
0
 def init_widget_events(self, widget):
     GTKClientWindowBase.init_widget_events(self, widget)
     widget.connect("draw", self.drawing_area_draw)
Example #22
0
 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)
Example #23
0
 def destroy(self):
     if self.recheck_focus_timer > 0:
         self.source_remove(self.recheck_focus_timer)
         self.recheck_focus_timer = -1
     GTKClientWindowBase.destroy(self)
Example #24
0
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)