From: NeilBrown Date: Fri, 25 Jan 2013 01:43:51 +0000 (+1100) Subject: tapboard: add support for control chars and arrows etc X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=416a6afa9c76d0349f6cb48fcdc6bd1b59c24ee2;p=plato.git tapboard: add support for control chars and arrows etc Signed-off-by: NeilBrown --- diff --git a/lib/tapboard.py b/lib/tapboard.py index 337587b..bd452d9 100644 --- a/lib/tapboard.py +++ b/lib/tapboard.py @@ -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'