char * guess_icon_from_exec (GtkIconTheme *icon_theme, GKeyFile *key_file) { char *exec; char *icon_name; char *path; exec = panel_key_file_get_string (key_file, "Exec"); if (!exec || !exec [0]) { g_free (exec); return NULL; } icon_name = g_path_get_basename (exec); g_free (exec); path = panel_find_icon (icon_theme, icon_name, 48); if (!path) { g_free (icon_name); return NULL; } return icon_name; }
static void panel_properties_dialog_setup_icon_entry (PanelPropertiesDialog *dialog, GladeXML *gui) { char *custom_icon; dialog->icon_align = glade_xml_get_widget (gui, "icon_align"); g_return_if_fail (dialog->icon_align != NULL); dialog->icon_entry = glade_xml_get_widget (gui, "icon_entry"); g_return_if_fail (dialog->icon_entry != NULL); dialog->icon_label = glade_xml_get_widget (gui, "icon_label"); g_return_if_fail (dialog->icon_label != NULL); dialog->icon_theme_dir = NULL; custom_icon = panel_profile_get_attached_custom_icon (dialog->toplevel); if (custom_icon != NULL && ! g_path_is_absolute (custom_icon)) { /* if the icon is not absolute path name it comes from the theme, and as such we wish to store the theme directory where it comes from. See bug #119209 */ char *icon; icon = panel_find_icon (gtk_icon_theme_get_default (), custom_icon, 48); if (icon != NULL) dialog->icon_theme_dir = g_path_get_dirname (icon); g_free (custom_icon); custom_icon = icon; } gnome_icon_entry_set_filename (GNOME_ICON_ENTRY (dialog->icon_entry), custom_icon); g_free (custom_icon); if (dialog->icon_theme_dir == NULL) { /* use the default pixmap directory as the standard icon_theme_dir, * since the standard directory is themed */ g_object_get (G_OBJECT (dialog->icon_entry), "pixmap_subdir", &(dialog->icon_theme_dir), NULL); } g_signal_connect_swapped (dialog->icon_entry, "changed", G_CALLBACK (panel_properties_dialog_icon_changed), dialog); if (!panel_profile_is_writable_attached_custom_icon (dialog->toplevel)) { gtk_widget_set_sensitive (dialog->icon_entry, FALSE); gtk_widget_set_sensitive (dialog->icon_label, FALSE); gtk_widget_show (dialog->writability_warn_general); } }
char * panel_find_icon (GtkIconTheme *icon_theme, const char *icon_name, gint size) { GtkIconInfo *info; char *retval; char *icon_no_extension; if (icon_name == NULL || strcmp (icon_name, "") == 0) return NULL; if (g_path_is_absolute (icon_name)) { if (g_file_test (icon_name, G_FILE_TEST_EXISTS)) { return g_strdup (icon_name); } else { char *basename; basename = g_path_get_basename (icon_name); retval = panel_find_icon (icon_theme, basename, size); g_free (basename); return retval; } } /* This is needed because some .desktop files have an icon name *and* * an extension as icon */ icon_no_extension = panel_xdg_icon_remove_extension (icon_name); info = gtk_icon_theme_lookup_icon (icon_theme, icon_no_extension, size, 0); g_free (icon_no_extension); if (info) { retval = g_strdup (gtk_icon_info_get_filename (info)); #if GTK_CHECK_VERSION (3, 8, 0) g_object_unref (info); #else gtk_icon_info_free (info); #endif } else retval = NULL; return retval; }
GdkPixbuf * panel_load_icon (GtkIconTheme *icon_theme, const char *icon_name, int size, int desired_width, int desired_height, char **error_msg) { GdkPixbuf *retval; char *file; GError *error; g_return_val_if_fail (error_msg == NULL || *error_msg == NULL, NULL); file = panel_find_icon (icon_theme, icon_name, size); if (!file) { if (error_msg) *error_msg = g_strdup_printf (_("Icon '%s' not found"), icon_name); return NULL; } error = NULL; retval = gdk_pixbuf_new_from_file_at_size (file, desired_width, desired_height, &error); if (error) { if (error_msg) *error_msg = g_strdup (error->message); g_error_free (error); } g_free (file); return retval; }
GdkPixbuf * panel_make_menu_icon (GtkIconTheme *icon_theme, const char *icon, const char *fallback, int size, gboolean *long_operation) { GdkPixbuf *pb; char *file, *key; gboolean loaded; g_return_val_if_fail (size > 0, NULL); file = NULL; if (icon != NULL) file = panel_find_icon (icon_theme, icon, size); if (file == NULL && fallback != NULL) file = panel_find_icon (icon_theme, fallback, size); if (file == NULL) return NULL; if (long_operation != NULL) *long_operation = TRUE; pb = NULL; loaded = FALSE; key = g_strdup_printf ("%d:%s", size, file); if (loaded_icons != NULL && (pb = g_hash_table_lookup (loaded_icons, key)) != NULL) { if (pb != NULL) g_object_ref (G_OBJECT (pb)); } if (pb == NULL) { pb = gdk_pixbuf_new_from_file (file, NULL); if (pb) { gint width, height; width = gdk_pixbuf_get_width (pb); height = gdk_pixbuf_get_height (pb); /* if we want 24 and we get 22, do nothing; * else scale */ if (!(size - 2 <= width && width <= size && size - 2 <= height && height <= size)) { GdkPixbuf *tmp; tmp = gdk_pixbuf_scale_simple (pb, size, size, GDK_INTERP_BILINEAR); g_object_unref (pb); pb = tmp; } } /* add icon to the hash table so we don't load it again */ loaded = TRUE; } if (pb == NULL) { g_free (file); g_free (key); return NULL; } if (loaded && (gdk_pixbuf_get_width (pb) != size && gdk_pixbuf_get_height (pb) != size)) { GdkPixbuf *pb2; int dest_width; int dest_height; int width; int height; width = gdk_pixbuf_get_width (pb); height = gdk_pixbuf_get_height (pb); if (height > width) { dest_width = (size * width) / height; dest_height = size; } else { dest_width = size; dest_height = (size * height) / width; } pb2 = gdk_pixbuf_scale_simple (pb, dest_width, dest_height, GDK_INTERP_BILINEAR); g_object_unref (G_OBJECT (pb)); pb = pb2; } if (loaded) { if (loaded_icons == NULL) loaded_icons = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); g_hash_table_replace (loaded_icons, g_strdup (key), g_object_ref (G_OBJECT (pb))); g_object_weak_ref (G_OBJECT (pb), (GWeakNotify) remove_pixmap_from_loaded, g_strdup (key)); } else { /* we didn't load from disk */ if (long_operation != NULL) *long_operation = FALSE; } g_free (file); g_free (key); return pb; }