mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 16:40:41 -05:00
window-props: Don't set override redirect windows as top-level parent
Java applications might use override-redirect windows as parent windows for top-level windows, although this is not following the standard [1]. In such case, the first non-override-redirect child window that is created was marked as being on_all_workspaces since the call to should_be_on_all_workspaces() returns TRUE for its parent, and this even though the on_all_workspaces_requested bit is unset. When a further child of this window was added, it was set as not having a workspace and not being on_all_workspaces, since the call to should_be_on_all_workspaces() for its parent would return FALSE (unless if it is in a different monitor, and the multiple-monitors workspaces are disabled). Since per commit09bab98b
we don't recompute the workspace if the on_all_workspaces bit is unset, we could end up in a case where a window can be nor in all the workspaces or in a specific workspace. So let's just ignore the transient_for bit for a window if that points to an override-redirect, using the x11 root window instead. Add a stacking test to verify this scenario (was failing before of this commit). Fixes https://gitlab.gnome.org/GNOME/mutter/issues/885 https://gitlab.gnome.org/GNOME/mutter/merge_requests/895 [1] https://standards.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472512128 (cherry picked from commitbacbbbd628
)
This commit is contained in:
parent
598be2b1d8
commit
7c1f3498fe
@ -131,6 +131,7 @@ stacking_tests = [
|
||||
'mixed-windows',
|
||||
'set-parent',
|
||||
'override-redirect',
|
||||
'set-override-redirect-parent',
|
||||
'set-parent-exported',
|
||||
]
|
||||
|
||||
|
24
src/tests/stacking/set-override-redirect-parent.metatest
Normal file
24
src/tests/stacking/set-override-redirect-parent.metatest
Normal file
@ -0,0 +1,24 @@
|
||||
new_client 1 x11
|
||||
create 1/1 override
|
||||
show 1/1
|
||||
|
||||
create 1/2
|
||||
set_parent 1/2 1
|
||||
show 1/2
|
||||
|
||||
create 1/3
|
||||
set_parent 1/3 2
|
||||
show 1/3
|
||||
|
||||
|
||||
new_client 2 x11
|
||||
create 2/1
|
||||
show 2/1
|
||||
|
||||
create 2/2 override
|
||||
set_parent 2/2 1
|
||||
show 2/2
|
||||
|
||||
create 2/3
|
||||
set_parent 2/3 2
|
||||
show 2/3
|
@ -1661,6 +1661,15 @@ reload_transient_for (MetaWindow *window,
|
||||
transient_for, window->desc);
|
||||
transient_for = None;
|
||||
}
|
||||
else if (parent->override_redirect)
|
||||
{
|
||||
meta_warning ("WM_TRANSIENT_FOR window %s for top-level %s is an "
|
||||
"override-redirect window and this is not correct "
|
||||
"according to the standard, so we'll fallback to "
|
||||
"the root window.\n", parent->desc, window->desc);
|
||||
transient_for = parent->display->x11_display->xroot;
|
||||
parent = NULL;
|
||||
}
|
||||
|
||||
/* Make sure there is not a loop */
|
||||
if (check_xtransient_for_loop (window, parent))
|
||||
|
Loading…
Reference in New Issue
Block a user