From 7cedabc79a3e85c54716444e1337cf97fec7a43b Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Thu, 5 Jan 2017 20:46:58 -0600 Subject: [PATCH] ensure mouse is always released on loss of focus and before trying to re-capture --- lib/matplotlib/backends/backend_wx.py | 35 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index ecd3bf970ad1..b050bb5f7299 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -685,6 +685,9 @@ def do_nothing(*args, **kwargs): self.Bind(wx.EVT_MIDDLE_DCLICK, self._onMiddleButtonDClick) self.Bind(wx.EVT_MIDDLE_UP, self._onMiddleButtonUp) + self.Bind(wx.EVT_MOUSE_CAPTURE_CHANGED, self._onCaptureLost) + self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self._onCaptureLost) + if wx.VERSION_STRING < "2.9": # only needed in 2.8 to reduce flicker self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) @@ -1023,12 +1026,23 @@ def _onKeyUp(self, evt): evt.Skip() FigureCanvasBase.key_release_event(self, key, guiEvent=evt) + def _set_capture(self, capture=True): + """control wx mouse capture """ + if self.HasCapture(): + self.ReleaseMouse() + if capture: + self.CaptureMouse() + + def _onCaptureLost(self, evt): + """Capture changed or lost""" + self._set_capture(False) + def _onRightButtonDown(self, evt): """Start measuring on an axis.""" x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 3, guiEvent=evt) def _onRightButtonDClick(self, evt): @@ -1036,7 +1050,7 @@ def _onRightButtonDClick(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 3, dblclick=True, guiEvent=evt) @@ -1045,8 +1059,7 @@ def _onRightButtonUp(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - if self.HasCapture(): - self.ReleaseMouse() + self._set_capture(False) FigureCanvasBase.button_release_event(self, x, y, 3, guiEvent=evt) def _onLeftButtonDown(self, evt): @@ -1054,7 +1067,7 @@ def _onLeftButtonDown(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 1, guiEvent=evt) def _onLeftButtonDClick(self, evt): @@ -1062,7 +1075,7 @@ def _onLeftButtonDClick(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 1, dblclick=True, guiEvent=evt) @@ -1072,8 +1085,7 @@ def _onLeftButtonUp(self, evt): y = self.figure.bbox.height - evt.GetY() # print 'release button', 1 evt.Skip() - if self.HasCapture(): - self.ReleaseMouse() + self._set_capture(False) FigureCanvasBase.button_release_event(self, x, y, 1, guiEvent=evt) # Add middle button events @@ -1082,7 +1094,7 @@ def _onMiddleButtonDown(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 2, guiEvent=evt) def _onMiddleButtonDClick(self, evt): @@ -1090,7 +1102,7 @@ def _onMiddleButtonDClick(self, evt): x = evt.GetX() y = self.figure.bbox.height - evt.GetY() evt.Skip() - self.CaptureMouse() + self._set_capture(True) FigureCanvasBase.button_press_event(self, x, y, 2, dblclick=True, guiEvent=evt) @@ -1100,8 +1112,7 @@ def _onMiddleButtonUp(self, evt): y = self.figure.bbox.height - evt.GetY() # print 'release button', 1 evt.Skip() - if self.HasCapture(): - self.ReleaseMouse() + self._set_capture(False) FigureCanvasBase.button_release_event(self, x, y, 2, guiEvent=evt) def _onMouseWheel(self, evt):