Use structs for notifications
This commit is contained in:
		
							parent
							
								
									1fa1532d7f
								
							
						
					
					
						commit
						bbbddad3a7
					
				
							
								
								
									
										10
									
								
								src/dbus.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/dbus.c
									
									
									
									
									
								
							| @ -130,10 +130,10 @@ static void on_get_capabilities(GDBusConnection *connection, | |||||||
|         g_dbus_connection_flush(connection, NULL, NULL, NULL); |         g_dbus_connection_flush(connection, NULL, NULL, NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static notification *dbus_message_to_notification(const gchar *sender, GVariant *parameters) | static struct notification *dbus_message_to_notification(const gchar *sender, GVariant *parameters) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|         notification *n = notification_create(); |         struct notification *n = notification_create(); | ||||||
| 
 | 
 | ||||||
|         n->actions = g_malloc0(sizeof(struct actions)); |         n->actions = g_malloc0(sizeof(struct actions)); | ||||||
|         n->dbus_client = g_strdup(sender); |         n->dbus_client = g_strdup(sender); | ||||||
| @ -272,7 +272,7 @@ static void on_notify(GDBusConnection *connection, | |||||||
|                       GVariant *parameters, |                       GVariant *parameters, | ||||||
|                       GDBusMethodInvocation *invocation) |                       GDBusMethodInvocation *invocation) | ||||||
| { | { | ||||||
|         notification *n = dbus_message_to_notification(sender, parameters); |         struct notification *n = dbus_message_to_notification(sender, parameters); | ||||||
|         int id = queues_notification_insert(n); |         int id = queues_notification_insert(n); | ||||||
| 
 | 
 | ||||||
|         GVariant *reply = g_variant_new("(u)", id); |         GVariant *reply = g_variant_new("(u)", id); | ||||||
| @ -314,7 +314,7 @@ static void on_get_server_information(GDBusConnection *connection, | |||||||
|         g_dbus_connection_flush(connection, NULL, NULL, NULL); |         g_dbus_connection_flush(connection, NULL, NULL, NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void signal_notification_closed(notification *n, enum reason reason) | void signal_notification_closed(struct notification *n, enum reason reason) | ||||||
| { | { | ||||||
|         if (reason < REASON_MIN || REASON_MAX < reason) { |         if (reason < REASON_MIN || REASON_MAX < reason) { | ||||||
|                 LOG_W("Closing notification with reason '%d' not supported. " |                 LOG_W("Closing notification with reason '%d' not supported. " | ||||||
| @ -344,7 +344,7 @@ void signal_notification_closed(notification *n, enum reason reason) | |||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void signal_action_invoked(notification *n, const char *identifier) | void signal_action_invoked(const struct notification *n, const char *identifier) | ||||||
| { | { | ||||||
|         GVariant *body = g_variant_new("(us)", n->id, identifier); |         GVariant *body = g_variant_new("(us)", n->id, identifier); | ||||||
|         GError *err = NULL; |         GError *err = NULL; | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ enum reason { | |||||||
| 
 | 
 | ||||||
| int initdbus(void); | int initdbus(void); | ||||||
| void dbus_tear_down(int id); | void dbus_tear_down(int id); | ||||||
| void signal_notification_closed(notification *n, enum reason reason); | void signal_notification_closed(struct notification *n, enum reason reason); | ||||||
| void signal_action_invoked(notification *n, const char *identifier); | void signal_action_invoked(const struct notification *n, const char *identifier); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								src/draw.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/draw.c
									
									
									
									
									
								
							| @ -26,7 +26,7 @@ struct colored_layout { | |||||||
|         char *text; |         char *text; | ||||||
|         PangoAttrList *attr; |         PangoAttrList *attr; | ||||||
|         cairo_surface_t *icon; |         cairo_surface_t *icon; | ||||||
|         const notification *n; |         const struct notification *n; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct window_x11 *win; | struct window_x11 *win; | ||||||
| @ -246,7 +246,7 @@ static PangoLayout *layout_create(cairo_t *c) | |||||||
|         return layout; |         return layout; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct colored_layout *layout_init_shared(cairo_t *c, const notification *n) | static struct colored_layout *layout_init_shared(cairo_t *c, const struct notification *n) | ||||||
| { | { | ||||||
|         struct colored_layout *cl = g_malloc(sizeof(struct colored_layout)); |         struct colored_layout *cl = g_malloc(sizeof(struct colored_layout)); | ||||||
|         cl->l = layout_create(c); |         cl->l = layout_create(c); | ||||||
| @ -302,7 +302,7 @@ static struct colored_layout *layout_init_shared(cairo_t *c, const notification | |||||||
|         return cl; |         return cl; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct colored_layout *layout_derive_xmore(cairo_t *c, const notification *n, int qlen) | static struct colored_layout *layout_derive_xmore(cairo_t *c, const struct notification *n, int qlen) | ||||||
| { | { | ||||||
|         struct colored_layout *cl = layout_init_shared(c, n); |         struct colored_layout *cl = layout_init_shared(c, n); | ||||||
|         cl->text = g_strdup_printf("(%d more)", qlen); |         cl->text = g_strdup_printf("(%d more)", qlen); | ||||||
| @ -311,7 +311,7 @@ static struct colored_layout *layout_derive_xmore(cairo_t *c, const notification | |||||||
|         return cl; |         return cl; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct colored_layout *layout_from_notification(cairo_t *c, notification *n) | static struct colored_layout *layout_from_notification(cairo_t *c, struct notification *n) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|         struct colored_layout *cl = layout_init_shared(c, n); |         struct colored_layout *cl = layout_init_shared(c, n); | ||||||
| @ -354,7 +354,7 @@ static GSList *create_layouts(cairo_t *c) | |||||||
|         for (const GList *iter = queues_get_displayed(); |         for (const GList *iter = queues_get_displayed(); | ||||||
|                         iter; iter = iter->next) |                         iter; iter = iter->next) | ||||||
|         { |         { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
| 
 | 
 | ||||||
|                 notification_update_text_to_render(n); |                 notification_update_text_to_render(n); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -161,7 +161,7 @@ int dunst_main(int argc, char *argv[]) | |||||||
|         guint int_src = g_unix_signal_add(SIGINT, quit_signal, NULL); |         guint int_src = g_unix_signal_add(SIGINT, quit_signal, NULL); | ||||||
| 
 | 
 | ||||||
|         if (settings.startup_notification) { |         if (settings.startup_notification) { | ||||||
|                 notification *n = notification_create(); |                 struct notification *n = notification_create(); | ||||||
|                 n->id = 0; |                 n->id = 0; | ||||||
|                 n->appname = g_strdup("dunst"); |                 n->appname = g_strdup("dunst"); | ||||||
|                 n->summary = g_strdup("startup"); |                 n->summary = g_strdup("startup"); | ||||||
|  | |||||||
| @ -143,7 +143,7 @@ GdkPixbuf *get_pixbuf_from_raw_image(const struct raw_image *raw_image) | |||||||
|         return pixbuf; |         return pixbuf; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| cairo_surface_t *icon_get_for_notification(const notification *n) | cairo_surface_t *icon_get_for_notification(const struct notification *n) | ||||||
| { | { | ||||||
|         GdkPixbuf *pixbuf; |         GdkPixbuf *pixbuf; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ GdkPixbuf *get_pixbuf_from_raw_image(const struct raw_image *raw_image); | |||||||
|  * |  * | ||||||
|  * @return a cairo_surface_t pointer or NULL if no icon could be retrieved. |  * @return a cairo_surface_t pointer or NULL if no icon could be retrieved. | ||||||
|  */ |  */ | ||||||
| cairo_surface_t *icon_get_for_notification(const notification *n); | cairo_surface_t *icon_get_for_notification(const struct notification *n); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | ||||||
|  | |||||||
| @ -135,7 +135,7 @@ void open_browser(const char *in) | |||||||
|  */ |  */ | ||||||
| void invoke_action(const char *action) | void invoke_action(const char *action) | ||||||
| { | { | ||||||
|         notification *invoked = NULL; |         struct notification *invoked = NULL; | ||||||
|         char *action_identifier = NULL; |         char *action_identifier = NULL; | ||||||
| 
 | 
 | ||||||
|         char *appname_begin = strchr(action, '['); |         char *appname_begin = strchr(action, '['); | ||||||
| @ -149,7 +149,7 @@ void invoke_action(const char *action) | |||||||
| 
 | 
 | ||||||
|         for (const GList *iter = queues_get_displayed(); iter; |         for (const GList *iter = queues_get_displayed(); iter; | ||||||
|              iter = iter->next) { |              iter = iter->next) { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
|                 if (g_str_has_prefix(appname_begin, n->appname) && strlen(n->appname) == appname_len) { |                 if (g_str_has_prefix(appname_begin, n->appname) && strlen(n->appname) == appname_len) { | ||||||
|                         if (!n->actions) |                         if (!n->actions) | ||||||
|                                 continue; |                                 continue; | ||||||
| @ -201,7 +201,7 @@ void context_menu(void) | |||||||
| 
 | 
 | ||||||
|         for (const GList *iter = queues_get_displayed(); iter; |         for (const GList *iter = queues_get_displayed(); iter; | ||||||
|              iter = iter->next) { |              iter = iter->next) { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
| 
 | 
 | ||||||
|                 if (n->urls) |                 if (n->urls) | ||||||
|                         dmenu_input = string_append(dmenu_input, n->urls, "\n"); |                         dmenu_input = string_append(dmenu_input, n->urls, "\n"); | ||||||
|  | |||||||
| @ -24,9 +24,9 @@ | |||||||
| #include "utils.h" | #include "utils.h" | ||||||
| #include "x11/x.h" | #include "x11/x.h" | ||||||
| 
 | 
 | ||||||
| static void notification_extract_urls(notification *n); | static void notification_extract_urls(struct notification *n); | ||||||
| static void notification_format_message(notification *n); | static void notification_format_message(struct notification *n); | ||||||
| static void notification_dmenu_string(notification *n); | static void notification_dmenu_string(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| const char *enum_to_string_fullscreen(enum behavior_fullscreen in) | const char *enum_to_string_fullscreen(enum behavior_fullscreen in) | ||||||
| @ -43,7 +43,7 @@ const char *enum_to_string_fullscreen(enum behavior_fullscreen in) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| void notification_print(notification *n) | void notification_print(const struct notification *n) | ||||||
| { | { | ||||||
|         //TODO: use logging info for this
 |         //TODO: use logging info for this
 | ||||||
|         printf("{\n"); |         printf("{\n"); | ||||||
| @ -87,7 +87,7 @@ void notification_print(notification *n) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| void notification_run_script(notification *n) | void notification_run_script(struct notification *n) | ||||||
| { | { | ||||||
|         if (!n->script || strlen(n->script) < 1) |         if (!n->script || strlen(n->script) < 1) | ||||||
|                 return; |                 return; | ||||||
| @ -150,7 +150,7 @@ const char *notification_urgency_to_string(const enum urgency urgency) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| int notification_cmp(const notification *a, const notification *b) | int notification_cmp(const struct notification *a, const struct notification *b) | ||||||
| { | { | ||||||
|         if (a->urgency != b->urgency) { |         if (a->urgency != b->urgency) { | ||||||
|                 return b->urgency - a->urgency; |                 return b->urgency - a->urgency; | ||||||
| @ -162,8 +162,8 @@ int notification_cmp(const notification *a, const notification *b) | |||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| int notification_cmp_data(const void *va, const void *vb, void *data) | int notification_cmp_data(const void *va, const void *vb, void *data) | ||||||
| { | { | ||||||
|         notification *a = (notification *) va; |         struct notification *a = (struct notification *) va; | ||||||
|         notification *b = (notification *) vb; |         struct notification *b = (struct notification *) vb; | ||||||
| 
 | 
 | ||||||
|         if (!settings.sort) |         if (!settings.sort) | ||||||
|                 return 1; |                 return 1; | ||||||
| @ -171,7 +171,7 @@ int notification_cmp_data(const void *va, const void *vb, void *data) | |||||||
|         return notification_cmp(a, b); |         return notification_cmp(a, b); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int notification_is_duplicate(const notification *a, const notification *b) | int notification_is_duplicate(const struct notification *a, const struct notification *b) | ||||||
| { | { | ||||||
|         //Comparing raw icons is not supported, assume they are not identical
 |         //Comparing raw icons is not supported, assume they are not identical
 | ||||||
|         if (settings.icon_position != icons_off |         if (settings.icon_position != icons_off | ||||||
| @ -207,7 +207,7 @@ void rawimage_free(struct raw_image *i) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| void notification_free(notification *n) | void notification_free(struct notification *n) | ||||||
| { | { | ||||||
|         if (!n) |         if (!n) | ||||||
|                 return; |                 return; | ||||||
| @ -256,9 +256,9 @@ void notification_replace_single_field(char **haystack, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| notification *notification_create(void) | struct notification *notification_create(void) | ||||||
| { | { | ||||||
|         notification *n = g_malloc0(sizeof(notification)); |         struct notification *n = g_malloc0(sizeof(struct notification)); | ||||||
| 
 | 
 | ||||||
|         /* Unparameterized default values */ |         /* Unparameterized default values */ | ||||||
|         n->first_render = true; |         n->first_render = true; | ||||||
| @ -281,7 +281,7 @@ notification *notification_create(void) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| void notification_init(notification *n) | void notification_init(struct notification *n) | ||||||
| { | { | ||||||
|         /* default to empty string to avoid further NULL faults */ |         /* default to empty string to avoid further NULL faults */ | ||||||
|         n->appname  = n->appname  ? n->appname  : g_strdup("unknown"); |         n->appname  = n->appname  ? n->appname  : g_strdup("unknown"); | ||||||
| @ -326,7 +326,7 @@ void notification_init(notification *n) | |||||||
|         notification_format_message(n); |         notification_format_message(n); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void notification_format_message(notification *n) | static void notification_format_message(struct notification *n) | ||||||
| { | { | ||||||
|         g_clear_pointer(&n->msg, g_free); |         g_clear_pointer(&n->msg, g_free); | ||||||
| 
 | 
 | ||||||
| @ -431,7 +431,7 @@ static void notification_format_message(notification *n) | |||||||
|         } |         } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void notification_extract_urls(notification *n) | static void notification_extract_urls(struct notification *n) | ||||||
| { | { | ||||||
|         g_clear_pointer(&n->urls, g_free); |         g_clear_pointer(&n->urls, g_free); | ||||||
| 
 | 
 | ||||||
| @ -455,7 +455,7 @@ static void notification_extract_urls(notification *n) | |||||||
|         g_free(urls_text); |         g_free(urls_text); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void notification_dmenu_string(notification *n) | static void notification_dmenu_string(struct notification *n) | ||||||
| { | { | ||||||
|         if (n->actions) { |         if (n->actions) { | ||||||
|                 g_clear_pointer(&n->actions->dmenu_str, g_free); |                 g_clear_pointer(&n->actions->dmenu_str, g_free); | ||||||
| @ -473,7 +473,7 @@ static void notification_dmenu_string(notification *n) | |||||||
|         } |         } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void notification_update_text_to_render(notification *n) | void notification_update_text_to_render(struct notification *n) | ||||||
| { | { | ||||||
|         g_clear_pointer(&n->text_to_render, g_free); |         g_clear_pointer(&n->text_to_render, g_free); | ||||||
| 
 | 
 | ||||||
| @ -529,7 +529,7 @@ void notification_update_text_to_render(notification *n) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see notification.h */ | /* see notification.h */ | ||||||
| void notification_do_action(notification *n) | void notification_do_action(const struct notification *n) | ||||||
| { | { | ||||||
|         if (n->actions) { |         if (n->actions) { | ||||||
|                 if (n->actions->count == 2) { |                 if (n->actions->count == 2) { | ||||||
|  | |||||||
| @ -42,7 +42,7 @@ struct actions { | |||||||
|         gsize count; |         gsize count; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| typedef struct _notification { | struct notification { | ||||||
|         int id; |         int id; | ||||||
|         char *dbus_client; |         char *dbus_client; | ||||||
| 
 | 
 | ||||||
| @ -83,7 +83,7 @@ typedef struct _notification { | |||||||
|         char *msg;            /**< formatted message */ |         char *msg;            /**< formatted message */ | ||||||
|         char *text_to_render; /**< formatted message (with age and action indicators) */ |         char *text_to_render; /**< formatted message (with age and action indicators) */ | ||||||
|         char *urls;           /**< urllist delimited by '\\n' */ |         char *urls;           /**< urllist delimited by '\\n' */ | ||||||
| } notification; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Create notification struct and initialise all fields with either |  * Create notification struct and initialise all fields with either | ||||||
| @ -93,7 +93,7 @@ typedef struct _notification { | |||||||
|  * This function is guaranteed to return a valid pointer. |  * This function is guaranteed to return a valid pointer. | ||||||
|  * @returns The generated notification |  * @returns The generated notification | ||||||
|  */ |  */ | ||||||
| notification *notification_create(void); | struct notification *notification_create(void); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Sanitize values of notification, apply all matching rules |  * Sanitize values of notification, apply all matching rules | ||||||
| @ -101,7 +101,7 @@ notification *notification_create(void); | |||||||
|  * |  * | ||||||
|  * @param n: the notification to sanitize |  * @param n: the notification to sanitize | ||||||
|  */ |  */ | ||||||
| void notification_init(notification *n); | void notification_init(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Free the actions structure |  * Free the actions structure | ||||||
| @ -122,12 +122,12 @@ void rawimage_free(struct raw_image *i); | |||||||
|  * |  * | ||||||
|  * @param n (nullable): pointer to #notification |  * @param n (nullable): pointer to #notification | ||||||
|  */ |  */ | ||||||
| void notification_free(notification *n); | void notification_free(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Helper function to compare two given notifications. |  * Helper function to compare two given notifications. | ||||||
|  */ |  */ | ||||||
| int notification_cmp(const notification *a, const notification *b); | int notification_cmp(const struct notification *a, const struct notification *b); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Wrapper for notification_cmp to match glib's |  * Wrapper for notification_cmp to match glib's | ||||||
| @ -135,7 +135,7 @@ int notification_cmp(const notification *a, const notification *b); | |||||||
|  */ |  */ | ||||||
| int notification_cmp_data(const void *va, const void *vb, void *data); | int notification_cmp_data(const void *va, const void *vb, void *data); | ||||||
| 
 | 
 | ||||||
| int notification_is_duplicate(const notification *a, const notification *b); | int notification_is_duplicate(const struct notification *a, const struct notification *b); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Run the script associated with the |  * Run the script associated with the | ||||||
| @ -144,12 +144,12 @@ int notification_is_duplicate(const notification *a, const notification *b); | |||||||
|  * If the script of the notification has been executed already and |  * If the script of the notification has been executed already and | ||||||
|  * settings.always_run_script is not set, do nothing. |  * settings.always_run_script is not set, do nothing. | ||||||
|  */ |  */ | ||||||
| void notification_run_script(notification *n); | void notification_run_script(struct notification *n); | ||||||
| /**
 | /**
 | ||||||
|  * print a human readable representation |  * print a human readable representation | ||||||
|  * of the given notification to stdout. |  * of the given notification to stdout. | ||||||
|  */ |  */ | ||||||
| void notification_print(notification *n); | void notification_print(const struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Replace the two chars where **needle points |  * Replace the two chars where **needle points | ||||||
| @ -162,14 +162,15 @@ void notification_replace_single_field(char **haystack, | |||||||
|                                        char **needle, |                                        char **needle, | ||||||
|                                        const char *replacement, |                                        const char *replacement, | ||||||
|                                        enum markup_mode markup_mode); |                                        enum markup_mode markup_mode); | ||||||
| void notification_update_text_to_render(notification *n); | 
 | ||||||
|  | void notification_update_text_to_render(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * If the notification has exactly one action, or one is marked as default, |  * If the notification has exactly one action, or one is marked as default, | ||||||
|  * invoke it. If there are multiple and no default, open the context menu. If |  * invoke it. If there are multiple and no default, open the context menu. If | ||||||
|  * there are no actions, proceed similarly with urls. |  * there are no actions, proceed similarly with urls. | ||||||
|  */ |  */ | ||||||
| void notification_do_action(notification *n); | void notification_do_action(const struct notification *n); | ||||||
| 
 | 
 | ||||||
| const char *notification_urgency_to_string(const enum urgency urgency); | const char *notification_urgency_to_string(const enum urgency urgency); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										47
									
								
								src/queues.c
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								src/queues.c
									
									
									
									
									
								
							| @ -33,7 +33,7 @@ static GQueue *history   = NULL; /**< history of displayed notifications */ | |||||||
| int next_notification_id = 1; | int next_notification_id = 1; | ||||||
| bool pause_displayed = false; | bool pause_displayed = false; | ||||||
| 
 | 
 | ||||||
| static bool queues_stack_duplicate(notification *n); | static bool queues_stack_duplicate(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| void queues_init(void) | void queues_init(void) | ||||||
| @ -50,7 +50,7 @@ const GList *queues_get_displayed(void) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| const notification *queues_get_head_waiting(void) | const struct notification *queues_get_head_waiting(void) | ||||||
| { | { | ||||||
|         if (waiting->length == 0) |         if (waiting->length == 0) | ||||||
|                 return NULL; |                 return NULL; | ||||||
| @ -91,8 +91,8 @@ static void queues_swap_notifications(GQueue *queueA, | |||||||
|                                       GQueue *queueB, |                                       GQueue *queueB, | ||||||
|                                       GList  *elemB) |                                       GList  *elemB) | ||||||
| { | { | ||||||
|         notification *toB = elemA->data; |         struct notification *toB = elemA->data; | ||||||
|         notification *toA = elemB->data; |         struct notification *toA = elemB->data; | ||||||
| 
 | 
 | ||||||
|         g_queue_delete_link(queueA, elemA); |         g_queue_delete_link(queueA, elemA); | ||||||
|         g_queue_delete_link(queueB, elemB); |         g_queue_delete_link(queueB, elemB); | ||||||
| @ -110,7 +110,7 @@ static void queues_swap_notifications(GQueue *queueA, | |||||||
|  * @param fullscreen True if a fullscreen window is currently active |  * @param fullscreen True if a fullscreen window is currently active | ||||||
|  * @param visible    True if the notification is currently displayed |  * @param visible    True if the notification is currently displayed | ||||||
|  */ |  */ | ||||||
| static bool queues_notification_is_ready(const notification *n, bool fullscreen, bool visible) | static bool queues_notification_is_ready(const struct notification *n, bool fullscreen, bool visible) | ||||||
| { | { | ||||||
|         if (fullscreen && visible) |         if (fullscreen && visible) | ||||||
|                 return n && n->fullscreen != FS_PUSHBACK; |                 return n && n->fullscreen != FS_PUSHBACK; | ||||||
| @ -121,7 +121,7 @@ static bool queues_notification_is_ready(const notification *n, bool fullscreen, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| int queues_notification_insert(notification *n) | int queues_notification_insert(struct notification *n) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|         /* do not display the message, if the message is empty */ |         /* do not display the message, if the message is empty */ | ||||||
| @ -167,13 +167,13 @@ int queues_notification_insert(notification *n) | |||||||
|  * @return true, if notification got stacked |  * @return true, if notification got stacked | ||||||
|  * @return false, if notification did not get stacked |  * @return false, if notification did not get stacked | ||||||
|  */ |  */ | ||||||
| static bool queues_stack_duplicate(notification *n) | static bool queues_stack_duplicate(struct notification *n) | ||||||
| { | { | ||||||
|         GQueue *allqueues[] = { displayed, waiting }; |         GQueue *allqueues[] = { displayed, waiting }; | ||||||
|         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { |         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { | ||||||
|                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); iter; |                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); iter; | ||||||
|                      iter = iter->next) { |                      iter = iter->next) { | ||||||
|                         notification *orig = iter->data; |                         struct notification *orig = iter->data; | ||||||
|                         if (notification_is_duplicate(orig, n)) { |                         if (notification_is_duplicate(orig, n)) { | ||||||
|                                 /* If the progress differs, probably notify-send was used to update the notification
 |                                 /* If the progress differs, probably notify-send was used to update the notification
 | ||||||
|                                  * So only count it as a duplicate, if the progress was not the same. |                                  * So only count it as a duplicate, if the progress was not the same. | ||||||
| @ -201,14 +201,14 @@ static bool queues_stack_duplicate(notification *n) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| bool queues_notification_replace_id(notification *new) | bool queues_notification_replace_id(struct notification *new) | ||||||
| { | { | ||||||
|         GQueue *allqueues[] = { displayed, waiting }; |         GQueue *allqueues[] = { displayed, waiting }; | ||||||
|         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { |         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { | ||||||
|                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); |                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); | ||||||
|                             iter; |                             iter; | ||||||
|                             iter = iter->next) { |                             iter = iter->next) { | ||||||
|                         notification *old = iter->data; |                         struct notification *old = iter->data; | ||||||
|                         if (old->id == new->id) { |                         if (old->id == new->id) { | ||||||
|                                 iter->data = new; |                                 iter->data = new; | ||||||
|                                 new->dup_count = old->dup_count; |                                 new->dup_count = old->dup_count; | ||||||
| @ -222,7 +222,6 @@ bool queues_notification_replace_id(notification *new) | |||||||
|                                 return true; |                                 return true; | ||||||
|                         } |                         } | ||||||
|                 } |                 } | ||||||
| 
 |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
| } | } | ||||||
| @ -230,13 +229,13 @@ bool queues_notification_replace_id(notification *new) | |||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| void queues_notification_close_id(int id, enum reason reason) | void queues_notification_close_id(int id, enum reason reason) | ||||||
| { | { | ||||||
|         notification *target = NULL; |         struct notification *target = NULL; | ||||||
| 
 | 
 | ||||||
|         GQueue *allqueues[] = { displayed, waiting }; |         GQueue *allqueues[] = { displayed, waiting }; | ||||||
|         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { |         for (int i = 0; i < sizeof(allqueues)/sizeof(GList*); i++) { | ||||||
|                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); iter; |                 for (GList *iter = g_queue_peek_head_link(allqueues[i]); iter; | ||||||
|                      iter = iter->next) { |                      iter = iter->next) { | ||||||
|                         notification *n = iter->data; |                         struct notification *n = iter->data; | ||||||
|                         if (n->id == id) { |                         if (n->id == id) { | ||||||
|                                 g_queue_remove(allqueues[i], n); |                                 g_queue_remove(allqueues[i], n); | ||||||
|                                 target = n; |                                 target = n; | ||||||
| @ -254,7 +253,7 @@ void queues_notification_close_id(int id, enum reason reason) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| void queues_notification_close(notification *n, enum reason reason) | void queues_notification_close(struct notification *n, enum reason reason) | ||||||
| { | { | ||||||
|         assert(n != NULL); |         assert(n != NULL); | ||||||
|         queues_notification_close_id(n->id, reason); |         queues_notification_close_id(n->id, reason); | ||||||
| @ -266,7 +265,7 @@ void queues_history_pop(void) | |||||||
|         if (g_queue_is_empty(history)) |         if (g_queue_is_empty(history)) | ||||||
|                 return; |                 return; | ||||||
| 
 | 
 | ||||||
|         notification *n = g_queue_pop_tail(history); |         struct notification *n = g_queue_pop_tail(history); | ||||||
|         n->redisplayed = true; |         n->redisplayed = true; | ||||||
|         n->start = 0; |         n->start = 0; | ||||||
|         n->timeout = settings.sticky_history ? 0 : n->timeout; |         n->timeout = settings.sticky_history ? 0 : n->timeout; | ||||||
| @ -274,11 +273,11 @@ void queues_history_pop(void) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* see queues.h */ | /* see queues.h */ | ||||||
| void queues_history_push(notification *n) | void queues_history_push(struct notification *n) | ||||||
| { | { | ||||||
|         if (!n->history_ignore) { |         if (!n->history_ignore) { | ||||||
|                 if (settings.history_length > 0 && history->length >= settings.history_length) { |                 if (settings.history_length > 0 && history->length >= settings.history_length) { | ||||||
|                         notification *to_free = g_queue_pop_head(history); |                         struct notification *to_free = g_queue_pop_head(history); | ||||||
|                         notification_free(to_free); |                         notification_free(to_free); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| @ -311,7 +310,7 @@ void queues_check_timeouts(bool idle, bool fullscreen) | |||||||
| 
 | 
 | ||||||
|         GList *iter = g_queue_peek_head_link(displayed); |         GList *iter = g_queue_peek_head_link(displayed); | ||||||
|         while (iter) { |         while (iter) { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
| 
 | 
 | ||||||
|                 /*
 |                 /*
 | ||||||
|                  * Update iter to the next item before we either exit the |                  * Update iter to the next item before we either exit the | ||||||
| @ -353,7 +352,7 @@ void queues_update(bool fullscreen) | |||||||
|         if (fullscreen) { |         if (fullscreen) { | ||||||
|                 GList *iter = g_queue_peek_head_link(displayed); |                 GList *iter = g_queue_peek_head_link(displayed); | ||||||
|                 while (iter) { |                 while (iter) { | ||||||
|                         notification *n = iter->data; |                         struct notification *n = iter->data; | ||||||
|                         GList *nextiter = iter->next; |                         GList *nextiter = iter->next; | ||||||
| 
 | 
 | ||||||
|                         if (n->fullscreen == FS_PUSHBACK){ |                         if (n->fullscreen == FS_PUSHBACK){ | ||||||
| @ -378,7 +377,7 @@ void queues_update(bool fullscreen) | |||||||
|         /* move notifications from queue to displayed */ |         /* move notifications from queue to displayed */ | ||||||
|         GList *iter = g_queue_peek_head_link(waiting); |         GList *iter = g_queue_peek_head_link(waiting); | ||||||
|         while (displayed->length < cur_displayed_limit && iter) { |         while (displayed->length < cur_displayed_limit && iter) { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
|                 GList *nextiter = iter->next; |                 GList *nextiter = iter->next; | ||||||
| 
 | 
 | ||||||
|                 if (!n) |                 if (!n) | ||||||
| @ -400,7 +399,7 @@ void queues_update(bool fullscreen) | |||||||
| 
 | 
 | ||||||
|         /* if necessary, push the overhanging notifications from displayed to waiting again */ |         /* if necessary, push the overhanging notifications from displayed to waiting again */ | ||||||
|         while (displayed->length > cur_displayed_limit) { |         while (displayed->length > cur_displayed_limit) { | ||||||
|                 notification *n = g_queue_pop_tail(displayed); |                 struct notification *n = g_queue_pop_tail(displayed); | ||||||
|                 g_queue_insert_sorted(waiting, n, notification_cmp_data, NULL); //TODO: actually it should be on the head if unsorted
 |                 g_queue_insert_sorted(waiting, n, notification_cmp_data, NULL); //TODO: actually it should be on the head if unsorted
 | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -418,7 +417,7 @@ void queues_update(bool fullscreen) | |||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|                         if (i_waiting && notification_cmp(i_displayed->data, i_waiting->data) > 0) { |                         if (i_waiting && notification_cmp(i_displayed->data, i_waiting->data) > 0) { | ||||||
|                                 notification *todisp = i_waiting->data; |                                 struct notification *todisp = i_waiting->data; | ||||||
| 
 | 
 | ||||||
|                                 todisp->start = time_monotonic_now(); |                                 todisp->start = time_monotonic_now(); | ||||||
|                                 notification_run_script(todisp); |                                 notification_run_script(todisp); | ||||||
| @ -438,7 +437,7 @@ gint64 queues_get_next_datachange(gint64 time) | |||||||
| 
 | 
 | ||||||
|         for (GList *iter = g_queue_peek_head_link(displayed); iter; |         for (GList *iter = g_queue_peek_head_link(displayed); iter; | ||||||
|                         iter = iter->next) { |                         iter = iter->next) { | ||||||
|                 notification *n = iter->data; |                 struct notification *n = iter->data; | ||||||
|                 gint64 ttl = n->timeout - (time - n->start); |                 gint64 ttl = n->timeout - (time - n->start); | ||||||
| 
 | 
 | ||||||
|                 if (n->timeout > 0) { |                 if (n->timeout > 0) { | ||||||
| @ -488,7 +487,7 @@ bool queues_pause_status(void) | |||||||
|  */ |  */ | ||||||
| static void teardown_notification(gpointer data) | static void teardown_notification(gpointer data) | ||||||
| { | { | ||||||
|         notification *n = data; |         struct notification *n = data; | ||||||
|         notification_free(n); |         notification_free(n); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								src/queues.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/queues.h
									
									
									
									
									
								
							| @ -30,7 +30,7 @@ const GList *queues_get_displayed(void); | |||||||
|  * |  * | ||||||
|  * @return a notification or NULL, if waiting is empty |  * @return a notification or NULL, if waiting is empty | ||||||
|  */ |  */ | ||||||
| const notification *queues_get_head_waiting(void); | const struct notification *queues_get_head_waiting(void); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Returns the current amount of notifications, |  * Returns the current amount of notifications, | ||||||
| @ -63,7 +63,7 @@ unsigned int queues_length_history(void); | |||||||
|  * @return `0`, the notification was dismissed and freed |  * @return `0`, the notification was dismissed and freed | ||||||
|  * @return The new value of `n->id` |  * @return The new value of `n->id` | ||||||
|  */ |  */ | ||||||
| int queues_notification_insert(notification *n); | int queues_notification_insert(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Replace the notification which matches the id field of |  * Replace the notification which matches the id field of | ||||||
| @ -75,7 +75,7 @@ int queues_notification_insert(notification *n); | |||||||
|  * @return true, if a matching notification has been found and is replaced |  * @return true, if a matching notification has been found and is replaced | ||||||
|  * @return false, else |  * @return false, else | ||||||
|  */ |  */ | ||||||
| bool queues_notification_replace_id(notification *new); | bool queues_notification_replace_id(struct notification *new); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Close the notification that has n->id == id |  * Close the notification that has n->id == id | ||||||
| @ -96,7 +96,7 @@ void queues_notification_close_id(int id, enum reason reason); | |||||||
|  * @param n (transfer full) The notification to close |  * @param n (transfer full) The notification to close | ||||||
|  * @param reason The #reason to close |  * @param reason The #reason to close | ||||||
|  * */ |  * */ | ||||||
| void queues_notification_close(notification *n, enum reason reason); | void queues_notification_close(struct notification *n, enum reason reason); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Pushes the latest notification of history to the displayed queue |  * Pushes the latest notification of history to the displayed queue | ||||||
| @ -110,7 +110,7 @@ void queues_history_pop(void); | |||||||
|  * |  * | ||||||
|  * @param n (transfer full) The notification to push to history |  * @param n (transfer full) The notification to push to history | ||||||
|  */ |  */ | ||||||
| void queues_history_push(notification *n); | void queues_history_push(struct notification *n); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Push all waiting and displayed notifications to history |  * Push all waiting and displayed notifications to history | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ | |||||||
| /*
 | /*
 | ||||||
|  * Apply rule to notification. |  * Apply rule to notification. | ||||||
|  */ |  */ | ||||||
| void rule_apply(struct rule *r, notification *n) | void rule_apply(struct rule *r, struct notification *n) | ||||||
| { | { | ||||||
|         if (r->timeout != -1) |         if (r->timeout != -1) | ||||||
|                 n->timeout = r->timeout; |                 n->timeout = r->timeout; | ||||||
| @ -50,7 +50,7 @@ void rule_apply(struct rule *r, notification *n) | |||||||
| /*
 | /*
 | ||||||
|  * Check all rules if they match n and apply. |  * Check all rules if they match n and apply. | ||||||
|  */ |  */ | ||||||
| void rule_apply_all(notification *n) | void rule_apply_all(struct notification *n) | ||||||
| { | { | ||||||
|         for (GSList *iter = rules; iter; iter = iter->next) { |         for (GSList *iter = rules; iter; iter = iter->next) { | ||||||
|                 struct rule *r = iter->data; |                 struct rule *r = iter->data; | ||||||
| @ -89,7 +89,7 @@ void rule_init(struct rule *r) | |||||||
| /*
 | /*
 | ||||||
|  * Check whether rule should be applied to n. |  * Check whether rule should be applied to n. | ||||||
|  */ |  */ | ||||||
| bool rule_matches_notification(struct rule *r, notification *n) | bool rule_matches_notification(struct rule *r, struct notification *n) | ||||||
| { | { | ||||||
|         return   ( (!r->appname  || (n->appname  && !fnmatch(r->appname,  n->appname, 0))) |         return   ( (!r->appname  || (n->appname  && !fnmatch(r->appname,  n->appname, 0))) | ||||||
|                 && (!r->summary  || (n->summary  && !fnmatch(r->summary,  n->summary, 0))) |                 && (!r->summary  || (n->summary  && !fnmatch(r->summary,  n->summary, 0))) | ||||||
|  | |||||||
| @ -37,9 +37,9 @@ struct rule { | |||||||
| extern GSList *rules; | extern GSList *rules; | ||||||
| 
 | 
 | ||||||
| void rule_init(struct rule *r); | void rule_init(struct rule *r); | ||||||
| void rule_apply(struct rule *r, notification *n); | void rule_apply(struct rule *r, struct notification *n); | ||||||
| void rule_apply_all(notification *n); | void rule_apply_all(struct notification *n); | ||||||
| bool rule_matches_notification(struct rule *r, notification *n); | bool rule_matches_notification(struct rule *r, struct notification *n); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | ||||||
|  | |||||||
| @ -411,7 +411,7 @@ static void x_handle_click(XEvent ev) | |||||||
| 
 | 
 | ||||||
|         if (act == MOUSE_DO_ACTION || act == MOUSE_CLOSE_CURRENT) { |         if (act == MOUSE_DO_ACTION || act == MOUSE_CLOSE_CURRENT) { | ||||||
|                 int y = settings.separator_height; |                 int y = settings.separator_height; | ||||||
|                 notification *n = NULL; |                 struct notification *n = NULL; | ||||||
|                 int first = true; |                 int first = true; | ||||||
|                 for (const GList *iter = queues_get_displayed(); iter; |                 for (const GList *iter = queues_get_displayed(); iter; | ||||||
|                      iter = iter->next) { |                      iter = iter->next) { | ||||||
|  | |||||||
| @ -5,8 +5,9 @@ | |||||||
| 
 | 
 | ||||||
| #include <glib.h> | #include <glib.h> | ||||||
| 
 | 
 | ||||||
| TEST test_notification_is_duplicate_field(char **field, notification *a, | TEST test_notification_is_duplicate_field(char **field, | ||||||
|                                           notification *b) |                                           struct notification *a, | ||||||
|  |                                           struct notification *b) | ||||||
| { | { | ||||||
|         ASSERT(notification_is_duplicate(a, b)); |         ASSERT(notification_is_duplicate(a, b)); | ||||||
|         char *tmp = *field; |         char *tmp = *field; | ||||||
| @ -19,9 +20,9 @@ TEST test_notification_is_duplicate_field(char **field, notification *a, | |||||||
| 
 | 
 | ||||||
| TEST test_notification_is_duplicate(void *notifications) | TEST test_notification_is_duplicate(void *notifications) | ||||||
| { | { | ||||||
|         notification **n = (notification**)notifications; |         struct notification **n = (struct notification**)notifications; | ||||||
|         notification *a = n[0]; |         struct notification *a = n[0]; | ||||||
|         notification *b = n[1]; |         struct notification *b = n[1]; | ||||||
| 
 | 
 | ||||||
|         ASSERT(notification_is_duplicate(a, b)); |         ASSERT(notification_is_duplicate(a, b)); | ||||||
| 
 | 
 | ||||||
| @ -102,18 +103,18 @@ SUITE(suite_notification) | |||||||
|         cmdline_load(0, NULL); |         cmdline_load(0, NULL); | ||||||
|         load_settings("data/dunstrc.default"); |         load_settings("data/dunstrc.default"); | ||||||
| 
 | 
 | ||||||
|         notification *a = notification_create(); |         struct notification *a = notification_create(); | ||||||
|         a->appname = "Test"; |         a->appname = "Test"; | ||||||
|         a->summary = "Summary"; |         a->summary = "Summary"; | ||||||
|         a->body = "Body"; |         a->body = "Body"; | ||||||
|         a->icon = "Icon"; |         a->icon = "Icon"; | ||||||
|         a->urgency = URG_NORM; |         a->urgency = URG_NORM; | ||||||
| 
 | 
 | ||||||
|         notification *b = notification_create(); |         struct notification *b = notification_create(); | ||||||
|         memcpy(b, a, sizeof(*b)); |         memcpy(b, a, sizeof(*b)); | ||||||
| 
 | 
 | ||||||
|         //2 equal notifications to be passed for duplicate checking,
 |         //2 equal notifications to be passed for duplicate checking,
 | ||||||
|         notification *n[2] = {a, b}; |         struct notification *n[2] = {a, b}; | ||||||
| 
 | 
 | ||||||
|         RUN_TEST1(test_notification_is_duplicate, (void*) n); |         RUN_TEST1(test_notification_is_duplicate, (void*) n); | ||||||
|         g_free(a); |         g_free(a); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Benedikt Heine
						Benedikt Heine