]> git.sur5r.net Git - i3/i3/commitdiff
Added a --toggle switch to "mark [--toggle] <mark>"
authorIngo Bürk <ingo.buerk@tngtech.com>
Sat, 28 Mar 2015 18:12:25 +0000 (19:12 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Sun, 29 Mar 2015 19:21:50 +0000 (21:21 +0200)
This option allows toggling marks on a window without knowing whether the mark is already set or not.
It behaves as follows:
1) If the matched window has no mark, the new mark is set.
2) If the matched window has another mark, the old mark is removed and the new mark is set.
3) If the matched window already has the mark, the mark is removed.

The behavior that all non-matched windows have this mark removed is kept.

fixes #1463

include/commands.h
parser-specs/commands.spec
src/commands.c

index 780a9e8eb781893dd3fb69c8642783b98c73e676..0f7e3635c0964b997f7ea219b930c5359fd50124 100644 (file)
@@ -109,10 +109,10 @@ void cmd_workspace_back_and_forth(I3_CMD);
 void cmd_workspace_name(I3_CMD, char *name);
 
 /**
- * Implementation of 'mark <mark>'
+ * Implementation of 'mark [--toggle] <mark>'
  *
  */
-void cmd_mark(I3_CMD, char *mark);
+void cmd_mark(I3_CMD, char *mark, char *toggle);
 
 /**
  * Implementation of 'unmark [mark]'
index 315a9218dd5930695e540506ce11e0cd30cabbf4..87db6cf082cebfeb04e430cc5a31ba1fe19370e4 100644 (file)
@@ -189,10 +189,12 @@ state FLOATING:
   floating = 'enable', 'disable', 'toggle'
       -> call cmd_floating($floating)
 
-# mark <mark>
+# mark [--toggle] <mark>
 state MARK:
+  toggle = '--toggle'
+      ->
   mark = string
-      -> call cmd_mark($mark)
+      -> call cmd_mark($mark, $toggle)
 
 # unmark [mark]
 state UNMARK:
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);