]> git.sur5r.net Git - i3/i3/commitdiff
Introduce get_assigned_output
authorOrestis Floros <orestisf1993@gmail.com>
Wed, 28 Mar 2018 00:35:40 +0000 (03:35 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Wed, 27 Jun 2018 11:56:31 +0000 (14:56 +0300)
This also replaces code in create_workspace_on_output() that is
theoretically more efficient but:
1. It isn't a huge difference since it depends on the number of outputs,
that shouldn't be high.
2. get_assigned_output will be modified and used for #555, then its
logic should be followed in create_workspace_on_output() too.

Another note for create_workspace_on_output: if assigned is not NULL the
condition (assigned != output->con) should never be false, ie if there
is an assigned output to this name, it isn't the current one. This
happens because the current callers check for assignments before calling
create_workspace_on_output().

src/workspace.c

index a16479a5409fd40374d87b8cf62cbe6d48970526..9441042ed38a2e71cf86720f99d76ccb438930d2 100644 (file)
@@ -67,6 +67,33 @@ static void _workspace_apply_default_orientation(Con *ws) {
     }
 }
 
+/*
+ * Returns the first output that is assigned to a workspace specified by the
+ * given name or number or NULL if no such output exists. If there is a
+ * workspace with a matching name and another workspace with a matching number,
+ * the output assigned to the first one is returned.
+ * If 'name' is NULL it will be ignored.
+ * If 'parsed_num' is -1 it will be ignored.
+ *
+ */
+static Con *get_assigned_output(const char *name, long parsed_num) {
+    Con *output = NULL;
+
+    struct Workspace_Assignment *assignment;
+    TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
+        if (name && strcmp(assignment->name, name) == 0) {
+            DLOG("Found workspace name assignment to output \"%s\"\n", assignment->output);
+            GREP_FIRST(output, croot, !strcmp(child->name, assignment->output));
+            break;
+        } else if (parsed_num != -1 && name_is_digits(assignment->name) && ws_name_to_number(assignment->name) == parsed_num) {
+            DLOG("Found workspace number assignment to output \"%s\"\n", assignment->output);
+            GREP_FIRST(output, croot, !strcmp(child->name, assignment->output));
+        }
+    }
+
+    return output;
+}
+
 /*
  * Returns a pointer to the workspace with the given number (starting at 0),
  * creating the workspace if necessary (by allocating the necessary amount of
@@ -78,25 +105,16 @@ Con *workspace_get(const char *num, bool *created) {
 
     if (workspace == NULL) {
         LOG("Creating new workspace \"%s\"\n", num);
-        /* unless an assignment is found, we will create this workspace on the current output */
-        Con *output = con_get_output(focused);
-        /* look for assignments */
-        struct Workspace_Assignment *assignment;
 
         /* We set workspace->num to the number if this workspace’s name begins
          * with a positive number. Otherwise it’s a named ws and num will be
          * -1. */
         long parsed_num = ws_name_to_number(num);
 
-        TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
-            if (strcmp(assignment->name, num) == 0) {
-                DLOG("Found workspace name assignment to output \"%s\"\n", assignment->output);
-                GREP_FIRST(output, croot, !strcmp(child->name, assignment->output));
-                break;
-            } else if (parsed_num != -1 && name_is_digits(assignment->name) && ws_name_to_number(assignment->name) == parsed_num) {
-                DLOG("Found workspace number assignment to output \"%s\"\n", assignment->output);
-                GREP_FIRST(output, croot, !strcmp(child->name, assignment->output));
-            }
+        Con *output = get_assigned_output(num, parsed_num);
+        /* if an assignment is not found, we create this workspace on the current output */
+        if (!output) {
+            output = con_get_output(focused);
         }
 
         Con *content = output_get_content(output);
@@ -208,19 +226,10 @@ Con *create_workspace_on_output(Output *output, Con *content) {
         /* Ensure that this workspace is not assigned to a different output —
          * otherwise we would create it, then move it over to its output, then
          * find a new workspace, etc… */
-        bool assigned = false;
-        struct Workspace_Assignment *assignment;
-        TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
-            if (strcmp(assignment->name, target_name) != 0 ||
-                strcmp(assignment->output, output_primary_name(output)) == 0)
-                continue;
-
-            assigned = true;
-            break;
-        }
-
-        if (assigned)
+        Con *assigned = get_assigned_output(target_name, -1);
+        if (assigned && assigned != output->con) {
             continue;
+        }
 
         exists = (get_existing_workspace_by_name(target_name) != NULL);
         if (!exists) {