diff -r 8d3b1ddf789c -r 06caf639d95e app-manager/applications.c --- a/app-manager/applications.c Sat Feb 20 12:11:02 2010 +0000 +++ b/app-manager/applications.c Thu Nov 10 11:19:34 2011 +0000 @@ -19,21 +19,46 @@ #include "config.h" #include #include +#ifdef WIN32 +#include +#endif #include #include #include #include "app-manager.h" +#ifdef WIN32 +static BOOL CALLBACK plover_applications_visible_callback(HMODULE module, + const char *type,char *name,long *param) +{ + gboolean *visible=(void *)param; + if (!IS_INTRESOURCE(name) && !strcmp(name,"MAINICON")) + *visible=TRUE; + return !*visible; +} +#endif + static gboolean plover_applications_visible_func(GtkTreeModel *model, GtkTreeIter *iter,gpointer data) { /* Visible if row is non-empty and package contains a .desktop file - * in /usr/share/applications + * in /usr/share/applications (UNIX) or package contains a .exe file + * which has a default application icon (MS-Windows). */ PloverPackage *package; GtkTreeModel *file_store; GtkTreeIter fi; - gchar *name,*dir; + gchar *name; +#ifdef WIN32 + HMODULE module; + DWORD flags= +#ifdef LOAD_LIBRARY_AS_IMAGE_RESOURCE + LOAD_LIBRARY_AS_IMAGE_RESOURCE| +#endif + LOAD_LIBRARY_AS_DATAFILE; +#else + gchar *dir; +#endif gboolean visible=FALSE; gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package,-1); if (package) @@ -45,11 +70,27 @@ { gtk_tree_model_get(file_store,&fi, PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,&name,-1); +#ifdef WIN32 + if (g_str_has_suffix(name,".exe")) + { + module=LoadLibraryExA(name,NULL,flags); + if (module) + { + (void)EnumResourceNamesA(module,RT_ICON, + plover_applications_visible_callback,&visible); + if (!visible) + (void)EnumResourceNamesA(module,RT_GROUP_ICON, + plover_applications_visible_callback,&visible); + FreeLibrary(module); + } + } +#else dir=g_path_get_dirname(name); if (!strcmp(dir,"/usr/share/applications") && g_str_has_suffix(name,".desktop")) visible=TRUE; g_free(dir); +#endif g_free(name); } while(!visible && gtk_tree_model_iter_next(file_store,&fi)); } @@ -62,7 +103,7 @@ { GtkTreeModel *model; model=gtk_tree_model_filter_new(installed,NULL); - gtk_tree_model_filter_set_visible_func(model, + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model), plover_applications_visible_func,NULL,NULL); return model; }