From 70cdb3535cd8fbc90c10e74d08734f23d5667129 Mon Sep 17 00:00:00 2001 From: Sascha Kruse Date: Fri, 22 Jun 2012 18:53:58 +0200 Subject: [PATCH] support proper closing and replacing requests --- dunst.c | 33 ++++++++++++++++++++++++-- dunst.h | 3 ++- dunst_dbus.c | 67 ++++++++++++++++++++++++++++++---------------------- 3 files changed, 72 insertions(+), 31 deletions(-) diff --git a/dunst.c b/dunst.c index 3ac44d5..b70a4f1 100644 --- a/dunst.c +++ b/dunst.c @@ -536,7 +536,7 @@ void history_pop(void) } } -int init_notification(notification * n) +int init_notification(notification * n, int id) { const char *fg = NULL; const char *bg = NULL; @@ -575,7 +575,6 @@ int init_notification(notification * n) n->redisplayed = False; - n->id = ++next_notification_id; dunst_printf(MSG, "%s\n", n->msg); dunst_printf(INFO, @@ -583,11 +582,41 @@ int init_notification(notification * n) n->appname, n->summary, n->body, n->icon, n->urgency, n->timeout); + if (id == 0) { + n->id = ++next_notification_id; + } else { + close_notification(id); + } + l_push(notification_queue, n); return n->id; } + + +int close_notification(int id) { + l_node *iter; + + for(iter = displayed_notifications->head; iter; iter = iter->next) { + notification *n = (notification *) iter->data; + if (n->id == id) { + l_move(displayed_notifications, notification_history, iter); + return True; + } + } + + for(iter = notification_queue->head; iter; iter = iter->next) { + notification *n = (notification *) iter->data; + if (n->id == id) { + l_move(displayed_notifications, notification_history, iter); + return True; + } + } + + return False; +} + rule_t *initrule(void) { rule_t *r = malloc(sizeof(rule_t)); diff --git a/dunst.h b/dunst.h index 6203731..607eb4c 100644 --- a/dunst.h +++ b/dunst.h @@ -58,5 +58,6 @@ typedef struct _dimension_t { /* vim: set ts=8 sw=8 tw=0: */ /* return id of notification */ -int init_notification(notification * n); +int init_notification(notification * n, int id); +int close_notification(int id); void map_win(void); diff --git a/dunst_dbus.c b/dunst_dbus.c index 6170a4f..06b1a01 100644 --- a/dunst_dbus.c +++ b/dunst_dbus.c @@ -11,6 +11,31 @@ DBusError dbus_err; DBusConnection *dbus_conn; dbus_uint32_t dbus_serial = 0; +static void _extract_basic(int type, DBusMessageIter * iter, void *target) +{ + int iter_type = dbus_message_iter_get_arg_type(iter); + if (iter_type == type) { + dbus_message_iter_get_basic(iter, target); + } +} + +static void +_extract_hint(const char *name, const char *hint_name, + DBusMessageIter * hint, void *target) +{ + + DBusMessageIter hint_value; + + if (!strcmp(hint_name, name)) { + dbus_message_iter_next(hint); + dbus_message_iter_recurse(hint, &hint_value); + do { + dbus_message_iter_get_basic(&hint_value, target); + } while (dbus_message_iter_next(hint)); + } +} + + static const char *introspect = "" "" " " @@ -64,7 +89,6 @@ void dbus_introspect(DBusMessage * dmsg) dbus_connection_send(dbus_conn, reply, &dbus_serial); dbus_message_unref(reply); - } void initdbus(void) @@ -173,10 +197,21 @@ void getCapabilities(DBusMessage * dmsg) void closeNotification(DBusMessage * dmsg) { DBusMessage *reply; + DBusMessageIter args; + int id; + reply = dbus_message_new_method_return(dmsg); if (!reply) { return; } + dbus_message_iter_init(dmsg, &args); + + _extract_basic(DBUS_TYPE_UINT32, &args, &id); + + close_notification(id); + + /* TODO org.freedesktop.Notifications.NotificationClosed */ + dbus_connection_send(dbus_conn, reply, &dbus_serial); dbus_connection_flush(dbus_conn); } @@ -218,30 +253,6 @@ void getServerInformation(DBusMessage * dmsg) dbus_message_unref(reply); } -static void _extract_basic(int type, DBusMessageIter * iter, void *target) -{ - int iter_type = dbus_message_iter_get_arg_type(iter); - if (iter_type == type) { - dbus_message_iter_get_basic(iter, target); - } -} - -static void -_extract_hint(const char *name, const char *hint_name, - DBusMessageIter * hint, void *target) -{ - - DBusMessageIter hint_value; - - if (!strcmp(hint_name, name)) { - dbus_message_iter_next(hint); - dbus_message_iter_recurse(hint, &hint_value); - do { - dbus_message_iter_get_basic(&hint_value, target); - } while (dbus_message_iter_next(hint)); - } -} - void notify(DBusMessage * dmsg) { DBusMessage *reply; @@ -260,7 +271,7 @@ void notify(DBusMessage * dmsg) const char *bgcolor = NULL; int urgency = 1; notification *n = malloc(sizeof(notification)); - dbus_uint32_t nid = 0; + dbus_uint32_t replaces_id = 0; dbus_int32_t expires = -1; dbus_serial++; @@ -269,7 +280,7 @@ void notify(DBusMessage * dmsg) _extract_basic(DBUS_TYPE_STRING, &args, &appname); dbus_message_iter_next(&args); - _extract_basic(DBUS_TYPE_UINT32, &args, &nid); + _extract_basic(DBUS_TYPE_UINT32, &args, &replaces_id); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_STRING, &args, &icon); @@ -324,7 +335,7 @@ void notify(DBusMessage * dmsg) } n->color_strings[ColFG] = fgcolor == NULL ? NULL : strdup(fgcolor); n->color_strings[ColBG] = bgcolor == NULL ? NULL : strdup(bgcolor); - id = init_notification(n); + id = init_notification(n, replaces_id); map_win(); reply = dbus_message_new_method_return(dmsg);