app-manager/applications.c
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Jun 29 10:08:58 2021 +0100 (2021-06-29)
changeset 107 6ae203c8b28d
parent 24 2b9f54d14cc2
permissions -rw-r--r--
Prepare to release 0.6.1
     1 /*
     2  * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
     3  *
     4  * This program is free software; you can redistribute it and/or modify
     5  * it under the terms of the GNU General Public License as published by
     6  * the Free Software Foundation; either version 2 of the License, or
     7  * (at your option) any later version.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License along
    15  * with this program; if not, write to the Free Software Foundation, Inc.,
    16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    17  */
    18 
    19 #include "config.h"
    20 #include <stdlib.h>
    21 #include <string.h>
    22 #ifdef WIN32
    23 #include <windows.h>
    24 #endif
    25 #include <glib.h>
    26 #include <gtk/gtk.h>
    27 #include <plover-gtk/packagestore.h>
    28 #include <plover-gtk/packagefilestore.h>
    29 #include "app-manager.h"
    30 
    31 #ifdef WIN32
    32 static BOOL CALLBACK plover_applications_visible_callback(HMODULE module,
    33   const char *type,char *name,LONG_PTR param)
    34 {
    35     gboolean *visible=(void *)param;
    36     if (!IS_INTRESOURCE(name) && !strcmp(name,"MAINICON"))
    37 	*visible=TRUE;
    38     return !*visible;
    39 }
    40 #endif
    41 
    42 static gboolean plover_applications_visible_func(GtkTreeModel *model,
    43   GtkTreeIter *iter,gpointer data)
    44 {
    45     /* Visible if row is non-empty and package contains a .desktop file
    46      * in /usr/share/applications (UNIX) or package contains a .exe file
    47      * which has a default application icon (MS-Windows).
    48      */
    49     PloverPackage *package;
    50     GtkTreeModel *file_store;
    51     GtkTreeIter fi;
    52     gchar *name;
    53 #ifdef WIN32
    54     HMODULE module;
    55     DWORD flags=
    56 #ifdef LOAD_LIBRARY_AS_IMAGE_RESOURCE
    57       LOAD_LIBRARY_AS_IMAGE_RESOURCE|
    58 #endif
    59       LOAD_LIBRARY_AS_DATAFILE;
    60 #else
    61     gchar *dir;
    62 #endif
    63     gboolean visible=FALSE;
    64     gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package,-1);
    65     if (package)
    66     {
    67 	file_store=
    68 	  GTK_TREE_MODEL(plover_package_file_store_new_from_package(package));
    69 	if (gtk_tree_model_get_iter_first(file_store,&fi))
    70 	{
    71 	    do
    72 	    {
    73 		gtk_tree_model_get(file_store,&fi,
    74 		  PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,&name,-1);
    75 #ifdef WIN32
    76 		if (g_str_has_suffix(name,".exe"))
    77 		{
    78 		    module=LoadLibraryExA(name,NULL,flags);
    79 		    if (module)
    80 		    {
    81 			(void)EnumResourceNamesA(module,RT_ICON,
    82 			  plover_applications_visible_callback,
    83 			  (LONG_PTR)&visible);
    84 			if (!visible)
    85 			    (void)EnumResourceNamesA(module,RT_GROUP_ICON,
    86 			      plover_applications_visible_callback,
    87 			      (LONG_PTR)&visible);
    88 			FreeLibrary(module);
    89 		    }
    90 		}
    91 #else
    92 		dir=g_path_get_dirname(name);
    93 		if (!strcmp(dir,"/usr/share/applications") &&
    94 		  g_str_has_suffix(name,".desktop"))
    95 		    visible=TRUE;
    96 		g_free(dir);
    97 #endif
    98 		g_free(name);
    99 	    } while(!visible && gtk_tree_model_iter_next(file_store,&fi));
   100 	}
   101 	g_object_unref(file_store);
   102     }
   103     g_object_unref(package);
   104     return visible;
   105 }
   106 
   107 GtkTreeModel *plover_applications_model_new(GtkTreeModel *installed)
   108 {
   109     GtkTreeModel *model;
   110     model=gtk_tree_model_filter_new(installed,NULL);
   111     gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),
   112       plover_applications_visible_func,NULL,NULL);
   113     return model;
   114 }