use n_stack for history

This commit is contained in:
Sascha Kruse 2012-12-12 09:58:52 +01:00
parent b2a20c0524
commit b641a9c881
3 changed files with 62 additions and 19 deletions

View File

@ -263,4 +263,29 @@ void l_sort(list * l, int (*f) (void *, void *))
free(old_list); free(old_list);
} }
void n_stack_push(n_stack **s, notification *n)
{
if (!n)
return;
n_stack *new = malloc(sizeof(n_stack));
new->n = n;
new->next = *s;
*s = new;
}
notification *n_stack_pop(n_stack **s)
{
if (!s || !*s)
return NULL;
n_stack *head = *s;
*s = (*s)->next;
notification *n = head->n;
free(head);
return n;
}
/* vim: set ts=8 sw=8 tw=0: */ /* vim: set ts=8 sw=8 tw=0: */

View File

@ -1,6 +1,8 @@
#ifndef _LIST_H #ifndef _LIST_H
#define _LIST_H #define _LIST_H
#include "dunst.h"
typedef struct _l_node { typedef struct _l_node {
struct _l_node *next; struct _l_node *next;
void *data; void *data;
@ -10,6 +12,11 @@ typedef struct _list {
l_node *head; l_node *head;
} list; } list;
typedef struct _n_stack {
notification *n;
struct _n_stack *next;
} n_stack;
/* append to end of list */ /* append to end of list */
int l_push(list * l, void *data); int l_push(list * l, void *data);
@ -54,6 +61,24 @@ int l_move(list * from, list * to, l_node * node);
void l_sort(list * l, int (*f) (void *, void *)); void l_sort(list * l, int (*f) (void *, void *));
list *l_init(void); list *l_init(void);
#endif
/************
* stack
*/
/**
* push notification onto stack
* creates a new stack if *s == NULL
*/
void n_stack_push(n_stack **s, notification *n);
/**
* remove and return notification from stack
* sets *s to NULL if stack is empty
*/
notification *n_stack_pop(n_stack **s);
#endif
/* vim: set ts=8 sw=8 tw=0: */ /* vim: set ts=8 sw=8 tw=0: */

29
dunst.c
View File

@ -84,7 +84,7 @@ bool deprecated_dunstrc_shortcuts = false;
/* notification lists */ /* notification lists */
list *notification_queue = NULL; /* all new notifications get into here */ list *notification_queue = NULL; /* all new notifications get into here */
list *displayed_notifications = NULL; /* currently displayed notifications */ list *displayed_notifications = NULL; /* currently displayed notifications */
list *notification_history = NULL; /* history of displayed notifications */ n_stack *n_history = NULL; /* history of displayed notifications */
/* misc funtions */ /* misc funtions */
void apply_rules(notification * n); void apply_rules(notification * n);
@ -884,22 +884,15 @@ void move_all_to_history()
void history_pop(void) void history_pop(void)
{ {
l_node *iter;
notification *data;
/* nothing to do */ if (!n_history)
if (l_is_empty(notification_history)) {
return; return;
}
for (iter = notification_history->head; iter->next; iter = iter->next) ; notification *n = n_stack_pop(&n_history);
data = (notification *) iter->data; n->redisplayed = true;
data->redisplayed = true; n->start = 0;
data->start = 0; n->timeout = sticky_history ? 0 : n->timeout;
if (sticky_history) { l_push(notification_queue, n);
data->timeout = 0;
}
l_move(notification_history, notification_queue, iter);
if (!visible) { if (!visible) {
map_win(); map_win();
@ -1040,8 +1033,8 @@ int close_notification_by_id(int id, int reason)
for (iter = displayed_notifications->head; iter; iter = iter->next) { for (iter = displayed_notifications->head; iter; iter = iter->next) {
notification *n = (notification *) iter->data; notification *n = (notification *) iter->data;
if (n->id == id) { if (n->id == id) {
l_move(displayed_notifications, notification_history, l_remove(displayed_notifications, iter);
iter); n_stack_push(&n_history, n);
target = n; target = n;
break; break;
} }
@ -1050,7 +1043,8 @@ int close_notification_by_id(int id, int reason)
for (iter = notification_queue->head; iter; iter = iter->next) { for (iter = notification_queue->head; iter; iter = iter->next) {
notification *n = (notification *) iter->data; notification *n = (notification *) iter->data;
if (n->id == id) { if (n->id == id) {
l_move(notification_queue, notification_history, iter); l_remove(notification_queue, iter);
n_stack_push(&n_history, n);
target = n; target = n;
break; break;
} }
@ -1677,7 +1671,6 @@ int main(int argc, char *argv[])
now = time(&now); now = time(&now);
notification_queue = l_init(); notification_queue = l_init();
notification_history = l_init();
displayed_notifications = l_init(); displayed_notifications = l_init();
r_line_cache_init(&line_cache); r_line_cache_init(&line_cache);