]> git.neil.brown.name Git - plato.git/commitdiff
tapboard: add support for control chars and arrows etc
authorNeilBrown <neilb@suse.de>
Fri, 25 Jan 2013 01:43:51 +0000 (12:43 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 25 Jan 2013 01:43:51 +0000 (12:43 +1100)
Signed-off-by: NeilBrown <neilb@suse.de>
lib/tapboard.py

index 337587b8fb53a0321293a05e05990b51b3d11c35..bd452d90f1e97bac17c6524c20ad4041d3ce8294 100644 (file)
@@ -75,6 +75,12 @@ keymap['lower-shift'] = [
     [  'A','S','D','F','G','H','J','K','L'],
     ['+','Z','X','C','V','B','N','M','\'',':']
 ]
+keymap['lower-ctrl'] = [
+    ['q','w','e','r','t','y','u','i','o','p'],
+    [  'a','s','d','f','g','h','j','k','l'],
+    ['Dwn','z','x','c','v','b','n','m','Lft','Rgt']
+]
+
 #keymap['number'] = [
 #    ['1','2','3','4','5','6','7','8','9','0'],
 #    [  '+','*','-','/','#','(',')','[',']'],
@@ -92,6 +98,20 @@ keymap['number-shift'] = [
     ['\\','|','+','=','_','-','Home','End','Insert','Delete']
 ]
 
+symmap = {
+    'Home' : '\x1bOH',
+    'End'  : '\x1bOF',
+    'Insert': '\x1b[2~',
+    'Delete': '\x1b[3~',
+    'Del'  :  '\0177',
+    'PgUp' : '\x1b[5~',
+    'PgDn' : '\x1b[6~',
+    'Up'   : '\x1b[A',
+    'Dwn'  : '\x1b[B',
+    'Rgt'  : '\x1b[C',
+    'Lft'  : '\x1b[D',
+}
+
 class TapBoard(gtk.VBox):
     __gsignals__ = {
         'key' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
@@ -163,8 +183,8 @@ class TapBoard(gtk.VBox):
         b = self.add_button('Num', self.nextmode, True, h, fd)
         self.modebutton = b
         b = self.add_button('SPC', self.tap, (-1,(' ','\t')), h, fd)
-        b = self.add_button('Entr', self.tap, (-1,('\n','\e')), h, fd)
-        b = self.add_button(gtk.STOCK_UNDO, self.tap, (-1,('\b','up')), h)
+        b = self.add_button('Entr', self.tap, (-1,('\n','\x1b')), h, fd)
+        b = self.add_button(gtk.STOCK_UNDO, self.tap, (-1,('\b','Up')), h)
 
         # mode can be 'lower' or 'number'
         # shift can be '' or '-shift'
@@ -272,7 +292,11 @@ class TapBoard(gtk.VBox):
         self.set_button_images()
 
     def set_button_images(self):
-        mode = self.mode + self.shift
+        if (self.mode + self.shift) in keymap:
+            mode = self.mode + self.shift
+        else:
+            # probably -ctrl: no separe keymap
+            mode = self.mode
         if self.image_mode == mode:
             return
         for row in range(3):
@@ -288,7 +312,10 @@ class TapBoard(gtk.VBox):
 
     def tap(self, rc, moved):
         (row,col) = rc
-        m = self.mode + self.shift
+        if (self.mode + self.shift) in keymap:
+            m = self.mode + self.shift
+        else:
+            m = self.mode
         if moved:
             if moved == 2 and (self.mode + '-xtra') in keymap\
                     and keymap[self.mode + '-xtra'][row][col] != ' ':
@@ -302,6 +329,11 @@ class TapBoard(gtk.VBox):
                 sym = col[0]
         else:
             sym = keymap[m][row][col]
+        if self.shift == '-ctrl' and len(sym) == 1 and sym.isalpha():
+            sym = chr(ord(sym) & 31)
+
+        if sym in symmap:
+            sym = symmap[sym]
         self.emit('key', sym)
         if self.shift and not self.locked:
             self.nextshift(True)
@@ -399,13 +431,19 @@ class TapBoard(gtk.VBox):
         self.button_timeout = gobject.timeout_add(500, self.do_buttons)
 
     def nextshift(self, a, moved=False):
-        if self.shift == '' and not a:
+        if moved:
+            lbl = '(ctrl)'
+            self.shift = '-ctrl'
+            self.locked = False
+        elif self.shift == '' and not a:
             self.shift = '-shift'
             self.locked = False
             lbl = 'Lock'
         elif not self.locked and not a:
             self.locked = True
             lbl = 'UnLk'
+            if self.shift == '-ctrl':
+                lbl = '(ctrl-lock)'
         else:
             self.shift = ''
             lbl = 'Shft'