glib r7049 - trunk/gio
- From: tml svn gnome org
- To: svn-commits-list gnome org
- Subject: glib r7049 - trunk/gio
- Date: Mon, 16 Jun 2008 13:23:14 +0000 (UTC)
Author: tml
Date: Mon Jun 16 13:23:14 2008
New Revision: 7049
URL: http://svn.gnome.org/viewvc/glib?rev=7049&view=rev
Log:
2008-06-16 Tor Lillqvist <tml novell com>
Bug 538362 - Get Win32 icons back in the file chooser
* gcontenttype.c (g_content_type_get_icon): Look up the icon
corresponding to a file extension in the Registry. Patch by Hans
Breuer.
(get_registry_classes_key): Handle also REG_EXPAND_SZ type values.
2008-06-16 Tor Lillqvist <tml novell com>
Patches by Hans Breuer:
* glocalfile.c (is_xp_or_later): Handle compiling against older
SDK headers with missing VerifyVersionInfo(). Conditioned on
_MSC_VER, but should probably use some better test.
* glocalfile.c (g_local_file_query_filesystem_info): Don't test
uninitialised statfs_result variable on Win32.
Modified:
trunk/gio/ChangeLog
trunk/gio/gcontenttype.c
trunk/gio/glocalfile.c
Modified: trunk/gio/gcontenttype.c
==============================================================================
--- trunk/gio/gcontenttype.c (original)
+++ trunk/gio/gcontenttype.c Mon Jun 16 13:23:14 2008
@@ -65,14 +65,30 @@
KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS &&
RegQueryValueExW (reg_key, key_name, 0,
&key_type, NULL, &nbytes) == ERROR_SUCCESS &&
- key_type == REG_SZ)
+ (key_type == REG_SZ || key_type == REG_EXPAND_SZ))
{
wchar_t *wc_temp = g_new (wchar_t, (nbytes+1)/2 + 1);
RegQueryValueExW (reg_key, key_name, 0,
&key_type, (LPBYTE) wc_temp, &nbytes);
wc_temp[nbytes/2] = '\0';
- value_utf8 = g_utf16_to_utf8 (wc_temp, -1, NULL, NULL, NULL);
+ if (key_type == REG_EXPAND_SZ)
+ {
+ wchar_t dummy[1];
+ int len = ExpandEnvironmentStringsW (wc_temp, dummy, 1);
+ if (len > 0)
+ {
+ wchar_t *wc_temp_expanded = g_new (wchar_t, len);
+ if (ExpandEnvironmentStringsW (wc_temp, wc_temp_expanded, len) == len)
+ value_utf8 = g_utf16_to_utf8 (wc_temp_expanded, -1, NULL, NULL, NULL);
+ g_free (wc_temp_expanded);
+ }
+ }
+ else
+ {
+ value_utf8 = g_utf16_to_utf8 (wc_temp, -1, NULL, NULL, NULL);
+ }
g_free (wc_temp);
+
}
g_free (wc_key);
@@ -179,22 +195,66 @@
return g_strdup ("application/octet-stream");
}
+G_LOCK_DEFINE_STATIC (_type_icons);
+static GHashTable *_type_icons = NULL;
+
GIcon *
g_content_type_get_icon (const char *type)
{
+ GIcon *themed_icon;
+ char *name = NULL;
+
g_return_val_if_fail (type != NULL, NULL);
- /* TODO: How do we represent icons???
- In the registry they are the default value of
+ /* In the Registry icons are the default value of
HKEY_CLASSES_ROOT\<progid>\DefaultIcon with typical values like:
<type>: <value>
REG_EXPAND_SZ: %SystemRoot%\System32\Wscript.exe,3
REG_SZ: shimgvw.dll,3
-
- gtkfilesystemwin32.c in gtk-2-12 is probably a good place to look
- for inspiration.
*/
- return NULL;
+ G_LOCK (_type_icons);
+ if (!_type_icons)
+ _type_icons = g_hash_table_new (g_str_hash, g_str_equal);
+ name = g_hash_table_lookup (_type_icons, type);
+ if (!name && type[0] == '.')
+ {
+ /* double lookup by extension */
+ gchar *key = get_registry_classes_key (type, NULL);
+ if (!key)
+ key = g_strconcat (type+1, "file\\DefaultIcon", NULL);
+ else
+ {
+ gchar *key2 = g_strconcat (key, "\\DefaultIcon", NULL);
+ g_free (key);
+ key = key2;
+ }
+ name = get_registry_classes_key (key, NULL);
+ if (name && strcmp (name, "%1") == 0)
+ {
+ g_free (name);
+ name = NULL;
+ }
+ if (name)
+ g_hash_table_insert (_type_icons, g_strdup (type), g_strdup (name));
+ g_free (key);
+ }
+
+ /* icon-name similar to how it was with gtk-2-12 */
+ if (name)
+ {
+ themed_icon = g_themed_icon_new (name);
+ }
+ else
+ {
+ /* if not found an icon fall back to gtk-builtins */
+ name = strcmp (type, "inode/directory") == 0 ? "gtk-directory" :
+ g_content_type_can_be_executable (type) ? "gtk-execute" : "gtk-file";
+ g_hash_table_insert (_type_icons, g_strdup (type), g_strdup (name));
+ themed_icon = g_themed_icon_new_with_default_fallbacks (name);
+ }
+ G_UNLOCK (_type_icons);
+
+ return G_ICON (themed_icon);
}
gboolean
Modified: trunk/gio/glocalfile.c
==============================================================================
--- trunk/gio/glocalfile.c (original)
+++ trunk/gio/glocalfile.c Mon Jun 16 13:23:14 2008
@@ -811,6 +811,7 @@
if (result == -1)
{
+#ifndef _MSC_VER
OSVERSIONINFOEX ver_info = {0};
DWORDLONG cond_mask = 0;
int op = VER_GREATER_EQUAL;
@@ -825,6 +826,9 @@
result = VerifyVersionInfo (&ver_info,
VER_MAJORVERSION | VER_MINORVERSION,
cond_mask) != 0;
+#else
+ result = ((DWORD)(LOBYTE (LOWORD (GetVersion ())))) >= 5;
+#endif
}
return result;
@@ -915,7 +919,7 @@
{
GLocalFile *local = G_LOCAL_FILE (file);
GFileInfo *info;
- int statfs_result;
+ int statfs_result = 0;
gboolean no_size;
#ifndef G_OS_WIN32
guint64 block_size;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]