@@ -109,44 +109,58 @@ def _mpl_coords(self, xy=None):
109109 return x , y
110110
111111 def scroll_event (self , controller , dx , dy ):
112- MouseEvent ("scroll_event" , self ,
113- * self ._mpl_coords (), step = dy )._process ()
112+ MouseEvent (
113+ "scroll_event" , self , * self ._mpl_coords (), step = dy ,
114+ modifiers = self ._mpl_modifiers (controller ),
115+ )._process ()
114116 return True
115117
116118 def button_press_event (self , controller , n_press , x , y ):
117- MouseEvent ("button_press_event" , self ,
118- * self ._mpl_coords ((x , y )), controller .get_current_button ()
119- )._process ()
119+ MouseEvent (
120+ "button_press_event" , self , * self ._mpl_coords ((x , y )),
121+ controller .get_current_button (),
122+ modifiers = self ._mpl_modifiers (controller ),
123+ )._process ()
120124 self .grab_focus ()
121125
122126 def button_release_event (self , controller , n_press , x , y ):
123- MouseEvent ("button_release_event" , self ,
124- * self ._mpl_coords ((x , y )), controller .get_current_button ()
125- )._process ()
127+ MouseEvent (
128+ "button_release_event" , self , * self ._mpl_coords ((x , y )),
129+ controller .get_current_button (),
130+ modifiers = self ._mpl_modifiers (controller ),
131+ )._process ()
126132
127133 def key_press_event (self , controller , keyval , keycode , state ):
128- KeyEvent ("key_press_event" , self ,
129- self ._get_key (keyval , keycode , state ), * self ._mpl_coords ()
130- )._process ()
134+ KeyEvent (
135+ "key_press_event" , self , self ._get_key (keyval , keycode , state ),
136+ * self ._mpl_coords (),
137+ )._process ()
131138 return True
132139
133140 def key_release_event (self , controller , keyval , keycode , state ):
134- KeyEvent ("key_release_event" , self ,
135- self ._get_key (keyval , keycode , state ), * self ._mpl_coords ()
136- )._process ()
141+ KeyEvent (
142+ "key_release_event" , self , self ._get_key (keyval , keycode , state ),
143+ * self ._mpl_coords (),
144+ )._process ()
137145 return True
138146
139147 def motion_notify_event (self , controller , x , y ):
140- MouseEvent ("motion_notify_event" , self ,
141- * self ._mpl_coords ((x , y )))._process ()
142-
143- def leave_notify_event (self , controller ):
144- LocationEvent ("figure_leave_event" , self ,
145- * self ._mpl_coords ())._process ()
148+ MouseEvent (
149+ "motion_notify_event" , self , * self ._mpl_coords ((x , y )),
150+ modifiers = self ._mpl_modifiers (controller ),
151+ )._process ()
146152
147153 def enter_notify_event (self , controller , x , y ):
148- LocationEvent ("figure_enter_event" , self ,
149- * self ._mpl_coords ((x , y )))._process ()
154+ LocationEvent (
155+ "figure_enter_event" , self , * self ._mpl_coords ((x , y )),
156+ modifiers = self ._mpl_modifiers (),
157+ )._process ()
158+
159+ def leave_notify_event (self , controller ):
160+ LocationEvent (
161+ "figure_leave_event" , self , * self ._mpl_coords (),
162+ modifiers = self ._mpl_modifiers (),
163+ )._process ()
150164
151165 def resize_event (self , area , width , height ):
152166 self ._update_device_pixel_ratio ()
@@ -157,22 +171,37 @@ def resize_event(self, area, width, height):
157171 ResizeEvent ("resize_event" , self )._process ()
158172 self .draw_idle ()
159173
174+ def _mpl_modifiers (self , controller = None ):
175+ if controller is None :
176+ surface = self .get_native ().get_surface ()
177+ is_over , x , y , event_state = surface .get_device_position (
178+ self .get_display ().get_default_seat ().get_pointer ())
179+ else :
180+ event_state = controller .get_current_event_state ()
181+ mod_table = [
182+ ("ctrl" , Gdk .ModifierType .CONTROL_MASK ),
183+ ("alt" , Gdk .ModifierType .ALT_MASK ),
184+ ("shift" , Gdk .ModifierType .SHIFT_MASK ),
185+ ("super" , Gdk .ModifierType .SUPER_MASK ),
186+ ]
187+ return [name for name , mask in mod_table if event_state & mask ]
188+
160189 def _get_key (self , keyval , keycode , state ):
161190 unikey = chr (Gdk .keyval_to_unicode (keyval ))
162191 key = cbook ._unikey_or_keysym_to_mplkey (
163192 unikey ,
164193 Gdk .keyval_name (keyval ))
165194 modifiers = [
166- (Gdk .ModifierType .CONTROL_MASK , 'ctrl' ),
167- (Gdk .ModifierType .ALT_MASK , ' alt' ),
168- (Gdk .ModifierType .SHIFT_MASK , ' shift' ),
169- (Gdk .ModifierType .SUPER_MASK , ' super' ),
195+ ("ctrl" , Gdk .ModifierType .CONTROL_MASK , "control" ),
196+ ("alt" , Gdk .ModifierType .ALT_MASK , " alt" ),
197+ ("shift" , Gdk .ModifierType .SHIFT_MASK , " shift" ),
198+ ("super" , Gdk .ModifierType .SUPER_MASK , " super" ),
170199 ]
171- for key_mask , prefix in modifiers :
172- if state & key_mask :
173- if not ( prefix == 'shift' and unikey . isprintable ()):
174- key = f' { prefix } + { key } '
175- return key
200+ mods = [
201+ mod for mod , mask , mod_key in modifiers
202+ if ( mod_key != key and state & mask
203+ and not ( mod == "shift" and unikey . isprintable ()))]
204+ return "+" . join ([ * mods , key ])
176205
177206 def _update_device_pixel_ratio (self , * args , ** kwargs ):
178207 # We need to be careful in cases with mixed resolution displays if
0 commit comments