diff options
-rw-r--r-- | include/sway/criteria.h | 6 | ||||
-rw-r--r-- | sway/criteria.c | 100 |
2 files changed, 53 insertions, 53 deletions
diff --git a/include/sway/criteria.h b/include/sway/criteria.h index 89fe369c..323ba01d 100644 --- a/include/sway/criteria.h +++ b/include/sway/criteria.h | |||
@@ -23,15 +23,15 @@ struct criteria { | |||
23 | pcre *title; | 23 | pcre *title; |
24 | pcre *shell; | 24 | pcre *shell; |
25 | pcre *app_id; | 25 | pcre *app_id; |
26 | pcre *class; | ||
27 | pcre *instance; | ||
28 | pcre *con_mark; | 26 | pcre *con_mark; |
29 | uint32_t con_id; // internal ID | 27 | uint32_t con_id; // internal ID |
30 | #ifdef HAVE_XWAYLAND | 28 | #ifdef HAVE_XWAYLAND |
29 | pcre *class; | ||
31 | uint32_t id; // X11 window ID | 30 | uint32_t id; // X11 window ID |
31 | pcre *instance; | ||
32 | pcre *window_role; | ||
32 | enum atom_name window_type; | 33 | enum atom_name window_type; |
33 | #endif | 34 | #endif |
34 | pcre *window_role; | ||
35 | bool floating; | 35 | bool floating; |
36 | bool tiling; | 36 | bool tiling; |
37 | char urgent; // 'l' for latest or 'o' for oldest | 37 | char urgent; // 'l' for latest or 'o' for oldest |
diff --git a/sway/criteria.c b/sway/criteria.c index 4fad45bc..acc70d1b 100644 --- a/sway/criteria.c +++ b/sway/criteria.c | |||
@@ -18,15 +18,15 @@ bool criteria_is_empty(struct criteria *criteria) { | |||
18 | return !criteria->title | 18 | return !criteria->title |
19 | && !criteria->shell | 19 | && !criteria->shell |
20 | && !criteria->app_id | 20 | && !criteria->app_id |
21 | && !criteria->class | ||
22 | && !criteria->instance | ||
23 | && !criteria->con_mark | 21 | && !criteria->con_mark |
24 | && !criteria->con_id | 22 | && !criteria->con_id |
25 | #ifdef HAVE_XWAYLAND | 23 | #ifdef HAVE_XWAYLAND |
24 | && !criteria->class | ||
26 | && !criteria->id | 25 | && !criteria->id |
26 | && !criteria->instance | ||
27 | && !criteria->window_role | ||
27 | && criteria->window_type == ATOM_LAST | 28 | && criteria->window_type == ATOM_LAST |
28 | #endif | 29 | #endif |
29 | && !criteria->window_role | ||
30 | && !criteria->floating | 30 | && !criteria->floating |
31 | && !criteria->tiling | 31 | && !criteria->tiling |
32 | && !criteria->urgent | 32 | && !criteria->urgent |
@@ -37,10 +37,12 @@ void criteria_destroy(struct criteria *criteria) { | |||
37 | pcre_free(criteria->title); | 37 | pcre_free(criteria->title); |
38 | pcre_free(criteria->shell); | 38 | pcre_free(criteria->shell); |
39 | pcre_free(criteria->app_id); | 39 | pcre_free(criteria->app_id); |
40 | #ifdef HAVE_XWAYLAND | ||
40 | pcre_free(criteria->class); | 41 | pcre_free(criteria->class); |
41 | pcre_free(criteria->instance); | 42 | pcre_free(criteria->instance); |
42 | pcre_free(criteria->con_mark); | ||
43 | pcre_free(criteria->window_role); | 43 | pcre_free(criteria->window_role); |
44 | #endif | ||
45 | pcre_free(criteria->con_mark); | ||
44 | free(criteria->workspace); | 46 | free(criteria->workspace); |
45 | free(criteria->cmdlist); | 47 | free(criteria->cmdlist); |
46 | free(criteria->raw); | 48 | free(criteria->raw); |
@@ -115,21 +117,7 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
115 | return false; | 117 | return false; |
116 | } | 118 | } |
117 | } | 119 | } |
118 | 120 | ||
119 | if (criteria->class) { | ||
120 | const char *class = view_get_class(view); | ||
121 | if (!class || regex_cmp(class, criteria->class) != 0) { | ||
122 | return false; | ||
123 | } | ||
124 | } | ||
125 | |||
126 | if (criteria->instance) { | ||
127 | const char *instance = view_get_instance(view); | ||
128 | if (!instance || regex_cmp(instance, criteria->instance) != 0) { | ||
129 | return false; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | if (criteria->con_mark) { | 121 | if (criteria->con_mark) { |
134 | bool exists = false; | 122 | bool exists = false; |
135 | for (int i = 0; i < view->marks->length; ++i) { | 123 | for (int i = 0; i < view->marks->length; ++i) { |
@@ -156,13 +144,25 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
156 | return false; | 144 | return false; |
157 | } | 145 | } |
158 | } | 146 | } |
159 | #endif | 147 | |
148 | if (criteria->class) { | ||
149 | const char *class = view_get_class(view); | ||
150 | if (!class || regex_cmp(class, criteria->class) != 0) { | ||
151 | return false; | ||
152 | } | ||
153 | } | ||
154 | |||
155 | if (criteria->instance) { | ||
156 | const char *instance = view_get_instance(view); | ||
157 | if (!instance || regex_cmp(instance, criteria->instance) != 0) { | ||
158 | return false; | ||
159 | } | ||
160 | } | ||
160 | 161 | ||
161 | if (criteria->window_role) { | 162 | if (criteria->window_role) { |
162 | // TODO | 163 | // TODO |
163 | } | 164 | } |
164 | 165 | ||
165 | #ifdef HAVE_XWAYLAND | ||
166 | if (criteria->window_type != ATOM_LAST) { | 166 | if (criteria->window_type != ATOM_LAST) { |
167 | if (!view_has_window_type(view, criteria->window_type)) { | 167 | if (!view_has_window_type(view, criteria->window_type)) { |
168 | return false; | 168 | return false; |
@@ -292,20 +292,20 @@ static enum atom_name parse_window_type(const char *type) { | |||
292 | 292 | ||
293 | enum criteria_token { | 293 | enum criteria_token { |
294 | T_APP_ID, | 294 | T_APP_ID, |
295 | T_CLASS, | ||
296 | T_CON_ID, | 295 | T_CON_ID, |
297 | T_CON_MARK, | 296 | T_CON_MARK, |
298 | T_FLOATING, | 297 | T_FLOATING, |
299 | #ifdef HAVE_XWAYLAND | 298 | #ifdef HAVE_XWAYLAND |
299 | T_CLASS, | ||
300 | T_ID, | 300 | T_ID, |
301 | T_INSTANCE, | ||
302 | T_WINDOW_ROLE, | ||
301 | T_WINDOW_TYPE, | 303 | T_WINDOW_TYPE, |
302 | #endif | 304 | #endif |
303 | T_INSTANCE, | ||
304 | T_SHELL, | 305 | T_SHELL, |
305 | T_TILING, | 306 | T_TILING, |
306 | T_TITLE, | 307 | T_TITLE, |
307 | T_URGENT, | 308 | T_URGENT, |
308 | T_WINDOW_ROLE, | ||
309 | T_WORKSPACE, | 309 | T_WORKSPACE, |
310 | 310 | ||
311 | T_INVALID, | 311 | T_INVALID, |
@@ -314,28 +314,28 @@ enum criteria_token { | |||
314 | static enum criteria_token token_from_name(char *name) { | 314 | static enum criteria_token token_from_name(char *name) { |
315 | if (strcmp(name, "app_id") == 0) { | 315 | if (strcmp(name, "app_id") == 0) { |
316 | return T_APP_ID; | 316 | return T_APP_ID; |
317 | } else if (strcmp(name, "class") == 0) { | ||
318 | return T_CLASS; | ||
319 | } else if (strcmp(name, "con_id") == 0) { | 317 | } else if (strcmp(name, "con_id") == 0) { |
320 | return T_CON_ID; | 318 | return T_CON_ID; |
321 | } else if (strcmp(name, "con_mark") == 0) { | 319 | } else if (strcmp(name, "con_mark") == 0) { |
322 | return T_CON_MARK; | 320 | return T_CON_MARK; |
323 | #ifdef HAVE_XWAYLAND | 321 | #ifdef HAVE_XWAYLAND |
322 | } else if (strcmp(name, "class") == 0) { | ||
323 | return T_CLASS; | ||
324 | } else if (strcmp(name, "id") == 0) { | 324 | } else if (strcmp(name, "id") == 0) { |
325 | return T_ID; | 325 | return T_ID; |
326 | } else if (strcmp(name, "instance") == 0) { | ||
327 | return T_INSTANCE; | ||
328 | } else if (strcmp(name, "window_role") == 0) { | ||
329 | return T_WINDOW_ROLE; | ||
326 | } else if (strcmp(name, "window_type") == 0) { | 330 | } else if (strcmp(name, "window_type") == 0) { |
327 | return T_WINDOW_TYPE; | 331 | return T_WINDOW_TYPE; |
328 | #endif | 332 | #endif |
329 | } else if (strcmp(name, "instance") == 0) { | ||
330 | return T_INSTANCE; | ||
331 | } else if (strcmp(name, "shell") == 0) { | 333 | } else if (strcmp(name, "shell") == 0) { |
332 | return T_SHELL; | 334 | return T_SHELL; |
333 | } else if (strcmp(name, "title") == 0) { | 335 | } else if (strcmp(name, "title") == 0) { |
334 | return T_TITLE; | 336 | return T_TITLE; |
335 | } else if (strcmp(name, "urgent") == 0) { | 337 | } else if (strcmp(name, "urgent") == 0) { |
336 | return T_URGENT; | 338 | return T_URGENT; |
337 | } else if (strcmp(name, "window_role") == 0) { | ||
338 | return T_WINDOW_ROLE; | ||
339 | } else if (strcmp(name, "workspace") == 0) { | 339 | } else if (strcmp(name, "workspace") == 0) { |
340 | return T_WORKSPACE; | 340 | return T_WORKSPACE; |
341 | } | 341 | } |
@@ -364,21 +364,12 @@ static char *get_focused_prop(enum criteria_token token) { | |||
364 | case T_APP_ID: | 364 | case T_APP_ID: |
365 | value = view_get_app_id(view); | 365 | value = view_get_app_id(view); |
366 | break; | 366 | break; |
367 | case T_CLASS: | ||
368 | value = view_get_class(view); | ||
369 | break; | ||
370 | case T_INSTANCE: | ||
371 | value = view_get_instance(view); | ||
372 | break; | ||
373 | case T_SHELL: | 367 | case T_SHELL: |
374 | value = view_get_shell(view); | 368 | value = view_get_shell(view); |
375 | break; | 369 | break; |
376 | case T_TITLE: | 370 | case T_TITLE: |
377 | value = view_get_class(view); | 371 | value = view_get_class(view); |
378 | break; | 372 | break; |
379 | case T_WINDOW_ROLE: | ||
380 | value = view_get_class(view); | ||
381 | break; | ||
382 | case T_WORKSPACE: | 373 | case T_WORKSPACE: |
383 | { | 374 | { |
384 | struct sway_container *ws = container_parent(focus, C_WORKSPACE); | 375 | struct sway_container *ws = container_parent(focus, C_WORKSPACE); |
@@ -400,7 +391,16 @@ static char *get_focused_prop(enum criteria_token token) { | |||
400 | case T_CON_MARK: // These do not support __focused__ | 391 | case T_CON_MARK: // These do not support __focused__ |
401 | case T_FLOATING: | 392 | case T_FLOATING: |
402 | #ifdef HAVE_XWAYLAND | 393 | #ifdef HAVE_XWAYLAND |
394 | case T_CLASS: | ||
395 | value = view_get_class(view); | ||
396 | break; | ||
403 | case T_ID: | 397 | case T_ID: |
398 | case T_INSTANCE: | ||
399 | value = view_get_instance(view); | ||
400 | break; | ||
401 | case T_WINDOW_ROLE: | ||
402 | value = view_get_class(view); | ||
403 | break; | ||
404 | case T_WINDOW_TYPE: | 404 | case T_WINDOW_TYPE: |
405 | #endif | 405 | #endif |
406 | case T_TILING: | 406 | case T_TILING: |
@@ -451,12 +451,6 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) { | |||
451 | case T_APP_ID: | 451 | case T_APP_ID: |
452 | generate_regex(&criteria->app_id, effective_value); | 452 | generate_regex(&criteria->app_id, effective_value); |
453 | break; | 453 | break; |
454 | case T_CLASS: | ||
455 | generate_regex(&criteria->class, effective_value); | ||
456 | break; | ||
457 | case T_INSTANCE: | ||
458 | generate_regex(&criteria->instance, effective_value); | ||
459 | break; | ||
460 | case T_CON_ID: | 454 | case T_CON_ID: |
461 | criteria->con_id = strtoul(effective_value, &endptr, 10); | 455 | criteria->con_id = strtoul(effective_value, &endptr, 10); |
462 | if (*endptr != 0) { | 456 | if (*endptr != 0) { |
@@ -466,12 +460,9 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) { | |||
466 | case T_CON_MARK: | 460 | case T_CON_MARK: |
467 | generate_regex(&criteria->con_mark, effective_value); | 461 | generate_regex(&criteria->con_mark, effective_value); |
468 | break; | 462 | break; |
469 | case T_WINDOW_ROLE: | ||
470 | generate_regex(&criteria->window_role, effective_value); | ||
471 | break; | ||
472 | #ifdef HAVE_XWAYLAND | 463 | #ifdef HAVE_XWAYLAND |
473 | case T_WINDOW_TYPE: | 464 | case T_CLASS: |
474 | criteria->window_type = parse_window_type(effective_value); | 465 | generate_regex(&criteria->class, effective_value); |
475 | break; | 466 | break; |
476 | case T_ID: | 467 | case T_ID: |
477 | criteria->id = strtoul(effective_value, &endptr, 10); | 468 | criteria->id = strtoul(effective_value, &endptr, 10); |
@@ -479,6 +470,15 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) { | |||
479 | error = strdup("The value for 'id' should be numeric"); | 470 | error = strdup("The value for 'id' should be numeric"); |
480 | } | 471 | } |
481 | break; | 472 | break; |
473 | case T_INSTANCE: | ||
474 | generate_regex(&criteria->instance, effective_value); | ||
475 | break; | ||
476 | case T_WINDOW_ROLE: | ||
477 | generate_regex(&criteria->window_role, effective_value); | ||
478 | break; | ||
479 | case T_WINDOW_TYPE: | ||
480 | criteria->window_type = parse_window_type(effective_value); | ||
481 | break; | ||
482 | #endif | 482 | #endif |
483 | case T_FLOATING: | 483 | case T_FLOATING: |
484 | criteria->floating = true; | 484 | criteria->floating = true; |