#include "frame.h"
#include "focus.h"
#include "config.h"
+#include "dock.h"
#include "debug.h"
+extern ObDock *dock;
+
static void add_choice(guint *choice, guint mychoice)
{
guint i;
gboolean contain = RECT_CONTAINS(*monitor, px, py);
g_free(monitor);
if (contain)
- return screen_area_monitor(c->desktop, i, NULL);
+ return screen_area(c->desktop, i, NULL);
}
g_assert_not_reached();
}
screen_pointer_pos(&px, &py);
- for (i = 0; i < screen_num_monitors; i++)
+ for (i = 0; i < screen_num_monitors; i++) {
Rect *monitor = screen_physical_area_monitor(i);
gboolean contain = RECT_CONTAINS(*monitor, px, py);
g_free(monitor);
- if (contain)
+ if (contain) {
add_choice(choice, i);
ob_debug("placement adding choice %d for mouse pointer\n", i);
break;
}
+ }
/* add any leftover choices */
for (i = 0; i < screen_num_monitors; ++i)
add_choice(choice, i);
for (i = 0; i < screen_num_monitors; ++i)
- area[i] = screen_area_monitor(c->desktop, choice[i], NULL);
+ area[i] = screen_area(c->desktop, choice[i], NULL);
return area;
}
}
enum {
- IGNORE_FULLSCREEN = 1 << 0,
- IGNORE_MAXIMIZED = 1 << 1,
- IGNORE_MENUTOOL = 1 << 2,
- /*IGNORE_SHADED = 1 << 3,*/
- IGNORE_NONGROUP = 1 << 3,
- IGNORE_BELOW = 1 << 4,
- IGNORE_NONFOCUS = 1 << 5,
- IGNORE_END = 1 << 6
+ IGNORE_FULLSCREEN = 1,
+ IGNORE_MAXIMIZED = 2,
+ IGNORE_MENUTOOL = 3,
+ /*IGNORE_SHADED = 3,*/
+ IGNORE_NONGROUP = 4,
+ IGNORE_BELOW = 5,
+ /*IGNORE_NONFOCUS = 1 << 5,*/
+ IGNORE_DOCK = 6,
+ IGNORE_END = 7
};
static gboolean place_nooverlap(ObClient *c, gint *x, gint *y)
maxit = NULL;
/* try ignoring different things to find empty space */
- for (ignore = 0; ignore < IGNORE_END && !ret; ignore = (ignore << 1) + 1) {
+ for (ignore = 0; ignore < IGNORE_END && !ret; ignore++) {
guint i;
/* try all monitors in order of preference */
test->type == OB_CLIENT_TYPE_DESKTOP) continue;
- if ((ignore & IGNORE_FULLSCREEN) &&
+ if ((ignore >= IGNORE_FULLSCREEN) &&
test->fullscreen) continue;
- if ((ignore & IGNORE_MAXIMIZED) &&
+ if ((ignore >= IGNORE_MAXIMIZED) &&
test->max_horz && test->max_vert) continue;
- if ((ignore & IGNORE_MENUTOOL) &&
+ if ((ignore >= IGNORE_MENUTOOL) &&
(test->type == OB_CLIENT_TYPE_MENU ||
test->type == OB_CLIENT_TYPE_TOOLBAR) &&
client_has_parent(c)) continue;
/*
- if ((ignore & IGNORE_SHADED) &&
+ if ((ignore >= IGNORE_SHADED) &&
test->shaded) continue;
*/
- if ((ignore & IGNORE_NONGROUP) &&
+ if ((ignore >= IGNORE_NONGROUP) &&
client_has_group_siblings(c) &&
test->group != c->group) continue;
- if ((ignore & IGNORE_BELOW) &&
+ if ((ignore >= IGNORE_BELOW) &&
test->layer < c->layer) continue;
- if ((ignore & IGNORE_NONFOCUS) &&
+ /*
+ if ((ignore >= IGNORE_NONFOCUS) &&
focus_client != test) continue;
-
+ */
/* don't ignore this window, so remove it from the available
area */
spaces = area_remove(spaces, &test->frame->area);
}
+ if (ignore < IGNORE_DOCK) {
+ Rect a;
+ dock_get_area(&a);
+ spaces = area_remove(spaces, &a);
+ }
+
for (sit = spaces; sit; sit = g_slist_next(sit)) {
Rect *r = sit->data;
screen = pick_pointer_head(client);
else if (settings->monitor > 0 &&
(guint)settings->monitor <= screen_num_monitors)
- screen = screen_area_monitor(client->desktop,
- (guint)settings->monitor - 1, NULL);
+ screen = screen_area(client->desktop, (guint)settings->monitor - 1,
+ NULL);
else {
Rect **areas;
guint i;