Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/gtk_common/keymap.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#!/usr/bin/env python
2# This file is part of Xpra.
3# Copyright (C) 2008 Nathaniel Smith <njs@pobox.com>
4# Copyright (C) 2011-2020 Antoine Martin <antoine@xpra.org>
5# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
6# later version. See the file COPYING for details.
9from xpra.log import Logger
11log = Logger("keyboard")
13#this allows platforms to inject keyname workarounds
14# the key is a tuple (keyname, keyval, keycode)
15# the value is the keyname override
16KEY_TRANSLATIONS = {}
19def get_gtk_keymap(ignore_keys=(None, "VoidSymbol", "0xffffff")):
20 """
21 Augment the keymap we get from gtk.gdk.keymap_get_default()
22 by adding the keyval_name.
23 We can also ignore some keys
24 """
25 from gi.repository import Gdk
26 display = Gdk.Display.get_default()
27 return do_get_gtk_keymap(display, ignore_keys)
29def do_get_gtk_keymap(display, ignore_keys):
30 if not display:
31 return ()
32 from gi.repository import Gdk
33 keymap = Gdk.Keymap.get_for_display(display)
34 log("keymap_get_for_display(%s)=%s, direction=%s, bidirectional layouts: %s",
35 display, keymap, keymap.get_direction(), keymap.have_bidi_layouts())
36 keycodes=[]
37 for i in range(0, 2**8):
38 entries = keymap.get_entries_for_keycode(i)
39 if not entries: # pragma: no cover
40 continue
41 found, keys, keyvals = entries
42 if not found:
43 log("get_entries_for_keycode(%s)=()", i)
44 continue
45 added = []
46 for j, key in enumerate(keys):
47 keyval = keyvals[j]
48 keycode = key.keycode
49 name = Gdk.keyval_name(keyval)
50 name = KEY_TRANSLATIONS.get((name, keyval, keycode), name)
51 group = key.group or 0
52 if name not in ignore_keys:
53 kdef = keyval or 0, name or "", keycode or 0, group, key.level or 0
54 keycodes.append(kdef)
55 added.append(kdef)
56 log("keycode %3i: %s", i, added)
57 log("get_gtk_keymap(%s)=%s (keymap=%s)", ignore_keys, keycodes, keymap)
58 return keycodes
61def main(): # pragma: no cover
62 import sys
63 from xpra.platform import program_context
64 from xpra.log import enable_color
65 with program_context("Keymap-Tool", "Keymap Information Tool"):
66 enable_color()
67 if "-v" in sys.argv or "--verbose" in sys.argv:
68 log.enable_debug()
69 gtk_keymap = get_gtk_keymap()
70 sizes = [16, 28, 8, 8, 8]
71 def pkey(*entries):
72 print(("".join([str(x).ljust(sizes[i]) for i,x in enumerate(entries)])).strip())
73 pkey("keyval", "name", "keycode", "group", "level")
74 for x in gtk_keymap:
75 pkey(*x)
76 return 0
79if __name__ == "__main__": # pragma: no cover
80 main()