Added a --toggle switch to "mark [--toggle] <mark>"
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
This commit is contained in:
parent
dfefb10d36
commit
d51d6d730e
|
@ -109,10 +109,10 @@ void cmd_workspace_back_and_forth(I3_CMD);
|
||||||
void cmd_workspace_name(I3_CMD, char *name);
|
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 'unmark [mark]'
|
||||||
|
|
|
@ -189,10 +189,12 @@ state FLOATING:
|
||||||
floating = 'enable', 'disable', 'toggle'
|
floating = 'enable', 'disable', 'toggle'
|
||||||
-> call cmd_floating($floating)
|
-> call cmd_floating($floating)
|
||||||
|
|
||||||
# mark <mark>
|
# mark [--toggle] <mark>
|
||||||
state MARK:
|
state MARK:
|
||||||
|
toggle = '--toggle'
|
||||||
|
->
|
||||||
mark = string
|
mark = string
|
||||||
-> call cmd_mark($mark)
|
-> call cmd_mark($mark, $toggle)
|
||||||
|
|
||||||
# unmark [mark]
|
# unmark [mark]
|
||||||
state UNMARK:
|
state UNMARK:
|
||||||
|
|
|
@ -1037,27 +1037,41 @@ 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) {
|
||||||
DLOG("Clearing all windows which have that mark first\n");
|
|
||||||
|
|
||||||
Con *con;
|
|
||||||
TAILQ_FOREACH(con, &all_cons, all_cons) {
|
|
||||||
if (con->mark && strcmp(con->mark, mark) == 0)
|
|
||||||
FREE(con->mark);
|
|
||||||
}
|
|
||||||
|
|
||||||
DLOG("marking window with str %s\n", mark);
|
|
||||||
owindow *current;
|
|
||||||
|
|
||||||
HANDLE_EMPTY_MATCH;
|
HANDLE_EMPTY_MATCH;
|
||||||
|
|
||||||
|
owindow *current;
|
||||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||||
DLOG("matching: %p / %s\n", current->con, current->con->name);
|
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);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
cmd_output->needs_tree_render = true;
|
cmd_output->needs_tree_render = true;
|
||||||
// XXX: default reply for now, make this a better reply
|
// XXX: default reply for now, make this a better reply
|
||||||
|
|
Loading…
Reference in New Issue