window/x11: Try harder to find the associated group

Otherwise we would try to create a new group later on which would crash

Fixes #3329

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3656>
This commit is contained in:
Bilal Elmoussaoui 2024-03-11 11:32:40 +01:00
parent 2a879be180
commit 6d03666d2d

View File

@ -4549,9 +4549,11 @@ static void
meta_window_x11_compute_group (MetaWindow *window) meta_window_x11_compute_group (MetaWindow *window)
{ {
MetaGroup *group = NULL; MetaGroup *group = NULL;
MetaWindow *ancestor;
MetaX11Display *x11_display = window->display->x11_display; MetaX11Display *x11_display = window->display->x11_display;
MetaWindow *ancestor = meta_window_find_root_ancestor (window);
Window win_leader = meta_window_x11_get_xgroup_leader (window); Window win_leader = meta_window_x11_get_xgroup_leader (window);
Window xwindow = meta_window_x11_get_xwindow (window);
Window ancestor_leader = meta_window_x11_get_xgroup_leader (ancestor);
MetaWindowX11Private *priv = MetaWindowX11Private *priv =
meta_window_x11_get_private (META_WINDOW_X11 (window)); meta_window_x11_get_private (META_WINDOW_X11 (window));
@ -4560,22 +4562,20 @@ meta_window_x11_compute_group (MetaWindow *window)
/* Determine the ancestor of the window; its group setting will override the /* Determine the ancestor of the window; its group setting will override the
* normal grouping rules; see bug 328211. * normal grouping rules; see bug 328211.
*/ */
ancestor = meta_window_find_root_ancestor (window);
if (x11_display->groups_by_leader) if (x11_display->groups_by_leader)
{ {
if (ancestor != window) if (ancestor != window && ancestor_leader != None)
group = meta_window_x11_get_group (ancestor); group = meta_window_x11_get_group (ancestor);
else if (win_leader != None)
if (win_leader != None && group == NULL)
group = g_hash_table_lookup (x11_display->groups_by_leader, group = g_hash_table_lookup (x11_display->groups_by_leader,
&win_leader); &win_leader);
else
{ if (group == NULL)
Window xwindow = meta_window_x11_get_xwindow (window);
group = g_hash_table_lookup (x11_display->groups_by_leader, group = g_hash_table_lookup (x11_display->groups_by_leader,
&xwindow); &xwindow);
} }
}
if (group != NULL) if (group != NULL)
{ {
@ -4584,17 +4584,13 @@ meta_window_x11_compute_group (MetaWindow *window)
} }
else else
{ {
Window ancestor_leader = meta_window_x11_get_xgroup_leader (ancestor);
if (ancestor != window && ancestor_leader != None) if (ancestor != window && ancestor_leader != None)
group = meta_group_new (x11_display, group = meta_group_new (x11_display, ancestor_leader);
ancestor_leader);
else if (win_leader != None) else if (win_leader != None)
group = meta_group_new (x11_display, group = meta_group_new (x11_display, win_leader);
win_leader);
else else
group = meta_group_new (x11_display, group = meta_group_new (x11_display, xwindow);
meta_window_x11_get_xwindow (window));
priv->group = group; priv->group = group;
} }