summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2005-11-04 17:25:42 +0000
committerElijah Newren <newren@src.gnome.org>2005-11-04 17:25:42 +0000
commitab85662839bc288e8736dbac616da1a30880ac7f (patch)
tree260d18b057b820409df62aad0ff18b2fdf4f1c6d
parent50ac0d05888f034b54b19932e627d567e5384c17 (diff)
downloadmetacity-ab85662839bc288e8736dbac616da1a30880ac7f.tar.gz
Cache screen and xinerama edges for edge resistance/snapping at the same
2005-11-04 Elijah Newren <newren@gmail.com> Cache screen and xinerama edges for edge resistance/snapping at the same time the workarea and on-screen/on-xinerama areas are computed. * src/workspace.[ch] (struct MetaWorkspace, meta_workspace_new, meta_workspace_free, meta_workspace_invalidate_work_area, ensure_work_areas_validated): add new screen_edges and xinerama_edges data fields to the workspace
-rw-r--r--ChangeLog12
-rw-r--r--src/workspace.c25
-rw-r--r--src/workspace.h2
3 files changed, 39 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 04fca805..9ad0552b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-11-04 Elijah Newren <newren@gmail.com>
+
+ Cache screen and xinerama edges for edge resistance/snapping at
+ the same time the workarea and on-screen/on-xinerama areas are
+ computed.
+
+ * src/workspace.[ch] (struct MetaWorkspace, meta_workspace_new,
+ meta_workspace_free, meta_workspace_invalidate_work_area,
+ ensure_work_areas_validated):
+ add new screen_edges and xinerama_edges data fields to the
+ workspace
+
2005-11-03 Elijah Newren <newren@gmail.com>
Add routines to find all the edges between adjacent xineramas,
diff --git a/src/workspace.c b/src/workspace.c
index 6a9c40d4..73d606f7 100644
--- a/src/workspace.c
+++ b/src/workspace.c
@@ -65,6 +65,8 @@ meta_workspace_new (MetaScreen *screen)
workspace->screen_region = NULL;
workspace->xinerama_region = NULL;
+ workspace->screen_edges = NULL;
+ workspace->xinerama_edges = NULL;
workspace->all_struts = NULL;
@@ -116,6 +118,8 @@ meta_workspace_free (MetaWorkspace *workspace)
meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
g_free (workspace->xinerama_region);
meta_rectangle_free_list_and_elements (workspace->screen_region);
+ meta_rectangle_free_list_and_elements (workspace->screen_edges);
+ meta_rectangle_free_list_and_elements (workspace->xinerama_edges);
g_free (workspace);
@@ -455,8 +459,12 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace)
meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
g_free (workspace->xinerama_region);
meta_rectangle_free_list_and_elements (workspace->screen_region);
+ meta_rectangle_free_list_and_elements (workspace->screen_edges);
+ meta_rectangle_free_list_and_elements (workspace->xinerama_edges);
workspace->xinerama_region = NULL;
workspace->screen_region = NULL;
+ workspace->screen_edges = NULL;
+ workspace->xinerama_edges = NULL;
workspace->work_areas_invalid = TRUE;
@@ -498,6 +506,8 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
g_assert (workspace->all_struts == NULL);
g_assert (workspace->xinerama_region == NULL);
g_assert (workspace->screen_region == NULL);
+ g_assert (workspace->screen_edges == NULL);
+ g_assert (workspace->xinerama_edges == NULL);
windows = meta_workspace_list_windows (workspace);
@@ -707,6 +717,21 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
workspace->screen_region = g_list_prepend (NULL, nonempty_region);
}
+ /* Now cache the screen and xinerama edges for edge resistance and snapping */
+ g_assert (workspace->screen_edges == NULL);
+ g_assert (workspace->xinerama_edges == NULL);
+ workspace->screen_edges =
+ meta_rectangle_find_onscreen_edges (&workspace->screen->rect,
+ workspace->all_struts);
+ tmp = NULL;
+ for (i = 0; i < workspace->screen->n_xinerama_infos; i++)
+ tmp = g_list_prepend (tmp, &workspace->screen->xinerama_infos[i].rect);
+ workspace->xinerama_edges =
+ meta_rectangle_find_nonintersected_xinerama_edges (tmp,
+ workspace->all_struts);
+ g_list_free (tmp);
+
+
/* We're all done, YAAY! Record that everything has been validated. */
workspace->work_areas_invalid = FALSE;
diff --git a/src/workspace.h b/src/workspace.h
index 8dc38ad6..b07f31b3 100644
--- a/src/workspace.h
+++ b/src/workspace.h
@@ -46,6 +46,8 @@ struct _MetaWorkspace
MetaRectangle *work_area_xinerama;
GList *screen_region;
GList **xinerama_region;
+ GList *screen_edges;
+ GList *xinerama_edges;
GSList *all_struts;
guint work_areas_invalid : 1;