# HG changeset patch # User Radek Brich # Date 1358974756 -3600 # Node ID bc51b0220be237182d3580c32be8f3585fb484c0 # Parent 71f60bf6ebb7d9e8ff1793e06c03574fb89f9979 DriverCurses: filter mousemove - generate event only when coordinates changes. diff -r 71f60bf6ebb7 -r bc51b0220be2 tuikit/driver_curses.py --- a/tuikit/driver_curses.py Wed Jan 23 21:49:40 2013 +0100 +++ b/tuikit/driver_curses.py Wed Jan 23 21:59:16 2013 +0100 @@ -82,6 +82,8 @@ self.colorstack = [] # pushcolor/popcolor puts or gets attributes from this self.inputqueue = [] self.mbtnstack = [] + self._mouse_last_pos = (None, None) + self._mouse_last_bstate = None def init_curses(self): '''Initialize curses''' @@ -301,20 +303,36 @@ out = [] if bstate & curses.REPORT_MOUSE_POSITION: - out += [('mousemove', x, y)] + if self._mouse_last_pos != (x, y): + self._mouse_last_pos = (x, y) + out += [('mousemove', x, y)] + + # 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 + bstate = ~old & new + self._mouse_last_bstate = new + else: + self._mouse_last_bstate = bstate if bstate & curses.BUTTON1_PRESSED: out += [('mousedown', x, y, 1)] - + if bstate & curses.BUTTON2_PRESSED: + out += [('mousedown', x, y, 2)] if bstate & curses.BUTTON3_PRESSED: out += [('mousedown', x, y, 3)] - if bstate & curses.BUTTON1_RELEASED: out += [('mouseup', x, y, 1)] - + if bstate & curses.BUTTON2_RELEASED: + out += [('mouseup', x, y, 2)] if bstate & curses.BUTTON3_RELEASED: out += [('mouseup', x, y, 3)] + # reset last pos when pressed/released + if len(out) > 0 and out[-1][0] in ('mousedown', 'mouseup'): + self._mouse_last_pos = (None, None) + return out @@ -404,12 +422,16 @@ btn = t - 0x1f if not btn in self.mbtnstack: self.mbtnstack.append(btn) + self._mouse_last_pos = (None, None) out += [('mousedown', x, y, btn)] else: - out += [('mousemove', x, y, btn)] + if self._mouse_last_pos != (x, y): + self._mouse_last_pos = (x, y) + out += [('mousemove', x, y, btn)] elif t == 0x23: # button release btn = self.mbtnstack.pop() + self._mouse_last_pos = (None, None) out += [('mouseup', x, y, btn)] elif t in (0x60, 0x61): # wheel up, down @@ -444,7 +466,7 @@ if len(params) == 0: params = [1] - # filter codes using + # filter codes using byte sequence while True: matching_codes = [] for code in codes: