popupMenu: Don't chain up vfuncs if the parent doesn't implement them

Some vfuncs like `button_press_event`, `button_release_event` and
`touch_event` don't have handlers in the parent classes of
PopupBaseMenuItem. So don't call those handlers and return the default
Clutter.EVENT_PROPAGATE there.

This fixes a crash of the shell that happens when pressing a mouse
button inside the system popup menu and releasing it above a slider like
the volume slider again.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/787
This commit is contained in:
Jonas Dreßler 2019-10-27 22:28:38 +01:00 committed by Florian Müllner
parent 6cfcfc72cc
commit c35b4cede5

View File

@ -118,18 +118,18 @@ var PopupBaseMenuItem = GObject.registerClass({
this._parent = parent; this._parent = parent;
} }
vfunc_button_press_event(buttonEvent) { vfunc_button_press_event() {
if (!this._activatable) if (!this._activatable)
return super.vfunc_button_press_event(buttonEvent); return Clutter.EVENT_PROPAGATE;
// This is the CSS active state // This is the CSS active state
this.add_style_pseudo_class('active'); this.add_style_pseudo_class('active');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
vfunc_button_release_event(buttonEvent) { vfunc_button_release_event() {
if (!this._activatable) if (!this._activatable)
return super.vfunc_button_release_event(buttonEvent); return Clutter.EVENT_PROPAGATE;
this.remove_style_pseudo_class('active'); this.remove_style_pseudo_class('active');
this.activate(Clutter.get_current_event()); this.activate(Clutter.get_current_event());
@ -138,7 +138,7 @@ var PopupBaseMenuItem = GObject.registerClass({
vfunc_touch_event(touchEvent) { vfunc_touch_event(touchEvent) {
if (!this._activatable) if (!this._activatable)
return super.vfunc_touch_event(touchEvent); return Clutter.EVENT_PROPAGATE;
if (touchEvent.type == Clutter.EventType.TOUCH_END) { if (touchEvent.type == Clutter.EventType.TOUCH_END) {
this.remove_style_pseudo_class('active'); this.remove_style_pseudo_class('active');