Hide keyboard shortcuts

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. 

6 

7from xpra.keyboard.mask import mask_to_names, MODIFIER_MAP 

8from xpra.log import Logger 

9from xpra.os_util import bytestostr 

10log = Logger("keyboard") 

11 

12 

13class KeyboardBase: 

14 

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 

24 

25 def cleanup(self): 

26 pass 

27 

28 def has_bell(self): 

29 return False 

30 

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) 

51 

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) 

60 

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) 

73 

74 def mask_to_names(self, mask): 

75 return mask_to_names(mask, self.modifier_map) 

76 

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"] 

83 

84 def get_keymap_spec(self): 

85 return "", "", {} 

86 

87 def get_x11_keymap(self): 

88 return {} 

89 

90 def get_layout_spec(self): 

91 return "", [], "", None, "" 

92 

93 def get_keyboard_repeat(self): 

94 return None 

95 

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 

99 

100 

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)