From a536e3f60bac9359eb1338a90e2575490d7844ac Mon Sep 17 00:00:00 2001 From: Benedikt Heine Date: Wed, 11 Oct 2017 12:25:30 +0200 Subject: [PATCH] Force management of queues to queues.c --- src/dunst.c | 4 ++-- src/menu.c | 4 ++-- src/queues.c | 24 +++++++++++++++++++++--- src/queues.h | 25 ++++++++++++++++++------- src/x11/x.c | 18 ++++++++---------- 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/dunst.c b/src/dunst.c index b5b1ddb..56f4213 100644 --- a/src/dunst.c +++ b/src/dunst.c @@ -60,11 +60,11 @@ gboolean run(void *data) timeout_cnt--; } - if (displayed->length > 0 && !xctx.visible) { + if (queues_length_displayed() > 0 && !xctx.visible) { x_win_show(); } - if (xctx.visible && displayed->length == 0) { + if (xctx.visible && queues_length_displayed() == 0) { x_win_hide(); } diff --git a/src/menu.c b/src/menu.c index 8ecaffc..6344c55 100644 --- a/src/menu.c +++ b/src/menu.c @@ -137,7 +137,7 @@ void invoke_action(const char *action) int appname_len = strlen(appname_begin) - 1; // remove ] int action_len = strlen(action) - appname_len - 3; // remove space, [, ] - for (GList *iter = g_queue_peek_head_link(displayed); iter; + for (const GList *iter = queues_get_displayed(); iter; iter = iter->next) { notification *n = iter->data; if (g_str_has_prefix(appname_begin, n->appname) && strlen(n->appname) == appname_len) { @@ -189,7 +189,7 @@ void context_menu(void) } char *dmenu_input = NULL; - for (GList *iter = g_queue_peek_head_link(displayed); iter; + for (const GList *iter = queues_get_displayed(); iter; iter = iter->next) { notification *n = iter->data; diff --git a/src/queues.c b/src/queues.c index 5bf8040..b8d251f 100644 --- a/src/queues.c +++ b/src/queues.c @@ -10,9 +10,9 @@ #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 */ +static GQueue *queue = NULL; /* all new notifications get into here */ +static GQueue *displayed = NULL; /* currently displayed notifications */ +static GQueue *history = NULL; /* history of displayed notifications */ unsigned int displayed_limit = 0; int next_notification_id = 1; @@ -32,6 +32,24 @@ void queues_displayed_limit(unsigned int limit) displayed_limit = limit; } +/* misc getter functions */ +const GList *queues_get_displayed() +{ + return g_queue_peek_head_link(displayed); +} +unsigned int queues_length_waiting() +{ + return queue->length; +} +unsigned int queues_length_displayed() +{ + return displayed->length; +} +unsigned int queues_length_history() +{ + return history->length; +} + int queues_notification_insert(notification *n, int replaces_id) { if (replaces_id == 0) { diff --git a/src/queues.h b/src/queues.h index e0605ec..698eccf 100644 --- a/src/queues.h +++ b/src/queues.h @@ -5,11 +5,6 @@ #include "notification.h" -extern GQueue *queue; -extern GQueue *displayed; -extern GQueue *history; -extern unsigned int displayed_limit; - /* * Initialise neccessary queues */ @@ -21,6 +16,19 @@ void queues_init(void); */ void queues_displayed_limit(unsigned int limit); +/* + * Return read only list of notifications + */ +const GList *queues_get_displayed(); + +/* + * Returns the current amount of notifications, + * which are shown, waiting or already in history + */ +unsigned int queues_length_waiting(); +unsigned int queues_length_displayed(); +unsigned int queues_length_history(); + /* * Insert a fully initialized notification into queues * Respects stack_duplicates, and notification replacement @@ -43,9 +51,12 @@ int queues_notification_insert(notification *n, int replaces_id); bool queues_notification_replace_id(notification *new); /* - * Close the notification that has id. + * Close the notification that has n->id == id * - * After closing, call wake_up to remove the notification from UI + * Sends a signal and pushes it automatically to history. + * + * After closing, call wake_up to synchronize the queues with the UI + * (which closes the notification on screen) * * reasons: * -1 -> notification is a replacement, no NotificationClosed signal emitted diff --git a/src/x11/x.c b/src/x11/x.c index be3b0f3..3647222 100644 --- a/src/x11/x.c +++ b/src/x11/x.c @@ -533,11 +533,11 @@ static GSList *r_create_layouts(cairo_t *c) { GSList *layouts = NULL; - int qlen = g_list_length(g_queue_peek_head_link(queue)); + int qlen = queues_length_waiting(); bool xmore_is_needed = qlen > 0 && settings.indicate_hidden; notification *last = NULL; - for (GList *iter = g_queue_peek_head_link(displayed); + for (const GList *iter = queues_get_displayed(); iter; iter = iter->next) { notification *n = iter->data; @@ -854,12 +854,10 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, && XLookupKeysym(&ev.xkey, 0) == settings.close_ks.sym && settings.close_ks.mask == state) { - if (displayed) { - notification *n = g_queue_peek_head(displayed); - if (n) { - queues_notification_close(n, 2); - wake_up(); - } + const GList *displayed = queues_get_displayed(); + if (displayed && displayed->data) { + queues_notification_close(displayed->data, 2); + wake_up(); } } if (settings.history_ks.str @@ -926,7 +924,7 @@ static void x_handle_click(XEvent ev) int y = settings.separator_height; notification *n = NULL; int first = true; - for (GList *iter = g_queue_peek_head_link(displayed); iter; + for (const GList *iter = queues_get_displayed(); iter; iter = iter->next) { n = iter->data; if (ev.xbutton.y > y && ev.xbutton.y < y + n->displayed_height) @@ -1127,7 +1125,7 @@ static void x_win_setup(void) void x_win_show(void) { /* window is already mapped or there's nothing to show */ - if (xctx.visible || g_queue_is_empty(displayed)) { + if (xctx.visible || queues_length_displayed() == 0) { return; }