aboutsummaryrefslogtreecommitdiffstats
path: root/sway/criteria.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/criteria.c')
-rw-r--r--sway/criteria.c57
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
49static 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
66static 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
49static bool criteria_matches_view(struct criteria *criteria, 74static 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;