modalDialog: Fix auto-completion of prompts immediately upon display

Shell modal dialogs can take their action on a certain key's
key-release-event. For example on <enter> the affirmative action is
usually run.

Make sure that the key was also pressed on the dialog and we're not
seeing a spurious key-release-event from a key that was pressed before
the dialog was displayed.

https://bugzilla.gnome.org/show_bug.cgi?id=692937
This commit is contained in:
Stef Walter 2013-02-13 21:57:02 +01:00
parent 323e3028b6
commit 7b705dd670

View File

@ -58,7 +58,9 @@ const ModalDialog = new Lang.Class({
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy)); this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
this._pressedKey = null;
this._buttonKeys = {}; this._buttonKeys = {};
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent)); this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
this._backgroundBin = new St.Bin(); this._backgroundBin = new St.Bin();
@ -179,10 +181,19 @@ const ModalDialog = new Lang.Class({
return button; return button;
}, },
_onKeyReleaseEvent: function(object, event) { _onKeyPressEvent: function(object, event) {
let symbol = event.get_key_symbol(); this._pressedKey = event.get_key_symbol();
let buttonInfo = this._buttonKeys[symbol]; },
_onKeyReleaseEvent: function(object, event) {
let pressedKey = this._pressedKey;
this._pressedKey = null;
let symbol = event.get_key_symbol();
if (symbol != pressedKey)
return false;
let buttonInfo = this._buttonKeys[symbol];
if (!buttonInfo) if (!buttonInfo)
return false; return false;