Exemple #1
0
	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)
Exemple #2
0
        def hide(fake_event):
            if fake_event is not None:
                Gtk.main_do_event(fake_event)

            self.__hide_id = None
            self.hide()
            return False
Exemple #3
0
    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
Exemple #4
0
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)
Exemple #5
0
	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 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)
Exemple #7
0
    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
Exemple #8
0
 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)
Exemple #9
0
 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)
Exemple #10
0
	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)
Exemple #11
0
 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)
Exemple #12
0
 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)
Exemple #13
0
	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)
Exemple #14
0
 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)
Exemple #15
0
    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
Exemple #16
0
    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 __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
Exemple #18
0
    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)
Exemple #19
0
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)
Exemple #20
0
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)
Exemple #21
0
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)
Exemple #22
0
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)
Exemple #24
0
 def on_gdk_event(self, event):
     Gtk.main_do_event(event)
Exemple #25
0
 def _event_handler(self, event):
     # Separate method so we can use return inside
     self._check_event(event)
     Gtk.main_do_event(event)
Exemple #26
0
 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)
Exemple #27
0
	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)
Exemple #28
0
 def _event_handler(self, event):
     # Separate method so we can use return inside
     self._check_event(event)
     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)