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]'
}
/*
- * 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);