comply to timeout component
This commit is contained in:
parent
aa6a4cd36c
commit
47c7a7fd92
92
dunst.c
92
dunst.c
@ -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")) {
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user