ignore the dock in placing as a last resort

This commit is contained in:
Dana Jansens 2007-06-13 02:42:27 +00:00
parent cbaafd2ff9
commit 1514ce75b6
3 changed files with 35 additions and 17 deletions

View file

@ -637,3 +637,8 @@ void dock_hide(gboolean hide)
} }
} }
} }
void dock_get_area(Rect *a)
{
RECT_SET(*a, dock->x, dock->y, dock->w, dock->h);
}

View file

@ -82,4 +82,6 @@ void dock_remove(ObDockApp *app, gboolean reparent);
void dock_app_drag(ObDockApp *app, XMotionEvent *e); void dock_app_drag(ObDockApp *app, XMotionEvent *e);
void dock_app_configure(ObDockApp *app, gint w, gint h); void dock_app_configure(ObDockApp *app, gint w, gint h);
void dock_get_area(Rect *a);
#endif #endif

View file

@ -23,8 +23,11 @@
#include "frame.h" #include "frame.h"
#include "focus.h" #include "focus.h"
#include "config.h" #include "config.h"
#include "dock.h"
#include "debug.h" #include "debug.h"
extern ObDock *dock;
static void add_choice(guint *choice, guint mychoice) static void add_choice(guint *choice, guint mychoice)
{ {
guint i; guint i;
@ -220,14 +223,15 @@ static GSList* area_remove(GSList *list, Rect *a)
} }
enum { enum {
IGNORE_FULLSCREEN = 1 << 0, IGNORE_FULLSCREEN = 1,
IGNORE_MAXIMIZED = 1 << 1, IGNORE_MAXIMIZED = 2,
IGNORE_MENUTOOL = 1 << 2, IGNORE_MENUTOOL = 3,
/*IGNORE_SHADED = 1 << 3,*/ /*IGNORE_SHADED = 3,*/
IGNORE_NONGROUP = 1 << 3, IGNORE_NONGROUP = 4,
IGNORE_BELOW = 1 << 4, IGNORE_BELOW = 5,
IGNORE_NONFOCUS = 1 << 5, /*IGNORE_NONFOCUS = 1 << 5,*/
IGNORE_END = 1 << 6 IGNORE_DOCK = 6,
IGNORE_END = 7
}; };
static gboolean place_nooverlap(ObClient *c, gint *x, gint *y) 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; maxit = NULL;
/* try ignoring different things to find empty space */ /* 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; guint i;
/* try all monitors in order of preference */ /* 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; test->type == OB_CLIENT_TYPE_DESKTOP) continue;
if ((ignore & IGNORE_FULLSCREEN) && if ((ignore >= IGNORE_FULLSCREEN) &&
test->fullscreen) continue; test->fullscreen) continue;
if ((ignore & IGNORE_MAXIMIZED) && if ((ignore >= IGNORE_MAXIMIZED) &&
test->max_horz && test->max_vert) continue; 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_MENU ||
test->type == OB_CLIENT_TYPE_TOOLBAR) && test->type == OB_CLIENT_TYPE_TOOLBAR) &&
client_has_parent(c)) continue; client_has_parent(c)) continue;
/* /*
if ((ignore & IGNORE_SHADED) && if ((ignore >= IGNORE_SHADED) &&
test->shaded) continue; test->shaded) continue;
*/ */
if ((ignore & IGNORE_NONGROUP) && if ((ignore >= IGNORE_NONGROUP) &&
client_has_group_siblings(c) && client_has_group_siblings(c) &&
test->group != c->group) continue; test->group != c->group) continue;
if ((ignore & IGNORE_BELOW) && if ((ignore >= IGNORE_BELOW) &&
test->layer < c->layer) continue; test->layer < c->layer) continue;
if ((ignore & IGNORE_NONFOCUS) && /*
if ((ignore >= IGNORE_NONFOCUS) &&
focus_client != test) continue; focus_client != test) continue;
*/
/* don't ignore this window, so remove it from the available /* don't ignore this window, so remove it from the available
area */ area */
spaces = area_remove(spaces, &test->frame->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)) { for (sit = spaces; sit; sit = g_slist_next(sit)) {
Rect *r = sit->data; Rect *r = sit->data;