Bugfix: Check swallows before assignments when managing windows (Thanks julien)
Fixes #395 (empty containers on restart when assigned windows are visible)
This commit is contained in:
parent
7fca97b151
commit
7ae0c9c973
45
src/manage.c
45
src/manage.c
|
@ -207,34 +207,35 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
|
||||||
Match *match;
|
Match *match;
|
||||||
Assignment *assignment;
|
Assignment *assignment;
|
||||||
|
|
||||||
/* check assignments first */
|
/* TODO: two matches for one container */
|
||||||
if ((assignment = assignment_for(cwindow, A_TO_WORKSPACE | A_TO_OUTPUT))) {
|
|
||||||
DLOG("Assignment matches (%p)\n", match);
|
|
||||||
if (assignment->type == A_TO_WORKSPACE) {
|
|
||||||
nc = con_descend_focused(workspace_get(assignment->dest.workspace, NULL));
|
|
||||||
DLOG("focused on ws %s: %p / %s\n", assignment->dest.workspace, nc, nc->name);
|
|
||||||
if (nc->type == CT_WORKSPACE)
|
|
||||||
nc = tree_open_con(nc);
|
|
||||||
else nc = tree_open_con(nc->parent);
|
|
||||||
}
|
|
||||||
/* TODO: handle assignments with type == A_TO_OUTPUT */
|
|
||||||
} else {
|
|
||||||
/* TODO: two matches for one container */
|
|
||||||
|
|
||||||
/* See if any container swallows this new window */
|
/* See if any container swallows this new window */
|
||||||
nc = con_for_window(search_at, cwindow, &match);
|
nc = con_for_window(search_at, cwindow, &match);
|
||||||
if (nc == NULL) {
|
if (nc == NULL) {
|
||||||
|
/* If not, check if it is assigned to a specific workspace / output */
|
||||||
|
if ((assignment = assignment_for(cwindow, A_TO_WORKSPACE | A_TO_OUTPUT))) {
|
||||||
|
DLOG("Assignment matches (%p)\n", match);
|
||||||
|
if (assignment->type == A_TO_WORKSPACE) {
|
||||||
|
nc = con_descend_focused(workspace_get(assignment->dest.workspace, NULL));
|
||||||
|
DLOG("focused on ws %s: %p / %s\n", assignment->dest.workspace, nc, nc->name);
|
||||||
|
if (nc->type == CT_WORKSPACE)
|
||||||
|
nc = tree_open_con(nc);
|
||||||
|
else nc = tree_open_con(nc->parent);
|
||||||
|
}
|
||||||
|
/* TODO: handle assignments with type == A_TO_OUTPUT */
|
||||||
|
} else {
|
||||||
|
/* If not, insert it at the currently focused position */
|
||||||
if (focused->type == CT_CON && con_accepts_window(focused)) {
|
if (focused->type == CT_CON && con_accepts_window(focused)) {
|
||||||
LOG("using current container, focused = %p, focused->name = %s\n",
|
LOG("using current container, focused = %p, focused->name = %s\n",
|
||||||
focused, focused->name);
|
focused, focused->name);
|
||||||
nc = focused;
|
nc = focused;
|
||||||
} else nc = tree_open_con(NULL);
|
} else nc = tree_open_con(NULL);
|
||||||
} else {
|
}
|
||||||
/* M_BELOW inserts the new window as a child of the one which was
|
} else {
|
||||||
* matched (e.g. dock areas) */
|
/* M_BELOW inserts the new window as a child of the one which was
|
||||||
if (match != NULL && match->insert_where == M_BELOW) {
|
* matched (e.g. dock areas) */
|
||||||
nc = tree_open_con(nc);
|
if (match != NULL && match->insert_where == M_BELOW) {
|
||||||
}
|
nc = tree_open_con(nc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue