boxPointer: Do not mute key events while showing

We want to mute things like pointers hovering the BoxPointer while
it does open. However keyboard events should still be handled
promptly.

Since Clutter.grab() will involve different actors being grabbed
and focused, this will have some more presence, e.g. when navigating
panel menus. We want to be able to navigate outside a menu while it
is still being shown.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2045>
This commit is contained in:
Carlos Garnacho 2021-11-18 00:18:09 +01:00
parent 0e4cd3bc79
commit 876765dbe1

View File

@ -46,6 +46,7 @@ var BoxPointer = GObject.registerClass({
this.add_actor(this._border); this.add_actor(this._border);
this.set_child_above_sibling(this.bin, this._border); this.set_child_above_sibling(this.bin, this._border);
this._sourceAlignment = 0.5; this._sourceAlignment = 0.5;
this._muteKeys = true;
this._muteInput = true; this._muteInput = true;
this.connect('notify::visible', () => { this.connect('notify::visible', () => {
@ -58,8 +59,16 @@ var BoxPointer = GObject.registerClass({
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
} }
vfunc_captured_event() { vfunc_captured_event(event) {
if (this._muteInput) if (event.type() === Clutter.EventType.ENTER ||
event.type() === Clutter.EventType.LEAVE)
return Clutter.EVENT_PROPAGATE;
let mute = event.type() === Clutter.EventType.KEY_PRESS ||
event.type() === Clutter.EventType.KEY_RELEASE
? this._muteKeys : this._muteInput;
if (mute)
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@ -86,6 +95,7 @@ var BoxPointer = GObject.registerClass({
else else
this.opacity = 255; this.opacity = 255;
this._muteKeys = false;
this.show(); this.show();
if (animate & PopupAnimation.SLIDE) { if (animate & PopupAnimation.SLIDE) {
@ -148,6 +158,7 @@ var BoxPointer = GObject.registerClass({
} }
this._muteInput = true; this._muteInput = true;
this._muteKeys = true;
this.remove_all_transitions(); this.remove_all_transitions();
this.ease({ this.ease({