Refactor: Move queue specific methods to queues.c
This commit is contained in:
parent
177fc30484
commit
a7003e3616
@ -8,6 +8,7 @@
|
||||
|
||||
#include "dunst.h"
|
||||
#include "notification.h"
|
||||
#include "queues.h"
|
||||
#include "settings.h"
|
||||
#include "utils.h"
|
||||
|
||||
|
55
src/dunst.c
55
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();
|
||||
|
@ -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);
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "dunst.h"
|
||||
#include "settings.h"
|
||||
#include "notification.h"
|
||||
#include "queues.h"
|
||||
#include "utils.h"
|
||||
|
||||
static bool is_initialized = false;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
137
src/queues.c
Normal file
137
src/queues.c
Normal file
@ -0,0 +1,137 @@
|
||||
/* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */
|
||||
|
||||
#include "queues.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <glib.h>
|
||||
|
||||
#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: */
|
49
src/queues.h
Normal file
49
src/queues.h
Normal file
@ -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: */
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user