diff options
author | Wade Brainerd <wadetb@gmail.com> | 2009-11-19 00:58:04 (GMT) |
---|---|---|
committer | Wade Brainerd <wadetb@gmail.com> | 2009-11-19 00:58:04 (GMT) |
commit | 49ca80749aa0a5a23595cdb67105ca700e4bd2f4 (patch) | |
tree | eac87616c1e3b6e725c356b19e0f4f32e998a2df /keyboard.py | |
parent | 0333a2bb7b1711641739a155c6131e6c4113a7e6 (diff) |
Use GDK as a fallback when a custom keymap is not present. Also display a reasonable error when a key is not understood.
Diffstat (limited to 'keyboard.py')
-rw-r--r-- | keyboard.py | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/keyboard.py b/keyboard.py index 4887183..45389f7 100644 --- a/keyboard.py +++ b/keyboard.py @@ -238,7 +238,7 @@ class KeyboardData: self.keys = None self.key_scan_map = None - self.letter_map = {} + self.letter_map = {} # Access the current GTK keymap. self.keymap = gtk.gdk.keymap_get_default() @@ -365,13 +365,11 @@ class KeyboardData: return None def get_key_state_group_for_letter(self, letter): - """Returns a (key, modifier_state) which when pressed will generate letter.""" - # Special processing for the enter key. + # Special processing for some keys. if letter == '\n' or letter == PARAGRAPH_CODE: return self.find_key_by_label('enter'), 0, 0 - # Look up the key in the letter map. - # Find the one with the fewest modifier keys. + # Try the letter map, if loaded. best_score = 3 best_result = None @@ -379,6 +377,7 @@ class KeyboardData: if unicode(l) == unicode(letter): scan, state, group = self.parse_key_sig(sig) + # Choose the key with the fewest modifiers. score = 0 if state & gtk.gdk.SHIFT_MASK: score += 1 if state & gtk.gdk.MOD5_MASK: score += 1 @@ -391,8 +390,35 @@ class KeyboardData: if k['key-scan'] == best_result[0]: return k, best_result[1], best_result[2] + # Try the GDK keymap. + keyval = gtk.gdk.unicode_to_keyval(ord(letter)) + entries = self.keymap.get_entries_for_keyval(keyval) + for e in entries: + for k in self.keys: + if k['key-scan'] == e[0]: + # TODO: Level -> state calculations are hardcoded to what the XO keyboard does. + # They were discovered through experimentation. + state = 0 + if e[2] & 1: + state |= gtk.gdk.SHIFT_MASK + if e[2] & 2: + state |= gtk.gdk.MOD5_MASK + return k, state, e[1] + + # Fail! return None, None, None + def get_letter_for_key_state_group(self, key, state, group): + sig = self.format_key_sig(key['key-scan'], state, group) + if self.letter_map.has_key(sig): + return self.letter_map[sig] + else: + t = self.keymap.translate_keyboard_state(key['key-scan'], self.active_state, self.active_group) + if t: + return unichr(gtk.gdk.keyval_to_unicode(t[0])) + + return '' + class KeyboardWidget(KeyboardData, gtk.DrawingArea): """A GTK widget which implements an interactive visual keyboard, with support for custom data driven layouts.""" @@ -494,11 +520,8 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): text = '' if k['key-label']: text = k['key-label'] - else: - sig = self.format_key_sig(k['key-scan'], self.active_state, self.active_group) - if self.letter_map.has_key(sig): - text = self.letter_map[sig] + text = self.get_letter_for_key_state_group(k, self.active_state, self.active_group) try: layout = self.create_pango_layout(unicode(text)) |