diff options
author | Wade Brainerd <wadetb@gmail.com> | 2009-03-20 03:25:48 (GMT) |
---|---|---|
committer | Wade Brainerd <wadetb@gmail.com> | 2009-03-20 03:25:48 (GMT) |
commit | 906b32711ac89789b8b3f2eb1c53d18db56fe5f7 (patch) | |
tree | bccc08fe96a9aabfc210a326dd817797f57decfc /keyboard.py | |
parent | 01a1d3f88d701eb89374a13b62a0d5ee9ad26649 (diff) |
Fix keyboard issues with new keymap format.
Diffstat (limited to 'keyboard.py')
-rw-r--r-- | keyboard.py | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/keyboard.py b/keyboard.py index a46bffb..34a9da2 100644 --- a/keyboard.py +++ b/keyboard.py @@ -20,7 +20,7 @@ import pygtk pygtk.require('2.0') import gtk import rsvg -import os, glob +import os, glob, re import pango import simplejson @@ -329,6 +329,35 @@ class KeyboardData: f.write(text) f.close() + def format_key_sig(self, scan, state, group): + sig = 'scan%d' % scan + if state & gtk.gdk.SHIFT_MASK: + sig += ' shift' + if state & gtk.gdk.MOD5_MASK: + sig += ' altgr' + if group != 0: + sig += ' group%d' % group + return sig + + KEY_SIG_RE = re.compile(r'scan(?P<scan>\d+) ?(?P<shift>shift)? ?(?P<altgr>altgr)?( group)?(?P<group>\d+)?') + + def parse_key_sig(self, sig): + m = KeyboardData.KEY_SIG_RE.match(sig) + + state = 0 + if m.group('shift'): + state |= gtk.gdk.SHIFT_MASK + if m.group('altgr'): + state |= gtk.gdk.MOD5_MASK + + scan = int(m.group('scan')) + + group = 0 + if m.group('group'): + group = int(m.group('group')) + + return scan, state, group + def find_key_by_label(self, label): for k in self.keys: if k['key-label'] == label: @@ -344,7 +373,12 @@ class KeyboardData: # Look up the key in the letter map. for sig, l in self.letter_map.items(): if l == letter: - return self.parse_key_sig(sig) + scan, state, group = self.parse_key_sig(sig) + for k in self.keys: + if k['key-scan'] == scan: + return k, state, group + + return None, None, None class KeyboardWidget(KeyboardData, gtk.DrawingArea): """A GTK widget which implements an interactive visual keyboard, with support @@ -391,30 +425,6 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea): self.root_window.disconnect(self.key_press_cb_id) self.root_window.disconnect(self.key_release_cb_id) - def format_key_sig(self, scan, state, group): - sig = 'scan%d' % scan - if state & gtk.gdk.SHIFT_MASK: - sig += ' shift' - if state & gtk.gdk.MOD5_MASK: - sig += ' altgr' - if group != 0: - sig += ' group%d' % group - return sig - - def parse_key_sig(self, sig): - m = re.match(r'scan(?P<scan>\d+) (?P<shift>shift)? (?P<altgr>altgr)? group(?P<group>\d+)', sig) - - state = 0 - if m.group('shift'): - state |= gtk.gdk.SHIFT_MASK - if m.group('altgr'): - state |= gtk.gdk.MOD5_MASK - - scan = int(m.group('scan')) - group = int(m.group('group')) - - return scan, state, group - def set_layout(self, layout): """Sets the keyboard's layout from a layout description.""" KeyboardData.set_layout(self, layout) |