Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/platform/keyboard_base.py : 70%
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) 2010 Nathaniel Smith <njs@pobox.com>
3# Copyright (C) 2011-2014 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 xpra.keyboard.mask import mask_to_names, MODIFIER_MAP
8from xpra.log import Logger
9from xpra.os_util import bytestostr
10log = Logger("keyboard")
13class KeyboardBase:
15 def __init__(self):
16 self.modifier_mappings = {}
17 self.modifier_keys = {}
18 self.modifier_names = {}
19 self.modifier_keycodes = {}
20 #FIXME: this only allows a single modifier per mask
21 #and in some cases we want to allow other modifier names
22 #to use the same mask... (ie: META on OSX)
23 self.modifier_map = MODIFIER_MAP
25 def cleanup(self):
26 pass
28 def has_bell(self):
29 return False
31 def _add_modifier_mapping(self, a, b, modifier):
32 #log.info("%s (%s), %s (%s)", keycode, type(keycode), keyname, type(keyname))
33 if isinstance(a, int) and isinstance(b, (bytes, str)):
34 self._do_add_modifier_mapping((b,), a, modifier)
35 elif isinstance(a, (str,bytes)) and isinstance(b, int):
36 #level = b
37 self._do_add_modifier_mapping((a,), 0, modifier)
38 elif isinstance(a, (bytes,str)) and isinstance(b, (bytes,str)):
39 self._do_add_modifier_mapping((a, b), 0, modifier)
40 elif isinstance(a, (tuple,list)) and isinstance(b, (bytes,str)):
41 #ie: a=(57, 'CapsLock'), b='CapsLock'
42 if len(a)==2:
43 self._add_modifier_mapping(a[0], a[1], modifier)
44 self._add_modifier_mapping((b,), 0, modifier)
45 elif isinstance(a, (tuple,list)) and isinstance(b, (int)):
46 #ie: a=('CapsLock'), b=0
47 self._do_add_modifier_mapping(a, 0, modifier)
48 else:
49 log.warn("Warning: unexpected key definition: %s, %s", type(a), type(b))
50 log.warn(" values: %s, %s", a, b)
52 def _do_add_modifier_mapping(self, keynames, keycode, modifier):
53 for keyname in keynames:
54 self.modifier_keys[bytestostr(keyname)] = bytestostr(modifier)
55 self.modifier_names[bytestostr(modifier)] = bytestostr(keyname)
56 if keycode:
57 keycodes = self.modifier_keycodes.setdefault(bytestostr(keyname), [])
58 if keycode not in keycodes:
59 keycodes.append(keycode)
61 def set_modifier_mappings(self, mappings):
62 log("set_modifier_mappings(%s)", mappings)
63 self.modifier_mappings = mappings
64 self.modifier_keys = {}
65 self.modifier_names = {}
66 self.modifier_keycodes = {}
67 for modifier, keys in mappings.items():
68 for a, b in keys:
69 self._add_modifier_mapping(a, b, modifier)
70 log("modifier_keys=%s", self.modifier_keys)
71 log("modifier_names=%s", self.modifier_names)
72 log("modifier_keycodes=%s", self.modifier_keycodes)
74 def mask_to_names(self, mask):
75 return mask_to_names(mask, self.modifier_map)
77 def get_keymap_modifiers(self):
78 """
79 ask the server to manage capslock ('lock') which can be missing from mouse events
80 (or maybe this is virtualbox causing it?)
81 """
82 return {}, [], ["lock"]
84 def get_keymap_spec(self):
85 return "", "", {}
87 def get_x11_keymap(self):
88 return {}
90 def get_layout_spec(self):
91 return "", [], "", None, ""
93 def get_keyboard_repeat(self):
94 return None
96 def update_modifier_map(self, display, xkbmap_mod_meanings):
97 log("update_modifier_map%s", (display, xkbmap_mod_meanings))
98 self.modifier_map = MODIFIER_MAP
101 def process_key_event(self, send_key_action_cb, wid, key_event):
102 #default is to just send it as-is:
103 send_key_action_cb(wid, key_event)