diff options
-rw-r--r-- | sway/criteria.c | 79 |
1 files changed, 55 insertions, 24 deletions
diff --git a/sway/criteria.c b/sway/criteria.c index 21278a94..09733616 100644 --- a/sway/criteria.c +++ b/sway/criteria.c | |||
@@ -275,28 +275,39 @@ static bool criteria_test(swayc_t *cont, list_t *tokens) { | |||
275 | if (cont->type != C_VIEW) { | 275 | if (cont->type != C_VIEW) { |
276 | return false; | 276 | return false; |
277 | } | 277 | } |
278 | struct sway_view *view = cont->sway_view; | ||
279 | |||
280 | int matches = 0; | 278 | int matches = 0; |
281 | for (int i = 0; i < tokens->length; i++) { | 279 | for (int i = 0; i < tokens->length; i++) { |
282 | struct crit_token *crit = tokens->items[i]; | 280 | struct crit_token *crit = tokens->items[i]; |
283 | switch (crit->type) { | 281 | switch (crit->type) { |
284 | case CRIT_CLASS: // TODO | 282 | case CRIT_CLASS: |
285 | break; | 283 | { |
286 | case CRIT_CON_ID: { | 284 | const char *class = view_get_class(cont->sway_view); |
287 | char *endptr; | 285 | if (!class) { |
288 | size_t crit_id = strtoul(crit->raw, &endptr, 10); | 286 | break; |
287 | } | ||
288 | if (crit->regex && regex_cmp(class, crit->regex) == 0) { | ||
289 | matches++; | ||
290 | } | ||
291 | break; | ||
292 | } | ||
293 | case CRIT_CON_ID: | ||
294 | { | ||
295 | char *endptr; | ||
296 | size_t crit_id = strtoul(crit->raw, &endptr, 10); | ||
289 | 297 | ||
290 | if (*endptr == 0 && cont->id == crit_id) { | 298 | if (*endptr == 0 && cont->id == crit_id) { |
291 | ++matches; | 299 | ++matches; |
300 | } | ||
301 | break; | ||
292 | } | 302 | } |
303 | case CRIT_CON_MARK: | ||
304 | // TODO | ||
293 | break; | 305 | break; |
294 | } | 306 | case CRIT_FLOATING: |
295 | case CRIT_CON_MARK: // TODO | 307 | // TODO |
296 | break; | ||
297 | case CRIT_FLOATING: // TODO | ||
298 | break; | 308 | break; |
299 | case CRIT_ID: // TODO | 309 | case CRIT_ID: |
310 | // TODO | ||
300 | break; | 311 | break; |
301 | case CRIT_APP_ID: | 312 | case CRIT_APP_ID: |
302 | { | 313 | { |
@@ -310,24 +321,44 @@ static bool criteria_test(swayc_t *cont, list_t *tokens) { | |||
310 | } | 321 | } |
311 | break; | 322 | break; |
312 | } | 323 | } |
313 | case CRIT_INSTANCE: // TODO | 324 | case CRIT_INSTANCE: |
314 | break; | 325 | { |
315 | case CRIT_TILING: // TODO | 326 | const char *instance = view_get_instance(cont->sway_view); |
327 | if (!instance) { | ||
328 | break; | ||
329 | } | ||
330 | |||
331 | if (crit->regex && regex_cmp(instance, crit->regex) == 0) { | ||
332 | matches++; | ||
333 | } | ||
334 | break; | ||
335 | } | ||
336 | case CRIT_TILING: | ||
337 | // TODO | ||
316 | break; | 338 | break; |
317 | case CRIT_TITLE: | 339 | case CRIT_TITLE: |
318 | if (!cont->name) { | 340 | { |
319 | // ignore | 341 | const char *title = view_get_title(cont->sway_view); |
320 | } else if (crit->regex && regex_cmp(cont->name, crit->regex) == 0) { | 342 | if (!title) { |
321 | matches++; | 343 | break; |
344 | } | ||
345 | |||
346 | if (crit->regex && regex_cmp(title, crit->regex) == 0) { | ||
347 | matches++; | ||
348 | } | ||
349 | break; | ||
322 | } | 350 | } |
323 | break; | 351 | case CRIT_URGENT: |
324 | case CRIT_URGENT: // "latest" or "oldest" | 352 | // TODO "latest" or "oldest" |
325 | break; | 353 | break; |
326 | case CRIT_WINDOW_ROLE: | 354 | case CRIT_WINDOW_ROLE: |
355 | // TODO | ||
327 | break; | 356 | break; |
328 | case CRIT_WINDOW_TYPE: | 357 | case CRIT_WINDOW_TYPE: |
358 | // TODO | ||
329 | break; | 359 | break; |
330 | case CRIT_WORKSPACE: // TODO | 360 | case CRIT_WORKSPACE: |
361 | // TODO | ||
331 | break; | 362 | break; |
332 | default: | 363 | default: |
333 | sway_abort("Invalid criteria type (%i)", crit->type); | 364 | sway_abort("Invalid criteria type (%i)", crit->type); |