runDialog: Require matching key-press for ESC shortcut

Both popover menus and dialogs can be dismissed with the Escape key,
however the former triggers on key press, while the latter triggers
on key release. As a result, the same key press+release can dismiss
both the command entry's context menu and the run dialog itself.

Fix this by only triggering a key shortcut when a matching key press
was recorded before, which matches how Dialog handles button shortcuts.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/8132
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3585>
This commit is contained in:
Florian Müllner 2025-01-04 00:17:53 +01:00
parent 50ce1fcee7
commit 9b9191e858

View File

@ -82,6 +82,7 @@ class RunDialog extends ModalDialog.ModalDialog {
content.add_child(this._descriptionLabel); content.add_child(this._descriptionLabel);
this._commandError = false; this._commandError = false;
this._pressedKey = null;
this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter = new Gio.FilenameCompleter();
@ -120,8 +121,19 @@ class RunDialog extends ModalDialog.ModalDialog {
}); });
} }
vfunc_key_press_event(event) {
this._pressedKey = event.get_key_symbol();
}
vfunc_key_release_event(event) { vfunc_key_release_event(event) {
if (event.get_key_symbol() === Clutter.KEY_Escape) { const pressedKey = this._pressedKey;
this._pressedKey = null;
const key = event.get_key_symbol();
if (key !== pressedKey)
return Clutter.EVENT_PROPAGATE;
if (key === Clutter.KEY_Escape) {
this.close(); this.close();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }