summaryrefslogtreecommitdiff
path: root/gtk/gtkicontheme.c
diff options
context:
space:
mode:
authorTor Lillqvist <tml@novell.com>2008-06-16 13:27:46 +0000
committerTor Lillqvist <tml@src.gnome.org>2008-06-16 13:27:46 +0000
commiteffd6886f649f9da3e9b051f19ca14f10e86dd8b (patch)
tree65e6728fde81bcf7ea7d769bc785239ca82fca71 /gtk/gtkicontheme.c
parent4d4722ca2f0bc80d5cba2843ab63b65c86845b2a (diff)
downloadgtk+-effd6886f649f9da3e9b051f19ca14f10e86dd8b.tar.gz
Bug 538362 - Get Win32 icons back in the file chooser
2008-06-16 Tor Lillqvist <tml@novell.com> Bug 538362 - Get Win32 icons back in the file chooser * gtk/gtkicontheme.c (choose_icon): Check if the icon name is a reference to an icon resource in a DLL or .EXE as in the Registry. In that case, extract the icon and convert to a GdkPixbuf. Patch by Hans Breuer. svn path=/trunk/; revision=20398
Diffstat (limited to 'gtk/gtkicontheme.c')
-rw-r--r--gtk/gtkicontheme.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 78696483da..43666a4c2a 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -33,6 +33,9 @@
#ifndef S_ISDIR
#define S_ISDIR(mode) ((mode)&_S_IFDIR)
#endif
+#define WIN32_MEAN_AND_LEAN
+#include <windows.h>
+#include "win32/gdkwin32.h"
#endif /* G_OS_WIN32 */
#include "gtkicontheme.h"
@@ -1277,6 +1280,32 @@ choose_icon (GtkIconTheme *icon_theme,
if (unthemed_icon)
break;
}
+#ifdef G_OS_WIN32
+ /* Still not found an icon, check if reference to a Win32 resource */
+ if (!unthemed_icon)
+ {
+ gchar **resources;
+ HICON hIcon = NULL;
+
+ resources = g_strsplit (icon_names[0], ",", 0);
+ if (resources[0])
+ {
+ wchar_t *wfile = g_utf8_to_utf16 (resources[0], -1, NULL, NULL, NULL);
+ ExtractIconExW (wfile, resources[1] ? atoi (resources[1]) : 0, &hIcon, NULL, 1);
+ g_free (wfile);
+ }
+
+ if (hIcon)
+ {
+ icon_info = icon_info_new ();
+ icon_info->cache_pixbuf = gdk_win32_icon_to_pixbuf_libgtk_only (hIcon);
+ DestroyIcon (hIcon);
+ icon_info->dir_type = ICON_THEME_DIR_UNTHEMED;
+ icon_info->dir_size = size;
+ }
+ g_strfreev (resources);
+ }
+#endif
if (unthemed_icon)
{
@@ -1327,6 +1356,7 @@ choose_icon (GtkIconTheme *icon_theme,
found = g_file_test (default_theme_path, G_FILE_TEST_IS_REGULAR);
g_free (default_theme_path);
}
+
if (!found)
{
g_warning (_("Could not find the icon '%s'. The '%s' theme\n"