tuikit/driver/curses.py
changeset 97 0c2e0c09ba5c
parent 95 05392e369ede
child 106 abcadb7e2ef1
child 109 105b1affc3c2
--- a/tuikit/driver/curses.py	Fri Mar 28 14:58:20 2014 +0100
+++ b/tuikit/driver/curses.py	Fri Mar 28 19:58:59 2014 +0100
@@ -139,7 +139,7 @@
 
     def flush(self):
         if self.cursor:
-            self.stdscr.move(*self.cursor)
+            self.stdscr.move(self.cursor.y, self.cursor.x)
             curses.curs_set(True)
         else:
             curses.curs_set(False)
@@ -175,18 +175,6 @@
             res = res | self.attr_map[a]
         return res
 
-    ## cursor ##
-
-    def showcursor(self, x, y):
-        if self.clipstack.test(x, y):
-            self.cursor = (y, x)
-        else:
-            self.cursor = None
-
-    def hidecursor(self):
-        curses.curs_set(False)
-        self.cursor = None
-
     ## input, events ##
 
     def getevents(self, timeout=None):
@@ -224,7 +212,7 @@
                 res += self._process_utf8_chars()
 
             elif curses.ascii.isprint(c):
-                res += [('keypress', None, str(chr(c)))]
+                res += [('keypress', None, str(chr(c)), set())]
 
             else:
                 self._inputqueue_unget(c)
@@ -337,7 +325,7 @@
             utf.append(c)
             try:
                 uni = str(bytes(utf), 'utf-8')
-                return [('keypress', None, uni)]
+                return [('keypress', None, uni, set())]
             except UnicodeDecodeError:
                 continue
         raise Exception('Invalid UTF-8 sequence: %r' % utf)
@@ -392,7 +380,7 @@
         if match is None:
             self.log.debug('Unknown control sequence: %s',
                            ','.join(['0x%x' % x for x in consumed]))
-            return [('keypress', 'Unknown', None)]
+            return [('keypress', 'Unknown', None, set())]
 
         if keyname == 'mouse':
             return self._process_xterm_mouse()
@@ -400,7 +388,7 @@
         if keyname == 'CSI':
             return self._process_control_sequence()
 
-        return [('keypress', keyname, None)]
+        return [('keypress', keyname, None, set())]
 
     def _process_xterm_mouse(self):
         t = self._inputqueue_get_wait()
@@ -473,7 +461,7 @@
                 # no match -> unknown code
                 seq = ','.join(['0x%x' % x for x in debug_seq])
                 self.log.debug('Unknown control sequence: %s', seq)
-                return [('keypress', 'Unknown:' + seq, None)]
+                return [('keypress', 'Unknown:' + seq, None, set())]
             elif len(codes) == 1:
                 # one match -> we got the winner
                 break
@@ -496,7 +484,7 @@
             # no match -> unknown code
             seq = ','.join(['0x%x' % x for x in debug_seq])
             self.log.debug('Unknown control sequence: %s', seq)
-            return [('keypress', 'Unknown:' + seq, None)]
+            return [('keypress', 'Unknown:' + seq, None, set())]
 
         if len(matching_codes) > 1:
             raise Exception('Internal error: invalid csi_codes, more than one matching')
@@ -504,11 +492,17 @@
         keyname = matching_codes[0][1]
 
         # modifiers
-        mod = 0
+        mod_bits = 0
         if len(params) > 1:
-            mod = params[1] - 1
+            mod_bits = params[1] - 1
 
-        return [('keypress', keyname, None, mod)]
+        # convert modifiers from bit-map to set
+        mod_set = set()
+        for bit, name in enumerate(('shift', 'alt', 'ctrl', 'meta')):
+            if mod_bits & 1<<bit:
+                mod_set.add(name)
+
+        return [('keypress', keyname, None, mod_set)]
 
 
 driver_class = CursesDriver