ignore the dock in placing as a last resort
This commit is contained in:
parent
cbaafd2ff9
commit
1514ce75b6
3 changed files with 35 additions and 17 deletions
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue