X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fplace.c;h=6a210b0f6377e60770c34fa36e206d284d762c84;hb=04b570de01abc9661f9cf30dba306e66307957f3;hp=6bcfe9d8df0d107bdf07424d7ab8f0e93cd3622f;hpb=17b927ab6dcaa00ab5a68647cab4a514235e5892;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index 6bcfe9d8..6a210b0f 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -23,8 +23,11 @@ #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; @@ -50,7 +53,7 @@ static Rect *pick_pointer_head(ObClient *c) 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(); } @@ -128,7 +131,7 @@ static Rect **pick_head(ObClient *c) 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; } @@ -220,14 +223,15 @@ static GSList* area_remove(GSList *list, Rect *a) } 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) @@ -245,7 +249,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 */ @@ -274,31 +278,38 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y) 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; @@ -315,8 +326,12 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y) Rect *r = maxit->data; /* center it in the area */ - *x = r->x + (r->width - c->frame->area.width) / 2; - *y = r->y + (r->height - c->frame->area.height) / 2; + *x = r->x; + *y = r->y; + if (config_place_center) { + *x += (r->width - c->frame->area.width) / 2; + *y += (r->height - c->frame->area.height) / 2; + } ret = TRUE; } @@ -369,8 +384,8 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, 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; @@ -467,12 +482,10 @@ gboolean place_client(ObClient *client, gint *x, gint *y, (config_place_policy == OB_PLACE_POLICY_MOUSE && place_under_mouse(client, x, y)) || place_nooverlap(client, x, y) || - place_under_mouse(client, x, y) || place_random(client, x, y); g_assert(ret); /* get where the client should be */ - frame_frame_gravity(client->frame, x, y, - client->area.width, client->area.height); + frame_frame_gravity(client->frame, x, y); return ret; }