X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Frandr.c;h=0c702db05ab9dc1868a3405031081e00bede64a5;hb=c3b4006f6b11578020238b1aa3d51eeab80d29e3;hp=acac36cab04c85feca9bf2bda0bbb1ec05cce825;hpb=c0563af3e27543d97eb3d201c2e197cc6285cb80;p=i3%2Fi3 diff --git a/src/randr.c b/src/randr.c index acac36ca..0c702db0 100644 --- a/src/randr.c +++ b/src/randr.c @@ -361,7 +361,17 @@ void output_init_con(Output *output) { free(name); ws->fullscreen_mode = CF_OUTPUT; - ws->orientation = HORIZ; + + /* If default_orientation is set to NO_ORIENTATION we determine + * orientation depending on output resolution. */ + if (config.default_orientation == NO_ORIENTATION) { + ws->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ; + DLOG("Auto orientation. Workspace size set to (%d,%d), setting orientation to %d.\n", + output->rect.width, output->rect.height, ws->orientation); + } else { + ws->orientation = config.default_orientation; + } + /* TODO: Set focus in main.c */ con_focus(ws); @@ -384,6 +394,31 @@ static void output_change_mode(xcb_connection_t *conn, Output *output) { DLOG("Output mode changed, updating rect\n"); assert(output->con != NULL); output->con->rect = output->rect; + + Con *content, *workspace, *child; + + /* Point content to the container of the workspaces */ + content = output_get_content(output->con); + + /* If default_orientation is NO_ORIENTATION, we change the orientation of + * the workspaces and their childs depending on output resolution. This is + * only done for workspaces with maximum one child. */ + if (config.default_orientation == NO_ORIENTATION) { + TAILQ_FOREACH(workspace, &(content->nodes_head), nodes) { + /* Workspaces with more than one child are left untouched because + * we do not want to change an existing layout. */ + if (con_num_children(workspace) > 1) + continue; + + workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ; + DLOG("Setting workspace [%d,%s]'s orientation to %d.\n", workspace->num, workspace->name, workspace->orientation); + if ((child = TAILQ_FIRST(&(workspace->nodes_head)))) { + child->orientation = workspace->orientation; + DLOG("Setting child [%d,%s]'s orientation to %d.\n", child->num, child->name, child->orientation); + } + } + } + #if 0 Rect bar_rect = {output->rect.x, output->rect.y + output->rect.height - (font->height + 6), @@ -608,6 +643,9 @@ void randr_query_outputs() { if ((first = get_first_output()) == NULL) die("No usable outputs available\n"); + /* TODO: refactor the following code into a nice function. maybe + * use an on_destroy callback which is implement differently for + * different container types (CT_CONTENT vs. CT_DOCKAREA)? */ Con *first_content = output_get_content(first->con); if (output->con != NULL) { @@ -638,6 +676,26 @@ void randr_query_outputs() { con_focus(next); } + /* 3: move the dock clients to the first output */ + Con *child; + TAILQ_FOREACH(child, &(output->con->nodes_head), nodes) { + if (child->type != CT_DOCKAREA) + continue; + DLOG("Handling dock con %p\n", child); + Con *dock; + while (!TAILQ_EMPTY(&(child->nodes_head))) { + dock = TAILQ_FIRST(&(child->nodes_head)); + Con *nc; + Match *match; + nc = con_for_window(first->con, dock->window, &match); + DLOG("Moving dock client %p to nc %p\n", dock, nc); + con_detach(dock); + DLOG("Re-attaching\n"); + con_attach(dock, nc, false); + DLOG("Done\n"); + } + } + DLOG("destroying disappearing con %p\n", output->con); tree_close(output->con, false, true); DLOG("Done. Should be fine now\n");