overview: Handle unredirection in OverviewShown state machine

Under certain unknown circumstances currently not every
`disable_unredirect_for_display()` gets matched with an
`enable_unredirect_for_display()` when closing the overview.

As we only want to not disable unredirection when hidden and we nowadays
have a state machine that ensures we transition to and from one state to
another only once, handle unredirection en-/disablement as part of the
state transition.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2970>
This commit is contained in:
robert.mader@collabora.com 2023-09-27 01:10:45 +02:00
parent b1a27d6086
commit a94fcee961

@ -305,6 +305,11 @@ export class Overview extends Signals.EventEmitter {
`${this._shownState} to ${state}`);
}
if (this._shownState === OverviewShownState.HIDDEN)
Meta.disable_unredirect_for_display(global.display);
else if (state === OverviewShownState.HIDDEN)
Meta.enable_unredirect_for_display(global.display);
this._shownState = state;
this.emit(OVERVIEW_SHOWN_TRANSITIONS[state].signal);
}
@ -411,8 +416,6 @@ export class Overview extends Signals.EventEmitter {
_gestureUpdate(tracker, progress) {
if (!this._shown) {
Meta.disable_unredirect_for_display(global.display);
this._shown = true;
this._visible = true;
this._visibleTarget = true;
@ -567,8 +570,6 @@ export class Overview extends Signals.EventEmitter {
this._visibleTarget = true;
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_display(global.display);
Main.layoutManager.overviewGroup.set_child_above_sibling(
this._coverPane, null);
this._coverPane.show();
@ -636,9 +637,6 @@ export class Overview extends Signals.EventEmitter {
}
_hideDone() {
// Re-enable unredirection
Meta.enable_unredirect_for_display(global.display);
this._coverPane.hide();
this._visible = false;
@ -688,8 +686,6 @@ export class Overview extends Signals.EventEmitter {
// the animation because of a race in the xserver where the grab
// fails when requested very early during startup.
Meta.disable_unredirect_for_display(global.display);
this._changeShownState(OverviewShownState.SHOWING);
this._overview.runStartupAnimation(() => {