Subversion Repositories pub

Compare Revisions

Ignore whitespace Rev 11 → Rev 14

/nautilus-follow-symlink/trunk/src/common.h
9,6 → 9,9
#include <glib/gmessages.h> /* g_print() */
#include <glib/gprintf.h> /* g_printf() */
 
#include <stdlib.h> /* getenv() (3) */
#include <string.h> /* strcmp() (3) */
 
#include "libintl.h"
#define _(STR) gettext(STR)
 
16,10 → 19,12
#include "config.h"
#endif // HAVE_CONFIG_H
 
#ifndef __inline__
#define __inline
#endif
 
#ifdef _DEBUG
/* Debugging facilities */
#include <stdlib.h> /* getenv() (3) */
#include <string.h> /* strcmp() (3) */
/* Debugging facilities */
 
/* Prefix for messages */
#define FSL_ "nautilus-follow-symlink: "
/nautilus-follow-symlink/trunk/src/follow-symlink.c
1,24 → 1,75
#include "follow-symlink.h"
 
#include <glib/gprintf.h>
#include <sys/stat.h>
#include <errno.h> /* errno (3) */
#include <stdlib.h> /* realpath() (3) */
#include <string.h> /* strlen(), strerror() (3) */
 
// Offset at char 7 to remove file://
static const unsigned short URI_OFFSET = 7 * sizeof(gchar);
static const size_t PATH_LENGTH_BYTES = sizeof(gchar) * (PATH_MAX + 1);
 
extern int errno;
 
/* Menu initialization */
void fsl_extension_menu_provider_iface_init(NautilusMenuProviderIface *iface)
{
TRACE();
 
//TODO: iface->get_background_items = fsl_get_background_items;
iface->get_file_items = fsl_get_file_items;
iface->get_background_items = fsl_get_background_items;
}
 
/* Implementation of the menu attachment,
* this is slightly different whith file items and with background (one folder)
* items, but shares most of the code, so the common part is here.
*/
GList * fsl_get_items_impl(GtkWidget * window,
NautilusFileInfo * file_info,
gboolean is_file_item)
{
TRACE();
 
NautilusMenuItem *item;
 
// Only file uris
{
gchar * uri_scheme = nautilus_file_info_get_uri_scheme(file_info);
if (strcmp(uri_scheme, "file") != 0) {
FSL_LOG( "Not file scheme" );
return NULL;
}
g_free(uri_scheme);
}
 
// We know the file is either a directory or a symlink to a directory
// TODO: Has glib/gnome any better/faster alternatives?
{
struct stat file_stat;
// Note ..._get_name doesn't give the full path
const gchar * const file_name = nautilus_file_info_get_uri(file_info) + URI_OFFSET;
lstat(file_name, &file_stat);
if (! S_ISLNK(file_stat.st_mode)) {
FSL_LOG1( "Not S_ISLNK:", file_name );
return NULL;
}
}
 
item = fsl_menu_item_new(gtk_widget_get_screen(window), is_file_item);
g_signal_connect(item, "activate", G_CALLBACK(fsl_callback),
file_info);
 
return g_list_append(NULL, item);
}
 
GList *
fsl_get_background_items(NautilusMenuProvider * provider,
GtkWidget * window,
NautilusFileInfo * current_folder)
{
TRACE();
 
if (NULL == current_folder) { // XXX: Does this ever happen?
FSL_LOG( "No folder selected" );
}
return fsl_get_items_impl(window, current_folder, FALSE);
}
 
/* Bind to menu if needed */
GList *
fsl_get_file_items (NautilusMenuProvider * provider,
27,8 → 78,6
{
TRACE();
 
NautilusMenuItem *item;
 
// Number of files = g_list_length(files)
// Directory = nautilus_file_info_is_directory(files->data)
 
37,47 → 86,18
return NULL;
}
 
// Only file uris
{
gchar * uri_scheme = nautilus_file_info_get_uri_scheme(files->data);
if (strcmp(uri_scheme, "file") != 0) {
FSL_LOG( "Not file scheme" );
return NULL;
}
g_free(uri_scheme);
}
 
// Xref: http://www.koders.com/c/fidA0AA0A78334E1FA3D668FD10B437638F6D031D77.aspx?s=NautilusFile
GnomeVFSFileInfo * gfi = nautilus_file_info_get_vfs_file_info(files->data);
/*
* Xref: /usr/include/gnome-vfs-2.0/libgnomevfs/gnome-vfs-file-info.h
*
* Aparently type is never GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK and symlinks
* are resolved to the target type
*/
/*if (gfi->type != GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK) {*/
if (gfi->type != GNOME_VFS_FILE_TYPE_DIRECTORY) {
FSL_LOG( "Not directory" );
return NULL;
}
// We know the file is either a directory or a symlink to a directory
// TODO: Has glib/gnome any better/faster alternatives?
{
struct stat file_info;
// Note ..._get_name doesn't give the full path
const gchar * const file_name = nautilus_file_info_get_uri(files->data) + URI_OFFSET;
lstat(file_name, &file_info);
if (! S_ISLNK(file_info.st_mode)) {
FSL_LOG1( "Not S_ISLNK:", file_name );
return NULL;
}
}
 
item = fsl_menu_item_new(gtk_widget_get_screen(window), TRUE);
g_signal_connect(item, "activate", G_CALLBACK(fsl_callback),
files->data);
 
return g_list_append(NULL, item);
return fsl_get_items_impl(window, files->data, TRUE);
}
 
void fsl_callback (NautilusMenuItem * item, NautilusFileInfo * file_info)
132,8 → 152,14
const char *name;
const char *tooltip;
 
name = _("Follow symbolic _link");
tooltip = _("Open the directory pointed by the currently selected symbolic link");
if (is_file_item) {
name = _("Follow symbolic _link");
tooltip = _("Open the directory pointed by the currently selected symbolic link");
}
else {
name = _("Open real path");
tooltip = _("Open the real path of the folder pointed by this symbolic link");
}
 
// (name, label, tip, icon)
ret = nautilus_menu_item_new("FsymlinkExtension::follow_symlink",
/nautilus-follow-symlink/trunk/src/nautilus-ext-follow-symlink.c
1,10 → 1,5
#include "nautilus-ext-follow-symlink.h"
 
#include <locale.h>
#include <libintl.h>
 
#include <glib/gprintf.h>
 
/* Public interface */
static GType fsl_type;
static GType provider_types[1];
/nautilus-follow-symlink/trunk/src/follow-symlink.h
6,18 → 6,28
* its core functionality
*/
 
#include "common.h"
 
#include <libnautilus-extension/nautilus-menu-provider.h>
 
#include "common.h"
#include <glib/gprintf.h>
#include <sys/stat.h>
#include <errno.h> /* errno (3) */
#include <stdlib.h> /* realpath() (3) */
#include <string.h> /* strlen(), strerror() (3) */
 
/* Static Prototypes */
 
static void fsl_callback(NautilusMenuItem *, NautilusFileInfo *);
 
static GList *fsl_get_file_items(NautilusMenuProvider *, GtkWidget *, GList *);
static GList * fsl_get_file_items(NautilusMenuProvider *, GtkWidget *, GList *);
 
static NautilusMenuItem* fsl_menu_item_new(GdkScreen *, gboolean);
static GList * fsl_get_background_items(NautilusMenuProvider *, GtkWidget *, NautilusFileInfo *);
 
static GList * fsl_get_items_impl(GtkWidget *, NautilusFileInfo *, gboolean);
 
static NautilusMenuItem * fsl_menu_item_new(GdkScreen *, gboolean);
 
/* Exported Prototypes
* Here the namespace is a bit more explicit just in case
*/
/nautilus-follow-symlink/trunk/src/nautilus-ext-follow-symlink.h
1,11 → 1,16
#ifndef NAUTILUS_EXT_FOLLOW_SYMLINK_H
#define NAUTILUS_EXT_FOLLOW_SYMLINK_H
 
#include "common.h"
 
#include <glib-object.h>
#include <libnautilus-extension/nautilus-menu-provider.h>
 
#include "common.h"
#include <locale.h>
#include <libintl.h>
 
#include <glib/gprintf.h>
 
/*
* This file contains nautilus-follow-symlink's "public" interface,
* the functions required to bind the extension to nautilus
45,5 → 50,5
/* Defined in the private interface */
extern void fsl_extension_menu_provider_iface_init(NautilusMenuProviderIface *iface);
 
#endif /* NAUTILUS_MODULE_FOLLOW_SYMLINK_H */
#endif /* NAUTILUS_EXT_FOLLOW_SYMLINK_H */
/* vim:set ts=4 et ai: */