Example #1
0
    def keymap_changed(self, *args):
        log("keymap_changed%s", args)
        if self._keymap_change_handler_id:
            self._keymap.disconnect(self._keymap_change_handler_id)
            self._keymap_change_handler_id = None
        display = display_get_default()
        self._keymap = keymap_get_for_display(display)
        if self._keymap_changing:
            #timer due already
            return
        self._keymap_changing = True

        def do_keys_changed():
            #re-register the change handler:
            self._keymap_change_handler_id = self._keymap.connect(
                "keys-changed", self.keymap_changed)
            self._keymap_changing = False
            if self.locked:
                #automatic changes not allowed!
                log.info("ignoring keymap change: layout is locked to '%s'",
                         self.layout_str())
                return
            if self.update():
                log.info(
                    "keymap has been changed to '%s', sending updated mappings to the server",
                    self.layout_str())
                if self.xkbmap_layout:
                    self.send_layout()
                self.send_keymap()

        glib.timeout_add(500, do_keys_changed)
Example #2
0
 def compute_modifier_keynames(self):
     self.keycodes_for_modifier_keynames = {}
     self.xkbmap_mod_nuisance = set(DEFAULT_MODIFIER_NUISANCE)
     display = display_get_default()
     keymap = keymap_get_for_display(display)
     gdk = import_gdk()
     if self.keynames_for_mod:
         for modifier, keynames in self.keynames_for_mod.items():
             for keyname in keynames:
                 if keyname in DEFAULT_MODIFIER_NUISANCE_KEYNAMES:
                     self.xkbmap_mod_nuisance.add(modifier)
                 keyval = gdk.keyval_from_name(bytestostr(keyname))
                 if keyval == 0:
                     log.error(
                         "Error: no keyval found for keyname '%s' (modifier '%s')",
                         keyname, modifier)
                     return []
                 entries = keymap.get_entries_for_keyval(keyval)
                 if entries:
                     keycodes = []
                     if is_gtk3():
                         if entries[0] is True:
                             keycodes = [
                                 entry.keycode for entry in entries[1]
                             ]
                     else:
                         keycodes = [entry[0] for entry in entries]
                     for keycode in keycodes:
                         l = self.keycodes_for_modifier_keynames.setdefault(
                             keyname, [])
                         if keycode not in l:
                             l.append(keycode)
     log("compute_modifier_keynames: keycodes_for_modifier_keynames=%s",
         self.keycodes_for_modifier_keynames)
Example #3
0
 def __init__(self, *args):
     KeyboardHelper.__init__(self, *args)
     #used for delaying the sending of keymap changes
     #(as we may be getting dozens of such events at a time)
     self._keymap_changing = False
     self._keymap_change_handler_id = None
     display = display_get_default()
     self._keymap = keymap_get_for_display(display)
     self.update()
     if self._keymap:
         self._keymap_change_handler_id = self._keymap.connect("keys-changed", self.keymap_changed)
Example #4
0
def get_gtk_keymap(ignore_keys=(None, "VoidSymbol", "0xffffff")):
    """
        Augment the keymap we get from gtk.gdk.keymap_get_default()
        by adding the keyval_name.
        We can also ignore some keys
    """
    from xpra.gtk_common.gtk_util import keymap_get_for_display, display_get_default, import_gdk, is_gtk3
    gdk = import_gdk()
    display = display_get_default()
    if not display:
        return ()
    keymap = keymap_get_for_display(display)
    log(
        "keymap_get_for_display(%s)=%s, direction=%s, bidirectional layouts: %s",
        display, keymap, keymap.get_direction(), keymap.have_bidi_layouts())
    keycodes = []
    for i in range(0, 2**8):
        entries = keymap.get_entries_for_keycode(i)
        log("get_entries_for_keycode(%s)=%s", i, entries)
        if not entries:
            continue
        if is_gtk3():
            found, keys, keyvals = entries
            if not found:
                continue
            for j, key in enumerate(keys):
                keyval = keyvals[j]
                keycode = key.keycode
                name = gdk.keyval_name(keyval)
                name = KEY_TRANSLATIONS.get((name, keyval, keycode), name)
                group = key.group or 0
                if name not in ignore_keys:
                    keycodes.append((keyval or 0, name or "", keycode
                                     or 0, group, key.level or 0))
        else:
            #gtk2:
            for keyval, keycode, group, level in entries:
                #assert keycode==i
                name = gdk.keyval_name(keyval)
                name = KEY_TRANSLATIONS.get((name, keyval, keycode), name)
                if name not in ignore_keys:
                    keycodes.append((keyval or 0, name or "", keycode
                                     or 0, group or 0, level or 0))
    log("get_gtk_keymap(%s)=%s (keymap=%s)", ignore_keys, keycodes, keymap)
    return keycodes
