diff --git a/src/dbus.c b/src/dbus.c index eb387ce..19cf35a 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -8,6 +8,7 @@ #include "dunst.h" #include "notification.h" +#include "queues.h" #include "settings.h" #include "utils.h" diff --git a/src/dunst.c b/src/dunst.c index f4e6349..b1d9696 100644 --- a/src/dunst.c +++ b/src/dunst.c @@ -16,6 +16,7 @@ #include "menu.h" #include "notification.h" #include "option_parser.h" +#include "queues.h" #include "settings.h" #include "x11/x.h" #include "x11/screen.h" @@ -39,14 +40,11 @@ bool pause_display = false; GMainLoop *mainloop = NULL; -/* notification lists */ -GQueue *queue = NULL; /* all new notifications get into here */ -GQueue *displayed = NULL; /* currently displayed notifications */ -GQueue *history = NULL; /* history of displayed notifications */ GSList *rules = NULL; /* misc funtions */ +/*TODO: move to queues.c */ void check_timeouts(void) { /* nothing to do */ @@ -82,6 +80,7 @@ void check_timeouts(void) } } +/*TODO: move to queues.c */ void update_lists() { int limit; @@ -128,47 +127,12 @@ void update_lists() } } -void move_all_to_history() -{ - while (displayed->length > 0) { - notification_close(g_queue_peek_head_link(displayed)->data, 2); - } - - while (queue->length > 0) { - notification_close(g_queue_peek_head_link(queue)->data, 2); - } -} - -void history_pop(void) -{ - if (g_queue_is_empty(history)) - return; - - notification *n = g_queue_pop_tail(history); - n->redisplayed = true; - n->start = 0; - n->timeout = settings.sticky_history ? 0 : n->timeout; - g_queue_push_head(queue, n); - - wake_up(); -} - -void history_push(notification *n) -{ - if (settings.history_length > 0 && history->length >= settings.history_length) { - notification *to_free = g_queue_pop_head(history); - notification_free(to_free); - } - - if (!n->history_ignore) - g_queue_push_tail(history, n); -} - void wake_up(void) { run(NULL); } +/* TODO: move parts to queue.c */ static gint64 get_sleep_time(void) { gint64 time = g_get_monotonic_time(); @@ -264,19 +228,11 @@ gboolean quit_signal(gpointer data) return G_SOURCE_CONTINUE; } -static void teardown_notification(gpointer data) -{ - notification *n = data; - notification_free(n); -} - static void teardown(void) { regex_teardown(); - g_queue_free_full(history, teardown_notification); - g_queue_free_full(displayed, teardown_notification); - g_queue_free_full(queue, teardown_notification); + teardown_queues(); x_free(); } @@ -284,6 +240,7 @@ static void teardown(void) int dunst_main(int argc, char *argv[]) { + /*TODO: move to queues.c */ history = g_queue_new(); displayed = g_queue_new(); queue = g_queue_new(); diff --git a/src/dunst.h b/src/dunst.h index 6982bef..f91d7ba 100644 --- a/src/dunst.h +++ b/src/dunst.h @@ -16,9 +16,6 @@ #define ColFG 1 #define ColBG 0 -extern GQueue *queue; -extern GQueue *displayed; -extern GQueue *history; extern GSList *rules; extern bool pause_display; extern const char *color_strings[3][3]; @@ -30,10 +27,7 @@ void wake_up(void); int dunst_main(int argc, char *argv[]); void check_timeouts(void); -void history_pop(void); -void history_push(notification *n); void usage(int exit_status); -void move_all_to_history(void); void print_version(void); char *extract_urls(const char *str); void context_menu(void); diff --git a/src/menu.c b/src/menu.c index 6bd2940..8ecaffc 100644 --- a/src/menu.c +++ b/src/menu.c @@ -16,6 +16,7 @@ #include "dunst.h" #include "settings.h" #include "notification.h" +#include "queues.h" #include "utils.h" static bool is_initialized = false; diff --git a/src/notification.c b/src/notification.c index ef37eb0..e3c0411 100644 --- a/src/notification.c +++ b/src/notification.c @@ -19,6 +19,7 @@ #include "menu.h" #include "rules.h" #include "settings.h" +#include "queues.h" #include "utils.h" #include "x11/x.h" @@ -430,6 +431,7 @@ int notification_init(notification *n, int id) n->dup_count = 0; + /* TODO: move this to queue.c */ /* check if n is a duplicate */ if (settings.stack_duplicates) { for (GList *iter = g_queue_peek_head_link(queue); iter; @@ -545,97 +547,6 @@ int notification_init(notification *n, int id) return n->id; } -/* - * Close the notification that has 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 notification_close_by_id(int id, int reason) -{ - notification *target = NULL; - - for (GList *iter = g_queue_peek_head_link(displayed); iter; - iter = iter->next) { - notification *n = iter->data; - if (n->id == id) { - g_queue_remove(displayed, n); - history_push(n); - target = n; - break; - } - } - - for (GList *iter = g_queue_peek_head_link(queue); iter; - iter = iter->next) { - notification *n = iter->data; - if (n->id == id) { - g_queue_remove(queue, n); - history_push(n); - target = n; - break; - } - } - - if (reason > 0 && reason < 4 && target != NULL) { - notification_closed(target, reason); - } - - wake_up(); - return reason; -} - -/* - * Close the given notification. SEE notification_close_by_id. - */ -int notification_close(notification *n, int reason) -{ - assert(n != NULL); - return notification_close_by_id(n->id, reason); -} - -/* - * Replace the notification which matches the id field of - * the new notification. The given notification is inserted - * right in the same position as the old notification. - * - * Returns true, if a matching notification has been found - * and is replaced. Else false. - */ -bool notification_replace_by_id(notification *new) -{ - - for (GList *iter = g_queue_peek_head_link(displayed); - iter; - iter = iter->next) { - notification *old = iter->data; - if (old->id == new->id) { - iter->data = new; - new->start = time(NULL); - new->dup_count = old->dup_count; - notification_run_script(new); - history_push(old); - return true; - } - } - - for (GList *iter = g_queue_peek_head_link(queue); - iter; - iter = iter->next) { - notification *old = iter->data; - if (old->id == new->id) { - iter->data = new; - new->dup_count = old->dup_count; - history_push(old); - return true; - } - } - return false; -} - void notification_update_text_to_render(notification *n) { g_free(n->text_to_render); diff --git a/src/notification.h b/src/notification.h index edd051b..d56ef90 100644 --- a/src/notification.h +++ b/src/notification.h @@ -64,13 +64,10 @@ typedef struct _notification { notification *notification_create(void); int notification_init(notification *n, int id); void notification_free(notification *n); -int notification_close_by_id(int id, int reason); -bool notification_replace_by_id(notification *n); int notification_cmp(const void *a, const void *b); int notification_cmp_data(const void *a, const void *b, void *data); int notification_is_duplicate(const notification *a, const notification *b); void notification_run_script(notification *n); -int notification_close(notification *n, int reason); void notification_print(notification *n); void notification_replace_single_field(char **haystack, char **needle, const char *replacement, enum markup_mode markup_mode); void notification_update_text_to_render(notification *n); diff --git a/src/queues.c b/src/queues.c new file mode 100644 index 0000000..a236598 --- /dev/null +++ b/src/queues.c @@ -0,0 +1,137 @@ +/* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */ + +#include "queues.h" + +#include +#include + +#include "dbus.h" +#include "dunst.h" +#include "notification.h" +#include "settings.h" + +/* notification lists */ +GQueue *queue = NULL; /* all new notifications get into here */ +GQueue *displayed = NULL; /* currently displayed notifications */ +GQueue *history = NULL; /* history of displayed notifications */ + +bool notification_replace_by_id(notification *new) +{ + + for (GList *iter = g_queue_peek_head_link(displayed); + iter; + iter = iter->next) { + notification *old = iter->data; + if (old->id == new->id) { + iter->data = new; + new->start = time(NULL); + new->dup_count = old->dup_count; + notification_run_script(new); + history_push(old); + return true; + } + } + + for (GList *iter = g_queue_peek_head_link(queue); + iter; + iter = iter->next) { + notification *old = iter->data; + if (old->id == new->id) { + iter->data = new; + new->dup_count = old->dup_count; + history_push(old); + return true; + } + } + return false; +} + +int notification_close_by_id(int id, int reason) +{ + notification *target = NULL; + + for (GList *iter = g_queue_peek_head_link(displayed); iter; + iter = iter->next) { + notification *n = iter->data; + if (n->id == id) { + g_queue_remove(displayed, n); + history_push(n); + target = n; + break; + } + } + + for (GList *iter = g_queue_peek_head_link(queue); iter; + iter = iter->next) { + notification *n = iter->data; + if (n->id == id) { + g_queue_remove(queue, n); + history_push(n); + target = n; + break; + } + } + + if (reason > 0 && reason < 4 && target != NULL) { + notification_closed(target, reason); + } + + wake_up(); + return reason; +} + +int notification_close(notification *n, int reason) +{ + assert(n != NULL); + return notification_close_by_id(n->id, reason); +} + +void move_all_to_history() +{ + while (displayed->length > 0) { + notification_close(g_queue_peek_head_link(displayed)->data, 2); + } + + while (queue->length > 0) { + notification_close(g_queue_peek_head_link(queue)->data, 2); + } +} + +void history_pop(void) +{ + if (g_queue_is_empty(history)) + return; + + notification *n = g_queue_pop_tail(history); + n->redisplayed = true; + n->start = 0; + n->timeout = settings.sticky_history ? 0 : n->timeout; + g_queue_push_head(queue, n); + + wake_up(); +} + +void history_push(notification *n) +{ + if (settings.history_length > 0 && history->length >= settings.history_length) { + notification *to_free = g_queue_pop_head(history); + notification_free(to_free); + } + + if (!n->history_ignore) + g_queue_push_tail(history, n); +} + +static void teardown_notification(gpointer data) +{ + notification *n = data; + notification_free(n); +} + +void teardown_queues(void) +{ + g_queue_free_full(history, teardown_notification); + g_queue_free_full(displayed, teardown_notification); + g_queue_free_full(queue, teardown_notification); +} +/* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ diff --git a/src/queues.h b/src/queues.h new file mode 100644 index 0000000..70e031f --- /dev/null +++ b/src/queues.h @@ -0,0 +1,49 @@ +/* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */ + +#ifndef DUNST_QUEUE_H +#define DUNST_QUEUE_H + +#include "notification.h" + +extern GQueue *queue; +extern GQueue *displayed; +extern GQueue *history; + +/* + * Replace the notification which matches the id field of + * the new notification. The given notification is inserted + * right in the same position as the old notification. + * + * Returns true, if a matching notification has been found + * and is replaced. Else false. + */ +bool notification_replace_by_id(notification *new); + +/* + * Close the notification that has id. + * + * After closing, call wake_up to remove the notification from UI + * + * 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 notification_close_by_id(int id, int reason); + +/* Close the given notification. SEE notification_close_by_id. */ +int notification_close(notification *n, int reason); + +void history_pop(void); +void history_push(notification *n); +void move_all_to_history(void); + +/* + * Remove all notifications from all lists + * and free the notifications + */ +void teardown_queues(void); + +#endif +/* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ diff --git a/src/x11/x.c b/src/x11/x.c index ce84229..18899f6 100644 --- a/src/x11/x.c +++ b/src/x11/x.c @@ -29,6 +29,7 @@ #include "src/markup.h" #include "src/notification.h" #include "src/settings.h" +#include "src/queues.h" #include "src/utils.h" #include "screen.h"