comply to timeout component

This commit is contained in:
Sascha Kruse 2011-09-13 19:56:55 +02:00
parent aa6a4cd36c
commit 47c7a7fd92
2 changed files with 83 additions and 14 deletions

92
dunst.c
View File

@ -24,6 +24,7 @@ typedef struct _msg_queue_t {
char *msg; char *msg;
struct _msg_queue_t *next; struct _msg_queue_t *next;
time_t start; time_t start;
int timeout;
} msg_queue_t; } msg_queue_t;
typedef struct _dimension_t { typedef struct _dimension_t {
@ -59,13 +60,15 @@ static dimension_t geometry;
static int font_h; static int font_h;
/* list functions */ /* list functions */
msg_queue_t *append(msg_queue_t *queue, char *msg); msg_queue_t *append(msg_queue_t *queue, char *msg, int to);
msg_queue_t *delete(msg_queue_t *elem);
msg_queue_t *pop(msg_queue_t *queue); msg_queue_t *pop(msg_queue_t *queue);
int list_len(msg_queue_t *list); int list_len(msg_queue_t *list);
/* misc funtions */ /* misc funtions */
void delete_msg(void); void check_timeouts(void);
void delete_msg(msg_queue_t *elem);
void drawmsg(void); void drawmsg(void);
void handleXEvents(void); void handleXEvents(void);
void run(void); void run(void);
@ -77,12 +80,17 @@ char *xml_unescape(char *str);
#include "dunst_dbus.h" #include "dunst_dbus.h"
msg_queue_t* msg_queue_t*
append(msg_queue_t *queue, char *msg) { append(msg_queue_t *queue, char *msg, int to) {
msg_queue_t *new = malloc(sizeof(msg_queue_t)); msg_queue_t *new = malloc(sizeof(msg_queue_t));
msg_queue_t *last; msg_queue_t *last;
new->msg = xml_unescape(msg); new->msg = xml_unescape(msg);
if(to == -1) {
new->timeout = global_timeout;
} else {
new->timeout = to;
}
new->start = 0; new->start = 0;
printf("%s\n", new->msg); printf("%s (timeout: %d)\n", new->msg, new->timeout);
new->next = NULL; new->next = NULL;
if(queue == NULL) { if(queue == NULL) {
return new; return new;
@ -92,6 +100,41 @@ append(msg_queue_t *queue, char *msg) {
return queue; return queue;
} }
msg_queue_t*
delete(msg_queue_t *elem) {
msg_queue_t *prev;
msg_queue_t *next;
if(msgqueue == NULL) {
return NULL;
}
if(elem == NULL) {
return msgqueue;
}
if(elem == msgqueue) {
next = elem->next;
free(elem->msg);
free(elem);
return next;
}
next = elem->next;
for(prev = msgqueue; prev != NULL; prev = prev->next) {
if(prev->next == elem) {
break;
}
}
if(prev == NULL) {
/* the element wasn't in the list */
return msgqueue;
}
prev->next = next;
free(elem->msg);
free(elem);
return msgqueue;
}
msg_queue_t* msg_queue_t*
pop(msg_queue_t *queue) { pop(msg_queue_t *queue) {
msg_queue_t *new_head; msg_queue_t *new_head;
@ -121,12 +164,37 @@ int list_len(msg_queue_t *list) {
} }
void void
delete_msg(void) { check_timeouts(void) {
msg_queue_t *cur;
for(cur = msgqueue; cur != NULL; cur = cur->next) {
if(cur->start == 0 || cur->timeout == 0) {
continue;
}
if(difftime(now, cur->start) > cur->timeout) {
delete_msg(cur);
}
}
}
void
delete_msg(msg_queue_t *elem) {
msg_queue_t *cur;
int visible_count = 0;
if(msgqueue == NULL) { if(msgqueue == NULL) {
return; return;
} }
msgqueue = pop(msgqueue); if(elem == NULL) {
if(msgqueue == NULL) { /* delete the last element */
for(elem = msgqueue; elem->next != NULL; elem = elem->next);
}
msgqueue = delete(elem);
for(cur = msgqueue; cur != NULL; cur = cur->next) {
if(cur->start != 0) {
visible_count++;
}
}
if(visible_count == 0) {
/* hide window */ /* hide window */
if(!visible) { if(!visible) {
/* window is already hidden */ /* window is already hidden */
@ -221,12 +289,12 @@ handleXEvents(void) {
break; break;
case ButtonPress: case ButtonPress:
if(ev.xbutton.window == win) { if(ev.xbutton.window == win) {
delete_msg(); delete_msg(NULL);
} }
break; break;
case KeyPress: case KeyPress:
if(XLookupKeysym(&ev.xkey, 0) == key) { if(XLookupKeysym(&ev.xkey, 0) == key) {
delete_msg(); delete_msg(NULL);
} }
} }
} }
@ -245,9 +313,7 @@ run(void) {
now = time(&now); now = time(&now);
if(msgqueue != NULL) { if(msgqueue != NULL) {
show_win(); show_win();
if(difftime(now, msgqueue->start) > global_timeout) { check_timeouts();
delete_msg();
}
handleXEvents(); handleXEvents();
} else if (!listen_to_dbus) { } else if (!listen_to_dbus) {
break; break;
@ -417,7 +483,7 @@ main(int argc, char *argv[]) {
else if(!strcmp(argv[i], "-to")) else if(!strcmp(argv[i], "-to"))
global_timeout = atoi(argv[++i]); global_timeout = atoi(argv[++i]);
else if(!strcmp(argv[i], "-msg")) { else if(!strcmp(argv[i], "-msg")) {
msgqueue = append(msgqueue, strdup(argv[++i])); msgqueue = append(msgqueue, strdup(argv[++i]), -1);
listen_to_dbus = False; listen_to_dbus = False;
} }
else if(!strcmp(argv[i], "-mon")) { else if(!strcmp(argv[i], "-mon")) {

View File

@ -199,7 +199,10 @@ notify(DBusMessage *dmsg) {
sprintf(msg, "%s: %s", appname, summary); sprintf(msg, "%s: %s", appname, summary);
} }
msgqueue = append(msgqueue, msg); if(expires > 0) {
expires = expires/1000;
}
msgqueue = append(msgqueue, msg, expires);
drawmsg(); drawmsg();
reply = dbus_message_new_method_return(dmsg); reply = dbus_message_new_method_return(dmsg);