Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19250)
+++ ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2007-12-27  Armin Burgmeier  <armin@openismus.com>
+
+	* gtk/gtkrecentmanager.c: Guess mime type from extension on windows,
+	instead of always falling back to application/octet-stream.
+
 2007-12-27  Xan Lopez  <xan@gnome.org>
 
 	* gtk/gtk.symbols: 
Index: gtk/gtkrecentmanager.c
===================================================================
--- gtk/gtkrecentmanager.c	(revision 19250)
+++ gtk/gtkrecentmanager.c	(working copy)
@@ -45,6 +45,12 @@
 #include "xdgmime/xdgmime.h"
 #endif
 
+#ifdef G_OS_WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <gdk/win32/gdkwin32.h>
+#include <winreg.h>
+#endif
+
 /* the file where we store the recently used items */
 #define GTK_RECENTLY_USED_FILE	".recently-used.xbel"
 
@@ -852,6 +858,51 @@
     }
   else
 #endif
+#ifdef G_OS_WIN32
+  if (has_case_prefix (uri, "file:/"))
+    {
+      gboolean success = FALSE;
+      gchar* filename;
+      filename = g_filename_from_uri(uri, NULL, NULL);
+      if (filename)
+        {
+          gchar* basename;
+          gchar* ext;
+
+          basename = g_path_get_basename(filename);
+          ext = strchr(filename, '.');
+
+          if (ext)
+            {
+              HKEY key;
+              DWORD size;
+              DWORD var_type = REG_SZ;
+
+              RegOpenKeyEx (HKEY_CLASSES_ROOT, ext, 0, KEY_READ, &key);
+              if (RegQueryValueEx (key, "Content Type", NULL, &var_type, NULL, &size) == ERROR_SUCCESS)
+                {
+                  recent_data.mime_type = g_malloc(size);
+                  if (RegQueryValueEx (key, "Content Type", NULL, &var_type, recent_data.mime_type, &size) != ERROR_SUCCESS)
+                    {
+                      g_free(recent_data.mime_type);
+                    }
+                  else
+                    {
+                      success = TRUE;
+                    }
+                }
+              RegCloseKey(key);
+            }
+
+          g_free(basename);
+          g_free(filename);
+        }
+
+        if(!success)
+          recent_data.mime_type = g_strdup (GTK_RECENT_DEFAULT_MIME);
+    }
+  else
+#endif
     recent_data.mime_type = g_strdup (GTK_RECENT_DEFAULT_MIME);
   
   recent_data.app_name = g_strdup (g_get_application_name ());

