grabHelper: Use Clutter.grab() underneath
This is subject to further possible simplifications. Use Clutter.grab to redirect input and focus, a fundamental difference here is that we do redirect input to the topmost owner of the grabhelper stack, instead of the stage. This is better behaved with the presence of other grabs, at the cost of some behavioral changes. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2045>
This commit is contained in:
parent
3a77d78b42
commit
0f315a63f3
@ -6,31 +6,6 @@ const { Clutter, St } = imports.gi;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
let _capturedEventId = 0;
|
|
||||||
let _grabHelperStack = [];
|
|
||||||
function _onCapturedEvent(actor, event) {
|
|
||||||
let grabHelper = _grabHelperStack[_grabHelperStack.length - 1];
|
|
||||||
return grabHelper.onCapturedEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _pushGrabHelper(grabHelper) {
|
|
||||||
_grabHelperStack.push(grabHelper);
|
|
||||||
|
|
||||||
if (_capturedEventId == 0)
|
|
||||||
_capturedEventId = global.stage.connect('captured-event', _onCapturedEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _popGrabHelper(grabHelper) {
|
|
||||||
let poppedHelper = _grabHelperStack.pop();
|
|
||||||
if (poppedHelper != grabHelper)
|
|
||||||
throw new Error("incorrect grab helper pop");
|
|
||||||
|
|
||||||
if (_grabHelperStack.length == 0) {
|
|
||||||
global.stage.disconnect(_capturedEventId);
|
|
||||||
_capturedEventId = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GrabHelper:
|
// GrabHelper:
|
||||||
// @owner: the actor that owns the GrabHelper
|
// @owner: the actor that owns the GrabHelper
|
||||||
// @params: optional parameters to pass to Main.pushModal()
|
// @params: optional parameters to pass to Main.pushModal()
|
||||||
@ -209,7 +184,10 @@ var GrabHelper = class GrabHelper {
|
|||||||
if (!Main.pushModal(this._owner, this._modalParams))
|
if (!Main.pushModal(this._owner, this._modalParams))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_pushGrabHelper(this);
|
this._capturedEventId = this._owner.connect('captured-event',
|
||||||
|
(actor, event) => {
|
||||||
|
return this.onCapturedEvent(event);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._modalCount++;
|
this._modalCount++;
|
||||||
@ -221,8 +199,7 @@ var GrabHelper = class GrabHelper {
|
|||||||
if (this._modalCount > 0)
|
if (this._modalCount > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_popGrabHelper(this);
|
this._owner.disconnect(this._capturedEventId);
|
||||||
|
|
||||||
this._ignoreUntilRelease = false;
|
this._ignoreUntilRelease = false;
|
||||||
|
|
||||||
Main.popModal(this._owner);
|
Main.popModal(this._owner);
|
||||||
|
Loading…
Reference in New Issue
Block a user