diff options
Diffstat (limited to 'sway/criteria.c')
-rw-r--r-- | sway/criteria.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/sway/criteria.c b/sway/criteria.c index d9f09ecc..c2e9c07e 100644 --- a/sway/criteria.c +++ b/sway/criteria.c | |||
@@ -37,7 +37,7 @@ void criteria_destroy(struct criteria *criteria) { | |||
37 | pcre_free(criteria->con_mark); | 37 | pcre_free(criteria->con_mark); |
38 | pcre_free(criteria->window_role); | 38 | pcre_free(criteria->window_role); |
39 | free(criteria->workspace); | 39 | free(criteria->workspace); |
40 | 40 | free(criteria->cmdlist); | |
41 | free(criteria->raw); | 41 | free(criteria->raw); |
42 | free(criteria); | 42 | free(criteria); |
43 | } | 43 | } |
@@ -46,6 +46,31 @@ static int regex_cmp(const char *item, const pcre *regex) { | |||
46 | return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); | 46 | return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); |
47 | } | 47 | } |
48 | 48 | ||
49 | static int cmp_urgent(const void *_a, const void *_b) { | ||
50 | struct sway_view *a = *(void **)_a; | ||
51 | struct sway_view *b = *(void **)_b; | ||
52 | |||
53 | if (a->urgent.tv_sec < b->urgent.tv_sec) { | ||
54 | return -1; | ||
55 | } else if (a->urgent.tv_sec > b->urgent.tv_sec) { | ||
56 | return 1; | ||
57 | } | ||
58 | if (a->urgent.tv_nsec < b->urgent.tv_nsec) { | ||
59 | return -1; | ||
60 | } else if (a->urgent.tv_nsec > b->urgent.tv_nsec) { | ||
61 | return 1; | ||
62 | } | ||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static void find_urgent_iterator(struct sway_container *swayc, void *data) { | ||
67 | if (swayc->type != C_VIEW || !view_is_urgent(swayc->sway_view)) { | ||
68 | return; | ||
69 | } | ||
70 | list_t *urgent_views = data; | ||
71 | list_add(urgent_views, swayc->sway_view); | ||
72 | } | ||
73 | |||
49 | static bool criteria_matches_view(struct criteria *criteria, | 74 | static bool criteria_matches_view(struct criteria *criteria, |
50 | struct sway_view *view) { | 75 | struct sway_view *view) { |
51 | if (criteria->title) { | 76 | if (criteria->title) { |
@@ -133,8 +158,23 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
133 | } | 158 | } |
134 | 159 | ||
135 | if (criteria->urgent) { | 160 | if (criteria->urgent) { |
136 | // TODO | 161 | if (!view_is_urgent(view)) { |
137 | return false; | 162 | return false; |
163 | } | ||
164 | list_t *urgent_views = create_list(); | ||
165 | container_for_each_descendant_dfs(&root_container, | ||
166 | find_urgent_iterator, urgent_views); | ||
167 | list_stable_sort(urgent_views, cmp_urgent); | ||
168 | struct sway_view *target; | ||
169 | if (criteria->urgent == 'o') { // oldest | ||
170 | target = urgent_views->items[0]; | ||
171 | } else { // latest | ||
172 | target = urgent_views->items[urgent_views->length - 1]; | ||
173 | } | ||
174 | list_free(urgent_views); | ||
175 | if (view != target) { | ||
176 | return false; | ||
177 | } | ||
138 | } | 178 | } |
139 | 179 | ||
140 | if (criteria->workspace) { | 180 | if (criteria->workspace) { |
@@ -185,6 +225,15 @@ list_t *criteria_get_views(struct criteria *criteria) { | |||
185 | }; | 225 | }; |
186 | container_for_each_descendant_dfs(&root_container, | 226 | container_for_each_descendant_dfs(&root_container, |
187 | criteria_get_views_iterator, &data); | 227 | criteria_get_views_iterator, &data); |
228 | |||
229 | // Scratchpad items which are hidden are not in the tree. | ||
230 | for (int i = 0; i < root_container.sway_root->scratchpad->length; ++i) { | ||
231 | struct sway_container *con = | ||
232 | root_container.sway_root->scratchpad->items[i]; | ||
233 | if (!con->parent) { | ||
234 | criteria_get_views_iterator(con, &data); | ||
235 | } | ||
236 | } | ||
188 | return matches; | 237 | return matches; |
189 | } | 238 | } |
190 | 239 | ||
@@ -507,7 +556,7 @@ struct criteria *criteria_parse(char *raw, char **error_arg) { | |||
507 | } | 556 | } |
508 | unescape(value); | 557 | unescape(value); |
509 | } | 558 | } |
510 | wlr_log(L_DEBUG, "Found pair: %s=%s", name, value); | 559 | wlr_log(WLR_DEBUG, "Found pair: %s=%s", name, value); |
511 | if (!parse_token(criteria, name, value)) { | 560 | if (!parse_token(criteria, name, value)) { |
512 | *error_arg = error; | 561 | *error_arg = error; |
513 | goto cleanup; | 562 | goto cleanup; |