summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Adams <robadams@ucla.edu>2003-06-04 19:15:46 +0000
committerRob Adams <readams@src.gnome.org>2003-06-04 19:15:46 +0000
commit993c7075f3cbcaf59b74233ddc298e1d13634f8c (patch)
treea433cf451c4a592d10ff231609a4713f317f7798 /src
parent4469a42a77601c9031d01050eca7db220b75445b (diff)
downloadmetacity-993c7075f3cbcaf59b74233ddc298e1d13634f8c.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/group.c90
-rw-r--r--src/group.h1
-rw-r--r--src/window.c8
-rw-r--r--src/window.h2
4 files changed, 56 insertions, 45 deletions
diff --git a/src/group.c b/src/group.c
index ab35cd26..a1e61c2a 100644
--- a/src/group.c
+++ b/src/group.c
@@ -105,67 +105,72 @@ meta_window_get_group (MetaWindow *window)
{
if (window->unmanaging)
return NULL;
+
+ if (window->group == NULL)
+ meta_window_compute_group (window);
- if (window->cached_group == NULL)
- {
- MetaGroup *group;
+ return window->group;
+}
+
+void
+meta_window_compute_group (MetaWindow* window)
+{
+ MetaGroup *group;
- /* use window->xwindow if no window->xgroup_leader */
+ /* use window->xwindow if no window->xgroup_leader */
- group = NULL;
+ 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 (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;
- }
+ if (group != NULL)
+ {
+ window->group = group;
+ group->refcount += 1;
+ }
+ else
+ {
+ if (window->xgroup_leader != None)
+ group = meta_group_new (window->display,
+ window->xgroup_leader);
else
- {
- if (window->xgroup_leader != None)
- group = meta_group_new (window->display,
- window->xgroup_leader);
- else
- group = meta_group_new (window->display,
- window->xwindow);
+ 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);
+ 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);
- }
+ meta_topic (META_DEBUG_GROUPS,
+ "Adding %s to group with leader 0x%lx\n",
+ window->desc, group->group_leader);
- return window->cached_group;
}
static void
remove_window_from_group (MetaWindow *window)
{
- if (window->cached_group != NULL)
+ if (window->group != NULL)
{
meta_topic (META_DEBUG_GROUPS,
"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 =
- g_slist_remove (window->cached_group->windows,
+ window->group->windows =
+ g_slist_remove (window->group->windows,
window);
- meta_group_unref (window->cached_group);
- window->cached_group = NULL;
+ meta_group_unref (window->group);
+ window->group = NULL;
}
}
@@ -173,7 +178,7 @@ void
meta_window_group_leader_changed (MetaWindow *window)
{
remove_window_from_group (window);
- meta_window_get_group (window);
+ meta_window_compute_group (window);
}
void
@@ -255,4 +260,5 @@ meta_group_property_notify (MetaGroup *group,
event->xproperty.atom);
return TRUE;
+
}
diff --git a/src/group.h b/src/group.h
index 6639839a..3f1425b5 100644
--- a/src/group.h
+++ b/src/group.h
@@ -26,6 +26,7 @@
/* note, can return NULL */
MetaGroup* meta_window_get_group (MetaWindow *window);
+void meta_window_compute_group (MetaWindow* window);
void meta_window_shutdown_group (MetaWindow *window);
void meta_window_group_leader_changed (MetaWindow *window);
diff --git a/src/window.c b/src/window.c
index 7b65e95e..76e66ea3 100644
--- a/src/window.c
+++ b/src/window.c
@@ -347,6 +347,10 @@ meta_window_new (MetaDisplay *display,
window->display = display;
window->workspaces = NULL;
+ /* assign the window to its group, or create a new group if needed
+ */
+ meta_window_compute_group (window);
+
#ifdef HAVE_XSYNC
window->update_counter = None;
#endif
@@ -490,7 +494,7 @@ meta_window_new (MetaDisplay *display,
window->top_strut = 0;
window->bottom_strut = 0;
- window->cached_group = NULL;
+ window->group = NULL;
window->using_net_wm_name = FALSE;
window->using_net_wm_icon_name = FALSE;
@@ -536,7 +540,7 @@ meta_window_new (MetaDisplay *display,
update_role (window);
update_net_wm_type (window);
meta_window_update_icon_now (window);
-
+
if (window->initially_iconic)
{
/* WM_HINTS said minimized */
diff --git a/src/window.h b/src/window.h
index 2c331d84..2b6a8fa0 100644
--- a/src/window.h
+++ b/src/window.h
@@ -284,7 +284,7 @@ struct _MetaWindow
int dialog_pipe;
/* maintained by group.c */
- MetaGroup *cached_group;
+ MetaGroup *group;
};
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->maximized && !(w)->fullscreen)