From: Mikael Magnusson Date: Fri, 13 Jul 2007 12:37:15 +0000 (+0200) Subject: split out edge detecting code a bit so it is easy to add the dock area and do that too X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=fc32204f3c1733b289d7f03a15f9f0a568369989;p=chaz%2Fopenbox split out edge detecting code a bit so it is easy to add the dock area and do that too --- diff --git a/openbox/client.c b/openbox/client.c index c1ed85a6..f38a0c01 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -64,6 +64,8 @@ typedef struct GList *client_list = NULL; +extern ObDock *dock; + static GSList *client_destroy_notifies = NULL; static void client_get_all(ObClient *self, gboolean real); @@ -3849,6 +3851,96 @@ ObClient *client_search_transient(ObClient *self, ObClient *search) return NULL; } +static void detect_edge(Rect area, ObDirection dir, + gint my_head, gint my_size, + gint my_edge_start, gint my_edge_size, + gint *dest, gboolean *near_edge) +{ + gint edge_start, edge_size, head, tail; + gboolean skip_head = FALSE, skip_tail = FALSE; + + switch(dir) { + case OB_DIRECTION_NORTH: + case OB_DIRECTION_SOUTH: + edge_start = area.x; + edge_size = area.width; + break; + case OB_DIRECTION_EAST: + case OB_DIRECTION_WEST: + edge_start = area.y; + edge_size = area.height; + break; + default: + g_assert_not_reached(); + } + + /* do we collide with this window? */ + if (!RANGES_INTERSECT(my_edge_start, my_edge_size, + edge_start, edge_size)) + return; + + switch(dir) { + case OB_DIRECTION_NORTH: + head = RECT_BOTTOM(area); + tail = RECT_TOP(area); + break; + case OB_DIRECTION_SOUTH: + head = RECT_TOP(area); + tail = RECT_BOTTOM(area); + break; + case OB_DIRECTION_EAST: + head = RECT_LEFT(area); + tail = RECT_RIGHT(area); + break; + case OB_DIRECTION_WEST: + head = RECT_RIGHT(area); + tail = RECT_LEFT(area); + break; + default: + g_assert_not_reached(); + } + switch(dir) { + case OB_DIRECTION_NORTH: + case OB_DIRECTION_WEST: + if (my_head <= head + 1) + skip_head = TRUE; + if (my_head + my_size - 1 <= tail) + skip_tail = TRUE; + if (head < *dest) + skip_head = TRUE; + if (tail - my_size < *dest) + skip_tail = TRUE; + break; + case OB_DIRECTION_SOUTH: + case OB_DIRECTION_EAST: + if (my_head >= head - 1) + skip_head = TRUE; + if (my_head - my_size + 1 >= tail) + skip_tail = TRUE; + if (head > *dest) + skip_head = TRUE; + if (tail + my_size > *dest) + skip_tail = TRUE; + break; + default: + g_assert_not_reached(); + } + + ob_debug("my head %d size %d\n", my_head, my_size); + ob_debug("head %d tail %d deest %d\n", head, tail, *dest); + if (!skip_head) { + ob_debug("using near edge %d\n", head); + *dest = head; + *near_edge = TRUE; + } + else if (!skip_tail) { + ob_debug("using far edge %d\n", tail); + *dest = tail; + *near_edge = FALSE; + } + +} + void client_find_edge_directional(ObClient *self, ObDirection dir, gint my_head, gint my_size, gint my_edge_start, gint my_edge_size, @@ -3897,8 +3989,6 @@ void client_find_edge_directional(ObClient *self, ObDirection dir, for(it = client_list; it; it = g_list_next(it)) { ObClient *cur = it->data; - gint edge_start, edge_size, head, tail; - gboolean skip_head = FALSE, skip_tail = FALSE; /* skip windows to not bump into */ if (cur == self) @@ -3911,87 +4001,11 @@ void client_find_edge_directional(ObClient *self, ObDirection dir, ob_debug("trying window %s\n", cur->title); - switch(dir) { - case OB_DIRECTION_NORTH: - case OB_DIRECTION_SOUTH: - edge_start = cur->frame->area.x; - edge_size = cur->frame->area.width; - break; - case OB_DIRECTION_EAST: - case OB_DIRECTION_WEST: - edge_start = cur->frame->area.y; - edge_size = cur->frame->area.height; - break; - default: - g_assert_not_reached(); - } - - /* do we collide with this window? */ - if (!RANGES_INTERSECT(my_edge_start, my_edge_size, - edge_start, edge_size)) - continue; - - switch(dir) { - case OB_DIRECTION_NORTH: - head = RECT_BOTTOM(cur->frame->area); - tail = RECT_TOP(cur->frame->area); - break; - case OB_DIRECTION_SOUTH: - head = RECT_TOP(cur->frame->area); - tail = RECT_BOTTOM(cur->frame->area); - break; - case OB_DIRECTION_EAST: - head = RECT_LEFT(cur->frame->area); - tail = RECT_RIGHT(cur->frame->area); - break; - case OB_DIRECTION_WEST: - head = RECT_RIGHT(cur->frame->area); - tail = RECT_LEFT(cur->frame->area); - break; - default: - g_assert_not_reached(); - } - - switch(dir) { - case OB_DIRECTION_NORTH: - case OB_DIRECTION_WEST: - if (my_head <= head + 1) - skip_head = TRUE; - if (my_head + my_size - 1 <= tail) - skip_tail = TRUE; - if (head < *dest) - skip_head = TRUE; - if (tail - my_size < *dest) - skip_tail = TRUE; - break; - case OB_DIRECTION_SOUTH: - case OB_DIRECTION_EAST: - if (my_head >= head - 1) - skip_head = TRUE; - if (my_head - my_size + 1 >= tail) - skip_tail = TRUE; - if (head > *dest) - skip_head = TRUE; - if (tail + my_size > *dest) - skip_tail = TRUE; - break; - default: - g_assert_not_reached(); - } - - ob_debug("my head %d size %d\n", my_head, my_size); - ob_debug("head %d tail %d deest %d\n", head, tail, *dest); - if (!skip_head) { - ob_debug("using near edge %d\n", head); - *dest = head; - *near_edge = TRUE; - } - else if (!skip_tail) { - ob_debug("using far edge %d\n", tail); - *dest = tail; - *near_edge = FALSE; - } + detect_edge(cur->frame->area, dir, my_head, my_size, my_edge_start, + my_edge_size, dest, near_edge); } + detect_edge(dock->area, dir, my_head, my_size, my_edge_start, + my_edge_size, dest, near_edge); } void client_find_move_directional(ObClient *self, ObDirection dir, diff --git a/openbox/dock.c b/openbox/dock.c index 8cb40fb6..22e4523c 100644 --- a/openbox/dock.c +++ b/openbox/dock.c @@ -31,7 +31,7 @@ EnterWindowMask | LeaveWindowMask) #define DOCKAPP_EVENT_MASK (StructureNotifyMask) -static ObDock *dock; +ObDock *dock; StrutPartial dock_strut;