org.freedesktop.Notifications.NotificationClosed
This commit is contained in:
parent
fcd794df6a
commit
454fb4ebed
49
dunst.c
49
dunst.c
@ -242,8 +242,7 @@ void check_timeouts(void)
|
|||||||
if (difftime(now, current->start) > current->timeout) {
|
if (difftime(now, current->start) > current->timeout) {
|
||||||
/* l_move changes iter->next, so we need to store it beforehand */
|
/* l_move changes iter->next, so we need to store it beforehand */
|
||||||
next = iter->next;
|
next = iter->next;
|
||||||
l_move(displayed_notifications, notification_history,
|
close_notification(current, 1);
|
||||||
iter);
|
|
||||||
iter = next;
|
iter = next;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -520,6 +519,7 @@ char
|
|||||||
void handle_mouse_click(XEvent ev)
|
void handle_mouse_click(XEvent ev)
|
||||||
{
|
{
|
||||||
l_node *iter = displayed_notifications->head;
|
l_node *iter = displayed_notifications->head;
|
||||||
|
notification *n;
|
||||||
int i;
|
int i;
|
||||||
if (ev.xbutton.button == Button3) {
|
if (ev.xbutton.button == Button3) {
|
||||||
move_all_to_history();
|
move_all_to_history();
|
||||||
@ -534,7 +534,8 @@ void handle_mouse_click(XEvent ev)
|
|||||||
iter = iter->next;
|
iter = iter->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l_move(displayed_notifications, notification_history, iter);
|
n = (notification *) iter->data;
|
||||||
|
close_notification(n, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,9 +565,9 @@ void handleXEvents(void)
|
|||||||
case KeyPress:
|
case KeyPress:
|
||||||
if (XLookupKeysym(&ev.xkey, 0) == key) {
|
if (XLookupKeysym(&ev.xkey, 0) == key) {
|
||||||
if (!l_is_empty(displayed_notifications)) {
|
if (!l_is_empty(displayed_notifications)) {
|
||||||
l_move(displayed_notifications,
|
notification *n = (notification *)
|
||||||
notification_history,
|
displayed_notifications->head->data;
|
||||||
displayed_notifications->head);
|
close_notification(n, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (XLookupKeysym(&ev.xkey, 0) == history_key) {
|
if (XLookupKeysym(&ev.xkey, 0) == history_key) {
|
||||||
@ -579,14 +580,17 @@ void handleXEvents(void)
|
|||||||
void move_all_to_history()
|
void move_all_to_history()
|
||||||
{
|
{
|
||||||
l_node *node;
|
l_node *node;
|
||||||
|
notification *n;
|
||||||
|
|
||||||
while (!l_is_empty(displayed_notifications)) {
|
while (!l_is_empty(displayed_notifications)) {
|
||||||
node = displayed_notifications->head;
|
node = displayed_notifications->head;
|
||||||
l_move(displayed_notifications, notification_history, node);
|
n = (notification *) node->data;
|
||||||
|
close_notification(n, 2);
|
||||||
}
|
}
|
||||||
while (!l_is_empty(notification_queue)) {
|
while (!l_is_empty(notification_queue)) {
|
||||||
node = notification_queue->head;
|
node = notification_queue->head;
|
||||||
l_move(notification_queue, notification_history, node);
|
n = (notification *) node->data;
|
||||||
|
close_notification(n, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +666,7 @@ int init_notification(notification * n, int id)
|
|||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
n->id = ++next_notification_id;
|
n->id = ++next_notification_id;
|
||||||
} else {
|
} else {
|
||||||
close_notification(id);
|
close_notification_by_id(id, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
l_push(notification_queue, n);
|
l_push(notification_queue, n);
|
||||||
@ -670,16 +674,25 @@ int init_notification(notification * n, int id)
|
|||||||
return n->id;
|
return n->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int close_notification(int id)
|
/*
|
||||||
|
* reasons:
|
||||||
|
* -1 -> notification is a replacement, no NotificationClosed signal emitted
|
||||||
|
* 1 -> the notification expired
|
||||||
|
* 2 -> the notification was dismissed by the user_data
|
||||||
|
* 3 -> The notification was closed by a call to CloseNotification
|
||||||
|
*/
|
||||||
|
int close_notification_by_id(int id, int reason)
|
||||||
{
|
{
|
||||||
l_node *iter;
|
l_node *iter;
|
||||||
|
notification *target = NULL;
|
||||||
|
|
||||||
for (iter = displayed_notifications->head; iter; iter = iter->next) {
|
for (iter = displayed_notifications->head; iter; iter = iter->next) {
|
||||||
notification *n = (notification *) iter->data;
|
notification *n = (notification *) iter->data;
|
||||||
if (n->id == id) {
|
if (n->id == id) {
|
||||||
l_move(displayed_notifications, notification_history,
|
l_move(displayed_notifications, notification_history,
|
||||||
iter);
|
iter);
|
||||||
return True;
|
target = n;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -688,11 +701,21 @@ int close_notification(int id)
|
|||||||
if (n->id == id) {
|
if (n->id == id) {
|
||||||
l_move(displayed_notifications, notification_history,
|
l_move(displayed_notifications, notification_history,
|
||||||
iter);
|
iter);
|
||||||
return True;
|
target = n;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return False;
|
if (reason > 0 && reason < 4) {
|
||||||
|
notificationClosed(target, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
return target == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int close_notification(notification * n, int reason)
|
||||||
|
{
|
||||||
|
return close_notification_by_id(n->id, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
rule_t *initrule(void)
|
rule_t *initrule(void)
|
||||||
|
6
dunst.h
6
dunst.h
@ -13,7 +13,7 @@
|
|||||||
#define ColFG 1
|
#define ColFG 1
|
||||||
#define ColBG 0
|
#define ColBG 0
|
||||||
|
|
||||||
enum alignment {left, center, right};
|
enum alignment { left, center, right };
|
||||||
|
|
||||||
typedef struct _rule_t {
|
typedef struct _rule_t {
|
||||||
char *name;
|
char *name;
|
||||||
@ -39,6 +39,7 @@ typedef struct _notification {
|
|||||||
char *icon;
|
char *icon;
|
||||||
char *msg;
|
char *msg;
|
||||||
const char *format;
|
const char *format;
|
||||||
|
char *dbus_client;
|
||||||
time_t start;
|
time_t start;
|
||||||
time_t timestamp;
|
time_t timestamp;
|
||||||
int timeout;
|
int timeout;
|
||||||
@ -61,5 +62,6 @@ typedef struct _dimension_t {
|
|||||||
|
|
||||||
/* return id of notification */
|
/* return id of notification */
|
||||||
int init_notification(notification * n, int id);
|
int init_notification(notification * n, int id);
|
||||||
int close_notification(int id);
|
int close_notification(notification * n, int reason);
|
||||||
|
int close_notification_by_id(int id, int reason);
|
||||||
void map_win(void);
|
void map_win(void);
|
||||||
|
29
dunst_dbus.c
29
dunst_dbus.c
@ -35,7 +35,6 @@ _extract_hint(const char *name, const char *hint_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const char *introspect = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
static const char *introspect = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||||
"<node name=\"/org/freedesktop/Notifications\">"
|
"<node name=\"/org/freedesktop/Notifications\">"
|
||||||
" <interface name=\"org.freedesktop.Notifications\">"
|
" <interface name=\"org.freedesktop.Notifications\">"
|
||||||
@ -208,9 +207,7 @@ void closeNotification(DBusMessage * dmsg)
|
|||||||
|
|
||||||
_extract_basic(DBUS_TYPE_UINT32, &args, &id);
|
_extract_basic(DBUS_TYPE_UINT32, &args, &id);
|
||||||
|
|
||||||
close_notification(id);
|
close_notification_by_id(id, 3);
|
||||||
|
|
||||||
/* TODO org.freedesktop.Notifications.NotificationClosed */
|
|
||||||
|
|
||||||
dbus_connection_send(dbus_conn, reply, &dbus_serial);
|
dbus_connection_send(dbus_conn, reply, &dbus_serial);
|
||||||
dbus_connection_flush(dbus_conn);
|
dbus_connection_flush(dbus_conn);
|
||||||
@ -253,6 +250,29 @@ void getServerInformation(DBusMessage * dmsg)
|
|||||||
dbus_message_unref(reply);
|
dbus_message_unref(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void notificationClosed(notification * n, int reason)
|
||||||
|
{
|
||||||
|
DBusMessage *dmsg;
|
||||||
|
DBusMessageIter args;
|
||||||
|
int id = n->id;
|
||||||
|
|
||||||
|
dmsg =
|
||||||
|
dbus_message_new_signal("/org/freedesktop/Notifications",
|
||||||
|
"org.freedesktop.Notifications",
|
||||||
|
"NotificationClosed");
|
||||||
|
dbus_message_iter_init_append(dmsg, &args);
|
||||||
|
dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &id);
|
||||||
|
dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &reason);
|
||||||
|
|
||||||
|
dbus_message_set_destination(dmsg, n->dbus_client);
|
||||||
|
|
||||||
|
dbus_connection_send(dbus_conn, dmsg, &dbus_serial);
|
||||||
|
|
||||||
|
dbus_message_unref(dmsg);
|
||||||
|
|
||||||
|
dbus_connection_flush(dbus_conn);
|
||||||
|
}
|
||||||
|
|
||||||
void notify(DBusMessage * dmsg)
|
void notify(DBusMessage * dmsg)
|
||||||
{
|
{
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
@ -330,6 +350,7 @@ void notify(DBusMessage * dmsg)
|
|||||||
n->icon = strdup(icon);
|
n->icon = strdup(icon);
|
||||||
n->timeout = expires;
|
n->timeout = expires;
|
||||||
n->urgency = urgency;
|
n->urgency = urgency;
|
||||||
|
n->dbus_client = strdup(dbus_message_get_sender(dmsg));
|
||||||
for (i = 0; i < ColLast; i++) {
|
for (i = 0; i < ColLast; i++) {
|
||||||
n->color_strings[i] = NULL;
|
n->color_strings[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ void notify(DBusMessage * msg);
|
|||||||
void getCapabilities(DBusMessage * dmsg);
|
void getCapabilities(DBusMessage * dmsg);
|
||||||
void closeNotification(DBusMessage * dmsg);
|
void closeNotification(DBusMessage * dmsg);
|
||||||
void getServerInformation(DBusMessage * dmsg);
|
void getServerInformation(DBusMessage * dmsg);
|
||||||
|
void notificationClosed(notification * n, int reason);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user