Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/x11/gtk_x11/keys.py : 100%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of Xpra.
2# Copyright (C) 2008, 2009 Nathaniel Smith <njs@pobox.com>
3# Copyright (C) 2012-2019 Antoine Martin <antoine@xpra.org>
4# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
5# later version. See the file COPYING for details.
7from gi.repository import Gdk
9from xpra.x11.bindings.keyboard_bindings import X11KeyboardBindings #@UnresolvedImport
10from xpra.keyboard.mask import DEFAULT_MODIFIER_MEANINGS
12X11Keyboard = X11KeyboardBindings()
15def grok_modifier_map(display, meanings):
16 """Return an dict mapping modifier names to corresponding X modifier
17 bitmasks."""
18 #TODO: needs fixing for GTK3
19 from xpra.keyboard.mask import MODIFIER_MAP
20 modifier_map = MODIFIER_MAP.copy()
21 modifier_map.update({
22 "scroll": 0,
23 "num": 0,
24 "meta": 0,
25 "super": 0,
26 "hyper": 0,
27 "alt": 0,
28 })
29 if not meanings:
30 meanings = DEFAULT_MODIFIER_MEANINGS
32 (max_keypermod, keycodes) = X11Keyboard.get_modifier_map()
33 assert len(keycodes) == 8 * max_keypermod
34 keymap = Gdk.Keymap.get_for_display(display)
35 for i in range(8):
36 for j in range(max_keypermod):
37 keycode = keycodes[i * max_keypermod + j]
38 if keycode:
39 entries = keymap.get_entries_for_keycode(keycode)
40 if entries is None: # pragma: no cover
41 # This keycode has no entry in the keymap:
42 continue
43 found, _, keyvals = entries
44 if not found: # pragma: no cover
45 continue
46 for keyval in keyvals:
47 keyval_name = Gdk.keyval_name(keyval)
48 modifier = meanings.get(keyval_name)
49 if modifier:
50 modifier_map[modifier] |= (1 << i)
51 return modifier_map