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);
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),
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) {
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");
disable_randr(conn);
}
- //ewmh_update_workarea();
+ ewmh_update_workarea();
#if 0
/* Just go through each active output and associate one workspace */