window: Really propagate effective on-all-workspaces setting to transients

Commit cda9579034 fixed a corner case when setting the initial workspace
state of transient windows, but it still missed a case:

should_be_on_all_workspaces() returns whether the window should be on all
workspaces according to its properties/placement, but it doesn't take
transient relations into account.

That means in case of nested transients, we can still fail the assert:

 1. on-all-workspaces toplevel
 2. should_be_on_all_workspaces() is TRUE for the first transient's parent,
    as the window from (1) has on_all_workspaces_requested == TRUE
 3. should_be_on_all_workspaces() is FALSE for the second transient's
    parent, as the window from (2) is only on-all-workspace because
    of its parent

We can fix this by either using the state from the root ancestor
instead of the direct transient parent, or by using the parent's
on_all_workspaces_state.

The latter is simpler, so go with that.

https://gitlab.gnome.org/GNOME/mutter/issues/1083
This commit is contained in:
Florian Müllner 2020-03-21 18:24:52 +01:00 committed by Marco Trevisan (Treviño)
parent dde0906639
commit f3420b0341

View File

@ -1272,7 +1272,7 @@ _meta_window_shared_new (MetaDisplay *display,
window->desc, window->transient_for->desc); window->desc, window->transient_for->desc);
set_workspace_state (window, set_workspace_state (window,
should_be_on_all_workspaces (window->transient_for), window->transient_for->on_all_workspaces,
window->transient_for->workspace); window->transient_for->workspace);
} }
else if (window->on_all_workspaces) else if (window->on_all_workspaces)