group: Move various functions to MetaWindowX11
Except meta_window_x11_get_group, which is still used by GNOME Shell and we can't make it a private API for now. Will need further investigation and could be done as a future step Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3555>
This commit is contained in:
parent
f0c22cb3bc
commit
e1e6534eb2
@ -1993,10 +1993,10 @@ in_tab_chain (MetaWindow *window,
|
|||||||
|
|
||||||
if (window->display->focus_window &&
|
if (window->display->focus_window &&
|
||||||
window->display->focus_window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
window->display->focus_window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
focus_group = meta_window_get_group (window->display->focus_window);
|
focus_group = meta_window_x11_get_group (window->display->focus_window);
|
||||||
|
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
window_group = meta_window_get_group (window);
|
window_group = meta_window_x11_get_group (window);
|
||||||
|
|
||||||
in_group_tab_chain = meta_window_is_focusable (window) && (!focus_group || window_group == focus_group);
|
in_group_tab_chain = meta_window_is_focusable (window) && (!focus_group || window_group == focus_group);
|
||||||
#endif
|
#endif
|
||||||
|
@ -512,7 +512,7 @@ create_constraints (Constraint **constraints,
|
|||||||
GSList *tmp2;
|
GSList *tmp2;
|
||||||
MetaGroup *group;
|
MetaGroup *group;
|
||||||
|
|
||||||
group = meta_window_get_group (w);
|
group = meta_window_x11_get_group (w);
|
||||||
|
|
||||||
if (group != NULL)
|
if (group != NULL)
|
||||||
group_windows = meta_group_list_windows (group);
|
group_windows = meta_group_list_windows (group);
|
||||||
|
@ -1455,7 +1455,7 @@ meta_window_unmanage (MetaWindow *window,
|
|||||||
meta_stack_freeze (window->display->stack);
|
meta_stack_freeze (window->display->stack);
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
{
|
{
|
||||||
group = meta_window_get_group (window);
|
group = meta_window_x11_get_group (window);
|
||||||
if (group)
|
if (group)
|
||||||
meta_group_update_layers (group);
|
meta_group_update_layers (group);
|
||||||
}
|
}
|
||||||
@ -1469,7 +1469,7 @@ meta_window_unmanage (MetaWindow *window,
|
|||||||
* group if window->unmanaging */
|
* group if window->unmanaging */
|
||||||
#ifdef HAVE_X11_CLIENT
|
#ifdef HAVE_X11_CLIENT
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
meta_window_shutdown_group (window);
|
meta_window_x11_shutdown_group (window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If we have the focus, focus some other window.
|
/* If we have the focus, focus some other window.
|
||||||
@ -4470,7 +4470,7 @@ meta_window_get_startup_id (MetaWindow *window)
|
|||||||
{
|
{
|
||||||
MetaGroup *group;
|
MetaGroup *group;
|
||||||
|
|
||||||
group = meta_window_get_group (window);
|
group = meta_window_x11_get_group (window);
|
||||||
|
|
||||||
if (group != NULL)
|
if (group != NULL)
|
||||||
return meta_group_get_startup_id (group);
|
return meta_group_get_startup_id (group);
|
||||||
@ -6114,7 +6114,7 @@ meta_window_update_layer (MetaWindow *window)
|
|||||||
MetaGroup *group = NULL;
|
MetaGroup *group = NULL;
|
||||||
|
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
group = meta_window_get_group (window);
|
group = meta_window_x11_get_group (window);
|
||||||
|
|
||||||
meta_stack_freeze (window->display->stack);
|
meta_stack_freeze (window->display->stack);
|
||||||
if (group)
|
if (group)
|
||||||
|
@ -31,16 +31,7 @@
|
|||||||
|
|
||||||
/* note, can return NULL */
|
/* note, can return NULL */
|
||||||
META_EXPORT
|
META_EXPORT
|
||||||
MetaGroup* meta_window_get_group (MetaWindow *window);
|
MetaGroup * meta_window_x11_get_group (MetaWindow *window);
|
||||||
|
|
||||||
META_EXPORT
|
|
||||||
void meta_window_compute_group (MetaWindow* window);
|
|
||||||
|
|
||||||
META_EXPORT
|
|
||||||
void meta_window_shutdown_group (MetaWindow *window);
|
|
||||||
|
|
||||||
META_EXPORT
|
|
||||||
void meta_window_group_leader_changed (MetaWindow *window);
|
|
||||||
|
|
||||||
META_EXPORT
|
META_EXPORT
|
||||||
GSList* meta_group_list_windows (MetaGroup *group);
|
GSList* meta_group_list_windows (MetaGroup *group);
|
||||||
|
@ -32,3 +32,8 @@ struct _MetaGroup
|
|||||||
char *startup_id;
|
char *startup_id;
|
||||||
char *wm_client_machine;
|
char *wm_client_machine;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MetaGroup * meta_group_new (MetaX11Display *x11_display,
|
||||||
|
Window group_leader);
|
||||||
|
|
||||||
|
void meta_group_unref (MetaGroup *group);
|
||||||
|
122
src/x11/group.c
122
src/x11/group.c
@ -38,7 +38,7 @@
|
|||||||
#include "x11/window-x11.h"
|
#include "x11/window-x11.h"
|
||||||
#include "x11/window-x11-private.h"
|
#include "x11/window-x11-private.h"
|
||||||
|
|
||||||
static MetaGroup*
|
MetaGroup*
|
||||||
meta_group_new (MetaX11Display *x11_display,
|
meta_group_new (MetaX11Display *x11_display,
|
||||||
Window group_leader)
|
Window group_leader)
|
||||||
{
|
{
|
||||||
@ -95,7 +95,7 @@ meta_group_new (MetaX11Display *x11_display,
|
|||||||
return g_steal_pointer (&group);
|
return g_steal_pointer (&group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
meta_group_unref (MetaGroup *group)
|
meta_group_unref (MetaGroup *group)
|
||||||
{
|
{
|
||||||
g_return_if_fail (group->refcount > 0);
|
g_return_if_fail (group->refcount > 0);
|
||||||
@ -126,124 +126,6 @@ meta_group_unref (MetaGroup *group)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_window_get_group: (skip)
|
|
||||||
* @window: a #MetaWindow
|
|
||||||
*
|
|
||||||
* Returns: (transfer none) (nullable): the #MetaGroup of the window
|
|
||||||
*/
|
|
||||||
MetaGroup*
|
|
||||||
meta_window_get_group (MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowX11 *window_x11;
|
|
||||||
MetaWindowX11Private *priv;
|
|
||||||
|
|
||||||
if (window->unmanaging)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
window_x11 = META_WINDOW_X11 (window);
|
|
||||||
priv = meta_window_x11_get_private (window_x11);
|
|
||||||
|
|
||||||
return priv->group;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_window_compute_group (MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaGroup *group = NULL;
|
|
||||||
MetaWindow *ancestor;
|
|
||||||
MetaX11Display *x11_display = window->display->x11_display;
|
|
||||||
Window win_leader = meta_window_x11_get_xgroup_leader (window);
|
|
||||||
MetaWindowX11Private *priv =
|
|
||||||
meta_window_x11_get_private (META_WINDOW_X11 (window));
|
|
||||||
|
|
||||||
/* use window->xwindow if no window->xgroup_leader */
|
|
||||||
|
|
||||||
/* Determine the ancestor of the window; its group setting will override the
|
|
||||||
* normal grouping rules; see bug 328211.
|
|
||||||
*/
|
|
||||||
ancestor = meta_window_find_root_ancestor (window);
|
|
||||||
|
|
||||||
if (x11_display->groups_by_leader)
|
|
||||||
{
|
|
||||||
if (ancestor != window)
|
|
||||||
group = meta_window_get_group (ancestor);
|
|
||||||
else if (win_leader != None)
|
|
||||||
group = g_hash_table_lookup (x11_display->groups_by_leader,
|
|
||||||
&win_leader);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Window xwindow = meta_window_x11_get_xwindow (window);
|
|
||||||
group = g_hash_table_lookup (x11_display->groups_by_leader,
|
|
||||||
&xwindow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (group != NULL)
|
|
||||||
{
|
|
||||||
priv->group = group;
|
|
||||||
group->refcount += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Window ancestor_leader = meta_window_x11_get_xgroup_leader (ancestor);
|
|
||||||
|
|
||||||
if (ancestor != window && ancestor_leader != None)
|
|
||||||
group = meta_group_new (x11_display,
|
|
||||||
ancestor_leader);
|
|
||||||
else if (win_leader != None)
|
|
||||||
group = meta_group_new (x11_display,
|
|
||||||
win_leader);
|
|
||||||
else
|
|
||||||
group = meta_group_new (x11_display,
|
|
||||||
meta_window_x11_get_xwindow (window));
|
|
||||||
|
|
||||||
priv->group = group;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!priv->group)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->group->windows = g_slist_prepend (priv->group->windows, window);
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_GROUPS,
|
|
||||||
"Adding %s to group with leader 0x%lx",
|
|
||||||
window->desc, group->group_leader);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
remove_window_from_group (MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowX11Private *priv =
|
|
||||||
meta_window_x11_get_private (META_WINDOW_X11 (window));
|
|
||||||
|
|
||||||
if (priv->group != NULL)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_GROUPS,
|
|
||||||
"Removing %s from group with leader 0x%lx",
|
|
||||||
window->desc, priv->group->group_leader);
|
|
||||||
|
|
||||||
priv->group->windows =
|
|
||||||
g_slist_remove (priv->group->windows,
|
|
||||||
window);
|
|
||||||
meta_group_unref (priv->group);
|
|
||||||
priv->group = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_window_group_leader_changed (MetaWindow *window)
|
|
||||||
{
|
|
||||||
remove_window_from_group (window);
|
|
||||||
meta_window_compute_group (window);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_window_shutdown_group (MetaWindow *window)
|
|
||||||
{
|
|
||||||
remove_window_from_group (window);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_x11_display_lookup_group: (skip)
|
* meta_x11_display_lookup_group: (skip)
|
||||||
* @x11_display: a #MetaX11Display
|
* @x11_display: a #MetaX11Display
|
||||||
|
@ -1665,7 +1665,7 @@ reload_wm_hints (MetaWindow *window,
|
|||||||
meta_verbose ("Window %s changed its group leader to 0x%lx",
|
meta_verbose ("Window %s changed its group leader to 0x%lx",
|
||||||
window->desc, priv->xgroup_leader);
|
window->desc, priv->xgroup_leader);
|
||||||
|
|
||||||
meta_window_group_leader_changed (window);
|
meta_window_x11_group_leader_changed (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_window_set_urgent (window, urgent);
|
meta_window_set_urgent (window, urgent);
|
||||||
|
@ -108,4 +108,9 @@ gboolean meta_window_x11_has_pointer (MetaWindow *window);
|
|||||||
gboolean meta_window_x11_same_application (MetaWindow *window,
|
gboolean meta_window_x11_same_application (MetaWindow *window,
|
||||||
MetaWindow *other_window);
|
MetaWindow *other_window);
|
||||||
|
|
||||||
|
void meta_window_x11_shutdown_group (MetaWindow *window);
|
||||||
|
|
||||||
|
META_EXPORT
|
||||||
|
void meta_window_x11_group_leader_changed (MetaWindow *window);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "wayland/meta-window-xwayland.h"
|
#include "wayland/meta-window-xwayland.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "x11/group-private.h"
|
||||||
#include "x11/meta-sync-counter.h"
|
#include "x11/meta-sync-counter.h"
|
||||||
#include "x11/meta-x11-display-private.h"
|
#include "x11/meta-x11-display-private.h"
|
||||||
#include "x11/session.h"
|
#include "x11/session.h"
|
||||||
@ -95,6 +96,9 @@ static void
|
|||||||
meta_window_x11_impl_process_property_notify (MetaWindow *window,
|
meta_window_x11_impl_process_property_notify (MetaWindow *window,
|
||||||
XPropertyEvent *event);
|
XPropertyEvent *event);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_x11_compute_group (MetaWindow *window);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_x11_init (MetaWindowX11 *window_x11)
|
meta_window_x11_init (MetaWindowX11 *window_x11)
|
||||||
{
|
{
|
||||||
@ -559,7 +563,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 */
|
||||||
priv->group = NULL;
|
priv->group = NULL;
|
||||||
priv->xgroup_leader = None;
|
priv->xgroup_leader = None;
|
||||||
meta_window_compute_group (window);
|
meta_window_x11_compute_group (window);
|
||||||
|
|
||||||
meta_window_load_initial_properties (window);
|
meta_window_load_initial_properties (window);
|
||||||
|
|
||||||
@ -1881,7 +1885,7 @@ get_maximum_layer_in_group (MetaWindow *window)
|
|||||||
|
|
||||||
max = META_LAYER_DESKTOP;
|
max = META_LAYER_DESKTOP;
|
||||||
|
|
||||||
group = meta_window_get_group (window);
|
group = meta_window_x11_get_group (window);
|
||||||
|
|
||||||
if (group != NULL)
|
if (group != NULL)
|
||||||
members = meta_group_list_windows (group);
|
members = meta_group_list_windows (group);
|
||||||
@ -2035,7 +2039,7 @@ meta_window_x11_set_transient_for (MetaWindow *window,
|
|||||||
if (xtransient_for != None &&
|
if (xtransient_for != None &&
|
||||||
priv->xgroup_leader != None &&
|
priv->xgroup_leader != None &&
|
||||||
xtransient_for != priv->xgroup_leader)
|
xtransient_for != priv->xgroup_leader)
|
||||||
meta_window_group_leader_changed (window);
|
meta_window_x11_group_leader_changed (window);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -4491,10 +4495,128 @@ gboolean
|
|||||||
meta_window_x11_same_application (MetaWindow *window,
|
meta_window_x11_same_application (MetaWindow *window,
|
||||||
MetaWindow *other_window)
|
MetaWindow *other_window)
|
||||||
{
|
{
|
||||||
MetaGroup *group = meta_window_get_group (window);
|
MetaGroup *group = meta_window_x11_get_group (window);
|
||||||
MetaGroup *other_group = meta_window_get_group (other_window);
|
MetaGroup *other_group = meta_window_x11_get_group (other_window);
|
||||||
|
|
||||||
return (group != NULL &&
|
return (group != NULL &&
|
||||||
other_group != NULL &&
|
other_group != NULL &&
|
||||||
group == other_group);
|
group == other_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_window_x11_get_group: (skip)
|
||||||
|
* @window: a #MetaWindow
|
||||||
|
*
|
||||||
|
* Returns: (transfer none) (nullable): the #MetaGroup of the window
|
||||||
|
*/
|
||||||
|
MetaGroup*
|
||||||
|
meta_window_x11_get_group (MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaWindowX11 *window_x11;
|
||||||
|
MetaWindowX11Private *priv;
|
||||||
|
|
||||||
|
if (window->unmanaging)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
window_x11 = META_WINDOW_X11 (window);
|
||||||
|
priv = meta_window_x11_get_private (window_x11);
|
||||||
|
|
||||||
|
return priv->group;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_x11_compute_group (MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaGroup *group = NULL;
|
||||||
|
MetaWindow *ancestor;
|
||||||
|
MetaX11Display *x11_display = window->display->x11_display;
|
||||||
|
Window win_leader = meta_window_x11_get_xgroup_leader (window);
|
||||||
|
MetaWindowX11Private *priv =
|
||||||
|
meta_window_x11_get_private (META_WINDOW_X11 (window));
|
||||||
|
|
||||||
|
/* use window->xwindow if no window->xgroup_leader */
|
||||||
|
|
||||||
|
/* Determine the ancestor of the window; its group setting will override the
|
||||||
|
* normal grouping rules; see bug 328211.
|
||||||
|
*/
|
||||||
|
ancestor = meta_window_find_root_ancestor (window);
|
||||||
|
|
||||||
|
if (x11_display->groups_by_leader)
|
||||||
|
{
|
||||||
|
if (ancestor != window)
|
||||||
|
group = meta_window_x11_get_group (ancestor);
|
||||||
|
else if (win_leader != None)
|
||||||
|
group = g_hash_table_lookup (x11_display->groups_by_leader,
|
||||||
|
&win_leader);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Window xwindow = meta_window_x11_get_xwindow (window);
|
||||||
|
group = g_hash_table_lookup (x11_display->groups_by_leader,
|
||||||
|
&xwindow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (group != NULL)
|
||||||
|
{
|
||||||
|
priv->group = group;
|
||||||
|
group->refcount += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Window ancestor_leader = meta_window_x11_get_xgroup_leader (ancestor);
|
||||||
|
|
||||||
|
if (ancestor != window && ancestor_leader != None)
|
||||||
|
group = meta_group_new (x11_display,
|
||||||
|
ancestor_leader);
|
||||||
|
else if (win_leader != None)
|
||||||
|
group = meta_group_new (x11_display,
|
||||||
|
win_leader);
|
||||||
|
else
|
||||||
|
group = meta_group_new (x11_display,
|
||||||
|
meta_window_x11_get_xwindow (window));
|
||||||
|
|
||||||
|
priv->group = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!priv->group)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->group->windows = g_slist_prepend (priv->group->windows, window);
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_GROUPS,
|
||||||
|
"Adding %s to group with leader 0x%lx",
|
||||||
|
window->desc, group->group_leader);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_window_from_group (MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaWindowX11Private *priv =
|
||||||
|
meta_window_x11_get_private (META_WINDOW_X11 (window));
|
||||||
|
|
||||||
|
if (priv->group != NULL)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_GROUPS,
|
||||||
|
"Removing %s from group with leader 0x%lx",
|
||||||
|
window->desc, priv->group->group_leader);
|
||||||
|
|
||||||
|
priv->group->windows =
|
||||||
|
g_slist_remove (priv->group->windows,
|
||||||
|
window);
|
||||||
|
meta_group_unref (priv->group);
|
||||||
|
priv->group = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_x11_group_leader_changed (MetaWindow *window)
|
||||||
|
{
|
||||||
|
remove_window_from_group (window);
|
||||||
|
meta_window_x11_compute_group (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_x11_shutdown_group (MetaWindow *window)
|
||||||
|
{
|
||||||
|
remove_window_from_group (window);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user