obey urgency

This commit is contained in:
Sascha Kruse 2011-09-14 00:26:28 +02:00
parent 732b52480f
commit 0d84f1c720
2 changed files with 76 additions and 10 deletions

56
dunst.c
View File

@ -25,6 +25,7 @@ typedef struct _msg_queue_t {
struct _msg_queue_t *next; struct _msg_queue_t *next;
time_t start; time_t start;
int timeout; int timeout;
int urgency;
} msg_queue_t; } msg_queue_t;
typedef struct _dimension_t { typedef struct _dimension_t {
@ -44,7 +45,13 @@ typedef struct _screen_info {
static const char *font = NULL; static const char *font = NULL;
static const char *normbgcolor = "#cccccc"; static const char *normbgcolor = "#cccccc";
static const char *normfgcolor = "#000000"; 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 normcol[ColLast];
static unsigned long critcol[ColLast];
static unsigned long lowcol[ColLast];
static Atom utf8; static Atom utf8;
static DC *dc; static DC *dc;
static Window win; static Window win;
@ -60,7 +67,7 @@ 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, 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 *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);
@ -80,17 +87,18 @@ 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, 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 *new = malloc(sizeof(msg_queue_t));
msg_queue_t *last; msg_queue_t *last;
new->msg = xml_unescape(msg); new->msg = xml_unescape(msg);
new->urgency = urgency;
if(to == -1) { if(to == -1) {
new->timeout = global_timeout; new->timeout = global_timeout;
} else { } else {
new->timeout = to; new->timeout = to;
} }
new->start = 0; 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; new->next = NULL;
if(queue == NULL) { if(queue == NULL) {
return new; return new;
@ -267,7 +275,25 @@ drawmsg(void) {
if(cur_msg->start == 0) if(cur_msg->start == 0)
cur_msg->start = now; 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; dc->y += font_h;
cur_msg = cur_msg->next; cur_msg = cur_msg->next;
} }
@ -342,8 +368,12 @@ setup(void) {
} }
root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); root = RootWindow(dc->dpy, DefaultScreen(dc->dpy));
normcol[ColBG] = getcolor(dc, normbgcolor); normcol[ColBG] = getcolor(dc, normbgcolor);
normcol[ColFG] = getcolor(dc, normfgcolor); 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); utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
@ -483,14 +513,22 @@ main(int argc, char *argv[]) {
} }
else if(!strcmp(argv[i], "-fn")) else if(!strcmp(argv[i], "-fn"))
font = argv[++i]; font = argv[++i];
else if(!strcmp(argv[i], "-nb") || !strcmp(argv[i], "-bg")) else if(!strcmp(argv[i], "-nb"))
normbgcolor = argv[++i]; normbgcolor = argv[++i];
else if(!strcmp(argv[i], "-nf") || !strcmp(argv[i], "-fg")) else if(!strcmp(argv[i], "-nf"))
normfgcolor = argv[++i]; 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")) 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]), -1); msgqueue = append(msgqueue, strdup(argv[++i]), -1, 1);
listen_to_dbus = False; listen_to_dbus = False;
} }
else if(!strcmp(argv[i], "-mon")) { else if(!strcmp(argv[i], "-mon")) {

View File

@ -155,12 +155,17 @@ void
notify(DBusMessage *dmsg) { notify(DBusMessage *dmsg) {
DBusMessage *reply; DBusMessage *reply;
DBusMessageIter args; DBusMessageIter args;
DBusMessageIter hints;
DBusMessageIter hint;
DBusMessageIter hint_value;
char *hint_name;
int id = 23; int id = 23;
const char *appname; const char *appname;
const char *summary; const char *summary;
const char *body; const char *body;
const char *icon; const char *icon;
int urgency = 1;
char *msg; char *msg;
dbus_uint32_t nid=0; dbus_uint32_t nid=0;
dbus_int32_t expires=-1; dbus_int32_t expires=-1;
@ -178,9 +183,32 @@ notify(DBusMessage *dmsg) {
dbus_message_iter_get_basic(&args, &body); dbus_message_iter_get_basic(&args, &body);
dbus_message_iter_next( &args ); dbus_message_iter_next( &args );
dbus_message_iter_next( &args ); dbus_message_iter_next( &args );
dbus_message_iter_recurse(&args, &hints);
dbus_message_iter_next( &args ); dbus_message_iter_next( &args );
dbus_message_iter_get_basic(&args, &expires); 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) { if(strlen(body) > 0) {
msg = malloc( msg = malloc(
@ -202,7 +230,7 @@ notify(DBusMessage *dmsg) {
if(expires > 0) { if(expires > 0) {
expires = expires/1000; expires = expires/1000;
} }
msgqueue = append(msgqueue, msg, expires); msgqueue = append(msgqueue, msg, expires, urgency);
drawmsg(); drawmsg();
reply = dbus_message_new_method_return(dmsg); reply = dbus_message_new_method_return(dmsg);