summaryrefslogtreecommitdiff
path: root/src/ui/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/ui.c')
-rw-r--r--src/ui/ui.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 44c72938..4935f77c 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <cairo-xlib.h>
+#include <gio/gdesktopappinfo.h>
static void meta_ui_accelerator_parse(const char* accel, guint* keysym, guint* keycode, GdkModifierType* keymask);
@@ -647,6 +648,79 @@ meta_ui_get_default_mini_icon (MetaUI *ui)
return default_icon;
}
+static GdkPixbuf *
+load_window_icon_from_name (char *name, int size, int scale)
+{
+ GtkIconTheme *theme = gtk_icon_theme_get_default ();
+ GdkPixbuf *pixbuf = NULL;
+
+ /* If the res_name window property maps to an icon, use that */
+ pixbuf = gtk_icon_theme_load_icon_for_scale (theme, name, size, scale, GTK_ICON_LOOKUP_FORCE_SIZE, NULL);
+ if (pixbuf != NULL)
+ return pixbuf;
+
+ char ***results;
+ gchar *desktop_id = NULL;
+ gint i, j;
+ GDesktopAppInfo *info;
+ GIcon *gicon;
+ GtkIconInfo *icon_info;
+
+ /* Find a proper desktop file based on the window property name */
+ results = g_desktop_app_info_search (name);
+
+ for (i = 0; results[i]; i++)
+ {
+ for (j = 0; results[i][j]; j++)
+ {
+ /* We are only interested in the top ranking result, so we use that and free up the rest */
+ if (desktop_id == NULL)
+ desktop_id = g_strdup(results[i][j]);
+ }
+ g_strfreev (results[i]);
+ }
+ g_free (results);
+
+ if (desktop_id == NULL)
+ return NULL;
+
+ /* Now that we have the desktop file ID, we extract the icon from it and render it */
+ info = g_desktop_app_info_new (desktop_id);
+ gicon = g_app_info_get_icon (G_APP_INFO (info));
+ icon_info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, gicon, size, scale, GTK_ICON_LOOKUP_FORCE_SIZE);
+
+ pixbuf = gtk_icon_info_load_icon (icon_info, NULL);
+
+ g_object_unref (icon_info);
+ g_free (desktop_id);
+
+ return pixbuf;
+}
+
+GdkPixbuf*
+meta_ui_get_window_icon_from_name (MetaUI *ui, char *name)
+{
+ int scale;
+ int size;
+
+ scale = gtk_widget_get_scale_factor (GTK_WIDGET (ui->frames));
+ size = meta_prefs_get_icon_size() / scale;
+
+ return load_window_icon_from_name (name, size, scale);
+}
+
+GdkPixbuf*
+meta_ui_get_mini_icon_from_name (MetaUI *ui, char *name)
+{
+ int scale;
+ int size;
+
+ scale = gtk_widget_get_scale_factor (GTK_WIDGET (ui->frames));
+ size = META_MINI_ICON_WIDTH / scale;
+
+ return load_window_icon_from_name (name, size, scale);
+}
+
gboolean
meta_ui_window_should_not_cause_focus (Display *xdisplay,
Window xwindow)