mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
Precompute groups to guarantee that meta_group_list_windows always returns
2003-06-04 Rob Adams <robadams@ucla.edu> Precompute groups to guarantee that meta_group_list_windows always returns the correct list of windows. See Bug #96973 * src/window.h: change cached_group variable to group * src/window.c (meta_window_new): change cached_group to group and call meta_window_compute_group * src/groups.c (meta_window_get_group): simply return window->group rather than computing it and returning window->cached_group (meta_window_compute_group): new function computes window->group. Designed to be called once from meta_window_new (remove_window_from_group): change cached_group to group (meta_window_group_leader_changed): call meta_window_compute_group instead of meta_window_get_group
This commit is contained in:
parent
4469a42a77
commit
993c7075f3
@ -13,7 +13,9 @@
|
|||||||
window->cached_group
|
window->cached_group
|
||||||
(meta_window_compute_group): new function computes window->group.
|
(meta_window_compute_group): new function computes window->group.
|
||||||
Designed to be called once from meta_window_new
|
Designed to be called once from meta_window_new
|
||||||
(remove_window_from_group): change cached_group to group
|
(remove_window_from_group): change cached_group to group
|
||||||
|
(meta_window_group_leader_changed): call meta_window_compute_group
|
||||||
|
instead of meta_window_get_group
|
||||||
|
|
||||||
2003-05-29 Rob Adams <robadams@ucla.edu>
|
2003-05-29 Rob Adams <robadams@ucla.edu>
|
||||||
|
|
||||||
|
98
src/group.c
98
src/group.c
@ -105,67 +105,72 @@ meta_window_get_group (MetaWindow *window)
|
|||||||
{
|
{
|
||||||
if (window->unmanaging)
|
if (window->unmanaging)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (window->group == NULL)
|
||||||
|
meta_window_compute_group (window);
|
||||||
|
|
||||||
if (window->cached_group == NULL)
|
return window->group;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_compute_group (MetaWindow* window)
|
||||||
|
{
|
||||||
|
MetaGroup *group;
|
||||||
|
|
||||||
|
/* use window->xwindow if no window->xgroup_leader */
|
||||||
|
|
||||||
|
group = NULL;
|
||||||
|
|
||||||
|
if (window->display->groups_by_leader)
|
||||||
{
|
{
|
||||||
MetaGroup *group;
|
if (window->xgroup_leader != None)
|
||||||
|
group = g_hash_table_lookup (window->display->groups_by_leader,
|
||||||
/* use window->xwindow if no window->xgroup_leader */
|
&window->xgroup_leader);
|
||||||
|
|
||||||
group = NULL;
|
|
||||||
|
|
||||||
if (window->display->groups_by_leader)
|
|
||||||
{
|
|
||||||
if (window->xgroup_leader != None)
|
|
||||||
group = g_hash_table_lookup (window->display->groups_by_leader,
|
|
||||||
&window->xgroup_leader);
|
|
||||||
else
|
|
||||||
group = g_hash_table_lookup (window->display->groups_by_leader,
|
|
||||||
&window->xwindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (group != NULL)
|
|
||||||
{
|
|
||||||
window->cached_group = group;
|
|
||||||
group->refcount += 1;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
group = g_hash_table_lookup (window->display->groups_by_leader,
|
||||||
if (window->xgroup_leader != None)
|
&window->xwindow);
|
||||||
group = meta_group_new (window->display,
|
}
|
||||||
window->xgroup_leader);
|
|
||||||
else
|
if (group != NULL)
|
||||||
group = meta_group_new (window->display,
|
{
|
||||||
window->xwindow);
|
window->group = group;
|
||||||
|
group->refcount += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (window->xgroup_leader != None)
|
||||||
|
group = meta_group_new (window->display,
|
||||||
|
window->xgroup_leader);
|
||||||
|
else
|
||||||
|
group = meta_group_new (window->display,
|
||||||
|
window->xwindow);
|
||||||
|
|
||||||
window->cached_group = group;
|
window->group = group;
|
||||||
}
|
|
||||||
|
|
||||||
window->cached_group->windows = g_slist_prepend (window->cached_group->windows,
|
|
||||||
window);
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_GROUPS,
|
|
||||||
"Adding %s to group with leader 0x%lx\n",
|
|
||||||
window->desc, group->group_leader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return window->cached_group;
|
window->group->windows = g_slist_prepend (window->group->windows,
|
||||||
|
window);
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_GROUPS,
|
||||||
|
"Adding %s to group with leader 0x%lx\n",
|
||||||
|
window->desc, group->group_leader);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_window_from_group (MetaWindow *window)
|
remove_window_from_group (MetaWindow *window)
|
||||||
{
|
{
|
||||||
if (window->cached_group != NULL)
|
if (window->group != NULL)
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_GROUPS,
|
meta_topic (META_DEBUG_GROUPS,
|
||||||
"Removing %s from group with leader 0x%lx\n",
|
"Removing %s from group with leader 0x%lx\n",
|
||||||
window->desc, window->cached_group->group_leader);
|
window->desc, window->group->group_leader);
|
||||||
|
|
||||||
window->cached_group->windows =
|
window->group->windows =
|
||||||
g_slist_remove (window->cached_group->windows,
|
g_slist_remove (window->group->windows,
|
||||||
window);
|
window);
|
||||||
meta_group_unref (window->cached_group);
|
meta_group_unref (window->group);
|
||||||
window->cached_group = NULL;
|
window->group = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +178,7 @@ void
|
|||||||
meta_window_group_leader_changed (MetaWindow *window)
|
meta_window_group_leader_changed (MetaWindow *window)
|
||||||
{
|
{
|
||||||
remove_window_from_group (window);
|
remove_window_from_group (window);
|
||||||
meta_window_get_group (window);
|
meta_window_compute_group (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -255,4 +260,5 @@ meta_group_property_notify (MetaGroup *group,
|
|||||||
event->xproperty.atom);
|
event->xproperty.atom);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
/* note, can return NULL */
|
/* note, can return NULL */
|
||||||
MetaGroup* meta_window_get_group (MetaWindow *window);
|
MetaGroup* meta_window_get_group (MetaWindow *window);
|
||||||
|
void meta_window_compute_group (MetaWindow* window);
|
||||||
void meta_window_shutdown_group (MetaWindow *window);
|
void meta_window_shutdown_group (MetaWindow *window);
|
||||||
|
|
||||||
void meta_window_group_leader_changed (MetaWindow *window);
|
void meta_window_group_leader_changed (MetaWindow *window);
|
||||||
|
@ -347,6 +347,10 @@ meta_window_new (MetaDisplay *display,
|
|||||||
window->display = display;
|
window->display = display;
|
||||||
window->workspaces = NULL;
|
window->workspaces = NULL;
|
||||||
|
|
||||||
|
/* assign the window to its group, or create a new group if needed
|
||||||
|
*/
|
||||||
|
meta_window_compute_group (window);
|
||||||
|
|
||||||
#ifdef HAVE_XSYNC
|
#ifdef HAVE_XSYNC
|
||||||
window->update_counter = None;
|
window->update_counter = None;
|
||||||
#endif
|
#endif
|
||||||
@ -490,7 +494,7 @@ meta_window_new (MetaDisplay *display,
|
|||||||
window->top_strut = 0;
|
window->top_strut = 0;
|
||||||
window->bottom_strut = 0;
|
window->bottom_strut = 0;
|
||||||
|
|
||||||
window->cached_group = NULL;
|
window->group = NULL;
|
||||||
|
|
||||||
window->using_net_wm_name = FALSE;
|
window->using_net_wm_name = FALSE;
|
||||||
window->using_net_wm_icon_name = FALSE;
|
window->using_net_wm_icon_name = FALSE;
|
||||||
@ -536,7 +540,7 @@ meta_window_new (MetaDisplay *display,
|
|||||||
update_role (window);
|
update_role (window);
|
||||||
update_net_wm_type (window);
|
update_net_wm_type (window);
|
||||||
meta_window_update_icon_now (window);
|
meta_window_update_icon_now (window);
|
||||||
|
|
||||||
if (window->initially_iconic)
|
if (window->initially_iconic)
|
||||||
{
|
{
|
||||||
/* WM_HINTS said minimized */
|
/* WM_HINTS said minimized */
|
||||||
|
@ -284,7 +284,7 @@ struct _MetaWindow
|
|||||||
int dialog_pipe;
|
int dialog_pipe;
|
||||||
|
|
||||||
/* maintained by group.c */
|
/* maintained by group.c */
|
||||||
MetaGroup *cached_group;
|
MetaGroup *group;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->maximized && !(w)->fullscreen)
|
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->maximized && !(w)->fullscreen)
|
||||||
|
Loading…
Reference in New Issue
Block a user