--- gnome-panel-2.10.2/gnome-panel/panel-util.c.kdeicons 2005-08-04 17:48:52.048223404 +0200 +++ gnome-panel-2.10.2/gnome-panel/panel-util.c 2005-08-04 18:49:14.537995877 +0200 @@ -18,6 +18,7 @@ #include <string.h> #include <unistd.h> #include <sys/types.h> +#include <dirent.h> #include <glib/gi18n.h> #include <libgnome/gnome-util.h> @@ -527,6 +528,110 @@ return ret; } +static char *kde_icondir = NULL; +static GSList *crystalsvg_kde_48 = NULL; +static GSList *crystalsvg_kde_32 = NULL; +static GSList *crystalsvg_kde_22 = NULL; +static GSList *crystalsvg_kde_16 = NULL; + +static GSList * +add_dirs (GSList *list, const char *dirname) +{ + DIR *dir; + struct dirent *dent; + + dir = opendir (dirname); + if (dir == NULL) + return list; + + list = g_slist_prepend (list, g_strdup (dirname)); + + while ((dent = readdir (dir)) != NULL) { + char *full; + + /* skip hidden and self/parent references */ + if (dent->d_name[0] == '.') + continue; + + full = g_build_filename (dirname, dent->d_name, NULL); + if (g_file_test (full, G_FILE_TEST_IS_DIR)) { + list = g_slist_prepend (list, full); + list = add_dirs (list, full); + } else { + g_free (full); + } + } + closedir (dir); + + return list; +} + + +static GSList * +get_kde_dirs (int size) +{ + GSList *list = NULL; + + if (kde_icondir == NULL) { + char *dirname; + + kde_icondir = g_build_filename ("/usr", "share", "icons", NULL); + + +#define ADD_DIRS(color,size) \ + dirname = g_build_filename (kde_icondir, #color, \ + #size "x" #size , NULL); \ + color ## _kde_ ## size = add_dirs (NULL, dirname); \ + g_free (dirname); + + ADD_DIRS (crystalsvg, 48); + ADD_DIRS (crystalsvg, 32); + ADD_DIRS (crystalsvg, 22); + ADD_DIRS (crystalsvg, 16); + +#undef ADD_DIRS + + } + + if (size > 32) { + /* 48-inf */ + list = g_slist_concat (g_slist_copy (crystalsvg_kde_48), + g_slist_copy (crystalsvg_kde_32)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_22)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_16)); + } else if (size > 22) { + /* 23-32 */ + list = g_slist_concat (g_slist_copy (crystalsvg_kde_32), + g_slist_copy (crystalsvg_kde_48)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_22)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_16)); + } else if (size > 16) { + /* 17-22 */ + list = g_slist_concat (g_slist_copy (crystalsvg_kde_22), + g_slist_copy (crystalsvg_kde_32)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_48)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_16)); + } else { + /* 1-16 */ + list = g_slist_concat (g_slist_copy (crystalsvg_kde_16), + g_slist_copy (crystalsvg_kde_22)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_32)); + list = g_slist_concat (list, + g_slist_copy (crystalsvg_kde_48)); + } + + list = g_slist_append (list, kde_icondir); + + return list; +} + char * panel_find_icon (GtkIconTheme *icon_theme, const char *icon_name, @@ -569,13 +674,32 @@ 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)); gtk_icon_info_free (info); - } else - retval = NULL; + } else { + const char *exts[] = { ".png", ".xpm", ".svg", NULL }; + GSList *kde_dirs = NULL; + GSList *li; + + kde_dirs = get_kde_dirs (size); + retval = NULL; + + for (li = kde_dirs; retval == NULL && li != NULL; li = li->next) { + int i; + for (i = 0; retval == NULL && exts[i] != NULL; i++) { + retval = g_strconcat (li->data, G_DIR_SEPARATOR_S, icon_no_extension, + exts[i], NULL); + if ( ! g_file_test (retval, G_FILE_TEST_EXISTS)) { + g_free (retval); + retval = NULL; + } + } + } + } + + g_free (icon_no_extension); return retval; }