#include <limits.h> /* for PATH_MAX */
#include <sys/types.h>
#include <sys/stat.h>
+#include <time.h> /* for time() */
#define __USE_GNU /* for strcasestr */
#include <string.h> /* for making ftw.h happy */
#include "pnd_apps.h"
#include "../lib/pnd_pathiter.h"
#include "pnd_locate.h"
+#include "pnd_notify.h"
+#include "pnd_dbusnotify.h"
#include "mmenu.h"
#include "mmapps.h"
extern pnd_conf_handle g_conf;
extern unsigned char g_pvwcache;
+extern pnd_conf_handle g_desktopconf;
mm_cache_t *g_icon_cache = NULL;
mm_cache_t *g_preview_cache = NULL;
}
}
+ // unique-id to use for the cache mount
+ char *uid = app -> unique_id;
+
+ if ( app -> appdata_dirname ) {
+ uid = app -> appdata_dirname;
+ }
+
// if we don't have a file path sorted out yet, means we need to mount and figure it
if ( ! filepath [ 0 ] ) {
sprintf ( fullpath, "%s/%s", app -> object_path, app -> object_filename );
- if ( ! pnd_pnd_mount ( pnd_run_script, fullpath, app -> unique_id ) ) {
+ if ( ! pnd_pnd_mount ( pnd_run_script, fullpath, uid ) ) {
pnd_log ( pndn_debug, "Couldn't mount '%s' for preview\n", fullpath );
return ( 0 ); // couldn't mount?!
}
- sprintf ( filepath, "%s/%s/%s", PND_MOUNT_PATH, app -> unique_id, app -> preview_pic1 );
+ sprintf ( filepath, "%s/%s/%s", PND_MOUNT_PATH, uid, app -> preview_pic1 );
}
// load whatever path we've got
if ( ! s ) {
// unmount it, if mounted
if ( fullpath [ 0 ] ) {
- pnd_pnd_unmount ( pnd_run_script, fullpath, app -> unique_id );
+ pnd_pnd_unmount ( pnd_run_script, fullpath, uid );
}
pnd_log ( pndn_debug, "Couldn't open image '%s' for preview\n", filepath );
return ( 0 );
unsigned char *iconbuf = NULL;
unsigned int buflen = 0;
- // same-path override?
+ // same-path icon override?
char ovrfile [ PATH_MAX ];
char *fixpxml;
sprintf ( ovrfile, "%s/%s", app -> object_path, app -> object_filename );
} // stat
} // ovr?
+ // perhaps pndnotifyd has dropped a copy of the icon into /tmp?
+#if 1
+ {
+ static char *iconpath = NULL;
+
+ if ( ! iconpath ) {
+ iconpath = pnd_conf_get_as_char ( g_desktopconf, "desktop.iconpath" );
+ }
+
+ sprintf ( ovrfile, "%s/%s.png", iconpath, app -> unique_id );
+
+ // making sure the file is at least a few seconds old, to help avoid race condition
+ struct stat statbuf;
+ if ( stat ( ovrfile, &statbuf ) == 0 && time ( NULL ) - statbuf.st_mtime > 5 ) { // race with pndnotifyd
+ buflen = statbuf.st_size;
+ if ( ( iconbuf = malloc ( statbuf.st_size ) ) ) {
+ int fd = open ( ovrfile, O_RDONLY );
+ if ( fd >= 0 ) {
+ if ( read ( fd, iconbuf, statbuf.st_size ) != statbuf.st_size ) {
+ free ( iconbuf );
+ close ( fd );
+ return ( 0 );
+ }
+ close ( fd );
+ } // open
+ } // malloc
+ } // stat
+
+ }
+#endif
+
// if this is a real pnd file (dir-app or pnd-file-app), then try to pull icon from there
- if ( app -> object_flags & PND_DISCO_GENERATED ) {
+ if ( ! iconbuf ) {
- // maybe we can discover this single-file and find an icon?
- if ( strcasestr ( app -> object_filename, PND_PACKAGE_FILEEXT ) ) {
+ if ( app -> object_flags & PND_DISCO_GENERATED ) {
- // looks like a pnd, now what do we do..
- pnd_box_handle h = pnd_disco_file ( app -> object_path, app -> object_filename );
+ // maybe we can discover this single-file and find an icon?
+ if ( strcasestr ( app -> object_filename, PND_PACKAGE_FILEEXT ) ) {
- if ( h ) {
- pnd_disco_t *d = pnd_box_get_head ( h );
- iconbuf = pnd_emit_icon_to_buffer ( d, &buflen );
- }
+ // looks like a pnd, now what do we do..
+ pnd_box_handle h = pnd_disco_file ( app -> object_path, app -> object_filename );
- } // filename has .pnd?
+ if ( h ) {
+ pnd_disco_t *d = pnd_box_get_head ( h );
+ iconbuf = pnd_emit_icon_to_buffer ( d, &buflen );
+ }
- } else {
+ } // filename has .pnd?
- // pull icon into buffer from .pnd if not already found an icon
- if ( ! iconbuf ) {
+ } else {
+
+ // pull icon into buffer from .pnd if not already found an icon
iconbuf = pnd_emit_icon_to_buffer ( app, &buflen );
- }
- } // generated?
+ } // generated?
+
+ } // already got icon?
if ( ! iconbuf ) {
return ( 0 );