Added support for more image formats for icons ( see knopwob/dunst#150 )
This commit is contained in:
		
							parent
							
								
									f60131258a
								
							
						
					
					
						commit
						b6f56be97b
					
				| @ -27,7 +27,7 @@ CFLAGS   += -g --std=gnu99 -pedantic -Wall -Wno-overlength-strings -Os ${STATIC} | |||||||
| 
 | 
 | ||||||
| pkg_config_packs := dbus-1 x11 freetype2 xext xft xscrnsaver \
 | pkg_config_packs := dbus-1 x11 freetype2 xext xft xscrnsaver \
 | ||||||
|                     "glib-2.0 >= 2.36" gio-2.0 \
 |                     "glib-2.0 >= 2.36" gio-2.0 \
 | ||||||
|                     pango cairo pangocairo |                     pango cairo pangocairo gdk-2.0 | ||||||
| 
 | 
 | ||||||
| # check if we need libxdg-basedir
 | # check if we need libxdg-basedir
 | ||||||
| ifeq (,$(findstring STATIC_CONFIG,$(CFLAGS))) | ifeq (,$(findstring STATIC_CONFIG,$(CFLAGS))) | ||||||
|  | |||||||
							
								
								
									
										68
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								x.c
									
									
									
									
									
								
							| @ -14,6 +14,7 @@ | |||||||
| #include <X11/Xatom.h> | #include <X11/Xatom.h> | ||||||
| #include <pango/pangocairo.h> | #include <pango/pangocairo.h> | ||||||
| #include <cairo-xlib.h> | #include <cairo-xlib.h> | ||||||
|  | #include <gdk/gdk.h> | ||||||
| 
 | 
 | ||||||
| #include "x.h" | #include "x.h" | ||||||
| #include "utils.h" | #include "utils.h" | ||||||
| @ -191,6 +192,17 @@ static bool have_dynamic_width(void) | |||||||
|         return (xctx.geometry.mask & WidthValue && xctx.geometry.w == 0); |         return (xctx.geometry.mask & WidthValue && xctx.geometry.w == 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static bool is_readable_file(const char *filename) | ||||||
|  | { | ||||||
|  |         return (access(filename, R_OK) != -1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const char *get_filename_ext(const char *filename) { | ||||||
|  |         const char *dot = strrchr(filename, '.'); | ||||||
|  |         if(!dot || dot == filename) return ""; | ||||||
|  |         return dot + 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static dimension_t calculate_dimensions(GSList *layouts) | static dimension_t calculate_dimensions(GSList *layouts) | ||||||
| { | { | ||||||
|         dimension_t dim; |         dimension_t dim; | ||||||
| @ -274,6 +286,47 @@ static dimension_t calculate_dimensions(GSList *layouts) | |||||||
|         return dim; |         return dim; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static cairo_surface_t *get_icon_surface_from_file(const char *icon_path) | ||||||
|  | { | ||||||
|  |         cairo_surface_t *icon_surface = NULL; | ||||||
|  |         if (is_readable_file(icon_path)) { | ||||||
|  |                 char *img_type; | ||||||
|  |                 img_type = get_filename_ext(icon_path); | ||||||
|  |                 if (strcmp(img_type, "png") == 0) { | ||||||
|  |                         icon_surface = cairo_image_surface_create_from_png(icon_path); | ||||||
|  |                 } else { | ||||||
|  |                         GdkPixbuf *pixbuf; | ||||||
|  |                         GError *error = NULL; | ||||||
|  |                         cairo_t *cr; | ||||||
|  |                         cairo_format_t format; | ||||||
|  |                         double width, height; | ||||||
|  |                         pixbuf = gdk_pixbuf_new_from_file(icon_path, &error); | ||||||
|  |                         if (pixbuf != NULL) { | ||||||
|  |                                 if (gdk_pixbuf_get_has_alpha(pixbuf)) { | ||||||
|  |                                         format = CAIRO_FORMAT_ARGB32; | ||||||
|  |                                 } else { | ||||||
|  |                                         format = CAIRO_FORMAT_RGB24; | ||||||
|  |                                 } | ||||||
|  |                                 width = gdk_pixbuf_get_width(pixbuf); | ||||||
|  |                                 height = gdk_pixbuf_get_height(pixbuf); | ||||||
|  |                                 icon_surface = cairo_image_surface_create(format, width, height); | ||||||
|  |                                 cr = cairo_create(icon_surface); | ||||||
|  |                                 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); | ||||||
|  |                                 cairo_paint(cr); | ||||||
|  |                                 free(cr); | ||||||
|  |                                 g_object_unref(pixbuf); | ||||||
|  |                         } else { | ||||||
|  |                             g_free(error); | ||||||
|  |                         } | ||||||
|  |                 } | ||||||
|  |                 if (cairo_surface_status(icon_surface) != CAIRO_STATUS_SUCCESS) { | ||||||
|  |                         cairo_surface_destroy(icon_surface); | ||||||
|  |                         icon_surface = NULL; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |         return icon_surface; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static cairo_surface_t *get_icon_surface(char *icon_path) | static cairo_surface_t *get_icon_surface(char *icon_path) | ||||||
| { | { | ||||||
|         cairo_surface_t *icon_surface = NULL; |         cairo_surface_t *icon_surface = NULL; | ||||||
| @ -287,11 +340,7 @@ static cairo_surface_t *get_icon_surface(char *icon_path) | |||||||
|                 } |                 } | ||||||
|                 /* absolute path? */ |                 /* absolute path? */ | ||||||
|                 if (icon_path[0] == '/' || icon_path[0] == '~') { |                 if (icon_path[0] == '/' || icon_path[0] == '~') { | ||||||
|                         icon_surface = cairo_image_surface_create_from_png(icon_path); |                         icon_surface = get_icon_surface_from_file(icon_path); | ||||||
|                         if (cairo_surface_status(icon_surface) != CAIRO_STATUS_SUCCESS) { |  | ||||||
|                                 cairo_surface_destroy(icon_surface); |  | ||||||
|                                 icon_surface = NULL; |  | ||||||
|                         } |  | ||||||
|                 } |                 } | ||||||
|                 /* search in icon_folders */ |                 /* search in icon_folders */ | ||||||
|                 if (icon_surface == NULL) { |                 if (icon_surface == NULL) { | ||||||
| @ -305,13 +354,10 @@ static cairo_surface_t *get_icon_surface(char *icon_path) | |||||||
|                                 maybe_icon_path = g_strconcat(current_folder, "/", icon_path, ".png", NULL); |                                 maybe_icon_path = g_strconcat(current_folder, "/", icon_path, ".png", NULL); | ||||||
|                                 free(current_folder); |                                 free(current_folder); | ||||||
| 
 | 
 | ||||||
|                                 icon_surface = cairo_image_surface_create_from_png(maybe_icon_path); |                                 icon_surface = get_icon_surface_from_file(maybe_icon_path); | ||||||
|                                 free(maybe_icon_path); |                                 free(maybe_icon_path); | ||||||
|                                 if (cairo_surface_status(icon_surface) == CAIRO_STATUS_SUCCESS) { |                                 if (icon_surface != NULL) { | ||||||
|                                         return icon_surface; |                                     return icon_surface; | ||||||
|                                 } else { |  | ||||||
|                                         cairo_surface_destroy(icon_surface); |  | ||||||
|                                         icon_surface = NULL; |  | ||||||
|                                 } |                                 } | ||||||
| 
 | 
 | ||||||
|                                 start = end + 1; |                                 start = end + 1; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Andrew Krasichkov
						Andrew Krasichkov