def on_button_clicked(self, widget): screen = widget.get_screen() self.time = Gtk.get_current_event_time() self.device = Gtk.get_current_event_device() self.grab_widget = Gtk.Window(Gtk.WindowType.POPUP) self.grab_widget.set_screen(screen) self.grab_widget.resize(1, 1) self.grab_widget.move(-100, -100) self.grab_widget.show() self.grab_widget.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK) toplevel = widget.get_toplevel() if isinstance(toplevel, Gtk.Window): if toplevel.has_group(): toplevel.add_window(grab_widget) window = self.grab_widget.get_window() picker_cursor = Gdk.Cursor(screen.get_display(), Gdk.CursorType.CROSSHAIR); grab_status = self.device.grab(window, Gdk.GrabOwnership.APPLICATION, False, Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK, picker_cursor, self.time) if grab_status != Gdk.GrabStatus.SUCCESS: return Gtk.device_grab_add(self.grab_widget, self.device, True) self.bp_handler = self.grab_widget.connect("button-press-event", self.mouse_press) self.kp_handler = self.grab_widget.connect("key-press-event", self.key_press)
def window_grab_and_map(window, mask): """Returns a list of devices that have a grab or an empty list if something failed. If somethings failed the window will be hidden. """ device = Gtk.get_current_event_device() event_time = Gtk.get_current_event_time() if not device: return [] # On wayland we need to grab before mapping and on X11 and everywhere else # we can grab after we are mapped if not is_wayland(): window.show() else: window.realize() Gtk.device_grab_add(window, device, True) status = device.grab( window.get_window(), Gdk.GrabOwnership.WINDOW, True, mask, None, event_time) if status != Gdk.GrabStatus.SUCCESS: Gtk.device_grab_remove(window, device) window.hide() return [] associated_device = device.get_associated_device() if associated_device is None: if is_wayland(): window.show() return [device] Gtk.device_grab_add(window, associated_device, True) status = associated_device.grab( window.get_window(), Gdk.GrabOwnership.WINDOW, True, mask, None, event_time) if status != Gdk.GrabStatus.SUCCESS: Gtk.device_grab_remove(window, associated_device) Gtk.device_grab_remove(window, device) device.ungrab(event_time) window.hide() return [] if is_wayland(): window.show() return [device, associated_device]
def _grab (self, device): if self.gdkwindow is None: return grabbed = False while not grabbed: device.set_mode (Gdk.InputMode.SCREEN) grabbed = (device.grab ( self.gdkwindow, Gdk.GrabOwnership.NONE, False, Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK, None, 0 ) == Gdk.GrabStatus.SUCCESS) Gtk.device_grab_add (self.window, device, False)
def _get_screen_color(self): time = Gtk.get_current_event_time() screen = self.__editor._pick_button.get_screen() display = self.__editor._pick_button.get_display() # XXX(JFlesch): Assumption: mouse is used pointer_device = Gtk.get_current_event_device() if not self.__dropper_grab_widget: self.__dropper_grab_widget = Gtk.Window.new(Gtk.WindowType.POPUP) self.__dropper_grab_widget.set_screen(screen) self.__dropper_grab_widget.resize(1, 1) self.__dropper_grab_widget.move(-100, -100) self.__dropper_grab_widget.show() self.__dropper_grab_widget.add_events( Gdk.EventMask.BUTTON_RELEASE_MASK ) toplevel = self.__editor._pick_button.get_toplevel() if isinstance(toplevel, Gtk.Window): if toplevel.has_group(): toplevel.get_group().add_window(self.__dropper_grab_widget) window = self.__dropper_grab_widget.get_window() picker_cursor = self._make_picker_cursor(display) if (pointer_device.grab( window, Gdk.GrabOwnership.APPLICATION, False, Gdk.EventMask.BUTTON_RELEASE_MASK, picker_cursor, time) != Gdk.GrabStatus.SUCCESS): logger.warning("Pointer device grab failed !") return Gtk.device_grab_add(self.__dropper_grab_widget, pointer_device, True) self.__grab_time = time self.__pointer_device = pointer_device self.__has_grab = True self.__dropper_grab_widget.connect("button-release-event", self._on_mouse_release)
def _get_screen_color(self): time = Gtk.get_current_event_time() screen = self.__editor._pick_button.get_screen() display = self.__editor._pick_button.get_display() # XXX(JFlesch): Assumption: mouse is used pointer_device = Gtk.get_current_event_device() if not self.__dropper_grab_widget: self.__dropper_grab_widget = Gtk.Window.new(Gtk.WindowType.POPUP) self.__dropper_grab_widget.set_screen(screen) self.__dropper_grab_widget.resize(1, 1) self.__dropper_grab_widget.move(-100, -100) self.__dropper_grab_widget.show() self.__dropper_grab_widget.add_events( Gdk.EventMask.BUTTON_RELEASE_MASK) toplevel = self.__editor._pick_button.get_toplevel() if isinstance(toplevel, Gtk.Window): if toplevel.has_group(): toplevel.get_group().add_window(self.__dropper_grab_widget) window = self.__dropper_grab_widget.get_window() picker_cursor = self._make_picker_cursor(display) if (pointer_device.grab(window, Gdk.GrabOwnership.APPLICATION, False, Gdk.EventMask.BUTTON_RELEASE_MASK, picker_cursor, time) != Gdk.GrabStatus.SUCCESS): logger.warning("Pointer device grab failed !") return Gtk.device_grab_add(self.__dropper_grab_widget, pointer_device, True) self.__grab_time = time self.__pointer_device = pointer_device self.__has_grab = True self.__dropper_grab_widget.connect("button-release-event", self._on_mouse_release)
def on_button_clicked(self, widget): screen = widget.get_screen() self.time = Gtk.get_current_event_time() self.device = Gtk.get_current_event_device() self.grab_widget = Gtk.Window(Gtk.WindowType.POPUP) self.grab_widget.set_screen(screen) self.grab_widget.resize(1, 1) self.grab_widget.move(-100, -100) self.grab_widget.show() self.grab_widget.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK) toplevel = widget.get_toplevel() if isinstance(toplevel, Gtk.Window): if toplevel.has_group(): toplevel.add_window(grab_widget) window = self.grab_widget.get_window() picker_cursor = Gdk.Cursor(screen.get_display(), Gdk.CursorType.CROSSHAIR) grab_status = self.device.grab( window, Gdk.GrabOwnership.APPLICATION, False, Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK, picker_cursor, self.time) if grab_status != Gdk.GrabStatus.SUCCESS: return Gtk.device_grab_add(self.grab_widget, self.device, True) self.bp_handler = self.grab_widget.connect("button-press-event", self.mouse_press) self.kp_handler = self.grab_widget.connect("key-press-event", self.key_press)