Example #5
0
File: keys.py Project: ljmljz/xpra
def grok_modifier_map(display, meanings):
    """Return an dict mapping modifier names to corresponding X modifier
    bitmasks."""
    #TODO: needs fixing for GTK3
    from xpra.keyboard.mask import MODIFIER_MAP
    modifier_map = MODIFIER_MAP.copy()
    modifier_map.update({
        "scroll":   0,
        "num":      0,
        "meta":     0,
        "super":    0,
        "hyper":    0,
        "alt":      0,
        })
    if not meanings:
        meanings = DEFAULT_MODIFIER_MEANINGS

    (max_keypermod, keycodes) = X11Keyboard.get_modifier_map()
    assert len(keycodes) == 8 * max_keypermod
    keymap = keymap_get_for_display(display)
    for i in range(8):
        for j in range(max_keypermod):
            keycode = keycodes[i * max_keypermod + j]
            if keycode:
                entries = keymap.get_entries_for_keycode(keycode)
                if entries is None:
                    # This keycode has no entry in the keymap:
                    continue
                if is_gtk3():
                    found, _, keyvals = entries
                    if not found:
                        continue
                else:
                    #(keyval, _, _, _) in entries
                    keyvals = [x[0] for x in entries]
                for keyval in keyvals:
                    keyval_name = gdk.keyval_name(keyval)
                    modifier = meanings.get(keyval_name)
                    if modifier:
                        modifier_map[modifier] |= (1 << i)
    return modifier_map
Example #6
0
File: keys.py Project: tardyp/Xpra
def grok_modifier_map(display, meanings):
    """Return an dict mapping modifier names to corresponding X modifier
    bitmasks."""
    #TODO: needs fixing for GTK3
    from xpra.keyboard.mask import MODIFIER_MAP
    modifier_map = MODIFIER_MAP.copy()
    modifier_map.update({
        "scroll":   0,
        "num":      0,
        "meta":     0,
        "super":    0,
        "hyper":    0,
        "alt":      0,
        })
    if not meanings:
        meanings = DEFAULT_MODIFIER_MEANINGS

    (max_keypermod, keycodes) = X11Keyboard.get_modifier_map()
    assert len(keycodes) == 8 * max_keypermod
    keymap = keymap_get_for_display(display)
    for i in range(8):
        for j in range(max_keypermod):
            keycode = keycodes[i * max_keypermod + j]
            if keycode:
                entries = keymap.get_entries_for_keycode(keycode)
                if entries is None:
                    # This keycode has no entry in the keymap:
                    continue
                if is_gtk3():
                    found, _, keyvals = entries
                    if not found:
                        continue
                else:
                    #(keyval, _, _, _) in entries
                    keyvals = [x[0] for x in entries]
                for keyval in keyvals:
                    keyval_name = gdk.keyval_name(keyval)
                    modifier = meanings.get(keyval_name)
                    if modifier:
                        modifier_map[modifier] |= (1 << i)
    return modifier_map
Example #7
0
 def watch_keymap_changes(self):
     ### Set up keymap change notification:
     display = display_get_default()
     keymap = keymap_get_for_display(display)
     keymap.connect("keys-changed", self._keys_changed)