tuikit/driver/cursesw.py
changeset 118 8c7970520632
parent 113 6796adfdc7eb
child 119 dd91747504dd
--- a/tuikit/driver/cursesw.py	Mon Feb 16 21:17:43 2015 +0100
+++ b/tuikit/driver/cursesw.py	Sat Feb 21 12:01:57 2015 +0100
@@ -3,7 +3,7 @@
 import logging
 
 from tuikit.driver.driver import Driver
-from tuikit.core.events import ResizeEvent, KeypressEvent
+from tuikit.core.events import ResizeEvent, KeypressEvent, MouseEvent
 from tuikit.core.coords import Point
 
 
@@ -106,7 +106,12 @@
                 self.stdscr.addstr(y, x, ch)
             else:
                 raise TypeError('Integer or one-char string is required.')
-        except curses.error as e:
+        except curses.error:
+            if x == self.size.w - 1 and y == self.size.h - 1:
+                # Curses putch to lower-right corner gives error because
+                # scrolling is disabled and cursor cannot move to next char.
+                # Let's just ignore that for now.
+                return
             self._log.exception('putch(%r, %s, %s) error:' % (ch, x, y))
 
     def draw(self, buffer, x=0, y=0):
@@ -162,7 +167,7 @@
         timeout -- float, in seconds (None=infinite)
 
         Returns:
-            [('event', param1, ...), ...]
+            List of Event objects.
 
         """
         # Set timeout
@@ -200,21 +205,21 @@
         return res
 
     def _process_mouse(self):
-        out = []
+        res = []
         try:
             _id, x, y, _z, bstate = curses.getmouse()
         except curses.error:
-            return out
+            return res
 
         pos = Point(x, y)
         if bstate & curses.REPORT_MOUSE_POSITION:
             if self._mouse_last_pos != pos:
                 if self._mouse_last_pos:
                     relpos = pos - self._mouse_last_pos
-                    out += [('mousemove', 0, pos, relpos)]
+                    res.append(MouseEvent('mousemove', 0, pos, relpos))
                 self._mouse_last_pos = pos
 
-        # we are interested only in changes, not buttons already pressed before event
+        # We are interested only in changes, not buttons already pressed before event
         if self._mouse_last_bstate is not None:
             old = self._mouse_last_bstate
             new = bstate
@@ -224,23 +229,23 @@
             self._mouse_last_bstate = bstate
 
         if bstate & curses.BUTTON1_PRESSED:
-            out += [('mousedown', 1, pos)]
+            res.append(MouseEvent('mousedown', 1, pos))
         if bstate & curses.BUTTON2_PRESSED:
-            out += [('mousedown', 2, pos)]
+            res.append(MouseEvent('mousedown', 2, pos))
         if bstate & curses.BUTTON3_PRESSED:
-            out += [('mousedown', 3, pos)]
+            res.append(MouseEvent('mousedown', 3, pos))
         if bstate & curses.BUTTON1_RELEASED:
-            out += [('mouseup', 1, pos)]
+            res.append(MouseEvent('mouseup', 1, pos))
         if bstate & curses.BUTTON2_RELEASED:
-            out += [('mouseup', 2, pos)]
+            res.append(MouseEvent('mouseup', 2, pos))
         if bstate & curses.BUTTON3_RELEASED:
-            out += [('mouseup', 3, pos)]
+            res.append(MouseEvent('mouseup', 3, pos))
 
-        # reset last pos when pressed/released
-        if len(out) > 0 and out[-1][0] in ('mousedown', 'mouseup'):
+        # Reset last pos when pressed/released
+        if len(res) > 0 and res[-1].name in ('mousedown', 'mouseup'):
             self._mouse_last_pos = None
 
-        return out
+        return res
 
     def _split_keyname_mods(self, keyname):
         """Parse keynames in form "shift+tab", return (keyname, mod)."""