From 0d84f1c720108c8ad2bb18ed5bb9ebca6b59fbcd Mon Sep 17 00:00:00 2001 From: Sascha Kruse Date: Wed, 14 Sep 2011 00:26:28 +0200 Subject: [PATCH] obey urgency --- dunst.c | 56 +++++++++++++++++++++++++++++++++++++++++++--------- dunst_dbus.c | 30 +++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/dunst.c b/dunst.c index 6595d39..29c1eef 100644 --- a/dunst.c +++ b/dunst.c @@ -25,6 +25,7 @@ typedef struct _msg_queue_t { struct _msg_queue_t *next; time_t start; int timeout; + int urgency; } msg_queue_t; typedef struct _dimension_t { @@ -44,7 +45,13 @@ typedef struct _screen_info { static const char *font = NULL; static const char *normbgcolor = "#cccccc"; static const char *normfgcolor = "#000000"; +static const char *critbgcolor = "#ffaaaa"; +static const char *critfgcolor = "#000000"; +static const char *lowbgcolor = "#aaaaff"; +static const char *lowfgcolor = "#000000"; static unsigned long normcol[ColLast]; +static unsigned long critcol[ColLast]; +static unsigned long lowcol[ColLast]; static Atom utf8; static DC *dc; static Window win; @@ -60,7 +67,7 @@ static dimension_t geometry; static int font_h; /* list functions */ -msg_queue_t *append(msg_queue_t *queue, char *msg, int to); +msg_queue_t *append(msg_queue_t *queue, char *msg, int to, int urgency); msg_queue_t *delete(msg_queue_t *elem); msg_queue_t *pop(msg_queue_t *queue); int list_len(msg_queue_t *list); @@ -80,17 +87,18 @@ char *xml_unescape(char *str); #include "dunst_dbus.h" msg_queue_t* -append(msg_queue_t *queue, char *msg, int to) { +append(msg_queue_t *queue, char *msg, int to, int urgency) { msg_queue_t *new = malloc(sizeof(msg_queue_t)); msg_queue_t *last; new->msg = xml_unescape(msg); + new->urgency = urgency; if(to == -1) { new->timeout = global_timeout; } else { new->timeout = to; } new->start = 0; - printf("%s (timeout: %d)\n", new->msg, new->timeout); + printf("%s (timeout: %d, urgency: %d)\n", new->msg, new->timeout, urgency); new->next = NULL; if(queue == NULL) { return new; @@ -267,7 +275,25 @@ drawmsg(void) { if(cur_msg->start == 0) cur_msg->start = now; - drawtext(dc, cur_msg->msg, normcol); + switch ( cur_msg->urgency ) { + case 0 : + drawrect(dc, 0 , dc->y, width, font_h, True, BG(dc, lowcol)); + drawtext(dc, cur_msg->msg, lowcol); + break; + case 1 : + drawrect(dc, 0, dc->y, width, font_h, True, BG(dc, normcol)); + drawtext(dc, cur_msg->msg, normcol); + break; + case 2 : + drawrect(dc, 0, dc->y, width, font_h, True, BG(dc, critcol)); + drawtext(dc, cur_msg->msg, critcol); + break; + default : + drawrect(dc, 0 ,dc->y, width, font_h, True, BG(dc, lowcol)); + drawtext(dc, cur_msg->msg, normcol); + break; + } + dc->y += font_h; cur_msg = cur_msg->next; } @@ -342,8 +368,12 @@ setup(void) { } root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); - normcol[ColBG] = getcolor(dc, normbgcolor); - normcol[ColFG] = getcolor(dc, normfgcolor); + normcol[ColBG] = getcolor(dc, normbgcolor); + normcol[ColFG] = getcolor(dc, normfgcolor); + critcol[ColBG] = getcolor(dc, critbgcolor); + critcol[ColFG] = getcolor(dc, critfgcolor); + lowcol[ColBG] = getcolor(dc, lowbgcolor); + lowcol[ColFG] = getcolor(dc, lowfgcolor); utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False); @@ -483,14 +513,22 @@ main(int argc, char *argv[]) { } else if(!strcmp(argv[i], "-fn")) font = argv[++i]; - else if(!strcmp(argv[i], "-nb") || !strcmp(argv[i], "-bg")) + else if(!strcmp(argv[i], "-nb")) normbgcolor = argv[++i]; - else if(!strcmp(argv[i], "-nf") || !strcmp(argv[i], "-fg")) + else if(!strcmp(argv[i], "-nf")) normfgcolor = argv[++i]; + else if(!strcmp(argv[i], "-lb")) + lowbgcolor = argv[++i]; + else if(!strcmp(argv[i], "-lf")) + lowfgcolor = argv[++i]; + else if(!strcmp(argv[i], "-cb")) + critbgcolor = argv[++i]; + else if(!strcmp(argv[i], "-cf")) + critfgcolor = argv[++i]; else if(!strcmp(argv[i], "-to")) global_timeout = atoi(argv[++i]); else if(!strcmp(argv[i], "-msg")) { - msgqueue = append(msgqueue, strdup(argv[++i]), -1); + msgqueue = append(msgqueue, strdup(argv[++i]), -1, 1); listen_to_dbus = False; } else if(!strcmp(argv[i], "-mon")) { diff --git a/dunst_dbus.c b/dunst_dbus.c index 9b0fc83..4dca948 100644 --- a/dunst_dbus.c +++ b/dunst_dbus.c @@ -155,12 +155,17 @@ void notify(DBusMessage *dmsg) { DBusMessage *reply; DBusMessageIter args; + DBusMessageIter hints; + DBusMessageIter hint; + DBusMessageIter hint_value; + char *hint_name; int id = 23; const char *appname; const char *summary; const char *body; const char *icon; + int urgency = 1; char *msg; dbus_uint32_t nid=0; dbus_int32_t expires=-1; @@ -178,9 +183,32 @@ notify(DBusMessage *dmsg) { dbus_message_iter_get_basic(&args, &body); dbus_message_iter_next( &args ); dbus_message_iter_next( &args ); + dbus_message_iter_recurse(&args, &hints); dbus_message_iter_next( &args ); dbus_message_iter_get_basic(&args, &expires); + do { + dbus_message_iter_recurse(&hints, &hint); + do { + /* 115 == dbus urgency type thingy... i hate this shit */ + if(dbus_message_iter_get_arg_type(&hint) != 115) { + continue; + } + dbus_message_iter_get_basic(&hint, &hint_name); + if(!strcmp(hint_name, "urgency")) { + dbus_message_iter_next(&hint); + dbus_message_iter_recurse(&hint, &hint_value); + do { + dbus_message_iter_get_basic(&hint_value, &urgency); + } while(dbus_message_iter_next(&hint)); + + } + } while(dbus_message_iter_next(&hint)); + } while(dbus_message_iter_next(&hints)); + + + + if(strlen(body) > 0) { msg = malloc( @@ -202,7 +230,7 @@ notify(DBusMessage *dmsg) { if(expires > 0) { expires = expires/1000; } - msgqueue = append(msgqueue, msg, expires); + msgqueue = append(msgqueue, msg, expires, urgency); drawmsg(); reply = dbus_message_new_method_return(dmsg);