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:
parent
6cfcfc72cc
commit
c35b4cede5
@ -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');
|
||||||
|
Loading…
Reference in New Issue
Block a user