Scale images down if they exceed a certain size
This commit is contained in:
parent
ad2aef6606
commit
342a23548f
96
x.c
96
x.c
@ -304,36 +304,21 @@ static cairo_surface_t *gdk_pixbuf_to_cairo_surface(const GdkPixbuf *pixbuf)
|
|||||||
return icon_surface;
|
return icon_surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cairo_surface_t *get_icon_surface_from_file(const char *icon_path)
|
static GdkPixbuf *get_pixbuf_from_file(const char *icon_path)
|
||||||
{
|
{
|
||||||
cairo_surface_t *icon_surface = NULL;
|
GdkPixbuf *pixbuf;
|
||||||
if (is_readable_file(icon_path)) {
|
if (is_readable_file(icon_path)) {
|
||||||
char *img_type;
|
GError *error = NULL;
|
||||||
img_type = get_filename_ext(icon_path);
|
pixbuf = gdk_pixbuf_new_from_file(icon_path, &error);
|
||||||
if (strcmp(img_type, "png") == 0) {
|
if (pixbuf == NULL)
|
||||||
icon_surface = cairo_image_surface_create_from_png(icon_path);
|
g_free(error);
|
||||||
} else {
|
|
||||||
GdkPixbuf *pixbuf;
|
|
||||||
GError *error = NULL;
|
|
||||||
pixbuf = gdk_pixbuf_new_from_file(icon_path, &error);
|
|
||||||
if (pixbuf != NULL) {
|
|
||||||
icon_surface = gdk_pixbuf_to_cairo_surface(pixbuf);
|
|
||||||
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;
|
return pixbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cairo_surface_t *get_icon_surface_from_path(char *icon_path)
|
static GdkPixbuf *get_pixbuf_from_path(char *icon_path)
|
||||||
{
|
{
|
||||||
cairo_surface_t *icon_surface = NULL;
|
GdkPixbuf *pixbuf = NULL;
|
||||||
gchar *uri_path = NULL;
|
gchar *uri_path = NULL;
|
||||||
if (strlen(icon_path) > 0 && settings.icon_position != icons_off) {
|
if (strlen(icon_path) > 0 && settings.icon_position != icons_off) {
|
||||||
if (g_str_has_prefix(icon_path, "file://")) {
|
if (g_str_has_prefix(icon_path, "file://")) {
|
||||||
@ -344,10 +329,10 @@ static cairo_surface_t *get_icon_surface_from_path(char *icon_path)
|
|||||||
}
|
}
|
||||||
/* absolute path? */
|
/* absolute path? */
|
||||||
if (icon_path[0] == '/' || icon_path[0] == '~') {
|
if (icon_path[0] == '/' || icon_path[0] == '~') {
|
||||||
icon_surface = get_icon_surface_from_file(icon_path);
|
pixbuf = get_pixbuf_from_file(icon_path);
|
||||||
}
|
}
|
||||||
/* search in icon_folders */
|
/* search in icon_folders */
|
||||||
if (icon_surface == NULL) {
|
if (pixbuf == NULL) {
|
||||||
char *start = settings.icon_folders,
|
char *start = settings.icon_folders,
|
||||||
*end, *current_folder, *maybe_icon_path;
|
*end, *current_folder, *maybe_icon_path;
|
||||||
do {
|
do {
|
||||||
@ -358,16 +343,16 @@ static cairo_surface_t *get_icon_surface_from_path(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 = get_icon_surface_from_file(maybe_icon_path);
|
pixbuf = get_pixbuf_from_file(maybe_icon_path);
|
||||||
free(maybe_icon_path);
|
free(maybe_icon_path);
|
||||||
if (icon_surface != NULL) {
|
if (pixbuf != NULL) {
|
||||||
return icon_surface;
|
return pixbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = end + 1;
|
start = end + 1;
|
||||||
} while (*(end) != '\0');
|
} while (*(end) != '\0');
|
||||||
}
|
}
|
||||||
if (icon_surface == NULL) {
|
if (pixbuf == NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Could not load icon: '%s'\n", icon_path);
|
"Could not load icon: '%s'\n", icon_path);
|
||||||
}
|
}
|
||||||
@ -375,12 +360,11 @@ static cairo_surface_t *get_icon_surface_from_path(char *icon_path)
|
|||||||
g_free(uri_path);
|
g_free(uri_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return icon_surface;
|
return pixbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cairo_surface_t *get_icon_surface_from_raw_image(const RawImage *raw_image)
|
static GdkPixbuf *get_pixbuf_from_raw_image(const RawImage *raw_image)
|
||||||
{
|
{
|
||||||
cairo_surface_t *icon_surface = NULL;
|
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_data(raw_image->data,
|
pixbuf = gdk_pixbuf_new_from_data(raw_image->data,
|
||||||
@ -393,11 +377,7 @@ static cairo_surface_t *get_icon_surface_from_raw_image(const RawImage *raw_imag
|
|||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (pixbuf != NULL) {
|
return pixbuf;
|
||||||
icon_surface = gdk_pixbuf_to_cairo_surface(pixbuf);
|
|
||||||
g_object_unref(pixbuf);
|
|
||||||
}
|
|
||||||
return icon_surface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static colored_layout *r_init_shared(cairo_t *c, notification *n)
|
static colored_layout *r_init_shared(cairo_t *c, notification *n)
|
||||||
@ -412,10 +392,40 @@ static colored_layout *r_init_shared(cairo_t *c, notification *n)
|
|||||||
pango_layout_set_ellipsize(cl->l, PANGO_ELLIPSIZE_MIDDLE);
|
pango_layout_set_ellipsize(cl->l, PANGO_ELLIPSIZE_MIDDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n->icon) {
|
GdkPixbuf *pixbuf;
|
||||||
cl->icon = get_icon_surface_from_path(n->icon);
|
|
||||||
} else if (n->raw_icon) {
|
if (n->raw_icon) {
|
||||||
cl->icon = get_icon_surface_from_raw_image(n->raw_icon);
|
pixbuf = get_pixbuf_from_raw_image(n->raw_icon);
|
||||||
|
} else if (n->icon) {
|
||||||
|
pixbuf = get_pixbuf_from_path(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;
|
||||||
|
int max_size = 24;
|
||||||
|
if (larger > max_size) {
|
||||||
|
if (w >= h) {
|
||||||
|
pixbuf = gdk_pixbuf_scale_simple(pixbuf,
|
||||||
|
max_size, (int) ((double) max_size / w * h),
|
||||||
|
GDK_INTERP_BILINEAR);
|
||||||
|
} else {
|
||||||
|
pixbuf = gdk_pixbuf_scale_simple(pixbuf,
|
||||||
|
(int) ((double) max_size / h * w), max_size,
|
||||||
|
GDK_INTERP_BILINEAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cl->icon = gdk_pixbuf_to_cairo_surface(pixbuf);
|
||||||
|
g_object_unref(pixbuf);
|
||||||
|
} else {
|
||||||
|
cl->icon = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cairo_surface_status(cl->icon) != CAIRO_STATUS_SUCCESS) {
|
||||||
|
cairo_surface_destroy(cl->icon);
|
||||||
|
cl->icon = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cl->fg = x_string_to_color_t(n->color_strings[ColFG]);
|
cl->fg = x_string_to_color_t(n->color_strings[ColFG]);
|
||||||
@ -599,7 +609,7 @@ void x_win_draw(void)
|
|||||||
int width = dim.w;
|
int width = dim.w;
|
||||||
int height = dim.h;
|
int height = dim.h;
|
||||||
|
|
||||||
if ((have_dynamic_width() || settings.shrink) && settings.align != left) {
|
if ((have_dynamic_width() || settings.shrink) && settings.align != left) {
|
||||||
r_update_layouts_width(layouts, width);
|
r_update_layouts_width(layouts, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user