diff options
author | Elijah Newren <newren@gmail.com> | 2005-11-01 06:54:41 +0000 |
---|---|---|
committer | Elijah Newren <newren@src.gnome.org> | 2005-11-01 06:54:41 +0000 |
commit | 460ff4bd50f1dfd3a9fb948601bde4c083b43ed5 (patch) | |
tree | 2b235a4b25f51dcc7c9329700e788c15748841ed /src/testboxes.c | |
parent | bfc1cd3c077a3b9b5e35caef903ab248231751f9 (diff) | |
download | metacity-460ff4bd50f1dfd3a9fb948601bde4c083b43ed5.tar.gz |
Add routines to find all the "screen edges" (where struts are considered
2005-10-31 Elijah Newren <newren@gmail.com>
Add routines to find all the "screen edges" (where struts are
considered to be offscreen), plus a thorough testing case.
* src/boxes.[ch] (meta_rectangle_free_list_and_elements):
* src/testboxes.c (test_regions_okay, test_region_fitting,
test_clamping_to_region, test_clipping_to_region,
test_shoving_into_region):
* src/workspace.c (meta_workspace_free,
meta_workspace_invalidate_work_area):
meta_rectangle_free_spanning_set() was renamed to
meta_rectangle_free_list_and_elements()
* src/boxes.c:
(meta_rectangle_region_to_string):
Output SOMETHING if the list is empty
(meta_rectangle_edge_to_string, meta_rectangle_edge_list_to_string):
new printing functions for edges
(meta_rectangle_get_minimal_spanning_set_for_region):
clean up the overview comment a little
(struts_are_disjoint):
(sort_edges):
(edges_overlap):
(rectangle_and_edge_intersection):
(add_edges):
(split_edge):
(fix_up_edges):
(meta_rectangle_find_onscreen_edges):
New functions to do various parts of finding all the screen edges
* src/boxes.h:
(BOX_LEFT, BOX_RIGHT, BOX_TOP, BOX_BOTTOM):
convenience macros that I should have defined a long time ago
(enum MetaEdgeType):
(struct MetaEdge):
new types for edges
(meta_rectangle_edge_to_string):
(meta_rectangle_edge_list_to_string):
(meta_rectangle_find_onscreen_edges):
new functions
* src/common.h:
(enum MetaDirection):
direction stuff seems to be used everywhere so add a type here;
only used in boxes for now, but add a note explaining several
other places where it could be used to remove duplicative enums
* src/testboxes.c:
(new_onscreen_edge):
(verify_edge_lists_are_equal):
(test_find_onscreen_edges):
new functions for testing the new "screen edge" finding abilities
(main):
add test_find_onscreen_edges() to the list
(get_strut_list):
new function factored out from get_screen_region()
(get_screen_region):
call get_strut_list() since it now has most of the code this
function used to have.
(get_screen_edges):
new function to compute the screen edges using the struts in
get_strut_list() and the meta_rectangle_find_onscreen_edges()
function.
Diffstat (limited to 'src/testboxes.c')
-rw-r--r-- | src/testboxes.c | 262 |
1 files changed, 237 insertions, 25 deletions
diff --git a/src/testboxes.c b/src/testboxes.c index d81997d6..be754b1e 100644 --- a/src/testboxes.c +++ b/src/testboxes.c @@ -68,6 +68,21 @@ new_meta_rect (int x, int y, int width, int height) return temporary; } +static MetaEdge* +new_onscreen_edge (int x, int y, int width, int height, int side_type) +{ + MetaEdge* temporary; + temporary = g_new (MetaEdge, 1); + temporary->rect.x = x; + temporary->rect.y = y; + temporary->rect.width = width; + temporary->rect.height = height; + temporary->side_type = side_type; + temporary->edge_type = META_EDGE_ONSCREEN; + + return temporary; +} + static void test_area () { @@ -205,15 +220,11 @@ free_strut_list (GSList *struts) g_slist_free (struts); } -static GList* -get_screen_region (int which) +static GSList* +get_strut_list (int which) { - GList *ret; GSList *struts; - MetaRectangle basic_rect; - basic_rect = meta_rect (0, 0, 1600, 1200); - ret = NULL; struts = NULL; g_assert (which >=0 && which <= 5); @@ -247,9 +258,40 @@ get_screen_region (int which) break; } + return struts; +} + +static GList* +get_screen_region (int which) +{ + GList *ret; + GSList *struts; + MetaRectangle basic_rect; + + basic_rect = meta_rect (0, 0, 1600, 1200); + ret = NULL; + + struts = get_strut_list (which); ret = meta_rectangle_get_minimal_spanning_set_for_region (&basic_rect, struts); + free_strut_list (struts); + + return ret; +} +static GList* +get_screen_edges (int which) +{ + GList *ret; + GSList *struts; + MetaRectangle basic_rect; + + basic_rect = meta_rect (0, 0, 1600, 1200); + ret = NULL; + + struts = get_strut_list (which); + ret = meta_rectangle_find_onscreen_edges (&basic_rect, struts); free_strut_list (struts); + return ret; } @@ -489,8 +531,8 @@ test_regions_okay () tmp = NULL; tmp = g_list_prepend (tmp, new_meta_rect (0, 0, 1600, 1200)); verify_lists_are_equal (region, tmp); - meta_rectangle_free_spanning_set (tmp); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (region); /*************************************************************/ /* Make sure test region 1 has the right spanning rectangles */ @@ -500,8 +542,8 @@ test_regions_okay () tmp = g_list_prepend (tmp, new_meta_rect (0, 20, 400, 1180)); tmp = g_list_prepend (tmp, new_meta_rect (0, 20, 1600, 1140)); verify_lists_are_equal (region, tmp); - meta_rectangle_free_spanning_set (tmp); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (region); /*************************************************************/ /* Make sure test region 2 has the right spanning rectangles */ @@ -514,8 +556,8 @@ test_regions_okay () tmp = g_list_prepend (tmp, new_meta_rect ( 0, 20, 800, 1130)); tmp = g_list_prepend (tmp, new_meta_rect ( 0, 20, 1600, 1080)); verify_lists_are_equal (region, tmp); - meta_rectangle_free_spanning_set (tmp); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (region); /*************************************************************/ /* Make sure test region 3 has the right spanning rectangles */ @@ -540,8 +582,8 @@ test_regions_okay () printf ("%s vs. %s\n", region_list, tmp_list); #endif verify_lists_are_equal (region, tmp); - meta_rectangle_free_spanning_set (tmp); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (region); /*************************************************************/ /* Make sure test region 4 has the right spanning rectangles */ @@ -550,8 +592,8 @@ test_regions_okay () tmp = NULL; tmp = g_list_prepend (tmp, new_meta_rect ( 800, 20, 800, 1180)); verify_lists_are_equal (region, tmp); - meta_rectangle_free_spanning_set (tmp); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (region); /*************************************************************/ /* Make sure test region 5 has the right spanning rectangles */ @@ -581,7 +623,7 @@ test_region_fitting () g_assert (meta_rectangle_contained_in_region (region, &rect) == FALSE || meta_rectangle_could_fit_in_region (region, &rect) == TRUE); } - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); /* Do some manual tests too */ region = get_screen_region (1); @@ -598,14 +640,14 @@ test_region_fitting () g_assert (meta_rectangle_could_fit_in_region (region, &rect)); g_assert (!meta_rectangle_contained_in_region (region, &rect)); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); region = get_screen_region (2); rect = meta_rect (1000, 50, 600, 1100); g_assert (meta_rectangle_could_fit_in_region (region, &rect)); g_assert (!meta_rectangle_contained_in_region (region, &rect)); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); printf ("%s passed.\n", __PRETTY_FUNCTION__); } @@ -635,7 +677,7 @@ test_clamping_to_region () g_assert (meta_rectangle_could_fit_in_region (region, &rect) == TRUE); g_assert (rect.x == temp.x && rect.y == temp.y); } - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); /* Do some manual tests too */ region = get_screen_region (1); @@ -697,7 +739,7 @@ test_clamping_to_region () &min_size); g_assert (rect.width == 100 && rect.height == 999999); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); printf ("%s passed.\n", __PRETTY_FUNCTION__); } @@ -743,7 +785,7 @@ test_clipping_to_region () g_assert (meta_rectangle_contained_in_region (region, &rect) == TRUE); } } - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); /* Do some manual tests too */ region = get_screen_region (2); @@ -782,7 +824,7 @@ test_clipping_to_region () &rect); g_assert (meta_rectangle_equal (&rect, &temp)); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); printf ("%s passed.\n", __PRETTY_FUNCTION__); } @@ -807,7 +849,7 @@ test_shoving_into_region () g_assert (meta_rectangle_contained_in_region (region, &rect)); } } - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); /* Do some manual tests too */ region = get_screen_region (2); @@ -854,7 +896,174 @@ test_shoving_into_region () &rect); g_assert (meta_rectangle_equal (&rect, &temp)); - meta_rectangle_free_spanning_set (region); + meta_rectangle_free_list_and_elements (region); + + printf ("%s passed.\n", __PRETTY_FUNCTION__); +} + +static void +verify_edge_lists_are_equal (GList *code, GList *answer) +{ + int which = 0; + + while (code && answer) + { + MetaEdge *a = code->data; + MetaEdge *b = answer->data; + + if (!meta_rectangle_equal (&a->rect, &b->rect) || + a->side_type != b->side_type || + a->edge_type != b->edge_type) + { + g_error ("%dth item in code answer answer lists do not match; " + "code rect: %d,%d + %d,%d; answer rect: %d,%d + %d,%d\n", + which, + a->rect.x, a->rect.y, a->rect.width, a->rect.height, + b->rect.x, b->rect.y, b->rect.width, b->rect.height); + } + + code = code->next; + answer = answer->next; + + which++; + } + + /* Ought to be at the end of both lists; check if we aren't */ + if (code) + { + MetaEdge *tmp = code->data; + g_error ("code list longer than answer list by %d items; " + "first extra item rect: %d,%d +%d,%d\n", + g_list_length (code), + tmp->rect.x, tmp->rect.y, tmp->rect.width, tmp->rect.height); + } + + if (answer) + { + MetaEdge *tmp = answer->data; + g_error ("answer list longer than code list by %d items; " + "first extra item rect: %d,%d +%d,%d\n", + g_list_length (answer), + tmp->rect.x, tmp->rect.y, tmp->rect.width, tmp->rect.height); + } +} + +static void +test_find_onscreen_edges () +{ + GList* edges; + GList* tmp; + + int left = META_DIRECTION_LEFT; + int right = META_DIRECTION_RIGHT; + int top = META_DIRECTION_TOP; + int bottom = META_DIRECTION_BOTTOM; + + /*************************************************/ + /* Make sure test region 0 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (0); + tmp = NULL; + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 1200, 1600, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 0, 1600, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1600, 0, 0, 1200, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 0, 0, 1200, left)); + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); + + /*************************************************/ + /* Make sure test region 1 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (1); + tmp = NULL; + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 1200, 400, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 400, 1160, 1200, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 1600, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1600, 20, 0, 1140, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 400, 1160, 0, 40, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 0, 1180, left)); + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); + + /*************************************************/ + /* Make sure test region 2 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (2); + tmp = NULL; + tmp = g_list_prepend (tmp, new_onscreen_edge (1200, 1200, 400, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 450, 1200, 350, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 1200, 300, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 300, 1150, 150, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 1100, 400, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 1600, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1600, 20, 0, 1180, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 1100, 0, 100, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 300, 1150, 0, 50, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1200, 1100, 0, 100, left)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 450, 1150, 0, 50, left)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 0, 1180, left)); + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); + + /*************************************************/ + /* Make sure test region 3 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (3); + tmp = NULL; + tmp = g_list_prepend (tmp, new_onscreen_edge (1200, 1200, 400, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 380, 1200, 420, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 1200, 300, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 300, 1150, 80, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 1100, 400, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 700, 525, 200, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 700, 675, 200, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 1600, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1600, 20, 0, 1180, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 1100, 0, 100, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 700, 525, 0, 150, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 300, 1150, 0, 50, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1200, 1100, 0, 100, left)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 900, 525, 0, 150, left)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 380, 1150, 0, 50, left)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 0, 20, 0, 1180, left)); + +#if 0 + #define FUDGE 50 + char big_buffer1[1 + (16+FUDGE)*38], big_buffer2[1 + 16*38]; + meta_rectangle_edge_list_to_string (edges, "\n ", big_buffer1); + meta_rectangle_edge_list_to_string (tmp, "\n ", big_buffer2); + printf("Real edge list:\n %s\nComparison edges list:\n %s\n", + big_buffer1, big_buffer2); +#endif + + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); + + /*************************************************/ + /* Make sure test region 4 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (4); + tmp = NULL; + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 1200, 800, 0, bottom)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 20, 800, 0, top)); + tmp = g_list_prepend (tmp, new_onscreen_edge (1600, 20, 0, 1180, right)); + tmp = g_list_prepend (tmp, new_onscreen_edge ( 800, 20, 0, 1180, left)); + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); + + /*************************************************/ + /* Make sure test region 5 has the correct edges */ + /*************************************************/ + edges = get_screen_edges (5); + tmp = NULL; + verify_edge_lists_are_equal (edges, tmp); + meta_rectangle_free_list_and_elements (tmp); + meta_rectangle_free_list_and_elements (edges); printf ("%s passed.\n", __PRETTY_FUNCTION__); } @@ -1029,6 +1238,9 @@ main() test_clipping_to_region (); test_shoving_into_region (); + /* And now the functions dealing with edges more than boxes */ + test_find_onscreen_edges (); + /* And now the misfit functions that don't quite fit in anywhere else... */ test_gravity_resize (); test_find_closest_point_to_line (); |