-#undef I3__FILE__
-#define I3__FILE__ "match.c"
/*
* vim:ts=4:sw=4:expandtab
*
*/
void match_init(Match *match) {
memset(match, 0, sizeof(Match));
- match->dock = M_DONTCHECK;
match->urgent = U_DONTCHECK;
+ match->window_mode = WM_ANY;
/* we use this as the placeholder value for "not set". */
match->window_type = UINT32_MAX;
}
match->id == XCB_NONE &&
match->window_type == UINT32_MAX &&
match->con_id == NULL &&
- match->dock == -1 &&
- match->floating == M_ANY);
+ match->dock == M_NODOCK &&
+ match->window_mode == WM_ANY);
}
/*
/* if we find a window that is newer than this one, bail */
TAILQ_FOREACH(con, &all_cons, all_cons) {
if ((con->window != NULL) &&
- _i3_timercmp(con->window->urgent, window->urgent, > )) {
+ _i3_timercmp(con->window->urgent, window->urgent, >)) {
return false;
}
}
TAILQ_FOREACH(con, &all_cons, all_cons) {
if ((con->window != NULL) &&
(con->window->urgent.tv_sec != 0) &&
- _i3_timercmp(con->window->urgent, window->urgent, < )) {
+ _i3_timercmp(con->window->urgent, window->urgent, <)) {
return false;
}
}
}
}
- /* We don’t 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;
+ }
+ }
+
+ if (match->window_mode != WM_ANY) {
+ if ((con = con_by_window_id(window->id)) == NULL)
+ return false;
+
+ const bool floating = (con_inside_floating(con) != NULL);
+
+ if ((match->window_mode == WM_TILING && floating) ||
+ (match->window_mode == WM_FLOATING && !floating)) {
+ LOG("window_mode does not match\n");
+ return false;
+ }
+
+ LOG("window_mode matches\n");
}
return true;
if (strcmp(ctype, "id") == 0) {
char *end;
- long parsed = strtol(cvalue, &end, 10);
+ long parsed = strtol(cvalue, &end, 0);
if (parsed == LONG_MIN ||
parsed == LONG_MAX ||
parsed < 0 ||
match->window_type = A__NET_WM_WINDOW_TYPE_POPUP_MENU;
} else if (strcasecmp(cvalue, "tooltip") == 0) {
match->window_type = A__NET_WM_WINDOW_TYPE_TOOLTIP;
+ } else if (strcasecmp(cvalue, "notification") == 0) {
+ match->window_type = A__NET_WM_WINDOW_TYPE_NOTIFICATION;
} else {
ELOG("unknown window_type value \"%s\"\n", cvalue);
match->error = sstrdup("unknown window_type value");
return;
}
+ if (strcmp(ctype, "tiling") == 0) {
+ match->window_mode = WM_TILING;
+ return;
+ }
+
+ if (strcmp(ctype, "floating") == 0) {
+ match->window_mode = WM_FLOATING;
+ return;
+ }
+
ELOG("Unknown criterion: %s\n", ctype);
}