Only mark a window if only one window is matched
We only support unique marks, so looping over all matched windows must be prevented. If more than one window is matched, we reject it with an error message. fixes #1614
This commit is contained in:
parent
43204b43fd
commit
2e4fac61d2
|
@ -1043,8 +1043,18 @@ void cmd_workspace_name(I3_CMD, char *name) {
|
||||||
void cmd_mark(I3_CMD, char *mark, char *toggle) {
|
void cmd_mark(I3_CMD, char *mark, char *toggle) {
|
||||||
HANDLE_EMPTY_MATCH;
|
HANDLE_EMPTY_MATCH;
|
||||||
|
|
||||||
owindow *current;
|
owindow *current = TAILQ_FIRST(&owindows);
|
||||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
if (current == NULL) {
|
||||||
|
ysuccess(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Marks must be unique, i.e., no two windows must have the same mark. */
|
||||||
|
if (current != TAILQ_LAST(&owindows, owindows_head)) {
|
||||||
|
yerror("A mark must not be put onto more than one window");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DLOG("matching: %p / %s\n", current->con, current->con->name);
|
DLOG("matching: %p / %s\n", current->con, current->con->name);
|
||||||
current->con->mark_changed = true;
|
current->con->mark_changed = true;
|
||||||
if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
|
if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
|
||||||
|
@ -1055,20 +1065,12 @@ void cmd_mark(I3_CMD, char *mark, char *toggle) {
|
||||||
FREE(current->con->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");
|
DLOG("Clearing all non-matched windows with this mark\n");
|
||||||
Con *con;
|
Con *con;
|
||||||
TAILQ_FOREACH(con, &all_cons, all_cons) {
|
TAILQ_FOREACH(con, &all_cons, all_cons) {
|
||||||
/* Skip matched windows, we took care of them already. */
|
/* Skip matched window, we took care of it already. */
|
||||||
bool matched = false;
|
if (current->con == con)
|
||||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
|
||||||
if (current->con == con) {
|
|
||||||
matched = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (matched)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (con->mark && strcmp(con->mark, mark) == 0) {
|
if (con->mark && strcmp(con->mark, mark) == 0) {
|
||||||
|
|
Loading…
Reference in New Issue