Sophie

Sophie

distrib > Mandriva > 2007.1 > x86_64 > by-pkgid > 72682f97789893cb05925a6c35ec9c08 > files > 1

gnome-panel-2.18.0-5mdv2007.1.src.rpm

--- 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;
 }