]> git.sur5r.net Git - i3/i3/commitdiff
Introduce get_existing_workspace_by_num 3207/head
authorOrestis Floros <orestisf1993@gmail.com>
Tue, 27 Mar 2018 19:36:51 +0000 (22:36 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Wed, 28 Mar 2018 12:18:43 +0000 (15:18 +0300)
include/workspace.h
src/commands.c
src/manage.c
src/workspace.c

index 3e7183b9f7b79cc068099adde5d2a14dc9dfb81e..1cb249399f81572c910e983c97244f5af0ae8afe 100644 (file)
  */
 Con *get_existing_workspace_by_name(const char *name);
 
+/**
+ * Returns the workspace with the given number or NULL if such a workspace does
+ * not exist.
+ *
+ */
+Con *get_existing_workspace_by_num(int num);
+
 /**
  * Returns a pointer to the workspace with the given number (starting at 0),
  * creating the workspace if necessary (by allocating the necessary amount of
index e6f6174b719ed94806901ed50f907d2dcb427fcd..d2d15618092d03ecef555bad741e6650f4993133 100644 (file)
@@ -394,21 +394,15 @@ void cmd_move_con_to_workspace_number(I3_CMD, const char *which, const char *_no
     }
 
     LOG("should move window to workspace %s\n", which);
-    /* get the workspace */
-    Con *output, *ws = NULL;
 
     long parsed_num = ws_name_to_number(which);
-
     if (parsed_num == -1) {
         LOG("Could not parse initial part of \"%s\" as a number.\n", which);
         yerror("Could not parse number \"%s\"", which);
         return;
     }
 
-    TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
-    GREP_FIRST(ws, output_get_content(output),
-               child->num == parsed_num);
-
+    Con *ws = get_existing_workspace_by_num(parsed_num);
     if (!ws) {
         ws = workspace_get(which, NULL);
     }
@@ -901,7 +895,6 @@ void cmd_workspace(I3_CMD, const char *which) {
  */
 void cmd_workspace_number(I3_CMD, const char *which, const char *_no_auto_back_and_forth) {
     const bool no_auto_back_and_forth = (_no_auto_back_and_forth != NULL);
-    Con *output, *workspace = NULL;
 
     if (con_get_fullscreen_con(croot, CF_GLOBAL)) {
         LOG("Cannot switch workspace while in global fullscreen\n");
@@ -910,17 +903,13 @@ void cmd_workspace_number(I3_CMD, const char *which, const char *_no_auto_back_a
     }
 
     long parsed_num = ws_name_to_number(which);
-
     if (parsed_num == -1) {
         LOG("Could not parse initial part of \"%s\" as a number.\n", which);
         yerror("Could not parse number \"%s\"", which);
         return;
     }
 
-    TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
-    GREP_FIRST(workspace, output_get_content(output),
-               child->num == parsed_num);
-
+    Con *workspace = get_existing_workspace_by_num(parsed_num);
     if (!workspace) {
         LOG("There is no workspace with number %ld, creating a new one.\n", parsed_num);
         ysuccess(true);
index 8b306052c7ea77243e457ccf97bccbd25ac0f23c..9dcc93f5131249fbc193520cdfac53b2617d0606 100644 (file)
@@ -265,13 +265,9 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
 
             Con *assigned_ws = NULL;
             if (assignment->type == A_TO_WORKSPACE_NUMBER) {
-                Con *output = NULL;
                 long parsed_num = ws_name_to_number(assignment->dest.workspace);
 
-                /* This will only work for workspaces that already exist. */
-                TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
-                    GREP_FIRST(assigned_ws, output_get_content(output), child->num == parsed_num);
-                }
+                assigned_ws = get_existing_workspace_by_num(parsed_num);
             }
             /* A_TO_WORKSPACE type assignment or fallback from A_TO_WORKSPACE_NUMBER
              * when the target workspace number does not exist yet. */
index bdd6f6f4dacf41af58c442f9a771d8898f3457ba..643b78dd49c634341290843f4fe4cc5954bd6d45 100644 (file)
@@ -33,6 +33,20 @@ Con *get_existing_workspace_by_name(const char *name) {
     return workspace;
 }
 
+/*
+ * Returns the workspace with the given number or NULL if such a workspace does
+ * not exist.
+ *
+ */
+Con *get_existing_workspace_by_num(int num) {
+    Con *output, *workspace = NULL;
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
+        GREP_FIRST(workspace, output_get_content(output), child->num == num);
+    }
+
+    return workspace;
+}
+
 /*
  * Sets ws->layout to splith/splitv if default_orientation was specified in the
  * configfile. Otherwise, it uses splith/splitv depending on whether the output
@@ -225,17 +239,10 @@ Con *create_workspace_on_output(Output *output, Con *content) {
         DLOG("Getting next unused workspace by number\n");
         int c = 0;
         while (exists) {
-            c++;
-
-            ws->num = c;
-
-            Con *out, *current = NULL;
-            TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
-            GREP_FIRST(current, output_get_content(out), child->num == ws->num);
-            exists = (current != NULL);
-
+            exists = (get_existing_workspace_by_num(++c) != NULL);
             DLOG("result for ws %d: exists = %d\n", c, exists);
         }
+        ws->num = c;
         sasprintf(&(ws->name), "%d", c);
     }
     con_attach(ws, content, false);