commit
						6d0e20e40b
					
				
							
								
								
									
										93
									
								
								src/dbus.c
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								src/dbus.c
									
									
									
									
									
								
							| @ -124,7 +124,7 @@ static void on_get_capabilities(GDBusConnection *connection, | ||||
|                 g_variant_builder_add(builder, "s", "body-markup"); | ||||
| 
 | ||||
|         value = g_variant_new("(as)", builder); | ||||
|         g_variant_builder_unref(builder); | ||||
|         g_clear_pointer(&builder, g_variant_builder_unref); | ||||
|         g_dbus_method_invocation_return_value(invocation, value); | ||||
| 
 | ||||
|         g_dbus_connection_flush(connection, NULL, NULL, NULL); | ||||
| @ -133,23 +133,10 @@ static void on_get_capabilities(GDBusConnection *connection, | ||||
| static notification *dbus_message_to_notification(const gchar *sender, GVariant *parameters) | ||||
| { | ||||
| 
 | ||||
|         gchar *appname = NULL; | ||||
|         guint replaces_id = 0; | ||||
|         gchar *icon = NULL; | ||||
|         gchar *summary = NULL; | ||||
|         gchar *body = NULL; | ||||
|         Actions *actions = g_malloc0(sizeof(Actions)); | ||||
|         gint timeout = -1; | ||||
|         notification *n = notification_create(); | ||||
| 
 | ||||
|         /* hints */ | ||||
|         gint urgency = 1; | ||||
|         gint progress = -1; | ||||
|         gboolean transient = 0; | ||||
|         gchar *fgcolor = NULL; | ||||
|         gchar *bgcolor = NULL; | ||||
|         gchar *frcolor = NULL; | ||||
|         gchar *category = NULL; | ||||
|         RawImage *raw_icon = NULL; | ||||
|         n->actions = g_malloc0(sizeof(Actions)); | ||||
|         n->dbus_client = g_strdup(sender); | ||||
| 
 | ||||
|         { | ||||
|                 GVariantIter *iter = g_variant_iter_new(parameters); | ||||
| @ -161,65 +148,65 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant | ||||
|                         switch (idx) { | ||||
|                         case 0: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING)) | ||||
|                                         appname = g_variant_dup_string(content, NULL); | ||||
|                                         n->appname = g_variant_dup_string(content, NULL); | ||||
|                                 break; | ||||
|                         case 1: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_UINT32)) | ||||
|                                         replaces_id = g_variant_get_uint32(content); | ||||
|                                         n->id = g_variant_get_uint32(content); | ||||
|                                 break; | ||||
|                         case 2: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING)) | ||||
|                                         icon = g_variant_dup_string(content, NULL); | ||||
|                                         n->icon = g_variant_dup_string(content, NULL); | ||||
|                                 break; | ||||
|                         case 3: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING)) | ||||
|                                         summary = g_variant_dup_string(content, NULL); | ||||
|                                         n->summary = g_variant_dup_string(content, NULL); | ||||
|                                 break; | ||||
|                         case 4: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING)) | ||||
|                                         body = g_variant_dup_string(content, NULL); | ||||
|                                         n->body = g_variant_dup_string(content, NULL); | ||||
|                                 break; | ||||
|                         case 5: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING_ARRAY)) | ||||
|                                         actions->actions = g_variant_dup_strv(content, &(actions->count)); | ||||
|                                         n->actions->actions = g_variant_dup_strv(content, &(n->actions->count)); | ||||
|                                 break; | ||||
|                         case 6: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_DICTIONARY)) { | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "urgency", G_VARIANT_TYPE_BYTE); | ||||
|                                         if (dict_value) { | ||||
|                                                 urgency = g_variant_get_byte(dict_value); | ||||
|                                                 n->urgency = g_variant_get_byte(dict_value); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "fgcolor", G_VARIANT_TYPE_STRING); | ||||
|                                         if (dict_value) { | ||||
|                                                 fgcolor = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 n->colors[ColFG] = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "bgcolor", G_VARIANT_TYPE_STRING); | ||||
|                                         if (dict_value) { | ||||
|                                                 bgcolor = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 n->colors[ColBG] = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "frcolor", G_VARIANT_TYPE_STRING); | ||||
|                                         if (dict_value) { | ||||
|                                                 frcolor = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 n->colors[ColFrame] = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "category", G_VARIANT_TYPE_STRING); | ||||
|                                         if (dict_value) { | ||||
|                                                 category = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 n->category = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         dict_value = g_variant_lookup_value(content, "image-path", G_VARIANT_TYPE_STRING); | ||||
|                                         if (dict_value) { | ||||
|                                                 g_free(icon); | ||||
|                                                 icon = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_free(n->icon); | ||||
|                                                 n->icon = g_variant_dup_string(dict_value, NULL); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
| @ -229,7 +216,7 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant | ||||
|                                         if (!dict_value) | ||||
|                                                 dict_value = g_variant_lookup_value(content, "icon_data", G_VARIANT_TYPE("(iiibiiay)")); | ||||
|                                         if (dict_value) { | ||||
|                                                 raw_icon = get_raw_image_from_data_hint(dict_value); | ||||
|                                                 n->raw_icon = get_raw_image_from_data_hint(dict_value); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
| @ -240,28 +227,28 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant | ||||
|                                          * So let's check for int and boolean until notify-send is fixed. | ||||
|                                          */ | ||||
|                                         if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_BOOLEAN))) { | ||||
|                                                 transient = g_variant_get_boolean(dict_value); | ||||
|                                                 n->transient = g_variant_get_boolean(dict_value); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } else if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_UINT32))) { | ||||
|                                                 transient = g_variant_get_uint32(dict_value) > 0; | ||||
|                                                 n->transient = g_variant_get_uint32(dict_value) > 0; | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } else if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_INT32))) { | ||||
|                                                 transient = g_variant_get_int32(dict_value) > 0; | ||||
|                                                 n->transient = g_variant_get_int32(dict_value) > 0; | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
| 
 | ||||
|                                         if((dict_value = g_variant_lookup_value(content, "value", G_VARIANT_TYPE_INT32))) { | ||||
|                                                 progress = g_variant_get_int32(dict_value); | ||||
|                                                 n->progress = g_variant_get_int32(dict_value); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } else if((dict_value = g_variant_lookup_value(content, "value", G_VARIANT_TYPE_UINT32))) { | ||||
|                                                 progress = g_variant_get_uint32(dict_value); | ||||
|                                                 n->progress = g_variant_get_uint32(dict_value); | ||||
|                                                 g_variant_unref(dict_value); | ||||
|                                         } | ||||
|                                 } | ||||
|                                 break; | ||||
|                         case 7: | ||||
|                                 if (g_variant_is_of_type(content, G_VARIANT_TYPE_INT32)) | ||||
|                                         timeout = g_variant_get_int32(content); | ||||
|                                         n->timeout = g_variant_get_int32(content) * 1000; | ||||
|                                 break; | ||||
|                         } | ||||
|                         g_variant_unref(content); | ||||
| @ -273,30 +260,8 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant | ||||
| 
 | ||||
