X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Frandr.c;h=0c702db05ab9dc1868a3405031081e00bede64a5;hb=c3b4006f6b11578020238b1aa3d51eeab80d29e3;hp=d4dc770bf097b07fd8b92bb22bcb52924fdba857;hpb=ffc71859a3b9ee54410dfdbe733aba8b01b4b46c;p=i3%2Fi3 diff --git a/src/randr.c b/src/randr.c index d4dc770b..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"); @@ -665,7 +723,7 @@ void randr_query_outputs() { disable_randr(conn); } - //ewmh_update_workarea(); + ewmh_update_workarea(); #if 0 /* Just go through each active output and associate one workspace */