Skip to content

layout: Update overview visibility using "showing" and "hidden" signals

When showing or hiding the overview, the layoutManager updates the visibility of the window_group, it currently does this from inside its showOverview() and hideOverview() methods. showOverview() gets called by overview.js before starting the animation to show the overview, and hideOverview() gets called after the animation to hide the overview was finished.

Now there's a quite obscure issue with the order those get called in: Because showOverview() is called before the animation is started, the window_group is hidden before the windowPreviews get shown (we show them when starting the animation). That in turn notifies the "mapped" property of the windowActor at a point where the windowActor has no mapped clones which makes mutter emit a wl_output event to the client, notifying it that it left the monitor.

Now this is not really issue right now, since painting the clone will temporarily map the source actor, which notifies the "mapped" property of the windowActor again at a point where the actor has a mapped clone, so the client will get notified about entering the monitor again while showing the overview.

Still, it's better to not send any wl_output events to the client while opening the overview, since the window is actually always shown on the screen.

To fix this, we need to always have either a clone or the windowActor itself visible while opening the overview, we can do that by waiting a bit longer until hiding the window_group. So listen to the "showing" and "hidden" signals for keeping track of the visibility of the overview in the layoutManager, since the "showing" signal is emitted right after the animation was started and the windowPreviews are shown.

Merge request reports