Add pcmanfm 0.3.0.1 (latest) + patch to enable use without FAM
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@620 311d38ba-8fff-0310-9ca6-ca027cbcb966
This commit is contained in:
parent
ac73b5ad0b
commit
1bf87de1e6
|
@ -0,0 +1,432 @@
|
|||
diff -urNd ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/configure.in pcmanfm-0.3.0.1/configure.in
|
||||
--- ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/configure.in 2006-08-20 15:45:28.000000000 +0100
|
||||
+++ pcmanfm-0.3.0.1/configure.in 2006-08-20 20:37:36.000000000 +0100
|
||||
@@ -63,8 +63,8 @@
|
||||
LIBS="$LIBS $FAM_LIBS"
|
||||
AC_CHECK_FUNCS([FAMNoExists])
|
||||
LIBS="$save_LIBS"
|
||||
-else
|
||||
- AC_MSG_ERROR([Fatal Error: no fam or gamin detected.])
|
||||
+#else
|
||||
+# AC_MSG_ERROR([Fatal Error: no fam or gamin detected.])
|
||||
fi
|
||||
|
||||
AC_SUBST([FAM_CFLAGS])
|
||||
diff -urNd ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c
|
||||
--- ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c 2006-07-16 20:00:46.000000000 +0100
|
||||
+++ pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c 2006-08-20 20:54:07.000000000 +0100
|
||||
@@ -31,7 +31,6 @@
|
||||
VFSFileMonitorCallbackEntry;
|
||||
|
||||
static GHashTable* monitor_hash = NULL;
|
||||
-static FAMConnection fam;
|
||||
static GIOChannel* fam_io_channel = NULL;
|
||||
static guint fam_io_watch = 0;
|
||||
|
||||
@@ -40,6 +39,8 @@
|
||||
GIOCondition cond,
|
||||
gpointer user_data );
|
||||
|
||||
+#ifdef HAVE_FAM_H
|
||||
+static FAMConnection fam;
|
||||
|
||||
static gboolean connect_to_fam()
|
||||
{
|
||||
@@ -81,6 +82,16 @@
|
||||
FAMClose( &fam );
|
||||
}
|
||||
}
|
||||
+#else
|
||||
+static gboolean connect_to_fam ()
|
||||
+{
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+static void disconnect_from_fam ()
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
|
||||
/* final cleanup */
|
||||
void vfs_file_monitor_clean()
|
||||
@@ -109,6 +120,7 @@
|
||||
VFSFileMonitorCallback cb,
|
||||
gpointer user_data )
|
||||
{
|
||||
+#ifdef HAVE_FAM_H
|
||||
VFSFileMonitor * monitor;
|
||||
VFSFileMonitorCallbackEntry cb_ent;
|
||||
gboolean add_new = FALSE;
|
||||
@@ -154,12 +166,16 @@
|
||||
}
|
||||
++monitor->n_ref;
|
||||
return monitor;
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
}
|
||||
|
||||
void vfs_file_monitor_remove( VFSFileMonitor* fm,
|
||||
VFSFileMonitorCallback cb,
|
||||
gpointer user_data )
|
||||
{
|
||||
+#ifdef HAVE_FAM_H
|
||||
int i;
|
||||
VFSFileMonitorCallbackEntry* callbacks;
|
||||
if ( cb && fm->callbacks )
|
||||
@@ -183,12 +199,14 @@
|
||||
g_array_free( fm->callbacks, TRUE );
|
||||
g_slice_free( VFSFileMonitor, fm );
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void reconnect_fam( gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data )
|
||||
{
|
||||
+#ifdef HAVE_FAM_H
|
||||
struct stat file_stat;
|
||||
VFSFileMonitor* monitor = ( VFSFileMonitor* ) value;
|
||||
const char* path = ( const char* ) key;
|
||||
@@ -209,6 +227,7 @@
|
||||
monitor );
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* event handler of all FAM events */
|
||||
@@ -216,6 +235,7 @@
|
||||
GIOCondition cond,
|
||||
gpointer user_data )
|
||||
{
|
||||
+#ifdef HAVE_FAM_H
|
||||
FAMEvent evt;
|
||||
VFSFileMonitor* monitor = NULL;
|
||||
VFSFileMonitorCallbackEntry* cb;
|
||||
@@ -266,5 +286,8 @@
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
+#else
|
||||
+ return TRUE;
|
||||
+#endif
|
||||
}
|
||||
|
||||
diff -urNd ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c~ pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c~
|
||||
--- ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c~ 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.c~ 2006-08-20 20:50:49.000000000 +0100
|
||||
@@ -0,0 +1,292 @@
|
||||
+/*
|
||||
+* C Implementation: vfs-monitor
|
||||
+*
|
||||
+* Description:
|
||||
+*
|
||||
+*
|
||||
+* Author: Hong Jen Yee (PCMan) <pcman.tw (AT) gmail.com>, (C) 2006
|
||||
+*
|
||||
+* Copyright: See COPYING file that comes with this distribution
|
||||
+*
|
||||
+*/
|
||||
+
|
||||
+#ifdef HAVE_CONFIG_H
|
||||
+#include "config.h"
|
||||
+#endif
|
||||
+
|
||||
+#include "vfs-file-monitor.h"
|
||||
+#include <sys/types.h> /* for stat */
|
||||
+#include <sys/stat.h>
|
||||
+
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+
|
||||
+#include "glib-mem.h"
|
||||
+
|
||||
+typedef struct
|
||||
+{
|
||||
+ VFSFileMonitorCallback callback;
|
||||
+ gpointer user_data;
|
||||
+}
|
||||
+VFSFileMonitorCallbackEntry;
|
||||
+
|
||||
+static GHashTable* monitor_hash = NULL;
|
||||
+static FAMConnection fam;
|
||||
+static GIOChannel* fam_io_channel = NULL;
|
||||
+static guint fam_io_watch = 0;
|
||||
+
|
||||
+/* event handler of all FAM events */
|
||||
+static gboolean on_fam_event( GIOChannel *channel,
|
||||
+ GIOCondition cond,
|
||||
+ gpointer user_data );
|
||||
+
|
||||
+#ifdef HAVE_FAM_H
|
||||
+static gboolean connect_to_fam()
|
||||
+{
|
||||
+ if ( FAMOpen( &fam ) )
|
||||
+ {
|
||||
+ fam_io_channel = NULL;
|
||||
+ fam.fd = -1;
|
||||
+ g_warning( "There is no FAM/gamin server\n" );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+#if HAVE_FAMNOEXISTS
|
||||
+ /*
|
||||
+ * Disable the initital directory content loading.
|
||||
+ * This can greatly speed up directory loading, but
|
||||
+ * unfortunately, it's not compatible with original FAM.
|
||||
+ */
|
||||
+ FAMNoExists( &fam ); /* This is an extension of gamin */
|
||||
+#endif
|
||||
+
|
||||
+ fam_io_channel = g_io_channel_unix_new( fam.fd );
|
||||
+ g_io_channel_set_encoding( fam_io_channel, NULL, NULL );
|
||||
+ g_io_channel_set_buffered( fam_io_channel, FALSE );
|
||||
+
|
||||
+ fam_io_watch = g_io_add_watch( fam_io_channel,
|
||||
+ G_IO_IN | G_IO_HUP,
|
||||
+ on_fam_event,
|
||||
+ NULL );
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static void disconnect_from_fam()
|
||||
+{
|
||||
+ if ( fam_io_channel )
|
||||
+ {
|
||||
+ g_io_channel_unref( fam_io_channel );
|
||||
+ fam_io_channel = NULL;
|
||||
+ g_source_remove( fam_io_watch );
|
||||
+
|
||||
+ FAMClose( &fam );
|
||||
+ }
|
||||
+}
|
||||
+#else
|
||||
+static gboolean connect_to_fam ()
|
||||
+{
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+static void disconnect_from_fam ()
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+/* final cleanup */
|
||||
+void vfs_file_monitor_clean()
|
||||
+{
|
||||
+ disconnect_from_fam();
|
||||
+ if ( monitor_hash )
|
||||
+ {
|
||||
+ g_hash_table_destroy( monitor_hash );
|
||||
+ monitor_hash = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+* Init monitor:
|
||||
+* Establish connection with gamin/fam.
|
||||
+*/
|
||||
+gboolean vfs_file_monitor_init()
|
||||
+{
|
||||
+ monitor_hash = g_hash_table_new( g_str_hash, g_str_equal );
|
||||
+ if ( ! connect_to_fam() )
|
||||
+ return FALSE;
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+VFSFileMonitor* vfs_file_monitor_add( const char* path,
|
||||
+ VFSFileMonitorCallback cb,
|
||||
+ gpointer user_data )
|
||||
+{
|
||||
+#ifdef HAVE_FAM_H
|
||||
+ VFSFileMonitor * monitor;
|
||||
+ VFSFileMonitorCallbackEntry cb_ent;
|
||||
+ gboolean add_new = FALSE;
|
||||
+ struct stat file_stat;
|
||||
+
|
||||
+ if ( ! monitor_hash )
|
||||
+ {
|
||||
+ if ( !vfs_file_monitor_init() )
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ monitor = ( VFSFileMonitor* ) g_hash_table_lookup ( monitor_hash, path );
|
||||
+ if ( ! monitor )
|
||||
+ {
|
||||
+ monitor = g_slice_new0( VFSFileMonitor );
|
||||
+ monitor->path = g_strdup( path );
|
||||
+ monitor->callbacks = g_array_new ( FALSE, FALSE, sizeof( VFSFileMonitorCallbackEntry ) );
|
||||
+ g_hash_table_insert ( monitor_hash,
|
||||
+ path,
|
||||
+ monitor );
|
||||
+ if ( lstat( path, &file_stat ) != -1 )
|
||||
+ {
|
||||
+ if ( S_ISDIR( file_stat.st_mode ) )
|
||||
+ {
|
||||
+ FAMMonitorDirectory( &fam,
|
||||
+ path,
|
||||
+ &monitor->request,
|
||||
+ monitor );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ FAMMonitorFile( &fam,
|
||||
+ path,
|
||||
+ &monitor->request,
|
||||
+ monitor );
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if ( cb )
|
||||
+ { /* Install a callback */
|
||||
+ cb_ent.callback = cb;
|
||||
+ cb_ent.user_data = user_data;
|
||||
+ monitor->callbacks = g_array_append_val( monitor->callbacks, cb_ent );
|
||||
+ }
|
||||
+ ++monitor->n_ref;
|
||||
+ return monitor;
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+void vfs_file_monitor_remove( VFSFileMonitor* fm,
|
||||
+ VFSFileMonitorCallback cb,
|
||||
+ gpointer user_data )
|
||||
+{
|
||||
+#ifdef HAVE_FAM_H
|
||||
+ int i;
|
||||
+ VFSFileMonitorCallbackEntry* callbacks;
|
||||
+ if ( cb && fm->callbacks )
|
||||
+ {
|
||||
+ callbacks = ( VFSFileMonitorCallbackEntry* ) fm->callbacks->data;
|
||||
+ for ( i = 0; i < fm->callbacks->len; ++i )
|
||||
+ {
|
||||
+ if ( callbacks[ i ].callback == cb && callbacks[ i ].user_data == user_data )
|
||||
+ {
|
||||
+ fm->callbacks = g_array_remove_index_fast ( fm->callbacks, i );
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ --fm->n_ref;
|
||||
+ if ( 0 >= fm->n_ref )
|
||||
+ {
|
||||
+ FAMCancelMonitor( &fam, &fm->request );
|
||||
+ g_hash_table_remove( monitor_hash, fm->path );
|
||||
+ g_free( fm->path );
|
||||
+ g_array_free( fm->callbacks, TRUE );
|
||||
+ g_slice_free( VFSFileMonitor, fm );
|
||||
+ }
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static void reconnect_fam( gpointer key,
|
||||
+ gpointer value,
|
||||
+ gpointer user_data )
|
||||
+{
|
||||
+#ifdef HAVE_FAM_H
|
||||
+ struct stat file_stat;
|
||||
+ VFSFileMonitor* monitor = ( VFSFileMonitor* ) value;
|
||||
+ const char* path = ( const char* ) key;
|
||||
+ if ( lstat( path, &file_stat ) != -1 )
|
||||
+ {
|
||||
+ if ( S_ISDIR( file_stat.st_mode ) )
|
||||
+ {
|
||||
+ FAMMonitorDirectory( &fam,
|
||||
+ path,
|
||||
+ &monitor->request,
|
||||
+ monitor );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ FAMMonitorFile( &fam,
|
||||
+ path,
|
||||
+ &monitor->request,
|
||||
+ monitor );
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/* event handler of all FAM events */
|
||||
+static gboolean on_fam_event( GIOChannel *channel,
|
||||
+ GIOCondition cond,
|
||||
+ gpointer user_data )
|
||||
+{
|
||||
+#ifdef HAVE_FAM_H
|
||||
+ FAMEvent evt;
|
||||
+ VFSFileMonitor* monitor = NULL;
|
||||
+ VFSFileMonitorCallbackEntry* cb;
|
||||
+ VFSFileMonitorCallback func;
|
||||
+ int i;
|
||||
+
|
||||
+ if ( cond & G_IO_HUP )
|
||||
+ {
|
||||
+ disconnect_from_fam();
|
||||
+ if ( g_hash_table_size ( monitor_hash ) > 0 )
|
||||
+ {
|
||||
+ /*
|
||||
+ Disconnected from FAM server, but there are still monitors.
|
||||
+ This may be caused by crash of FAM server.
|
||||
+ So we have to reconnect to FAM server.
|
||||
+ */
|
||||
+ connect_to_fam();
|
||||
+ g_hash_table_foreach( monitor_hash, ( GHFunc ) reconnect_fam, NULL );
|
||||
+ }
|
||||
+ return TRUE; /* don't need to remove the event source since
|
||||
+ it has been removed by disconnect_from_fam(). */
|
||||
+ }
|
||||
+
|
||||
+ while ( FAMPending( &fam ) )
|
||||
+ {
|
||||
+ if ( FAMNextEvent( &fam, &evt ) > 0 )
|
||||
+ {
|
||||
+ monitor = ( VFSFileMonitor* ) evt.userdata;
|
||||
+ switch ( evt.code )
|
||||
+ {
|
||||
+ case FAMCreated:
|
||||
+ case FAMDeleted:
|
||||
+ case FAMChanged:
|
||||
+ /* Call the callback functions */
|
||||
+ if ( monitor->callbacks && monitor->callbacks->len )
|
||||
+ {
|
||||
+ cb = ( VFSFileMonitorCallbackEntry* ) monitor->callbacks->data;
|
||||
+ for ( i = 0; i < monitor->callbacks->len; ++i )
|
||||
+ {
|
||||
+ func = cb[ i ].callback;
|
||||
+ func( monitor, evt.code, evt.filename, cb[ i ].user_data );
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ return TRUE; /* Other events are not supported */
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return TRUE;
|
||||
+#else
|
||||
+ return TRUE;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
diff -urNd ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.h pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.h
|
||||
--- ../pcmanfm-0.3.0.1-r0/pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.h 2006-04-03 00:38:33.000000000 +0100
|
||||
+++ pcmanfm-0.3.0.1/src/vfs/vfs-file-monitor.h 2006-08-20 20:47:00.000000000 +0100
|
||||
@@ -20,7 +20,16 @@
|
||||
#define _VFS_FILE_MONITOR_H_
|
||||
|
||||
#include <glib.h>
|
||||
+#ifdef HAVE_FAM_H
|
||||
#include <fam.h>
|
||||
+#else
|
||||
+# define FAMCreated 0
|
||||
+# define FAMDeleted 1
|
||||
+# define FAMChanged 2
|
||||
+typedef struct {
|
||||
+ int reqnum;
|
||||
+} FAMRequest;
|
||||
+#endif
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
LICENSE = "GPL"
|
||||
DESCRIPTION = "procfs tools"
|
||||
SECTION = "x11"
|
||||
PRIORITY = "optional"
|
||||
MAINTAINER = "Chris Lord <chris@openedhand.com>"
|
||||
DEPENDS = "gtk+"
|
||||
|
||||
SRC_URI = "${SOURCEFORGE_MIRROR}/pcmanfm/pcmanfm-${PV}.tar.gz \
|
||||
file://gnome-fs-directory.png \
|
||||
file://gnome-fs-regular.png \
|
||||
file://gnome-mime-text-plain.png \
|
||||
file://emblem-symbolic-link.png \
|
||||
file://no-fam.patch;patch=1"
|
||||
|
||||
inherit autotools pkgconfig
|
||||
|
||||
do_install_append () {
|
||||
install -d ${D}/${datadir}
|
||||
install -d ${D}/${datadir}/pixmaps/
|
||||
|
||||
install -m 0644 ${WORKDIR}/*.png ${D}/${datadir}/pixmaps
|
||||
}
|
||||
|
||||
FILES_${PN} += "${datadir}/pixmaps/*.png"
|
||||
|
Loading…
Reference in New Issue