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).""" |