When using POINTER_MOTION_HINT_MASK, only the first motion-notify-event
is fired, and then following events are suppressed until a button is
pressed or gtk.gtk.Window.get_pointer() is called. The previous version
did not call get_pointer(), so on some systems, the event only fired
once, and the effect was that panning and the mouse-over effect did not
work.
Fixes issue #24.
... | ... |
@@ -1264,11 +1264,15 @@ class DragAction(object): |
1264 | 1264 |
self.start() |
1265 | 1265 |
|
1266 | 1266 |
def on_motion_notify(self, event): |
1267 |
- deltax = self.prevmousex - event.x |
|
1268 |
- deltay = self.prevmousey - event.y |
|
1267 |
+ if event.is_hint: |
|
1268 |
+ x, y, state = event.window.get_pointer() |
|
1269 |
+ else: |
|
1270 |
+ x, y, state = event.x, event.y, event.state |
|
1271 |
+ deltax = self.prevmousex - x |
|
1272 |
+ deltay = self.prevmousey - y |
|
1269 | 1273 |
self.drag(deltax, deltay) |
1270 |
- self.prevmousex = event.x |
|
1271 |
- self.prevmousey = event.y |
|
1274 |
+ self.prevmousex = x |
|
1275 |
+ self.prevmousey = y |
|
1272 | 1276 |
|
1273 | 1277 |
def on_button_release(self, event): |
1274 | 1278 |
self.stopmousex = event.x |
... | ... |
@@ -1294,10 +1298,14 @@ class DragAction(object): |
1294 | 1298 |
class NullAction(DragAction): |
1295 | 1299 |
|
1296 | 1300 |
def on_motion_notify(self, event): |
1301 |
+ if event.is_hint: |
|
1302 |
+ x, y, state = event.window.get_pointer() |
|
1303 |
+ else: |
|
1304 |
+ x, y, state = event.x, event.y, event.state |
|
1297 | 1305 |
dot_widget = self.dot_widget |
1298 |
- item = dot_widget.get_url(event.x, event.y) |
|
1306 |
+ item = dot_widget.get_url(x, y) |
|
1299 | 1307 |
if item is None: |
1300 |
- item = dot_widget.get_jump(event.x, event.y) |
|
1308 |
+ item = dot_widget.get_jump(x, y) |
|
1301 | 1309 |
if item is not None: |
1302 | 1310 |
dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) |
1303 | 1311 |
dot_widget.set_highlight(item.highlight) |