]> git.sur5r.net Git - i3/i3/blobdiff - src/workspace.c
Bugfix: When moving floating cons to other workspaces, attach them to the workspace
[i3/i3] / src / workspace.c
index 2912278d3089e0c55ee25f3efa8aac677ff5c758..8104aa89fc35d6da21765408718255e5d06a0473 100644 (file)
@@ -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,19 +225,15 @@ void workspace_show(const char *num) {
             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);
 
@@ -235,6 +246,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 +254,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 +470,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);