mirror of
https://github.com/swaywm/sway.git
synced 2025-11-18 06:59:48 -05:00
Implement urgency base functionality
Introduces a command to manually set urgency, as well as rendering of urgent views, sending the IPC event, removing urgency after focused for one second, and matching urgent views via criteria.
This commit is contained in:
parent
b314a8f2cc
commit
315d5311b2
12 changed files with 170 additions and 7 deletions
|
|
@ -46,6 +46,31 @@ static int regex_cmp(const char *item, const pcre *regex) {
|
|||
return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0);
|
||||
}
|
||||
|
||||
static int cmp_urgent(const void *_a, const void *_b) {
|
||||
struct sway_view *a = *(void **)_a;
|
||||
struct sway_view *b = *(void **)_b;
|
||||
|
||||
if (a->urgent.tv_sec < b->urgent.tv_sec) {
|
||||
return -1;
|
||||
} else if (a->urgent.tv_sec > b->urgent.tv_sec) {
|
||||
return 1;
|
||||
}
|
||||
if (a->urgent.tv_nsec < b->urgent.tv_nsec) {
|
||||
return -1;
|
||||
} else if (a->urgent.tv_nsec > b->urgent.tv_nsec) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void find_urgent_iterator(struct sway_container *swayc, void *data) {
|
||||
if (swayc->type != C_VIEW || !view_is_urgent(swayc->sway_view)) {
|
||||
return;
|
||||
}
|
||||
list_t *urgent_views = data;
|
||||
list_add(urgent_views, swayc->sway_view);
|
||||
}
|
||||
|
||||
static bool criteria_matches_view(struct criteria *criteria,
|
||||
struct sway_view *view) {
|
||||
if (criteria->title) {
|
||||
|
|
@ -133,8 +158,23 @@ static bool criteria_matches_view(struct criteria *criteria,
|
|||
}
|
||||
|
||||
if (criteria->urgent) {
|
||||
// TODO
|
||||
return false;
|
||||
if (!view_is_urgent(view)) {
|
||||
return false;
|
||||
}
|
||||
list_t *urgent_views = create_list();
|
||||
container_for_each_descendant_dfs(&root_container,
|
||||
find_urgent_iterator, urgent_views);
|
||||
list_stable_sort(urgent_views, cmp_urgent);
|
||||
struct sway_view *target;
|
||||
if (criteria->urgent == 'o') { // oldest
|
||||
target = urgent_views->items[0];
|
||||
} else { // latest
|
||||
target = urgent_views->items[urgent_views->length - 1];
|
||||
}
|
||||
list_free(urgent_views);
|
||||
if (view != target) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (criteria->workspace) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue