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