Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e18cfda

Browse files
committed
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.
1 parent dc63ec7 commit e18cfda

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

lib/matplotlib/backends/backend_gtk4.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
TimerGTK as TimerGTK4,
3030
)
3131

32+
_GOBJECT_GE_3_47 = gi.version_info >= (3, 47, 0)
33+
3234

3335
class FigureCanvasGTK4(_FigureCanvasGTK, Gtk.DrawingArea):
3436
required_interactive_framework = "gtk4"
@@ -115,7 +117,7 @@ def scroll_event(self, controller, dx, dy):
115117
MouseEvent(
116118
"scroll_event", self, *self._mpl_coords(), step=dy,
117119
modifiers=self._mpl_modifiers(controller),
118-
guiEvent=controller.get_current_event(),
120+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
119121
)._process()
120122
return True
121123

@@ -124,7 +126,7 @@ def button_press_event(self, controller, n_press, x, y):
124126
"button_press_event", self, *self._mpl_coords((x, y)),
125127
controller.get_current_button(),
126128
modifiers=self._mpl_modifiers(controller),
127-
guiEvent=controller.get_current_event(),
129+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
128130
)._process()
129131
self.grab_focus()
130132

@@ -133,22 +135,22 @@ def button_release_event(self, controller, n_press, x, y):
133135
"button_release_event", self, *self._mpl_coords((x, y)),
134136
controller.get_current_button(),
135137
modifiers=self._mpl_modifiers(controller),
136-
guiEvent=controller.get_current_event(),
138+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
137139
)._process()
138140

139141
def key_press_event(self, controller, keyval, keycode, state):
140142
KeyEvent(
141143
"key_press_event", self, self._get_key(keyval, keycode, state),
142144
*self._mpl_coords(),
143-
guiEvent=controller.get_current_event(),
145+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
144146
)._process()
145147
return True
146148

147149
def key_release_event(self, controller, keyval, keycode, state):
148150
KeyEvent(
149151
"key_release_event", self, self._get_key(keyval, keycode, state),
150152
*self._mpl_coords(),
151-
guiEvent=controller.get_current_event(),
153+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
152154
)._process()
153155
return True
154156

@@ -157,21 +159,21 @@ def motion_notify_event(self, controller, x, y):
157159
"motion_notify_event", self, *self._mpl_coords((x, y)),
158160
buttons=self._mpl_buttons(controller),
159161
modifiers=self._mpl_modifiers(controller),
160-
guiEvent=controller.get_current_event(),
162+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
161163
)._process()
162164

163165
def enter_notify_event(self, controller, x, y):
164166
LocationEvent(
165167
"figure_enter_event", self, *self._mpl_coords((x, y)),
166168
modifiers=self._mpl_modifiers(),
167-
guiEvent=controller.get_current_event(),
169+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
168170
)._process()
169171

170172
def leave_notify_event(self, controller):
171173
LocationEvent(
172174
"figure_leave_event", self, *self._mpl_coords(),
173175
modifiers=self._mpl_modifiers(),
174-
guiEvent=controller.get_current_event(),
176+
guiEvent=controller.get_current_event() if _GOBJECT_GE_3_47 else None,
175177
)._process()
176178

177179
def resize_event(self, area, width, height):

0 commit comments

Comments
 (0)