From 61754f3e16a34b6ed102268e16ae645faec14307 Mon Sep 17 00:00:00 2001 From: Jedediah Smith Date: Tue, 10 Apr 2012 03:09:39 -0400 Subject: [PATCH 1/4] fix mouse-look jumping after losing and regaining focus (probably only on Mac) --- albow/root.py | 39 +++++++++++++++++++++++++-------------- leveleditor.py | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/albow/root.py b/albow/root.py index 7befa89..12412ef 100644 --- a/albow/root.py +++ b/albow/root.py @@ -98,6 +98,7 @@ class RootWidget(Widget): widget.root_widget = self self.is_gl = surface.get_flags() & OPENGL != 0 self.idle_handlers = [] + self.avoid_mouse_jump_bug = 0 def set_timer(self, ms): pygame.time.set_timer(USEREVENT, ms) @@ -114,6 +115,9 @@ class RootWidget(Widget): pygame.mouse.set_visible(False) pygame.event.set_grab(True) get_root().captured_widget = widget + + if self.avoid_mouse_jump_bug == 1: + self.avoid_mouse_jump_bug = 2 else: pygame.mouse.set_visible(True) pygame.event.set_grab(False) @@ -197,21 +201,25 @@ class RootWidget(Widget): mouse_widget.notify_attention_loss() mouse_widget.handle_mouse('mouse_down', event) elif type == MOUSEMOTION: - self.do_draw = True - add_modifiers(event) - modal_widget.dispatch_key('mouse_delta', event) - last_mouse_event = event - - mouse_widget = self.update_tooltip(event.pos) - - if clicked_widget: - last_mouse_event_handler = clicked_widget - clicked_widget.handle_mouse('mouse_drag', event) + if self.avoid_mouse_jump_bug == 2: + self.avoid_mouse_jump_bug = 0 + log.debug("Discarding mouse move event due to a pygame bug") else: - if not mouse_widget.is_inside(modal_widget): - mouse_widget = modal_widget - last_mouse_event_handler = mouse_widget - mouse_widget.handle_mouse('mouse_move', event) + self.do_draw = True + add_modifiers(event) + modal_widget.dispatch_key('mouse_delta', event) + last_mouse_event = event + + mouse_widget = self.update_tooltip(event.pos) + + if clicked_widget: + last_mouse_event_handler = clicked_widget + clicked_widget.handle_mouse('mouse_drag', event) + else: + if not mouse_widget.is_inside(modal_widget): + mouse_widget = modal_widget + last_mouse_event_handler = mouse_widget + mouse_widget.handle_mouse('mouse_move', event) elif type == MOUSEBUTTONUP: add_modifiers(event) self.do_draw = True @@ -266,6 +274,9 @@ class RootWidget(Widget): elif type == ACTIVEEVENT: add_modifiers(event) self.dispatch_key('activeevent', event) + + if self.avoid_mouse_jump_bug == 0: + self.avoid_mouse_jump_bug = 1 elif type == NOEVENT: add_modifiers(event) self.call_idle_handlers(event) diff --git a/leveleditor.py b/leveleditor.py index 10dd029..194c48f 100644 --- a/leveleditor.py +++ b/leveleditor.py @@ -2273,7 +2273,7 @@ class LevelEditor(GLViewport): self.dragInProgress = True self.dragStartPoint = (x,y) self.currentOperation.dragStart(x,y) - ' + def mouseDragOff(self): if self.dragInProgress: self.dragInProgress = False From 4e604d5a5d1bcc5cb2e44a85e59d88d5ab22af17 Mon Sep 17 00:00:00 2001 From: Jedediah Smith Date: Fri, 13 Apr 2012 06:08:06 -0400 Subject: [PATCH 2/4] revert changes to external library albow --- albow/root.py | 39 ++++++++++++++------------------------- leveleditor.py | 2 +- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/albow/root.py b/albow/root.py index 12412ef..7befa89 100644 --- a/albow/root.py +++ b/albow/root.py @@ -98,7 +98,6 @@ class RootWidget(Widget): widget.root_widget = self self.is_gl = surface.get_flags() & OPENGL != 0 self.idle_handlers = [] - self.avoid_mouse_jump_bug = 0 def set_timer(self, ms): pygame.time.set_timer(USEREVENT, ms) @@ -115,9 +114,6 @@ class RootWidget(Widget): pygame.mouse.set_visible(False) pygame.event.set_grab(True) get_root().captured_widget = widget - - if self.avoid_mouse_jump_bug == 1: - self.avoid_mouse_jump_bug = 2 else: pygame.mouse.set_visible(True) pygame.event.set_grab(False) @@ -201,25 +197,21 @@ class RootWidget(Widget): mouse_widget.notify_attention_loss() mouse_widget.handle_mouse('mouse_down', event) elif type == MOUSEMOTION: - if self.avoid_mouse_jump_bug == 2: - self.avoid_mouse_jump_bug = 0 - log.debug("Discarding mouse move event due to a pygame bug") + self.do_draw = True + add_modifiers(event) + modal_widget.dispatch_key('mouse_delta', event) + last_mouse_event = event + + mouse_widget = self.update_tooltip(event.pos) + + if clicked_widget: + last_mouse_event_handler = clicked_widget + clicked_widget.handle_mouse('mouse_drag', event) else: - self.do_draw = True - add_modifiers(event) - modal_widget.dispatch_key('mouse_delta', event) - last_mouse_event = event - - mouse_widget = self.update_tooltip(event.pos) - - if clicked_widget: - last_mouse_event_handler = clicked_widget - clicked_widget.handle_mouse('mouse_drag', event) - else: - if not mouse_widget.is_inside(modal_widget): - mouse_widget = modal_widget - last_mouse_event_handler = mouse_widget - mouse_widget.handle_mouse('mouse_move', event) + if not mouse_widget.is_inside(modal_widget): + mouse_widget = modal_widget + last_mouse_event_handler = mouse_widget + mouse_widget.handle_mouse('mouse_move', event) elif type == MOUSEBUTTONUP: add_modifiers(event) self.do_draw = True @@ -274,9 +266,6 @@ class RootWidget(Widget): elif type == ACTIVEEVENT: add_modifiers(event) self.dispatch_key('activeevent', event) - - if self.avoid_mouse_jump_bug == 0: - self.avoid_mouse_jump_bug = 1 elif type == NOEVENT: add_modifiers(event) self.call_idle_handlers(event) diff --git a/leveleditor.py b/leveleditor.py index 194c48f..10dd029 100644 --- a/leveleditor.py +++ b/leveleditor.py @@ -2273,7 +2273,7 @@ class LevelEditor(GLViewport): self.dragInProgress = True self.dragStartPoint = (x,y) self.currentOperation.dragStart(x,y) - + ' def mouseDragOff(self): if self.dragInProgress: self.dragInProgress = False From c9604d768af7f3a5ed1bce172b7a043ac47c0a77 Mon Sep 17 00:00:00 2001 From: Jedediah Smith Date: Fri, 13 Apr 2012 06:40:55 -0400 Subject: [PATCH 3/4] fix mouse jump after regaining focus (without touching albow) --- leveleditor.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/leveleditor.py b/leveleditor.py index 10dd029..8b42c9f 100644 --- a/leveleditor.py +++ b/leveleditor.py @@ -244,6 +244,12 @@ class CameraViewport(GLViewport): self.cameraVector = self._cameraVector() + # A state machine to dodge an apparent bug in pygame that generates erroneous mouse move events + # 0 = bad event already happened + # 1 = app just started or regained focus since last bad event + # 2 = mouse cursor was hidden after state 1, next event will be bad + self.avoidMouseJumpBug = 1 + Settings.drawSky.addObserver(self) Settings.drawFog.addObserver(self) Settings.showCeiling.addObserver(self) @@ -579,6 +585,9 @@ class CameraViewport(GLViewport): self.focus_switch = None self.startingMousePosition = mouse.get_pos() + if self.avoidMouseJumpBug == 1: + self.avoidMouseJumpBug = 2 + def mouseLookOff(self): root.get_root().capture_mouse(None) if self.startingMousePosition: @@ -1022,6 +1031,10 @@ class CameraViewport(GLViewport): lastRendererUpdate = datetime.now() def mouse_move(self, evt): + if self.avoidMouseJumpBug == 2: + self.avoidMouseJumpBug = 0 + return + def sensitivityAdjust(d): return d * ControlSettings.mouseSpeed.get() / 10.0 @@ -1046,6 +1059,10 @@ class CameraViewport(GLViewport): # event.get(MOUSEMOTION) # self.oldMousePosition = (self.startingMousePosition) + def activeevent(self, evt): + if evt.state & 0x2 and evt.gain != 0: + self.avoidMouseJumpBug = 1 + @property def tooltipText(self): return self.editor.currentTool.worldTooltipText @@ -2178,6 +2195,8 @@ class LevelEditor(GLViewport): self.doWorkUnit() def activeevent(self, evt): + self.mainViewport.activeevent(evt) + if evt.state & 0x4: # minimized if evt.gain == 0: logging.debug("Offscreen") From 634b263a424d3417d14420dc19ce2f64250e7ae4 Mon Sep 17 00:00:00 2001 From: Jedediah Smith Date: Fri, 13 Apr 2012 06:43:32 -0400 Subject: [PATCH 4/4] remove a spurious apostrophe that confuses emacs --- leveleditor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leveleditor.py b/leveleditor.py index 8b42c9f..9862fb2 100644 --- a/leveleditor.py +++ b/leveleditor.py @@ -2292,7 +2292,7 @@ class LevelEditor(GLViewport): self.dragInProgress = True self.dragStartPoint = (x,y) self.currentOperation.dragStart(x,y) - ' + def mouseDragOff(self): if self.dragInProgress: self.dragInProgress = False