Match on all criteria even if con_id or con_mark are given.

Previously, if a match specification contained the con_id or con_mark criterion,
all other criteria were ignored. However, a user may want to specify one of
those two unique identifiers and still specify others as well, for example to
match the currently focused window, but only if it has a certain WM_CLASS:

    [con_id=__focused__ class=special] kill

We now check all specified criteria.

fixes #2111
This commit is contained in:
Ingo Bürk
2015-12-15 07:38:56 -05:00
parent 8e081d7fff
commit bba18453af
3 changed files with 107 additions and 14 deletions

View File

@ -223,11 +223,25 @@ bool match_matches_window(Match *match, i3Window *window) {
}
}
/* We dont check the mark because this function is not even called when
* the mark would have matched - it is checked in cmdparse.y itself */
if (match->mark != NULL) {
LOG("mark does not match\n");
return false;
if ((con = con_by_window_id(window->id)) == NULL)
return false;
bool matched = false;
mark_t *mark;
TAILQ_FOREACH(mark, &(con->marks_head), marks) {
if (regex_matches(match->mark, mark->name)) {
matched = true;
break;
}
}
if (matched) {
LOG("mark matches\n");
} else {
LOG("mark does not match\n");
return false;
}
}
return true;