grabHelper: Track the grab before trying to set key focus

If we don't this for a nested grabFocus grab, the notify::key-focus
will be called, not think that the new key focus is part of the
grab, and cancel the full grab. This leaves the grab helper in an
inconsistent and confused state, as the grab is pushed onto the
grab stack after.

https://bugzilla.gnome.org/show_bug.cgi?id=693975
This commit is contained in:
Jasper St. Pierre 2013-02-16 12:52:37 -05:00
parent 5f995c64d4
commit 180000a531

View File

@ -167,6 +167,8 @@ const GrabHelper = new Lang.Class({
if (params.grabFocus && !this._takeFocusGrab(hadFocus)) if (params.grabFocus && !this._takeFocusGrab(hadFocus))
return false; return false;
this._grabStack.push(params);
if (params.focus) { if (params.focus) {
params.focus.grab_key_focus(); params.focus.grab_key_focus();
} else if (newFocus && (hadFocus || params.grabFocus)) { } else if (newFocus && (hadFocus || params.grabFocus)) {
@ -177,7 +179,6 @@ const GrabHelper = new Lang.Class({
if ((params.grabFocus || params.modal) && !this._capturedEventId) if ((params.grabFocus || params.modal) && !this._capturedEventId)
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent)); this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._grabStack.push(params);
return true; return true;
}, },