* 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?
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;
}
*
*/
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. */
old = current;
current->fullscreen_mode = CF_NONE;
}
-
- /* 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
- * focused con */
- Con *ws = con_get_workspace(focused);
- if (ws && ws->parent != old->parent)
- old = ws;
+ assert(old != NULL);
/* enable fullscreen for the target workspace. If it happens to be the
* same one we are currently on anyways, we can stop here. */
workspace->fullscreen_mode = CF_OUTPUT;
- if (workspace == old)
+ if (workspace == con_get_workspace(focused)) {
+ DLOG("Not switching, already there.\n");
return;
+ }
workspace_reassign_sticky(workspace);
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;
}
}
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
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);