window: Move xgroup_leader to WindowX11

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3211>
This commit is contained in:
Bilal Elmoussaoui 2023-08-24 12:25:30 +02:00 committed by Robert Mader
parent 7d6e7773bf
commit 9e150fda42
5 changed files with 42 additions and 20 deletions

View File

@ -204,7 +204,6 @@ struct _MetaWindow
char *gtk_menubar_object_path; char *gtk_menubar_object_path;
Window xtransient_for; Window xtransient_for;
Window xgroup_leader;
MetaWindow *transient_for; MetaWindow *transient_for;
/* Initial workspace property */ /* Initial workspace property */

View File

@ -36,6 +36,7 @@
#include "x11/group-props.h" #include "x11/group-props.h"
#include "x11/meta-x11-display-private.h" #include "x11/meta-x11-display-private.h"
#include "x11/window-x11.h" #include "x11/window-x11.h"
#include "x11/window-x11-private.h"
static MetaGroup* static MetaGroup*
meta_group_new (MetaX11Display *x11_display, meta_group_new (MetaX11Display *x11_display,
@ -141,16 +142,15 @@ meta_window_get_group (MetaWindow *window)
} }
void void
meta_window_compute_group (MetaWindow* window) meta_window_compute_group (MetaWindow *window)
{ {
MetaGroup *group; MetaGroup *group = NULL;
MetaWindow *ancestor; MetaWindow *ancestor;
MetaX11Display *x11_display = window->display->x11_display; MetaX11Display *x11_display = window->display->x11_display;
Window win_leader = meta_window_x11_get_xgroup_leader (window);
/* use window->xwindow if no window->xgroup_leader */ /* use window->xwindow if no window->xgroup_leader */
group = NULL;
/* 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.
*/ */
@ -160,9 +160,9 @@ meta_window_compute_group (MetaWindow* window)
{ {
if (ancestor != window) if (ancestor != window)
group = ancestor->group; group = ancestor->group;
else if (window->xgroup_leader != None) else if (win_leader != None)
group = g_hash_table_lookup (x11_display->groups_by_leader, group = g_hash_table_lookup (x11_display->groups_by_leader,
&window->xgroup_leader); &win_leader);
else else
{ {
Window xwindow = meta_window_x11_get_xwindow (window); Window xwindow = meta_window_x11_get_xwindow (window);
@ -178,12 +178,14 @@ meta_window_compute_group (MetaWindow* window)
} }
else else
{ {
if (ancestor != window && ancestor->xgroup_leader != None) Window ancestor_leader = meta_window_x11_get_xgroup_leader (ancestor);
if (ancestor != window && ancestor_leader != None)
group = meta_group_new (x11_display, group = meta_group_new (x11_display,
ancestor->xgroup_leader); ancestor_leader);
else if (window->xgroup_leader != None) else if (win_leader != None)
group = meta_group_new (x11_display, group = meta_group_new (x11_display,
window->xgroup_leader); win_leader);
else else
group = meta_group_new (x11_display, group = meta_group_new (x11_display,
meta_window_x11_get_xwindow (window)); meta_window_x11_get_xwindow (window));

View File

@ -1617,12 +1617,12 @@ reload_wm_hints (MetaWindow *window,
Window old_group_leader; Window old_group_leader;
gboolean urgent; gboolean urgent;
old_group_leader = window->xgroup_leader; old_group_leader = priv->xgroup_leader;
/* Fill in defaults */ /* Fill in defaults */
window->input = TRUE; window->input = TRUE;
window->initially_iconic = FALSE; window->initially_iconic = FALSE;
window->xgroup_leader = None; priv->xgroup_leader = None;
priv->wm_hints_pixmap = None; priv->wm_hints_pixmap = None;
priv->wm_hints_mask = None; priv->wm_hints_mask = None;
urgent = FALSE; urgent = FALSE;
@ -1638,7 +1638,7 @@ reload_wm_hints (MetaWindow *window,
window->initially_iconic = (hints->initial_state == IconicState); window->initially_iconic = (hints->initial_state == IconicState);
if (hints->flags & WindowGroupHint) if (hints->flags & WindowGroupHint)
window->xgroup_leader = hints->window_group; priv->xgroup_leader = hints->window_group;
if (hints->flags & IconPixmapHint) if (hints->flags & IconPixmapHint)
priv->wm_hints_pixmap = hints->icon_pixmap; priv->wm_hints_pixmap = hints->icon_pixmap;
@ -1651,15 +1651,15 @@ reload_wm_hints (MetaWindow *window,
meta_verbose ("Read WM_HINTS input: %d iconic: %d group leader: 0x%lx pixmap: 0x%lx mask: 0x%lx", meta_verbose ("Read WM_HINTS input: %d iconic: %d group leader: 0x%lx pixmap: 0x%lx mask: 0x%lx",
window->input, window->initially_iconic, window->input, window->initially_iconic,
window->xgroup_leader, priv->xgroup_leader,
priv->wm_hints_pixmap, priv->wm_hints_pixmap,
priv->wm_hints_mask); priv->wm_hints_mask);
} }
if (window->xgroup_leader != old_group_leader) if (priv->xgroup_leader != old_group_leader)
{ {
meta_verbose ("Window %s changed its group leader to 0x%lx", meta_verbose ("Window %s changed its group leader to 0x%lx",
window->desc, window->xgroup_leader); window->desc, priv->xgroup_leader);
meta_window_group_leader_changed (window); meta_window_group_leader_changed (window);
} }

View File

@ -79,6 +79,7 @@ struct _MetaWindowX11Private
Window xwindow; Window xwindow;
Window xclient_leader; Window xclient_leader;
Window xgroup_leader;
/* Bypass compositor hints */ /* Bypass compositor hints */
MetaBypassCompositorHint bypass_compositor; MetaBypassCompositorHint bypass_compositor;
@ -90,4 +91,6 @@ MetaWindowX11Private * meta_window_x11_get_private (MetaWindowX11 *window_x11);
void meta_window_x11_initialize_state (MetaWindow *window); void meta_window_x11_initialize_state (MetaWindow *window);
Window meta_window_x11_get_xgroup_leader (MetaWindow *window);
G_END_DECLS G_END_DECLS

View File

@ -558,7 +558,7 @@ meta_window_x11_manage (MetaWindow *window)
/* assign the window to its group, or create a new group if needed */ /* assign the window to its group, or create a new group if needed */
window->group = NULL; window->group = NULL;
window->xgroup_leader = None; priv->xgroup_leader = None;
meta_window_compute_group (window); meta_window_compute_group (window);
meta_window_load_initial_properties (window); meta_window_load_initial_properties (window);
@ -2002,6 +2002,10 @@ static gboolean
meta_window_x11_set_transient_for (MetaWindow *window, meta_window_x11_set_transient_for (MetaWindow *window,
MetaWindow *parent) MetaWindow *parent)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv =
meta_window_x11_get_instance_private (window_x11);
meta_window_x11_recalc_window_type (window); meta_window_x11_recalc_window_type (window);
if (!window->constructing) if (!window->constructing)
{ {
@ -2027,8 +2031,8 @@ meta_window_x11_set_transient_for (MetaWindow *window,
* in programs such as xmms-- see #328211. * in programs such as xmms-- see #328211.
*/ */
if (window->xtransient_for != None && if (window->xtransient_for != None &&
window->xgroup_leader != None && priv->xgroup_leader != None &&
window->xtransient_for != window->xgroup_leader) window->xtransient_for != priv->xgroup_leader)
meta_window_group_leader_changed (window); meta_window_group_leader_changed (window);
return TRUE; return TRUE;
@ -4412,3 +4416,17 @@ meta_window_x11_get_xwindow (MetaWindow *window)
return priv->xwindow; return priv->xwindow;
} }
Window
meta_window_x11_get_xgroup_leader (MetaWindow *window)
{
MetaWindowX11 *window_x11;
MetaWindowX11Private *priv;
g_return_val_if_fail (META_IS_WINDOW (window), None);
window_x11 = META_WINDOW_X11 (window);
priv = meta_window_x11_get_instance_private (window_x11);
return priv->xgroup_leader;
}