From 4faa9cbaaa640279dc67243a84f149ea926fe406 Mon Sep 17 00:00:00 2001 From: Nikos Tsipinakis Date: Sun, 25 Mar 2018 15:53:42 +0300 Subject: [PATCH] Isolate GdkPixbuf usage to icon.c Cleans up the clutter in draw and since only a single icon function is called externally from icon.c it'll make things easier if we ever decide to switch icon libraries. --- src/draw.c | 32 +------------------------------- src/icon.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/icon.h | 8 ++++++++ 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/draw.c b/src/draw.c index 1c4cee2..47af2f9 100644 --- a/src/draw.c +++ b/src/draw.c @@ -267,38 +267,8 @@ static colored_layout *layout_init_shared(cairo_t *c, notification *n) pango_layout_set_ellipsize(cl->l, ellipsize); } - GdkPixbuf *pixbuf = NULL; - if (settings.icon_position != icons_off) { - if (n->raw_icon) - pixbuf = get_pixbuf_from_raw_image(n->raw_icon); - else if (n->icon) - pixbuf = get_pixbuf_from_icon(n->icon); - } - - if (pixbuf != NULL) { - int w = gdk_pixbuf_get_width(pixbuf); - int h = gdk_pixbuf_get_height(pixbuf); - int larger = w > h ? w : h; - if (settings.max_icon_size && larger > settings.max_icon_size) { - GdkPixbuf *scaled; - if (w >= h) { - scaled = gdk_pixbuf_scale_simple(pixbuf, - settings.max_icon_size, - (int) ((double) settings.max_icon_size / w * h), - GDK_INTERP_BILINEAR); - } else { - scaled = gdk_pixbuf_scale_simple(pixbuf, - (int) ((double) settings.max_icon_size / h * w), - settings.max_icon_size, - GDK_INTERP_BILINEAR); - } - g_object_unref(pixbuf); - pixbuf = scaled; - } - - cl->icon = gdk_pixbuf_to_cairo_surface(pixbuf); - g_object_unref(pixbuf); + cl->icon = icon_get_for_notification(n); } else { cl->icon = NULL; } diff --git a/src/icon.c b/src/icon.c index 2d2bd44..9685940 100644 --- a/src/icon.c +++ b/src/icon.c @@ -138,4 +138,44 @@ GdkPixbuf *get_pixbuf_from_raw_image(const RawImage *raw_image) return pixbuf; } + +cairo_surface_t *icon_get_for_notification(const notification *n) +{ + GdkPixbuf *pixbuf; + + if (n->raw_icon) + pixbuf = get_pixbuf_from_raw_image(n->raw_icon); + else if (n->icon) + pixbuf = get_pixbuf_from_icon(n->icon); + else + return NULL; + + if (!pixbuf) + return NULL; + + int w = gdk_pixbuf_get_width(pixbuf); + int h = gdk_pixbuf_get_height(pixbuf); + int larger = w > h ? w : h; + if (settings.max_icon_size && larger > settings.max_icon_size) { + GdkPixbuf *scaled; + if (w >= h) { + scaled = gdk_pixbuf_scale_simple(pixbuf, + settings.max_icon_size, + (int) ((double) settings.max_icon_size / w * h), + GDK_INTERP_BILINEAR); + } else { + scaled = gdk_pixbuf_scale_simple(pixbuf, + (int) ((double) settings.max_icon_size / h * w), + settings.max_icon_size, + GDK_INTERP_BILINEAR); + } + g_object_unref(pixbuf); + pixbuf = scaled; + } + + cairo_surface_t *ret = gdk_pixbuf_to_cairo_surface(pixbuf); + g_object_unref(pixbuf); + return ret; +} + /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ diff --git a/src/icon.h b/src/icon.h index dcd6f3d..c314465 100644 --- a/src/icon.h +++ b/src/icon.h @@ -22,5 +22,13 @@ GdkPixbuf *get_pixbuf_from_icon(const char *iconname); */ GdkPixbuf *get_pixbuf_from_raw_image(const RawImage *raw_image); +/** + * Get a cairo surface with the appropriate icon for the notification, scaled + * according to the current settings + * + * @return a cairo_surface_t pointer or NULL if no icon could be retrieved. + */ +cairo_surface_t *icon_get_for_notification(const notification *n); + #endif /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */