def keyEvent(self, key, val): tp = Gdk.EventType.BUTTON_PRESS if val else Gdk.EventType.BUTTON_RELEASE event = Gdk.Event.new(tp) event.button = int(key) - Keys.BTN_LEFT + 1 window, event.x, event.y = Gdk.Window.at_pointer() screen, x, y, mask = Gdk.Display.get_default().get_pointer() event.x_root, event.y_root = x, y gtk_window = None for w in Gtk.Window.list_toplevels(): if w.get_window(): if window.get_toplevel().get_xid() == w.get_window().get_xid(): gtk_window = w break if gtk_window: if gtk_window.get_type_hint() == Gdk.WindowTypeHint.COMBO: # Special case, clicking on combo does nothing, so # pressing "space" is emulated instead. if not val: return event = Gdk.Event.new(Gdk.EventType.KEY_PRESS) event.time = Gtk.get_current_event_time() event.hardware_keycode = 65 event.keyval = Gdk.KEY_space event.window = self.mapper.target_window event.time = Gtk.get_current_event_time() event.window = window event.set_device(self.device) Gtk.main_do_event(event)
def hide(fake_event): if fake_event is not None: Gtk.main_do_event(fake_event) self.__hide_id = None self.hide() return False
def __event(self, event): if not self.__view: return True # hack: present the main window on key press if event.type == Gdk.EventType.BUTTON_PRESS: # hack: present is overridden to present all windows. # bypass to only select one Gtk.Window.present(get_top_parent(self.__view)) def translate_enter_leave_event(event): # enter/leave events have different x/y values as motion events # so it makes sense to push them to the underlying view as # additional motion events. # Warning: this may result in motion events outside of the # view window.. ? new_event = Gdk.Event.new(Gdk.EventType.MOTION_NOTIFY) struct = new_event.motion for attr in [ "x", "y", "x_root", "y_root", "time", "window", "state", "send_event" ]: setattr(struct, attr, getattr(event.crossing, attr)) device = Gtk.get_current_event_device() if device is not None: struct.set_device(device) return new_event # FIXME: We should translate motion events on the tooltip # to crossing events for the underlying view. # (I think, no tested) Currently the hover scrollbar stays visible # if the mouse leaves the view through the tooltip without the # knowledge of the view. type_ = event.type real_event = None if type_ == Gdk.EventType.BUTTON_PRESS: real_event = event.button elif type_ == Gdk.EventType.BUTTON_RELEASE: real_event = event.button elif type_ == Gdk.EventType.MOTION_NOTIFY: real_event = event.motion elif type_ == Gdk.EventType.ENTER_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion elif type_ == Gdk.EventType.LEAVE_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion if real_event: real_event.x += self.__dx real_event.y += self.__dy # modifying event.window is a necessary evil, made okay because # nobody else should tie to any TreeViewHints events ever. event.any.window = self.__view.get_bin_window() Gtk.main_do_event(event) return True
def cb_any_event(event, onboard): # Hide bug in Oneiric's GTK3 # Suppress ValueError: invalid enum value: 4294967295 try: type = event.type except ValueError: type = None if 0: # debug a = [event, event.type] if type == Gdk.EventType.VISIBILITY_NOTIFY: a += [event.state] if type == Gdk.EventType.CONFIGURE: a += [event.x, event.y, event.width, event.height] if type == Gdk.EventType.WINDOW_STATE: a += [event.window_state] if type == Gdk.EventType.UNMAP: a += [event.window, "0x{:x}".format(event.window.get_xid())] print(*a) # Update layout on keyboard group changes # XkbStateNotify maps to Gdk.EventType.NOTHING # https://bugzilla.gnome.org/show_bug.cgi?id=156948 if type == Gdk.EventType.NOTHING: onboard.cb_group_changed() # Update the cached pango layout object here or Onboard # doesn't get those settings, i.e. label fonts sizes are off # when font dpi changes. elif type == Gdk.EventType.SETTING: onboard.on_gdk_setting_changed(event.setting.name) Gtk.main_do_event(event)
def __event(self, event): if not self.__view: return True # hack: present the main window on key press if event.type == Gdk.EventType.BUTTON_PRESS: # hack: present is overridden to present all windows. # bypass to only select one if not is_wayland(): # present duplicates windows in weston Gtk.Window.present(get_top_parent(self.__view)) def translate_enter_leave_event(event): # enter/leave events have different x/y values as motion events # so it makes sense to push them to the underlying view as # additional motion events. # Warning: this may result in motion events outside of the # view window.. ? new_event = Gdk.Event.new(Gdk.EventType.MOTION_NOTIFY) struct = new_event.motion for attr in ["x", "y", "x_root", "y_root", "time", "window", "state", "send_event"]: setattr(struct, attr, getattr(event.crossing, attr)) device = Gtk.get_current_event_device() if device is not None: struct.set_device(device) return new_event # FIXME: We should translate motion events on the tooltip # to crossing events for the underlying view. # (I think, no tested) Currently the hover scrollbar stays visible # if the mouse leaves the view through the tooltip without the # knowledge of the view. type_ = event.type real_event = None if type_ == Gdk.EventType.BUTTON_PRESS: real_event = event.button elif type_ == Gdk.EventType.BUTTON_RELEASE: real_event = event.button elif type_ == Gdk.EventType.MOTION_NOTIFY: real_event = event.motion elif type_ == Gdk.EventType.ENTER_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion elif type_ == Gdk.EventType.LEAVE_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion if real_event: real_event.x += self.__dx real_event.y += self.__dy # modifying event.window is a necessary evil, made okay because # nobody else should tie to any TreeViewHints events ever. event.any.window = self.__view.get_bin_window() Gtk.main_do_event(event) return True
def _filter_callback(self, event): if event.type in [ Gdk.EventType.BUTTON_PRESS, Gdk.EventType.BUTTON_RELEASE, Gdk.EventType.KEY_PRESS, Gdk.EventType.KEY_RELEASE, Gdk.EventType.MOTION_NOTIFY, Gdk.EventType.SCROLL ]: self._idle = 0 Gtk.main_do_event(event)
def event_handler(event): state = event.get_state() if isinstance(state, tuple): state = state[1] if (event.type == Gdk.EventType.KEY_PRESS and state & Gdk.ModifierType.CONTROL_MASK and event.keyval == Gdk.KEY_q): os._exit(0) Gtk.main_do_event(event)
def releaseEvent(self, keys=[]): for k in keys: event = Gdk.Event.new(Gdk.EventType.KEY_RELEASE) event.time = Gtk.get_current_event_time() event.hardware_keycode = KEY_TO_KEYCODE[k] event.keyval = KEY_TO_GDK[k] event.window = self.mapper.target_window event.set_device(self.device) Gtk.main_do_event(event)
def _filter_callback(self, event): if event.type in [Gdk.EventType.BUTTON_PRESS, Gdk.EventType.BUTTON_RELEASE, Gdk.EventType.KEY_PRESS, Gdk.EventType.KEY_RELEASE, Gdk.EventType.MOTION_NOTIFY, Gdk.EventType.SCROLL]: self._idle = 0 Gtk.main_do_event(event)
def keyEvent(self, key, val): tp = Gdk.EventType.BUTTON_PRESS if val else Gdk.EventType.BUTTON_RELEASE event = Gdk.Event.new(tp) event.time = Gtk.get_current_event_time() event.button = int(key) - Keys.BTN_LEFT + 1 event.window, wx, wy = Gdk.Window.at_pointer() screen, x, y, mask = Gdk.Display.get_default().get_pointer() event.x_root, event.y_root = x, y event.x, event.y = x - wx, y - wy event.set_device(self.device) Gtk.main_do_event(event)
def __event(self, event): if not self.__view: return True # hack: present the main window on key press if event.type == Gdk.EventType.BUTTON_PRESS: # hack: present is overridden to present all windows. # bypass to only select one if not is_wayland(): # present duplicates windows in weston Gtk.Window.present(get_top_parent(self.__view)) def translate_enter_leave_event(event): # enter/leave events have different x/y values as motion events # so it makes sense to push them to the underlying view as # additional motion events. # Warning: this may result in motion events outside of the # view window.. ? new_event = Gdk.Event() new_event.type = Gdk.EventType.MOTION_NOTIFY struct = new_event.motion for attr in ["x", "y", "x_root", "y_root", "time", "window", "state", "send_event"]: setattr(struct, attr, getattr(event.crossing, attr)) struct.device = Gtk.get_current_event_device() return new_event type_ = event.type real_event = None if type_ == Gdk.EventType.BUTTON_PRESS: real_event = event.button elif type_ == Gdk.EventType.BUTTON_RELEASE: real_event = event.button elif type_ == Gdk.EventType.MOTION_NOTIFY: real_event = event.motion elif type_ == Gdk.EventType.ENTER_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion elif type_ == Gdk.EventType.LEAVE_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion if real_event: real_event.x += self.__dx real_event.y += self.__dy # modifying event.window is a necessary evil, made okay because # nobody else should tie to any TreeViewHints events ever. event.any.window = self.__view.get_bin_window() Gtk.main_do_event(event) return True
def __long_pressed_cb(self, controller, x, y): # We can't force a context menu, but we can fake a right mouse click event = Gdk.Event() event.type = Gdk.EventType.BUTTON_PRESS b = event.button b.type = Gdk.EventType.BUTTON_PRESS b.window = self._browser.get_window() b.time = Gtk.get_current_event_time() b.button = 3 # Right b.x = x b.y = y b.x_root, b.y_root = self._browser.get_window().get_root_coords(x, y) Gtk.main_do_event(event) return True
def event_handler(self, event): """ Handle mouse and keyboard events """ if event.type == gdk.EventType.BUTTON_PRESS: if event.button.button != 1: print("Canceled by the user") exit(EXIT_CANCEL) self.started = True self.start_x = int(event.x) self.start_y = int(event.y) self.move(self.x, self.y) self.queue_draw() elif event.type == gdk.EventType.KEY_RELEASE: if gdk.keyval_name(event.keyval) == "Escape": print("Canceled by the user") exit(EXIT_CANCEL) elif event.type == gdk.EventType.MOTION_NOTIFY: if not self.started: return self.set_rect_size(event) self.draw() if self.width > 3 and self.height > 3: self.resize(self.width, self.height) self.move(self.x, self.y) self.show_all() self.queue_draw() elif event.type == gdk.EventType.BUTTON_RELEASE: if not self.started: return self.set_rect_size(event) self.queue_draw() self.ungrab() self.wait() else: gtk.main_do_event(event)
def cb_any_event(event, onboard): # Hide bug in Oneiric's GTK3 # Suppress ValueError: invalid enum value: 4294967295 try: type = event.type except ValueError: type = None if 0: # debug a = [event, event.type] if type == Gdk.EventType.VISIBILITY_NOTIFY: a += [event.state] if type == Gdk.EventType.CONFIGURE: a += [event.x, event.y, event.width, event.height] if type == Gdk.EventType.WINDOW_STATE: a += [event.window_state] if type == Gdk.EventType.UNMAP: a += [event.window, "0x{:x}".format(event.window.get_xid())] print(*a) # Update layout on keyboard group changes # XkbStateNotify maps to Gdk.EventType.NOTHING # https://bugzilla.gnome.org/show_bug.cgi?id=156948 if type == Gdk.EventType.NOTHING: onboard.reload_layout() # Update the cached pango layout object here or Onboard # doesn't get those settings, i.e. label fonts sizes are off # when font dpi changes. elif type == Gdk.EventType.SETTING: if event.setting.name == "gtk-theme-name": onboard.on_gtk_theme_changed() elif event.setting.name in [ "gtk-xft-dpi", "gtk-xft-antialias" "gtk-xft-hinting", "gtk-xft-hintstyle" ]: # For some reason the font sizes are still off when running # this immediately. Delay it a little. GLib.idle_add(onboard.on_gtk_font_dpi_changed) Gtk.main_do_event(event)
def cb_any_event(event, onboard): # Hide bug in Oneiric's GTK3 # Suppress ValueError: invalid enum value: 4294967295 try: type = event.type except ValueError: type = None if 0: # debug a = [event, event.type] if type == Gdk.EventType.VISIBILITY_NOTIFY: a += [event.state] if type == Gdk.EventType.CONFIGURE: a += [event.x, event.y, event.width, event.height] if type == Gdk.EventType.WINDOW_STATE: a += [event.window_state] if type == Gdk.EventType.UNMAP: a += [event.window, "0x{:x}".format(event.window.get_xid())] print(*a) # Update layout on keyboard group changes # XkbStateNotify maps to Gdk.EventType.NOTHING # https://bugzilla.gnome.org/show_bug.cgi?id=156948 if type == Gdk.EventType.NOTHING: onboard.reload_layout() # Update the cached pango layout object here or Onboard # doesn't get those settings, i.e. label fonts sizes are off # when font dpi changes. elif type == Gdk.EventType.SETTING: if event.setting.name == "gtk-theme-name": onboard.on_gtk_theme_changed() elif event.setting.name in ["gtk-xft-dpi", "gtk-xft-antialias" "gtk-xft-hinting", "gtk-xft-hintstyle"]: # For some reason the font sizes are still off when running # this immediately. Delay it a little. GLib.idle_add(onboard.on_gtk_font_dpi_changed) Gtk.main_do_event(event)
def _send_keys(view, s): print("_send_keys %s" % s) MAPPING = {'@': 'at', '.': 'period', '\t': 'Tab', '\n': 'Return', '?': 'question', '\a': 'Down', # fake ' ': 'space', '\v': 'Page_Down', # fake } for key in s: event = Gdk.Event(Gdk.KEY_PRESS) event.window = view.window if key.isdigit(): key = "_" + key if hasattr(Gdk, key): event.keyval = getattr(Gdk, key) else: event.keyval = getattr(Gdk, MAPPING[key]) Gtk.main_do_event(event)
def _send_keys(view, s): print("_send_keys %s" % s) MAPPING = { "@": "at", ".": "period", "\t": "Tab", "\n": "Return", "?": "question", "\a": "Down", # fake " ": "space", "\v": "Page_Down", # fake } for key in s: event = Gdk.Event(Gdk.KEY_PRESS) event.window = view.window if key.isdigit(): key = "_" + key if hasattr(Gdk, key): event.keyval = getattr(Gdk, key) else: event.keyval = getattr(Gdk, MAPPING[key]) Gtk.main_do_event(event)
def _send_keys(view, s): print("_send_keys %s" % s) MAPPING = { '@': 'at', '.': 'period', '\t': 'Tab', '\n': 'Return', '?': 'question', '\a': 'Down', # fake ' ': 'space', '\v': 'Page_Down', # fake } for key in s: event = Gdk.Event(Gdk.KEY_PRESS) event.window = view.window if key.isdigit(): key = "_" + key if hasattr(Gdk, key): event.keyval = getattr(Gdk, key) else: event.keyval = getattr(Gdk, MAPPING[key]) Gtk.main_do_event(event)
def on_gdk_event(self, event): Gtk.main_do_event(event)
def _event_handler(self, event): # Separate method so we can use return inside self._check_event(event) Gtk.main_do_event(event)
def event_handler(self, event, data): #make a copy to avoid errors if the dict changes size for func, func_args, func_kwargs in list( self.event_listeners.values()): func(event, *func_args, **func_kwargs) Gtk.main_do_event(event)
def event_handler(self, event, data): #make a copy to avoid errors if the dict changes size for func, func_args, func_kwargs in list(self.event_listeners.values()): func(event, *func_args, **func_kwargs) Gtk.main_do_event(event)
def _on_event(event): if Gdk.EventType.MOTION_NOTIFY == event.type: self.cursor_handler.refresh() Gtk.main_do_event(event)