split out edge detecting code a bit so it is easy to add the dock area and do that too
This commit is contained in:
parent
3234a75083
commit
fc32204f3c
2 changed files with 97 additions and 83 deletions
178
openbox/client.c
178
openbox/client.c
|
@ -64,6 +64,8 @@ typedef struct
|
||||||
|
|
||||||
GList *client_list = NULL;
|
GList *client_list = NULL;
|
||||||
|
|
||||||
|
extern ObDock *dock;
|
||||||
|
|
||||||
static GSList *client_destroy_notifies = NULL;
|
static GSList *client_destroy_notifies = NULL;
|
||||||
|
|
||||||
static void client_get_all(ObClient *self, gboolean real);
|
static void client_get_all(ObClient *self, gboolean real);
|
||||||
|
@ -3849,6 +3851,96 @@ ObClient *client_search_transient(ObClient *self, ObClient *search)
|
||||||
return NULL;
|
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,
|
void client_find_edge_directional(ObClient *self, ObDirection dir,
|
||||||
gint my_head, gint my_size,
|
gint my_head, gint my_size,
|
||||||
gint my_edge_start, gint my_edge_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)) {
|
for(it = client_list; it; it = g_list_next(it)) {
|
||||||
ObClient *cur = it->data;
|
ObClient *cur = it->data;
|
||||||
gint edge_start, edge_size, head, tail;
|
|
||||||
gboolean skip_head = FALSE, skip_tail = FALSE;
|
|
||||||
|
|
||||||
/* skip windows to not bump into */
|
/* skip windows to not bump into */
|
||||||
if (cur == self)
|
if (cur == self)
|
||||||
|
@ -3911,87 +4001,11 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
|
||||||
|
|
||||||
ob_debug("trying window %s\n", cur->title);
|
ob_debug("trying window %s\n", cur->title);
|
||||||
|
|
||||||
switch(dir) {
|
detect_edge(cur->frame->area, dir, my_head, my_size, my_edge_start,
|
||||||
case OB_DIRECTION_NORTH:
|
my_edge_size, dest, near_edge);
|
||||||
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(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,
|
void client_find_move_directional(ObClient *self, ObDirection dir,
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
EnterWindowMask | LeaveWindowMask)
|
EnterWindowMask | LeaveWindowMask)
|
||||||
#define DOCKAPP_EVENT_MASK (StructureNotifyMask)
|
#define DOCKAPP_EVENT_MASK (StructureNotifyMask)
|
||||||
|
|
||||||
static ObDock *dock;
|
ObDock *dock;
|
||||||
|
|
||||||
StrutPartial dock_strut;
|
StrutPartial dock_strut;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue