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:
parent
50ce1fcee7
commit
9b9191e858
@ -82,6 +82,7 @@ class RunDialog extends ModalDialog.ModalDialog {
|
||||
content.add_child(this._descriptionLabel);
|
||||
|
||||
this._commandError = false;
|
||||
this._pressedKey = null;
|
||||
|
||||
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) {
|
||||
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();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user