]> git.sur5r.net Git - i3/i3/blobdiff - src/commands.c
Added a --toggle switch to "mark [--toggle] <mark>"
[i3/i3] / src / commands.c
index 9b51b3ecc7cba9d7561819d77a42519fd757d142..46c75c43be1fa7f782265a469404c07f6ddda71c 100644 (file)
@@ -1037,28 +1037,42 @@ void cmd_workspace_name(I3_CMD, char *name) {
 }
 
 /*
- * Implementation of 'mark <mark>'
+ * Implementation of 'mark [--toggle] <mark>'
  *
  */
-void cmd_mark(I3_CMD, char *mark) {
-    DLOG("Clearing all windows which have that mark first\n");
+void cmd_mark(I3_CMD, char *mark, char *toggle) {
+    HANDLE_EMPTY_MATCH;
+
+    owindow *current;
+    TAILQ_FOREACH(current, &owindows, owindows) {
+        DLOG("matching: %p / %s\n", current->con, current->con->name);
+        if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
+            DLOG("removing window mark %s\n", mark);
+            FREE(current->con->mark);
+        } else {
+            DLOG("marking window with str %s\n", mark);
+            FREE(current->con->mark);
+            current->con->mark = sstrdup(mark);
+        }
+    }
 
+    DLOG("Clearing all non-matched windows with this mark\n");
     Con *con;
     TAILQ_FOREACH(con, &all_cons, all_cons) {
+        /* Skip matched windows, we took care of them already. */
+        bool matched = false;
+        TAILQ_FOREACH(current, &owindows, owindows)
+        if (current->con == con) {
+            matched = true;
+            break;
+        }
+        if (matched)
+            continue;
+
         if (con->mark && strcmp(con->mark, mark) == 0)
             FREE(con->mark);
     }
 
-    DLOG("marking window with str %s\n", mark);
-    owindow *current;
-
-    HANDLE_EMPTY_MATCH;
-
-    TAILQ_FOREACH(current, &owindows, owindows) {
-        DLOG("matching: %p / %s\n", current->con, current->con->name);
-        current->con->mark = sstrdup(mark);
-    }
-
     cmd_output->needs_tree_render = true;
     // XXX: default reply for now, make this a better reply
     ysuccess(true);