tuikit/driver/cursesw.py
changeset 113 6796adfdc7eb
parent 106 abcadb7e2ef1
parent 111 b055add74b18
child 118 8c7970520632
equal deleted inserted replaced
112:ce2e67e7bbb8 113:6796adfdc7eb
     2 import math
     2 import math
     3 import logging
     3 import logging
     4 
     4 
     5 from tuikit.driver.driver import Driver
     5 from tuikit.driver.driver import Driver
     6 from tuikit.core.events import ResizeEvent, KeypressEvent
     6 from tuikit.core.events import ResizeEvent, KeypressEvent
       
     7 from tuikit.core.coords import Point
     7 
     8 
     8 
     9 
     9 class CursesWDriver(Driver):
    10 class CursesWDriver(Driver):
    10 
    11 
    11     key_names = {
    12     key_names = {
    63         self._log = logging.getLogger(__name__)
    64         self._log = logging.getLogger(__name__)
    64         self.stdscr = None
    65         self.stdscr = None
    65         self.cursor = None
    66         self.cursor = None
    66         self.colors = {}     # maps names to curses attributes
    67         self.colors = {}     # maps names to curses attributes
    67         self.colorpairs = {} # maps tuple (fg,bg) to curses color_pair
    68         self.colorpairs = {} # maps tuple (fg,bg) to curses color_pair
    68         self._mouse_last_pos = (None, None)
    69         self._mouse_last_pos = None  # Point
    69         self._mouse_last_bstate = None
    70         self._mouse_last_bstate = None
    70 
    71 
    71     ## initialization, finalization ##
    72     ## initialization, finalization ##
    72 
    73 
    73     def init(self):
    74     def init(self):
   203         try:
   204         try:
   204             _id, x, y, _z, bstate = curses.getmouse()
   205             _id, x, y, _z, bstate = curses.getmouse()
   205         except curses.error:
   206         except curses.error:
   206             return out
   207             return out
   207 
   208 
       
   209         pos = Point(x, y)
   208         if bstate & curses.REPORT_MOUSE_POSITION:
   210         if bstate & curses.REPORT_MOUSE_POSITION:
   209             if self._mouse_last_pos != (x, y):
   211             if self._mouse_last_pos != pos:
   210                 if self._mouse_last_pos[0] is not None:
   212                 if self._mouse_last_pos:
   211                     relx = x - (self._mouse_last_pos[0] or 0)
   213                     relpos = pos - self._mouse_last_pos
   212                     rely = y - (self._mouse_last_pos[1] or 0)
   214                     out += [('mousemove', 0, pos, relpos)]
   213                     out += [('mousemove', 0, x, y, relx, rely)]
   215                 self._mouse_last_pos = pos
   214                 self._mouse_last_pos = (x, y)
       
   215 
   216 
   216         # we are interested only in changes, not buttons already pressed before event
   217         # we are interested only in changes, not buttons already pressed before event
   217         if self._mouse_last_bstate is not None:
   218         if self._mouse_last_bstate is not None:
   218             old = self._mouse_last_bstate
   219             old = self._mouse_last_bstate
   219             new = bstate
   220             new = bstate
   221             self._mouse_last_bstate = new
   222             self._mouse_last_bstate = new
   222         else:
   223         else:
   223             self._mouse_last_bstate = bstate
   224             self._mouse_last_bstate = bstate
   224 
   225 
   225         if bstate & curses.BUTTON1_PRESSED:
   226         if bstate & curses.BUTTON1_PRESSED:
   226             out += [('mousedown', 1, x, y)]
   227             out += [('mousedown', 1, pos)]
   227         if bstate & curses.BUTTON2_PRESSED:
   228         if bstate & curses.BUTTON2_PRESSED:
   228             out += [('mousedown', 2, x, y)]
   229             out += [('mousedown', 2, pos)]
   229         if bstate & curses.BUTTON3_PRESSED:
   230         if bstate & curses.BUTTON3_PRESSED:
   230             out += [('mousedown', 3, x, y)]
   231             out += [('mousedown', 3, pos)]
   231         if bstate & curses.BUTTON1_RELEASED:
   232         if bstate & curses.BUTTON1_RELEASED:
   232             out += [('mouseup', 1, x, y)]
   233             out += [('mouseup', 1, pos)]
   233         if bstate & curses.BUTTON2_RELEASED:
   234         if bstate & curses.BUTTON2_RELEASED:
   234             out += [('mouseup', 2, x, y)]
   235             out += [('mouseup', 2, pos)]
   235         if bstate & curses.BUTTON3_RELEASED:
   236         if bstate & curses.BUTTON3_RELEASED:
   236             out += [('mouseup', 3, x, y)]
   237             out += [('mouseup', 3, pos)]
   237 
   238 
   238         # reset last pos when pressed/released
   239         # reset last pos when pressed/released
   239         if len(out) > 0 and out[-1][0] in ('mousedown', 'mouseup'):
   240         if len(out) > 0 and out[-1][0] in ('mousedown', 'mouseup'):
   240             self._mouse_last_pos = (None, None)
   241             self._mouse_last_pos = None
   241 
   242 
   242         return out
   243         return out
   243 
   244 
   244     def _split_keyname_mods(self, keyname):
   245     def _split_keyname_mods(self, keyname):
   245         """Parse keynames in form "shift+tab", return (keyname, mod)."""
   246         """Parse keynames in form "shift+tab", return (keyname, mod)."""