From e18cfda1348d0a1c803d61a729d88ec1be559bb5 Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Fri, 20 Dec 2024 14:10:45 -0700 Subject: [PATCH] FIX: Add version gate to GTK4 calls when necessary get_current_event() calls within pygobject would cause segfaults. This was fixed in 3.47, so gate the guiEvent information to only access that method in versions that don't segfault. --- lib/matplotlib/backends/backend_gtk4.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backends/backend_gtk4.py b/lib/matplotlib/backends/backend_gtk4.py index 6af301c2becb..620c9e5b94b6 100644 --- a/lib/matplotlib/backends/backend_gtk4.py +++ b/lib/matplotlib/backends/backend_gtk4.py @@ -29,6 +29,8 @@ TimerGTK as TimerGTK4, ) +_GOBJECT_GE_3_47 = gi.version_info >= (3, 47, 0) + class FigureCanvasGTK4(_FigureCanvasGTK, Gtk.DrawingArea): required_interactive_framework = "gtk4" @@ -115,7 +117,7 @@ def scroll_event(self, controller, dx, dy): MouseEvent( "scroll_event", self, *self._mpl_coords(), step=dy, modifiers=self._mpl_modifiers(controller), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() return True @@ -124,7 +126,7 @@ def button_press_event(self, controller, n_press, x, y): "button_press_event", self, *self._mpl_coords((x, y)), controller.get_current_button(), modifiers=self._mpl_modifiers(controller), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() self.grab_focus() @@ -133,14 +135,14 @@ def button_release_event(self, controller, n_press, x, y): "button_release_event", self, *self._mpl_coords((x, y)), controller.get_current_button(), modifiers=self._mpl_modifiers(controller), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() def key_press_event(self, controller, keyval, keycode, state): KeyEvent( "key_press_event", self, self._get_key(keyval, keycode, state), *self._mpl_coords(), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() return True @@ -148,7 +150,7 @@ def key_release_event(self, controller, keyval, keycode, state): KeyEvent( "key_release_event", self, self._get_key(keyval, keycode, state), *self._mpl_coords(), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() return True @@ -157,21 +159,21 @@ def motion_notify_event(self, controller, x, y): "motion_notify_event", self, *self._mpl_coords((x, y)), buttons=self._mpl_buttons(controller), modifiers=self._mpl_modifiers(controller), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() def enter_notify_event(self, controller, x, y): LocationEvent( "figure_enter_event", self, *self._mpl_coords((x, y)), modifiers=self._mpl_modifiers(), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() def leave_notify_event(self, controller): LocationEvent( "figure_leave_event", self, *self._mpl_coords(), modifiers=self._mpl_modifiers(), - guiEvent=controller.get_current_event(), + guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None, )._process() def resize_event(self, area, width, height):