summaryrefslogtreecommitdiff
path: root/shell/mate-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/mate-utils.c')
-rw-r--r--shell/mate-utils.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/shell/mate-utils.c b/shell/mate-utils.c
new file mode 100644
index 00000000..e42d02c4
--- /dev/null
+++ b/shell/mate-utils.c
@@ -0,0 +1,82 @@
+#include "mate-utils.h"
+
+#include <string.h>
+
+gboolean
+load_image_by_id (GtkImage *image, GtkIconSize size, const gchar *image_id)
+{
+ cairo_surface_t *surface;
+ gint width;
+ gint height;
+ gint scale_factor;
+
+ GtkIconTheme *icon_theme;
+
+ gchar *id;
+
+ gboolean icon_exists;
+
+ if (!image_id)
+ return FALSE;
+
+ id = g_strdup (image_id);
+ scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (image));
+
+ gtk_icon_size_lookup (size, &width, &height);
+ gtk_image_set_pixel_size (image, width);
+
+ if (g_path_is_absolute (id))
+ {
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gdk_pixbuf_new_from_file_at_size (id, width * scale_factor, height * scale_factor, NULL);
+
+ icon_exists = (pixbuf != NULL);
+
+ if (icon_exists)
+ {
+ surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale_factor, NULL);
+ gtk_image_set_from_surface (image, surface);
+
+ cairo_surface_destroy (surface);
+ g_object_unref (pixbuf);
+ }
+ else
+ gtk_image_set_from_icon_name (image, "image-missing", size);
+ }
+ else
+ {
+ if ( /* file extensions are not copesetic with loading by "name" */
+ g_str_has_suffix (id, ".png") ||
+ g_str_has_suffix (id, ".svg") ||
+ g_str_has_suffix (id, ".xpm")
+ )
+
+ id[strlen (id) - 4] = '\0';
+
+ if (gtk_widget_has_screen (GTK_WIDGET (image)))
+ icon_theme =
+ gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET
+ (image)));
+ else
+ icon_theme = gtk_icon_theme_get_default ();
+
+ surface = gtk_icon_theme_load_surface (icon_theme, id,
+ width, scale_factor,
+ NULL,
+ GTK_ICON_LOOKUP_FORCE_SIZE,
+ NULL);
+ icon_exists = (surface != NULL);
+ if (icon_exists) {
+ gtk_image_set_from_surface (image, surface);
+ cairo_surface_destroy (surface);
+ }
+ else
+ gtk_image_set_from_icon_name (image, "image-missing", size);
+
+ }
+
+ g_free (id);
+
+ return icon_exists;
+}