use queue for notification queue
This commit is contained in:
parent
557a8e29fa
commit
1dd6e2587e
84
container.c
84
container.c
@ -265,7 +265,7 @@ void l_sort(list * l, int (*f) (void *, void *))
|
||||
|
||||
void n_stack_push(n_stack **s, notification *n)
|
||||
{
|
||||
if (!n)
|
||||
if (!n || !s)
|
||||
return;
|
||||
|
||||
n_stack *new = malloc(sizeof(n_stack));
|
||||
@ -288,4 +288,86 @@ notification *n_stack_pop(n_stack **s)
|
||||
return n;
|
||||
}
|
||||
|
||||
int n_stack_len(n_stack **s)
|
||||
{
|
||||
if (!s || !*s)
|
||||
return 0;
|
||||
|
||||
n_stack *cur = *s;
|
||||
int count = 0;
|
||||
|
||||
while (cur) {
|
||||
cur = cur->next;
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int cmp_notification(notification *a, notification *b)
|
||||
{
|
||||
if (a == NULL && b == NULL)
|
||||
return 0;
|
||||
else if (a == NULL)
|
||||
return -1;
|
||||
else if (b == NULL)
|
||||
return 1;
|
||||
|
||||
if (a->urgency != b->urgency) {
|
||||
return a->urgency - b->urgency;
|
||||
} else {
|
||||
return b->timestamp - a->timestamp;
|
||||
}
|
||||
}
|
||||
|
||||
void n_queue_enqueue(n_queue **q, notification *n)
|
||||
{
|
||||
if (!n || !q)
|
||||
return;
|
||||
|
||||
|
||||
n_queue *new = malloc(sizeof(n_queue));
|
||||
new->n = n;
|
||||
new->next = NULL;
|
||||
|
||||
if (!(*q)) {
|
||||
/* queue was empty */
|
||||
*q = new;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* new head */
|
||||
if (cmp_notification(new->n, (*q)->n) > 0) {
|
||||
new->next = *q;
|
||||
*q = new;
|
||||
return;
|
||||
}
|
||||
|
||||
/* in between */
|
||||
n_queue *cur = *q;
|
||||
while (cur->next) {
|
||||
if (cmp_notification(new->n, cur->next->n) > 0) {
|
||||
new->next = cur->next;
|
||||
cur->next = new;
|
||||
return;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* last */
|
||||
cur->next = new;
|
||||
}
|
||||
|
||||
notification *n_queue_dequeue(n_queue **q)
|
||||
{
|
||||
return n_stack_pop(q);
|
||||
}
|
||||
|
||||
int n_queue_len(n_queue **q)
|
||||
{
|
||||
return n_stack_len(q);
|
||||
}
|
||||
|
||||
/* vim: set ts=8 sw=8 tw=0: */
|
||||
|
33
container.h
33
container.h
@ -17,6 +17,10 @@ typedef struct _n_stack {
|
||||
struct _n_stack *next;
|
||||
} n_stack;
|
||||
|
||||
typedef n_stack n_queue;
|
||||
|
||||
int cmp_notification(notification *a, notification *b);
|
||||
|
||||
/* append to end of list */
|
||||
int l_push(list * l, void *data);
|
||||
|
||||
@ -79,6 +83,35 @@ void n_stack_push(n_stack **s, notification *n);
|
||||
*/
|
||||
notification *n_stack_pop(n_stack **s);
|
||||
|
||||
/**
|
||||
* return length of stack
|
||||
*/
|
||||
|
||||
int n_stack_len(n_stack **s);
|
||||
|
||||
/***************
|
||||
* queue
|
||||
*/
|
||||
|
||||
/**
|
||||
* enqueue notification into queue
|
||||
* creates a new queue if *q == NULL
|
||||
*/
|
||||
|
||||
void n_queue_enqueue(n_queue **q, notification *n);
|
||||
|
||||
/**
|
||||
* dequeues the next element from the queue.
|
||||
* returns NULL if queue is empty
|
||||
*/
|
||||
|
||||
notification *n_queue_dequeue(n_queue **q);
|
||||
|
||||
/**
|
||||
* return length of queue
|
||||
*/
|
||||
|
||||
int n_queue_len(n_queue **q);
|
||||
|
||||
#endif
|
||||
/* vim: set ts=8 sw=8 tw=0: */
|
||||
|
94
dunst.c
94
dunst.c
@ -79,7 +79,7 @@ bool dunst_grab_errored = false;
|
||||
int next_notification_id = 1;
|
||||
|
||||
/* notification lists */
|
||||
list *notification_queue = NULL; /* all new notifications get into here */
|
||||
n_queue *queue = NULL; /* all new notifications get into here */
|
||||
list *displayed_notifications = NULL; /* currently displayed notifications */
|
||||
n_stack *n_history = NULL; /* history of displayed notifications */
|
||||
|
||||
@ -194,51 +194,6 @@ void ungrab_key(keyboard_shortcut * ks)
|
||||
XUngrabKey(dc->dpy, ks->code, ks->mask, root);
|
||||
}
|
||||
|
||||
int cmp_notification(void *a, void *b)
|
||||
{
|
||||
if (a == NULL && b == NULL)
|
||||
return 0;
|
||||
else if (a == NULL)
|
||||
return -1;
|
||||
else if (b == NULL)
|
||||
return 1;
|
||||
|
||||
notification *na = (notification *) a;
|
||||
notification *nb = (notification *) b;
|
||||
if (na->urgency != nb->urgency) {
|
||||
return na->urgency - nb->urgency;
|
||||
} else {
|
||||
return nb->timestamp - na->timestamp;
|
||||
}
|
||||
}
|
||||
|
||||
l_node *most_important(list * l)
|
||||
{
|
||||
|
||||
if (l == NULL || l_is_empty(l)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (sort) {
|
||||
notification *max;
|
||||
l_node *node_max;
|
||||
notification *data;
|
||||
|
||||
max = l->head->data;
|
||||
node_max = l->head;
|
||||
for (l_node * iter = l->head; iter; iter = iter->next) {
|
||||
data = (notification *) iter->data;
|
||||
if (cmp_notification(max, data) < 0) {
|
||||
max = data;
|
||||
node_max = iter;
|
||||
}
|
||||
}
|
||||
return node_max;
|
||||
} else {
|
||||
return l->head;
|
||||
}
|
||||
}
|
||||
|
||||
void apply_rules(notification * n)
|
||||
{
|
||||
|
||||
@ -303,15 +258,14 @@ void check_timeouts(void)
|
||||
|
||||
void update_lists()
|
||||
{
|
||||
l_node *to_move;
|
||||
notification *n;
|
||||
int limit;
|
||||
|
||||
check_timeouts();
|
||||
|
||||
if (pause_display) {
|
||||
while (!l_is_empty(displayed_notifications)) {
|
||||
l_move(displayed_notifications, notification_queue, displayed_notifications->head);
|
||||
notification *n = (notification *) l_remove(displayed_notifications, displayed_notifications->head);
|
||||
n_queue_enqueue(&queue, n);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -328,23 +282,20 @@ void update_lists()
|
||||
|
||||
|
||||
/* move notifications from queue to displayed */
|
||||
while (!l_is_empty(notification_queue)) {
|
||||
while (queue) {
|
||||
|
||||
if (limit > 0 && l_length(displayed_notifications) >= limit) {
|
||||
/* the list is full */
|
||||
break;
|
||||
}
|
||||
|
||||
to_move = most_important(notification_queue);
|
||||
if (!to_move) {
|
||||
return;
|
||||
}
|
||||
n = (notification *) to_move->data;
|
||||
notification *n = n_queue_dequeue(&queue);
|
||||
|
||||
if (!n)
|
||||
return;
|
||||
n->start = now;
|
||||
|
||||
l_move(notification_queue, displayed_notifications, to_move);
|
||||
l_push(displayed_notifications, n);
|
||||
|
||||
l_sort(displayed_notifications, cmp_notification);
|
||||
|
||||
@ -629,7 +580,7 @@ void fill_line_cache(int width)
|
||||
assert(line_cache.count > 0);
|
||||
|
||||
/* add (x more) */
|
||||
int queue_cnt = l_length(notification_queue);
|
||||
int queue_cnt = n_queue_len(&queue);
|
||||
if (indicate_hidden && queue_cnt > 0) {
|
||||
if (geometry.h != 1) {
|
||||
char *tmp;
|
||||
@ -846,10 +797,11 @@ void move_all_to_history()
|
||||
n = (notification *) node->data;
|
||||
close_notification(n, 2);
|
||||
}
|
||||
while (!l_is_empty(notification_queue)) {
|
||||
node = notification_queue->head;
|
||||
n = (notification *) node->data;
|
||||
close_notification(n, 2);
|
||||
|
||||
n = n_queue_dequeue(&queue);
|
||||
while (n) {
|
||||
n_stack_push(&n_history, n);
|
||||
n = n_queue_dequeue(&queue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -863,7 +815,7 @@ void history_pop(void)
|
||||
n->redisplayed = true;
|
||||
n->start = 0;
|
||||
n->timeout = sticky_history ? 0 : n->timeout;
|
||||
l_push(notification_queue, n);
|
||||
n_queue_enqueue(&queue, n);
|
||||
|
||||
if (!visible) {
|
||||
map_win();
|
||||
@ -923,8 +875,8 @@ int init_notification(notification * n, int id)
|
||||
n->dup_count = 0;
|
||||
|
||||
/* check if n is a duplicate */
|
||||
for (l_node * iter = notification_queue->head; iter; iter = iter->next) {
|
||||
notification *orig = (notification *) iter->data;
|
||||
for (n_queue *iter = queue; iter; iter = iter->next) {
|
||||
notification *orig = iter->n;
|
||||
if (strcmp(orig->appname, n->appname) == 0
|
||||
&& strcmp(orig->msg, n->msg) == 0) {
|
||||
orig->dup_count++;
|
||||
@ -980,7 +932,7 @@ int init_notification(notification * n, int id)
|
||||
close_notification(n, 2);
|
||||
printf("skipping notification: %s %s\n", n->body, n->summary);
|
||||
} else {
|
||||
l_push(notification_queue, n);
|
||||
n_queue_enqueue(&queue, n);
|
||||
}
|
||||
|
||||
if (print_notifications)
|
||||
@ -998,10 +950,9 @@ int init_notification(notification * n, int id)
|
||||
*/
|
||||
int close_notification_by_id(int id, int reason)
|
||||
{
|
||||
l_node *iter;
|
||||
notification *target = NULL;
|
||||
|
||||
for (iter = displayed_notifications->head; iter; iter = iter->next) {
|
||||
for (l_node *iter = displayed_notifications->head; iter; iter = iter->next) {
|
||||
notification *n = (notification *) iter->data;
|
||||
if (n->id == id) {
|
||||
l_remove(displayed_notifications, iter);
|
||||
@ -1011,10 +962,12 @@ int close_notification_by_id(int id, int reason)
|
||||
}
|
||||
}
|
||||
|
||||
for (iter = notification_queue->head; iter; iter = iter->next) {
|
||||
notification *n = (notification *) iter->data;
|
||||
for (n_queue *iter = queue; iter && iter->next; iter = iter->next) {
|
||||
notification *n = iter->next->n;
|
||||
if (n->id == id) {
|
||||
l_remove(notification_queue, iter);
|
||||
n_queue *tmp = iter->next;
|
||||
iter->next = iter->next->next;
|
||||
free(tmp);
|
||||
n_stack_push(&n_history, n);
|
||||
target = n;
|
||||
break;
|
||||
@ -1623,7 +1576,6 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
now = time(&now);
|
||||
|
||||
notification_queue = l_init();
|
||||
displayed_notifications = l_init();
|
||||
r_line_cache_init(&line_cache);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user