|         fflush(stdout); | ||||
| 
 | ||||
|         notification *n = notification_create(); | ||||
| 
 | ||||
|         n->id = replaces_id; | ||||
|         n->appname = appname; | ||||
|         n->summary = summary; | ||||
|         n->body = body; | ||||
|         n->icon = icon; | ||||
|         n->raw_icon = raw_icon; | ||||
|         n->timeout = timeout < 0 ? -1 : timeout * 1000; | ||||
|         n->progress = progress; | ||||
|         n->urgency = urgency; | ||||
|         n->category = category; | ||||
|         n->dbus_client = g_strdup(sender); | ||||
|         n->transient = transient; | ||||
| 
 | ||||
|         if (actions->count < 1) { | ||||
|                 actions_free(actions); | ||||
|                 actions = NULL; | ||||
|         } | ||||
|         n->actions = actions; | ||||
| 
 | ||||
|         n->colors[ColFG] = fgcolor; | ||||
|         n->colors[ColBG] = bgcolor; | ||||
|         n->colors[ColFrame] = frcolor; | ||||
|         if (n->actions->count < 1) | ||||
|                 g_clear_pointer(&n->actions, actions_free); | ||||
| 
 | ||||
|         notification_init(n); | ||||
|         return n; | ||||
| @ -484,8 +449,7 @@ static int dbus_get_fdn_daemon_info(GDBusConnection  *connection, | ||||
| 
 | ||||
|         if (error) { | ||||
|                 /* Ignore the error, we may still be able to retrieve the PID */ | ||||
|                 g_error_free(error); | ||||
|                 error = NULL; | ||||
|                 g_clear_pointer(&error, g_error_free); | ||||
|         } else { | ||||
|                 g_variant_get(daemoninfo, "(ssss)", name, vendor, NULL, NULL); | ||||
|         } | ||||
| @ -617,8 +581,7 @@ int initdbus(void) | ||||
| 
 | ||||
| void dbus_tear_down(int owner_id) | ||||
| { | ||||
|         if (introspection_data) | ||||
|                 g_dbus_node_info_unref(introspection_data); | ||||
|         g_clear_pointer(&introspection_data, g_dbus_node_info_unref); | ||||
| 
 | ||||
|         g_bus_unown_name(owner_id); | ||||
| } | ||||
|  | ||||
| @ -625,10 +625,11 @@ void draw(void) | ||||
| 
 | ||||
|         bool first = true; | ||||
|         for (GSList *iter = layouts; iter; iter = iter->next) { | ||||
|                 if (iter->next) | ||||
|                         dim = layout_render(image_surface, iter->data, iter->next->data, dim, first, iter->next == NULL); | ||||
|                 else | ||||
|                         dim = layout_render(image_surface, iter->data, NULL, dim, first, iter->next == NULL); | ||||
| 
 | ||||
|                 colored_layout *cl_this = iter->data; | ||||
|                 colored_layout *cl_next = iter->next ? iter->next->data : NULL; | ||||
| 
 | ||||
|                 dim = layout_render(image_surface, cl_this, cl_next, dim, first, !cl_next); | ||||
| 
 | ||||
|                 first = false; | ||||
|         } | ||||
|  | ||||
| @ -176,7 +176,7 @@ int dunst_main(int argc, char *argv[]) | ||||
| 
 | ||||
|         run(NULL); | ||||
|         g_main_loop_run(mainloop); | ||||
|         g_main_loop_unref(mainloop); | ||||
|         g_clear_pointer(&mainloop, g_main_loop_unref); | ||||
| 
 | ||||
|         /* remove signal handler watches */ | ||||
|         g_source_remove(pause_src); | ||||
|  | ||||
							
								
								
									
										12
									
								
								src/markup.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/markup.c
									
									
									
									
									
								
							| @ -13,7 +13,7 @@ | ||||
| 
 | ||||
| static char *markup_quote(char *str) | ||||
| { | ||||
|         assert(str != NULL); | ||||
|         assert(str); | ||||
| 
 | ||||
|         str = string_replace_all("&", "&", str); | ||||
|         str = string_replace_all("\"", """, str); | ||||
| @ -26,7 +26,7 @@ static char *markup_quote(char *str) | ||||
| 
 | ||||
| static char *markup_unquote(char *str) | ||||
| { | ||||
|         assert(str != NULL); | ||||
|         assert(str); | ||||
| 
 | ||||
|         str = string_replace_all(""", "\"", str); | ||||
|         str = string_replace_all("'", "'", str); | ||||
| @ -39,7 +39,7 @@ static char *markup_unquote(char *str) | ||||
| 
 | ||||
| static char *markup_br2nl(char *str) | ||||
| { | ||||
|         assert(str != NULL); | ||||
|         assert(str); | ||||
| 
 | ||||
|         str = string_replace_all("<br>", "\n", str); | ||||
|         str = string_replace_all("<br/>", "\n", str); | ||||
| @ -230,9 +230,8 @@ void markup_strip_img(char **str, char **urls) | ||||
|  */ | ||||
| char *markup_strip(char *str) | ||||
| { | ||||
|         if (str == NULL) { | ||||
|         if (!str) | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
|         /* strip all tags */ | ||||
|         string_strip_delimited(str, '<', '>'); | ||||
| @ -249,9 +248,8 @@ char *markup_strip(char *str) | ||||
|  */ | ||||
| char *markup_transform(char *str, enum markup_mode markup_mode) | ||||
| { | ||||
|         if (str == NULL) { | ||||
|         if (!str) | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
|         switch (markup_mode) { | ||||
|         case MARKUP_NULL: | ||||
|  | ||||
| @ -193,7 +193,7 @@ void dispatch_menu_result(const char *input) | ||||
|  */ | ||||
| void context_menu(void) | ||||
| { | ||||
|         if (settings.dmenu_cmd == NULL) { | ||||
|         if (!settings.dmenu_cmd) { | ||||
|                 LOG_C("Unable to open dmenu: No dmenu command set."); | ||||
|                 return; | ||||
|         } | ||||
|  | ||||
| @ -42,10 +42,7 @@ const char *enum_to_string_fullscreen(enum behavior_fullscreen in) | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * print a human readable representation | ||||
|  * of the given notification to stdout. | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_print(notification *n) | ||||
| { | ||||
|         //TODO: use logging info for this
 | ||||
| @ -64,6 +61,7 @@ void notification_print(notification *n) | ||||
|         printf("\tbg: %s\n", n->colors[ColBG]); | ||||
|         printf("\tframe: %s\n", n->colors[ColFrame]); | ||||
|         printf("\tfullscreen: %s\n", enum_to_string_fullscreen(n->fullscreen)); | ||||
|         printf("\tprogress: %d\n", n->progress); | ||||
|         printf("\tid: %d\n", n->id); | ||||
|         if (n->urls) { | ||||
|                 char *urls = string_replace_all("\n", "\t\t\n", g_strdup(n->urls)); | ||||
| @ -88,19 +86,16 @@ void notification_print(notification *n) | ||||
|         printf("}\n"); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Run the script associated with the | ||||
|  * given notification. | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_run_script(notification *n) | ||||
| { | ||||
|         if (!n->script || strlen(n->script) < 1) | ||||
|                 return; | ||||
| 
 | ||||
|         char *appname = n->appname ? n->appname : ""; | ||||
|         char *summary = n->summary ? n->summary : ""; | ||||
|         char *body = n->body ? n->body : ""; | ||||
|         char *icon = n->icon ? n->icon : ""; | ||||
|         const char *appname = n->appname ? n->appname : ""; | ||||
|         const char *summary = n->summary ? n->summary : ""; | ||||
|         const char *body = n->body ? n->body : ""; | ||||
|         const char *icon = n->icon ? n->icon : ""; | ||||
| 
 | ||||
|         const char *urgency = notification_urgency_to_string(n->urgency); | ||||
| 
 | ||||
| @ -133,7 +128,7 @@ void notification_run_script(notification *n) | ||||
| /*
 | ||||
|  * Helper function to convert an urgency to a string | ||||
|  */ | ||||
| const char *notification_urgency_to_string(enum urgency urgency) | ||||
| const char *notification_urgency_to_string(const enum urgency urgency) | ||||
| { | ||||
|         switch (urgency) { | ||||
|         case URG_NONE: | ||||
| @ -149,18 +144,9 @@ const char *notification_urgency_to_string(enum urgency urgency) | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Helper function to compare to given | ||||
|  * notifications. | ||||
|  */ | ||||
| int notification_cmp(const void *va, const void *vb) | ||||
| /* see notification.h */ | ||||
| int notification_cmp(const notification *a, const notification *b) | ||||
| { | ||||
|         notification *a = (notification *) va; | ||||
|         notification *b = (notification *) vb; | ||||
| 
 | ||||
|         if (!settings.sort) | ||||
|                 return 1; | ||||
| 
 | ||||
|         if (a->urgency != b->urgency) { | ||||
|                 return b->urgency - a->urgency; | ||||
|         } else { | ||||
| @ -168,20 +154,23 @@ int notification_cmp(const void *va, const void *vb) | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Wrapper for notification_cmp to match glib's | ||||
|  * compare functions signature. | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| int notification_cmp_data(const void *va, const void *vb, void *data) | ||||
| { | ||||
|         return notification_cmp(va, vb); | ||||
|         notification *a = (notification *) va; | ||||
|         notification *b = (notification *) vb; | ||||
| 
 | ||||
|         if (!settings.sort) | ||||
|                 return 1; | ||||
| 
 | ||||
|         return notification_cmp(a, b); | ||||
| } | ||||
| 
 | ||||
| int notification_is_duplicate(const notification *a, const notification *b) | ||||
| { | ||||
|         //Comparing raw icons is not supported, assume they are not identical
 | ||||
|         if (settings.icon_position != icons_off | ||||
|                 && (a->raw_icon != NULL || b->raw_icon != NULL)) | ||||
|                 && (a->raw_icon || b->raw_icon)) | ||||
|                 return false; | ||||
| 
 | ||||
|         return strcmp(a->appname, b->appname) == 0 | ||||
| @ -191,10 +180,7 @@ int notification_is_duplicate(const notification *a, const notification *b) | ||||
|             && a->urgency == b->urgency; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Free the actions element | ||||
|  * @a: (nullable): Pointer to #Actions | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void actions_free(Actions *a) | ||||
| { | ||||
|         if (!a) | ||||
| @ -205,10 +191,7 @@ void actions_free(Actions *a) | ||||
|         g_free(a); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Free a #RawImage | ||||
|  * @i: (nullable): pointer to #RawImage | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void rawimage_free(RawImage *i) | ||||
| { | ||||
|         if (!i) | ||||
| @ -218,12 +201,12 @@ void rawimage_free(RawImage *i) | ||||
|         g_free(i); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Free the memory used by the given notification. | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_free(notification *n) | ||||
| { | ||||
|         assert(n != NULL); | ||||
|         if (!n) | ||||
|                 return; | ||||
| 
 | ||||
|         g_free(n->appname); | ||||
|         g_free(n->summary); | ||||
|         g_free(n->body); | ||||
| @ -243,14 +226,7 @@ void notification_free(notification *n) | ||||
|         g_free(n); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Replace the two chars where **needle points | ||||
|  * with a quoted "replacement", according to the markup settings. | ||||
|  * | ||||
|  * The needle is a double pointer and gets updated upon return | ||||
|  * to point to the first char, which occurs after replacement. | ||||
|  * | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_replace_single_field(char **haystack, | ||||
|                                        char **needle, | ||||
|                                        const char *replacement, | ||||
| @ -274,14 +250,7 @@ void notification_replace_single_field(char **haystack, | ||||
|         g_free(input); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Create notification struct and initialise all fields with either | ||||
|  *  - the default (if it's not needed to be freed later) | ||||
|  *  - its undefined representation (NULL, -1) | ||||
|  * | ||||
|  * This function is guaranteed to return a valid pointer. | ||||
|  * @Returns: The generated notification | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| notification *notification_create(void) | ||||
| { | ||||
|         notification *n = g_malloc0(sizeof(notification)); | ||||
| @ -304,12 +273,7 @@ notification *notification_create(void) | ||||
|         return n; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Sanitize values of notification, apply all matching rules | ||||
|  * and generate derived fields. | ||||
|  * | ||||
|  * @n: the notification to sanitize | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_init(notification *n) | ||||
| { | ||||
|         /* default to empty string to avoid further NULL faults */ | ||||
| @ -557,11 +521,7 @@ void notification_update_text_to_render(notification *n) | ||||
|         n->text_to_render = buf; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * 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 | ||||
|  * there are no actions, proceed similarly with urls. | ||||
|  */ | ||||
| /* see notification.h */ | ||||
| void notification_do_action(notification *n) | ||||
| { | ||||
|         if (n->actions) { | ||||
| @ -578,10 +538,10 @@ void notification_do_action(notification *n) | ||||
|                 context_menu(); | ||||
| 
 | ||||
|         } else if (n->urls) { | ||||
|                 if (strstr(n->urls, "\n") == NULL) | ||||
|                         open_browser(n->urls); | ||||
|                 else | ||||
|                 if (strstr(n->urls, "\n")) | ||||
|                         context_menu(); | ||||
|                 else | ||||
|                         open_browser(n->urls); | ||||
|         } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -84,24 +84,90 @@ typedef struct _notification { | ||||
|         char *urls;           /**< urllist delimited by '\\n' */ | ||||
| } notification; | ||||
| 
 | ||||
| /**
 | ||||
|  * Create notification struct and initialise all fields with either | ||||
|  *  - the default (if it's not needed to be freed later) | ||||
|  *  - its undefined representation (NULL, -1) | ||||
|  * | ||||
|  * This function is guaranteed to return a valid pointer. | ||||
|  * @returns The generated notification | ||||
|  */ | ||||
| notification *notification_create(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Sanitize values of notification, apply all matching rules | ||||
|  * and generate derived fields. | ||||
|  * | ||||
|  * @param n: the notification to sanitize | ||||
|  */ | ||||
| void notification_init(notification *n); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free the actions structure | ||||
|  * | ||||
|  * @param a (nullable): Pointer to #Actions | ||||
|  */ | ||||
| void actions_free(Actions *a); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free a #RawImage | ||||
|  * | ||||
|  * @param i (nullable): pointer to #RawImage | ||||
|  */ | ||||
| void rawimage_free(RawImage *i); | ||||
| 
 | ||||
| /**
 | ||||
|  * Free the memory used by the given notification. | ||||
|  * | ||||
|  * @param n (nullable): pointer to #notification | ||||
|  */ | ||||
| void notification_free(notification *n); | ||||
| int notification_cmp(const void *a, const void *b); | ||||
| int notification_cmp_data(const void *a, const void *b, void *data); | ||||
| 
 | ||||
| /**
 | ||||
|  * Helper function to compare two given notifications. | ||||
|  */ | ||||
| int notification_cmp(const notification *a, const notification *b); | ||||
| 
 | ||||
| /**
 | ||||
|  * Wrapper for notification_cmp to match glib's | ||||
|  * compare functions signature. | ||||
|  */ | ||||
| int notification_cmp_data(const void *va, const void *vb, void *data); | ||||
| 
 | ||||
| int notification_is_duplicate(const notification *a, const notification *b); | ||||
| 
 | ||||
| /**
 | ||||
|  * Run the script associated with the | ||||
|  * given notification. | ||||
|  */ | ||||
| void notification_run_script(notification *n); | ||||
| /**
 | ||||
|  * print a human readable representation | ||||
|  * of the given notification to stdout. | ||||
|  */ | ||||
| void notification_print(notification *n); | ||||
| 
 | ||||
| /**
 | ||||
|  * Replace the two chars where **needle points | ||||
|  * with a quoted "replacement", according to the markup settings. | ||||
|  * | ||||
|  * The needle is a double pointer and gets updated upon return | ||||
|  * to point to the first char, which occurs after replacement. | ||||
|  */ | ||||
| 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); | ||||
| 
 | ||||
| /**
 | ||||
|  * 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 | ||||
|  * there are no actions, proceed similarly with urls. | ||||
|  */ | ||||
| void notification_do_action(notification *n); | ||||
| 
 | ||||
| const char *notification_urgency_to_string(enum urgency urgency); | ||||
| const char *notification_urgency_to_string(const enum urgency urgency); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the string representation for fullscreen behavior | ||||
|  | ||||
| @ -66,9 +66,8 @@ void free_ini(void) | ||||
|                 g_free(sections[i].entries); | ||||
|                 g_free(sections[i].name); | ||||
|         } | ||||
|         g_free(sections); | ||||
|         g_clear_pointer(§ions, g_free); | ||||
|         section_count = 0; | ||||
|         sections = NULL; | ||||
| } | ||||
| 
 | ||||
| section_t *get_section(const char *name) | ||||
| @ -84,9 +83,8 @@ section_t *get_section(const char *name) | ||||
| void add_entry(const char *section_name, const char *key, const char *value) | ||||
| { | ||||
|         section_t *s = get_section(section_name); | ||||
|         if (s == NULL) { | ||||
|         if (!s) | ||||
|                 s = new_section(section_name); | ||||
|         } | ||||
| 
 | ||||
|         s->entry_count++; | ||||
|         int len = s->entry_count; | ||||
| @ -139,19 +137,19 @@ gint64 ini_get_time(const char *section, const char *key, gint64 def) | ||||
| int ini_get_int(const char *section, const char *key, int def) | ||||
| { | ||||
|         const char *value = get_value(section, key); | ||||
|         if (value == NULL) | ||||
|                 return def; | ||||
|         else | ||||
|         if (value) | ||||
|                 return atoi(value); | ||||
|         else | ||||
|                 return def; | ||||
| } | ||||
| 
 | ||||
| double ini_get_double(const char *section, const char *key, double def) | ||||
| { | ||||
|         const char *value = get_value(section, key); | ||||
|         if (value == NULL) | ||||
|                 return def; | ||||
|         else | ||||
|         if (value) | ||||
|                 return atof(value); | ||||
|         else | ||||
|                 return def; | ||||
| } | ||||
| 
 | ||||
| bool ini_is_set(const char *ini_section, const char *ini_key) | ||||
| @ -164,9 +162,8 @@ const char *next_section(const char *section) | ||||
|         if (section_count == 0) | ||||
|                 return NULL; | ||||
| 
 | ||||
|         if (section == NULL) { | ||||
|         if (!section) | ||||
|                 return sections[0].name; | ||||
|         } | ||||
| 
 | ||||
|         for (int i = 0; i < section_count; i++) { | ||||
|                 if (strcmp(section, sections[i].name) == 0) { | ||||
| @ -182,9 +179,7 @@ const char *next_section(const char *section) | ||||
| int ini_get_bool(const char *section, const char *key, int def) | ||||
| { | ||||
|         const char *value = get_value(section, key); | ||||
|         if (value == NULL) | ||||
|                 return def; | ||||
|         else { | ||||
|         if (value) { | ||||
|                 switch (value[0]) { | ||||
|                 case 'y': | ||||
|                 case 'Y': | ||||
| @ -201,6 +196,8 @@ int ini_get_bool(const char *section, const char *key, int def) | ||||
|                 default: | ||||
|                         return def; | ||||
|                 } | ||||
|         } else { | ||||
|                 return def; | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| @ -351,10 +348,10 @@ char *cmdline_get_string(const char *key, const char *def, const char *descripti | ||||
| 
 | ||||
|         if (str) | ||||
|                 return g_strdup(str); | ||||
|         if (def == NULL) | ||||
|                 return NULL; | ||||
|         else | ||||
|         if (def) | ||||
|                 return g_strdup(def); | ||||
|         else | ||||
|                 return NULL; | ||||
| } | ||||
| 
 | ||||
| char *cmdline_get_path(const char *key, const char *def, const char *description) | ||||
| @ -386,10 +383,10 @@ int cmdline_get_int(const char *key, int def, const char *description) | ||||
|         cmdline_usage_append(key, "int", description); | ||||
|         const char *str = cmdline_get_value(key); | ||||
| 
 | ||||
|         if (str == NULL) | ||||
|                 return def; | ||||
|         else | ||||
|         if (str) | ||||
|                 return atoi(str); | ||||
|         else | ||||
|                 return def; | ||||
| } | ||||
| 
 | ||||
| double cmdline_get_double(const char *key, double def, const char *description) | ||||
| @ -397,10 +394,10 @@ double cmdline_get_double(const char *key, double def, const char *description) | ||||
|         cmdline_usage_append(key, "double", description); | ||||
|         const char *str = cmdline_get_value(key); | ||||
| 
 | ||||
|         if (str == NULL) | ||||
|                 return def; | ||||
|         else | ||||
|         if (str) | ||||
|                 return atof(str); | ||||
|         else | ||||
|                 return def; | ||||
| } | ||||
| 
 | ||||
| int cmdline_get_bool(const char *key, int def, const char *description) | ||||
|  | ||||
| @ -27,8 +27,7 @@ void rule_apply(rule_t *r, notification *n) | ||||
|         if (r->new_icon) { | ||||
|                 g_free(n->icon); | ||||
|                 n->icon = g_strdup(r->new_icon); | ||||
|                 rawimage_free(n->raw_icon); | ||||
|                 n->raw_icon = NULL; | ||||
|                 g_clear_pointer(&n->raw_icon, rawimage_free); | ||||
|         } | ||||
|         if (r->fg) { | ||||
|                 g_free(n->colors[ColFG]); | ||||
|  | ||||
| @ -77,7 +77,7 @@ void load_settings(char *cmdline_config_path) | ||||
| 
 | ||||
|         xdgInitHandle(&xdg); | ||||
| 
 | ||||
|         if (cmdline_config_path != NULL) { | ||||
|         if (cmdline_config_path) { | ||||
|                 if (0 == strcmp(cmdline_config_path, "-")) { | ||||
|                         config_file = stdin; | ||||
|                 } else { | ||||
| @ -88,14 +88,14 @@ void load_settings(char *cmdline_config_path) | ||||
|                         DIE("Cannot find config file: '%s'", cmdline_config_path); | ||||
|                 } | ||||
|         } | ||||
|         if (config_file == NULL) { | ||||
|         if (!config_file) { | ||||
|                 config_file = xdgConfigOpen("dunst/dunstrc", "r", &xdg); | ||||
|         } | ||||
|         if (config_file == NULL) { | ||||
|         if (!config_file) { | ||||
|                 /* Fall back to just "dunstrc", which was used before 2013-06-23
 | ||||
|                  * (before v0.2). */ | ||||
|                 config_file = xdgConfigOpen("dunstrc", "r", &xdg); | ||||
|                 if (config_file == NULL) { | ||||
|                 if (!config_file) { | ||||
|                         LOG_W("No dunstrc found."); | ||||
|                         xdgWipeHandle(&xdg); | ||||
|                 } | ||||
| @ -669,7 +669,7 @@ void load_settings(char *cmdline_config_path) | ||||
|                                 r = match; | ||||
|                 } | ||||
| 
 | ||||
|                 if (r == NULL) { | ||||
|                 if (!r) { | ||||
|                         r = g_malloc(sizeof(rule_t)); | ||||
|                         rule_init(r); | ||||
|                         rules = g_slist_insert(rules, r, -1); | ||||
| @ -689,7 +689,7 @@ void load_settings(char *cmdline_config_path) | ||||
|                                 "markup", NULL | ||||
|                         ); | ||||
| 
 | ||||
|                         if (c != NULL) { | ||||
|                         if (c) { | ||||
|                                 r->markup = parse_markup_mode(c); | ||||
|                                 g_free(c); | ||||
|                         } | ||||
|  | ||||
| @ -14,7 +14,7 @@ | ||||
| char *string_replace_char(char needle, char replacement, char *haystack) | ||||
| { | ||||
|         char *current = haystack; | ||||
|         while ((current = strchr(current, needle)) != NULL) | ||||
|         while ((current = strchr(current, needle))) | ||||
|                 *current++ = replacement; | ||||
|         return haystack; | ||||
| } | ||||
| @ -49,9 +49,8 @@ char *string_replace(const char *needle, const char *replacement, char *haystack | ||||
| { | ||||
|         char *start; | ||||
|         start = strstr(haystack, needle); | ||||
|         if (start == NULL) { | ||||
|         if (!start) | ||||
|                 return haystack; | ||||
|         } | ||||
| 
 | ||||
|         return string_replace_at(haystack, (start - haystack), strlen(needle), replacement); | ||||
| } | ||||
| @ -70,7 +69,7 @@ char *string_replace_all(const char *needle, const char *replacement, char *hays | ||||
|         start = strstr(haystack, needle); | ||||
|         repl_len = strlen(replacement); | ||||
| 
 | ||||
|         while (start != NULL) { | ||||
|         while (start) { | ||||
|                 needle_pos = start - haystack; | ||||
|                 haystack = string_replace_at(haystack, needle_pos, needle_len, replacement); | ||||
|                 start = strstr(haystack + needle_pos + repl_len, needle); | ||||
|  | ||||
| @ -46,7 +46,7 @@ static double get_xft_dpi_value(void) | ||||
|                 XrmInitialize(); | ||||
|                 char *xRMS = XResourceManagerString(xctx.dpy); | ||||
| 
 | ||||
|                 if (xRMS == NULL) { | ||||
|                 if (!xRMS) { | ||||
|                         dpi = 0; | ||||
|                         return 0; | ||||
|                 } | ||||
| @ -144,10 +144,13 @@ static int autodetect_dpi(screen_info *scr) | ||||
| 
 | ||||
| void screen_check_event(XEvent event) | ||||
| { | ||||
|         if (event.type == randr_event_base + RRScreenChangeNotify) | ||||
|         if (event.type == randr_event_base + RRScreenChangeNotify) { | ||||
|                 LOG_D("XEvent: processing 'RRScreenChangeNotify'"); | ||||
|                 randr_update(); | ||||
|         else | ||||
|                 LOG_D("XEvent: Ignored '%d'", event.type); | ||||
| 
 | ||||
|         } else { | ||||
|                 LOG_D("XEvent: Ignoring '%d'", event.type); | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| void xinerama_update(void) | ||||
|  | ||||
							
								
								
									
										12
									
								
								src/x11/x.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/x11/x.c
									
									
									
									
									
								
							| @ -274,21 +274,23 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer | ||||
|         unsigned int state; | ||||
|         while (XPending(xctx.dpy) > 0) { | ||||
|                 XNextEvent(xctx.dpy, &ev); | ||||
|                 LOG_D("XEvent: processing '%d'", ev.type); | ||||
| 
 | ||||
|                 switch (ev.type) { | ||||
|                 case Expose: | ||||
|                         LOG_D("XEvent: processing 'Expose'"); | ||||
|                         if (ev.xexpose.count == 0 && win->visible) { | ||||
|                                 draw(); | ||||
|                         } | ||||
|                         break; | ||||
|                 case ButtonRelease: | ||||
|                         LOG_D("XEvent: processing 'ButtonRelease'"); | ||||
|                         if (ev.xbutton.window == win->xwin) { | ||||
|                                 x_handle_click(ev); | ||||
|                                 wake_up(); | ||||
|                         } | ||||
|                         break; | ||||
|                 case KeyPress: | ||||
|                         LOG_D("XEvent: processing 'KeyPress'"); | ||||
|                         state = ev.xkey.state; | ||||
|                         /* NumLock is also encoded in the state. Remove it. */ | ||||
|                         state &= ~x_numlock_mod(); | ||||
| @ -325,15 +327,21 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer | ||||
|                         } | ||||
|                         break; | ||||
|                 case FocusIn: | ||||
|                         LOG_D("XEvent: processing 'FocusIn'"); | ||||
|                         wake_up(); | ||||
|                         break; | ||||
|                 case FocusOut: | ||||
|                         LOG_D("XEvent: processing 'FocusOut'"); | ||||
|                         wake_up(); | ||||
|                         break; | ||||
|                 case CreateNotify: | ||||
|                         LOG_D("XEvent: processing 'CreateNotify'"); | ||||
|                         if (win->visible && | ||||
|                             ev.xcreatewindow.override_redirect == 0) | ||||
|                                 XRaiseWindow(xctx.dpy, win->xwin); | ||||
|                         break; | ||||
|                 case PropertyNotify: | ||||
|                         LOG_D("XEvent: processing 'PropertyNotify'"); | ||||
|                         fullscreen_now = have_fullscreen_window(); | ||||
|                         scr = get_active_screen(); | ||||
| 
 | ||||
| @ -815,7 +823,7 @@ static void x_shortcut_ungrab(keyboard_shortcut *ks) | ||||
|  */ | ||||
| static void x_shortcut_init(keyboard_shortcut *ks) | ||||
| { | ||||
|         if (ks == NULL || ks->str == NULL) | ||||
|         if (!ks|| !ks->str) | ||||
|                 return; | ||||
| 
 | ||||
|         if (!strcmp(ks->str, "none") || (!strcmp(ks->str, ""))) { | ||||
|  | ||||
| @ -279,7 +279,7 @@ TEST test_option_get_bool(void) | ||||
| SUITE(suite_option_parser) | ||||
| { | ||||
|         FILE *config_file = fopen("data/test-ini", "r"); | ||||
|         if (config_file == NULL) { | ||||
|         if (!config_file) { | ||||
|                 fputs("\nTest config file 'data/test-ini' couldn't be opened, failing.\n", stderr); | ||||
|                 exit(1); | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Nikos Tsipinakis
						Nikos Tsipinakis