Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=gfpm.git;a=commitdiff;h=cee0ec5346487333433e6c0b4b561923881bca0a

commit cee0ec5346487333433e6c0b4b561923881bca0a
Author: Priyank <priy...@frugalware.org>
Date:   Fri Jun 12 11:43:28 2009 +0530

updates in nautilus-extension
* users can now install a package (.fpm) by right-clicking the file and
selecting "Install this package"

diff --git a/nautilus-extension/nautilus-gfpm.c 
b/nautilus-extension/nautilus-gfpm.c
index a6085fa..50315f7 100644
--- a/nautilus-extension/nautilus-gfpm.c
+++ b/nautilus-extension/nautilus-gfpm.c
@@ -26,6 +26,7 @@
#include <libnautilus-extension/nautilus-extension-types.h>
#include <libnautilus-extension/nautilus-file-info.h>
#include <libnautilus-extension/nautilus-property-page-provider.h>
+#include <libnautilus-extension/nautilus-menu-provider.h>
#include "nautilus-gfpm.h"

#ifdef HAVE_NAUTILUS_EXT
@@ -346,49 +347,93 @@ _populate_property_page (GtkWidget *page, const gchar 
*file)
return ret;
}

-static GList *
-nautilus_gfpm_property_page_get_pages (NautilusPropertyPageProvider *provider,
-                                                                               
GList *files)
+/* returns the absolute path of the file */
+/* returned string must be freed */
+static gchar *
+_nautilus_file_info_get_file_path (NautilusFileInfo *fi)
{
-       GList                                   *pages = NULL;
-       NautilusPropertyPage    *page = NULL;
-       NautilusFileInfo                *info = NULL;
-       gchar                                   *scheme = NULL;
-       gint                                    filescheme = 0;
-       GtkWidget                               *package_widget = NULL;
-       GFile                                   *pkgloc = NULL;
-       char                                    *filename = NULL;
+       gchar   *ret = NULL;
+       GFile   *file = NULL;
+
+       if (fi)
+       {
+               file = nautilus_file_info_get_location (fi);
+               if (file)
+               {
+                       ret = g_file_get_path (file);
+               }
+       }
+       return ret;
+}
+
+static gboolean
+_validate (GList *files)
+{
+       NautilusFileInfo        *info = NULL;
+       char                            *filename = NULL;
+       int                                     filescheme = 0;
+       char                            *scheme = NULL;
+       gboolean                        ret = TRUE;

/* skip if no files or multiple files are selected */
if (!files || files->next!=NULL)
-               return NULL;
+               return FALSE;

/* skip if it's a directory */
info = (NautilusFileInfo*) files->data;
-       if (nautilus_file_info_is_directory(info))
-               return NULL;
+       if (!info || nautilus_file_info_is_directory(info))
+               return FALSE;

/* check the uri scheme of the file */
scheme = nautilus_file_info_get_uri_scheme (info);
-       filescheme = strncmp (scheme, "file", 4);
-       g_free (scheme);
-       /* skip if it's not a local file */
-       if (filescheme!=0)
-               return NULL;
+       if (scheme)
+       {
+               filescheme = strncmp (scheme, "file", 4);
+               g_free (scheme);
+               /* skip if it's not a local file */
+               if (filescheme!=0)
+                       return FALSE;
+       }

/* now check the mime-type */
/* fpm archives are nothing but bzip comressed archives with .fpm as extension 
*/
if (!nautilus_file_info_is_mime_type(info,"application/x-bzip"))
-               return NULL;
-
+               return FALSE;
+
/* ok, last one, check the extension */
-       pkgloc = nautilus_file_info_get_location (info);
-       filename = g_file_get_path (pkgloc);
-       if (strncmp(_get_file_ext(filename),"fpm",3))
+       filename = _nautilus_file_info_get_file_path (info);
+       if (filename)
+       {
+               if (strncmp(_get_file_ext(filename),"fpm",3))
+               {
+                       ret = FALSE;
+               }
+               g_free (filename);
+       }
+       else
+       {
+               ret = FALSE;
+       }
+
+       return ret;
+}
+
+static GList *
+nautilus_gfpm_property_page_get_pages (NautilusPropertyPageProvider *provider,
+                                                                               
GList *files)
+{
+       GList                                   *pages = NULL;
+       NautilusPropertyPage    *page = NULL;
+       GtkWidget                               *package_widget = NULL;
+       char                                    *filename = NULL;
+
+       /* perform a few checks */
+       if (!_validate(files))
return NULL;

/* now create and populate our property page with package info */
package_widget = _create_property_page ();
+       filename = _nautilus_file_info_get_file_path 
((NautilusFileInfo*)files->data);
if (_populate_property_page(package_widget,filename))
{
gtk_widget_show_all (package_widget);
@@ -405,6 +450,57 @@ nautilus_gfpm_property_page_get_pages 
(NautilusPropertyPageProvider *provider,
return pages;
}

+static void
+install_callback (NautilusMenuItem *item, gpointer data)
+{
+       NautilusFileInfo        *info = NULL;
+       char                            *file = NULL;
+       GString                         *cmd = NULL;
+
+       info = (NautilusFileInfo*) data;
+       file = _nautilus_file_info_get_file_path (info);
+       if (file)
+       {
+               cmd = g_string_new ("sudo /usr/bin/gfpm -A");
+               g_string_append_printf (cmd, " \"%s\"", file);
+               g_print ("launching command: %s\n", cmd->str);
+               g_spawn_command_line_async (cmd->str, NULL);
+               g_free (file);
+               g_string_free (cmd, FALSE);
+       }
+
+       return;
+}
+
+static GList *
+nautilus_gfpm_menu_get_file_items (NautilusMenuProvider *provider,
+                                                               GtkWidget 
*window,
+                                                               GList *files)
+{
+       GList                           *items = NULL;
+       NautilusMenuItem        *item = NULL;
+
+       if (!_validate(files))
+               return NULL;
+
+       item = nautilus_menu_item_new ("NautilusGfpm::menu_item",
+                                                                       
_("Install this package"),
+                                                                       
_("Install this package using GFpm"),
+                                                                       "gfpm");
+       g_signal_connect (item,
+                                       "activate",
+                                       G_CALLBACK(install_callback),
+                                       (gpointer)(files->data));
+       items = g_list_append (items, item);
+
+       return items;
+}
+
+static void
+nautilus_gfpm_menu_provider_iface_init (NautilusMenuProviderIface *iface)
+{
+       iface->get_file_items = nautilus_gfpm_menu_get_file_items;
+}

static void
nautilus_gfpm_property_page_provider_iface_init 
(NautilusPropertyPageProviderIface *iface)
@@ -412,13 +508,11 @@ nautilus_gfpm_property_page_provider_iface_init 
(NautilusPropertyPageProviderIfa
iface->get_pages = nautilus_gfpm_property_page_get_pages;
}

-
static void
nautilus_gfpm_instance_init (NautilusGfpm *ng)
{
}

-
static void
nautilus_gfpm_class_init (NautilusGfpmClass *klass)
{
@@ -448,12 +542,20 @@ nautilus_gfpm_register_type (GTypeModule *module)
(GInstanceInitFunc) nautilus_gfpm_instance_init,
};

+       /* property page provider interface */
static const GInterfaceInfo property_page_provider_iface_info = {
(GInterfaceInitFunc) nautilus_gfpm_property_page_provider_iface_init,
NULL,
NULL
};

+       /* menu provider interface */
+       static const GInterfaceInfo menu_provider_iface_info = {
+               (GInterfaceInitFunc) nautilus_gfpm_menu_provider_iface_init,
+               NULL,
+               NULL
+       };
+
gfpm_type = g_type_module_register_type (module,
G_TYPE_OBJECT,
"NautilusGfpm",
@@ -463,6 +565,11 @@ nautilus_gfpm_register_type (GTypeModule *module)
gfpm_type,
NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER,
&property_page_provider_iface_info);
+
+       g_type_module_add_interface (module,
+                                    gfpm_type,
+                                    NAUTILUS_TYPE_MENU_PROVIDER,
+                                    &menu_provider_iface_info);
}

#endif /* end HAVE_NAUTILUS_EXT */
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to