X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fworkspace.c;h=4e93b92e08079613bdbdc17fd487f22217e2e2cd;hb=2f992f5c0ed75452a61b19d6c118e5f5f3ba67e9;hp=2912278d3089e0c55ee25f3efa8aac677ff5c758;hpb=9719b2124331d1d560a927a4e58b04f3aeb910d1;p=i3%2Fi3 diff --git a/src/workspace.c b/src/workspace.c index 2912278d..4e93b92e 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -17,7 +17,7 @@ * memory and initializing the data structures correctly). * */ -Con *workspace_get(const char *num) { +Con *workspace_get(const char *num, bool *created) { Con *output, *workspace = NULL, *child; /* TODO: could that look like this in the future? @@ -59,13 +59,27 @@ Con *workspace_get(const char *num) { workspace->num = -1; else workspace->num = parsed_num; LOG("num = %d\n", workspace->num); - workspace->orientation = HORIZ; + + /* If default_orientation is set to NO_ORIENTATION we + * determine workspace orientation from workspace size. + * Otherwise we just set the orientation to default_orientation. */ + if (config.default_orientation == NO_ORIENTATION) { + workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ; + DLOG("Auto orientation. Output resolution set to (%d,%d), setting orientation to %d.\n", + workspace->rect.width, workspace->rect.height, workspace->orientation); + } else { + workspace->orientation = config.default_orientation; + } + con_attach(workspace, content, false); ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}"); + if (created != NULL) + *created = true; + } + else if (created != NULL) { + *created = false; } - - //ewmh_update_workarea(); return workspace; } @@ -199,9 +213,10 @@ static void workspace_reassign_sticky(Con *con) { * */ void workspace_show(const char *num) { - Con *workspace, *current, *old; + Con *workspace, *current, *old = NULL; - workspace = workspace_get(num); + bool changed_num_workspaces; + workspace = workspace_get(num, &changed_num_workspaces); /* disable fullscreen for the other workspaces and get the workspace we are * currently on. */ @@ -210,6 +225,7 @@ void workspace_show(const char *num) { old = current; current->fullscreen_mode = CF_NONE; } + assert(old != NULL); /* Check if the the currently focused con is on the same Output as the * workspace we chose as 'old'. If not, use the workspace of the currently @@ -235,6 +251,7 @@ void workspace_show(const char *num) { LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name); tree_close(old, false, false); ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"empty\"}"); + changed_num_workspaces = true; } } @@ -242,6 +259,11 @@ void workspace_show(const char *num) { workspace->fullscreen_mode = CF_OUTPUT; LOG("focused now = %p / %s\n", focused, focused->name); + /* Update the EWMH hints */ + if (changed_num_workspaces) + ewmh_update_workarea(); + ewmh_update_current_desktop(); + ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"focus\"}"); #if 0 @@ -453,7 +475,7 @@ Workspace *get_first_workspace_for_output(Output *output) { int last_ws = 0; TAILQ_FOREACH(ws, workspaces, workspaces) last_ws = ws->num; - result = workspace_get(last_ws + 1); + result = workspace_get(last_ws + 1, NULL); } workspace_initialize(result, output, false);