def _key_press_cb(self, widget, event): """App-wide keypress handler for toplevel windows.""" if not self.enabled: return # See gtk sourcecode in gtkmenu.c function gtk_menu_key_press, # which uses the same code as below when changing an accelerator. keymap = gtk2compat.gdk.keymap_get_default() # Instead of using event.keyval, we do it the lowlevel way. # Reason: ignoring CAPSLOCK and checking if SHIFT was pressed state = event.state & ~gdk.LOCK_MASK if gtk2compat.USE_GTK3: state = gdk.ModifierType(state) res = keymap.translate_keyboard_state(event.hardware_keycode, state, event.group) if not res: # PyGTK returns None when gdk_keymap_translate_keyboard_state() # returns false. Not sure if this is a bug or a feature - the only # time I have seen this happen is when I put my laptop into sleep # mode. logger.warning('translate_keyboard_state() returned None. ' 'Strange key pressed?') return keyval_offset = 1 if gtk2compat.USE_GTK3 else 0 keyval = res[keyval_offset] consumed_modifiers = res[keyval_offset + 3] # We want to ignore irrelevant modifiers like ScrollLock. The stored # key binding does not include modifiers that affected its keyval. modifiers = (event.state & gtk.accelerator_get_default_mod_mask() & ~consumed_modifiers) # Except that key bindings are always stored in lowercase. keyval_lower = gdk.keyval_to_lower(keyval) if keyval_lower != keyval: modifiers |= gdk.SHIFT_MASK action = self.keymap.get((keyval_lower, modifiers)) if not action: # try hardcoded keys action = self.keymap2.get((keyval_lower, modifiers)) # Don't dispatch if the window is only sensitive to a subset of # actions, and the action is not in that set. if action is not None and isinstance(action, gtk.Action): win_actions = self.window_actions.get(widget, None) if win_actions is not None: if action.get_name() not in win_actions: return False # If the lookup succeeded, activate the corresponding action. if action: return self.activate_keydown_event(action, event) # Otherwise, dispatch the event to the active doc. return self._dispatch_fallthru_key_press_event(widget, event)
def button_press_displayname(button, mods): """Converts a button number & modifier mask to a localized unicode string. """ button = int(button) mods = int(mods) if button <= 0: return None mods = gdk.ModifierType(mods) modif_label = gtk.accelerator_get_label(0, mods) #TRANSLATORS: abbreviated "Button <number>" for forms like "Ctrl+Alt+Btn1" return unicode(modif_label) + (_(u"Btn%d") % (button, ))
def local_mouse_state(self, last_update=False): tdw_win = self.tdw.get_window() display = self.tdw.get_display() devmgr = display and display.get_device_manager() or None coredev = devmgr and devmgr.get_client_pointer() or None if coredev and tdw_win: win_, x, y, kbmods = tdw_win.get_device_position_double(coredev) else: x, y, kbmods = (0., 0., gdk.ModifierType(0)) if last_update: return self.lx, self.ly, kbmods x, y = self.tdw.display_to_model(x, y) return x, y, kbmods
def button_press_name(button, mods): """Converts button number & modifier mask to a prefs-storable string. Analogous to `gtk.accelerator_name()`. Buttonpress names look similar to GDK accelerator names, for example ``<Control><Shift>Button2`` or ``<Primary><Alt>Button4`` for newer versions of GTK. If the button is equal to zero (see `button_press_parse()`), `None` is returned. """ button = int(button) mods = int(mods) if button <= 0: return None mods = gdk.ModifierType(mods) modif_name = gtk.accelerator_name(0, mods) return modif_name + "Button%d" % (button, )
def button_press_displayname(button, mods): """Converts a button number & modifier mask to a localized unicode string. """ button = int(button) mods = int(mods) if button <= 0: return None mods = gdk.ModifierType(mods) modif_label = gtk.accelerator_get_label(0, mods) modif_label = unicode(modif_label) separator = "" if modif_label: separator = u"+" #TRANSLATORS: abbreviated "Button <number>" for forms like "Ctrl+Alt+Btn1" return _("{modifiers}{plus}Btn{button_number}").format( modifiers=modif_label, plus=separator, button_number=button, )
def button_press_displayname(button, mods, shorten=False): """Converts a button number & modifier mask to a localized unicode string. """ button = int(button) mods = int(mods) if button <= 0: return None mods = gdk.ModifierType(mods) modif_label = gtk.accelerator_get_label(0, mods) modif_label = unicode(modif_label) separator = "" if modif_label: separator = u"+" mouse_button_label = _("Button") if shorten: #TRANSLATORS: abbreviated "Button <number>" for forms like "Alt+Btn1" mouse_button_label = _("Btn") return "{modifiers}{plus}{btn}{button_number}".format( modifiers=modif_label, plus=separator, btn=mouse_button_label, button_number=button, )
def button_press_parse(name): """Converts button press names to a button number & modifier mask. Analogous to `gtk.accelerator_parse()`. This function parses the strings created by `button_press_name()`, and returns a 2-tuple containing the button number and modifier mask corresponding to `name`. If the parse fails, both values will be 0 (zero). """ if name is None: return (0, 0) name = str(name) try: mods_s, button_s = name.split("Button", 1) if button_s == '': button = 0 else: button = int(button_s) except ValueError: button = 0 mods = gdk.ModifierType(0) else: keyval_ignored, mods = gtk.accelerator_parse(mods_s) return button, mods