forked from old/legacy-imlib2
This is what I meant.
I have tested: feh test:image.jpg WORKS imlib2_view e/data/icons/image/png.db:/icon/clicked WORKS I have tested saving with geist too and that works. The patch is bigger than it would have been because I had to revert some of raster's attempt. There is more debris left over (unused functions and params etc) but I won't clean all that out until people have checked out this and are happy. I might make something like imlib_get_real_filename available in the public API. So that apps (like feh) that use stat() that do their own error checking can also do the right thing, but this is a separate issue and not totally necessary. SVN revision: 5122
This commit is contained in:
parent
a3dae08a37
commit
ab067f4fc5
|
@ -258,7 +258,7 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
char progress_granularity)
|
char progress_granularity)
|
||||||
{
|
{
|
||||||
int alpha = 0;
|
int alpha = 0;
|
||||||
char file[4096], key[4096], *cp;
|
char file[4096], key[4096], *cp, *tmp;
|
||||||
DATA32 *header;
|
DATA32 *header;
|
||||||
DATA32 *buf;
|
DATA32 *buf;
|
||||||
E_DB_File *db;
|
E_DB_File *db;
|
||||||
|
@ -271,10 +271,16 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
return 0;
|
return 0;
|
||||||
if (im->flags & F_HAS_ALPHA)
|
if (im->flags & F_HAS_ALPHA)
|
||||||
alpha = 1;
|
alpha = 1;
|
||||||
if ((!im->file) || (!im->real_file) || (!im->key))
|
if ((!im->file) || (!im->real_file))
|
||||||
return 0;
|
return 0;
|
||||||
strcpy(file, im->real_file);
|
strcpy(file, im->real_file);
|
||||||
strcpy(key, im->key);
|
|
||||||
|
tmp = strrchr(file, ':');
|
||||||
|
if(!tmp)
|
||||||
|
return 0;
|
||||||
|
*tmp = '\0';
|
||||||
|
strcpy(key, tmp + 1);
|
||||||
|
|
||||||
if (exists(file))
|
if (exists(file))
|
||||||
{
|
{
|
||||||
if (!can_write(file)) return 0;
|
if (!can_write(file)) return 0;
|
||||||
|
|
19
src/file.c
19
src/file.c
|
@ -119,7 +119,7 @@ __imlib_FileExists(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
|
|
||||||
if ((!s) || (!*s)) return 0;
|
if ((!s) || (!*s)) return 0;
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (stat(fl, &st) < 0)
|
if (stat(fl, &st) < 0)
|
||||||
|
@ -138,7 +138,7 @@ __imlib_FileIsFile(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
|
|
||||||
if ((!s) || (!*s)) return 0;
|
if ((!s) || (!*s)) return 0;
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (stat(fl, &st) < 0)
|
if (stat(fl, &st) < 0)
|
||||||
|
@ -162,7 +162,7 @@ __imlib_FileIsDir(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
|
|
||||||
if ((!s) || (!*s)) return 0;
|
if ((!s) || (!*s)) return 0;
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (stat(fl, &st) < 0)
|
if (stat(fl, &st) < 0)
|
||||||
|
@ -186,7 +186,7 @@ __imlib_FilePermissions(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
|
|
||||||
if ((!s) || (!*s)) return 0;
|
if ((!s) || (!*s)) return 0;
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (stat(fl, &st) < 0)
|
if (stat(fl, &st) < 0)
|
||||||
|
@ -204,7 +204,7 @@ __imlib_FileCanRead(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (!(__imlib_FilePermissions(fl, 1) & (S_IRUSR | S_IRGRP | S_IROTH)))
|
if (!(__imlib_FilePermissions(fl, 1) & (S_IRUSR | S_IRGRP | S_IROTH)))
|
||||||
|
@ -306,6 +306,13 @@ __imlib_FileDel(char *s)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
__imlib_IsRealFile(const char *s)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
return ((stat(s, &st) != -1) && (!S_ISREG(st.st_mode)));
|
||||||
|
}
|
||||||
|
|
||||||
time_t
|
time_t
|
||||||
__imlib_FileModDate(const char *s, int raw)
|
__imlib_FileModDate(const char *s, int raw)
|
||||||
{
|
{
|
||||||
|
@ -313,7 +320,7 @@ __imlib_FileModDate(const char *s, int raw)
|
||||||
char *fl;
|
char *fl;
|
||||||
|
|
||||||
if ((!s) || (!*s)) return 0;
|
if ((!s) || (!*s)) return 0;
|
||||||
if (raw) fl = strdup(s);
|
if (__imlib_IsRealFile(s)) fl = strdup(s);
|
||||||
else fl = __imlib_FileRealFile(s);
|
else fl = __imlib_FileRealFile(s);
|
||||||
if (!fl) return 0;
|
if (!fl) return 0;
|
||||||
if (stat(fl, &st) < 0)
|
if (stat(fl, &st) < 0)
|
||||||
|
|
|
@ -14,6 +14,7 @@ char *__imlib_FileHomeDir(int uid);
|
||||||
char *__imlib_FileField(char *s, int field);
|
char *__imlib_FileField(char *s, int field);
|
||||||
int __imlib_FilePermissions(const char *s, int raw);
|
int __imlib_FilePermissions(const char *s, int raw);
|
||||||
int __imlib_FileCanRead(const char *s, int raw);
|
int __imlib_FileCanRead(const char *s, int raw);
|
||||||
|
int __imlib_IsRealFile(const char *s);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
14
src/image.c
14
src/image.c
|
@ -1024,6 +1024,7 @@ __imlib_LoadImage(const char *file, ImlibProgressFunction progress,
|
||||||
ImlibImage *im;
|
ImlibImage *im;
|
||||||
ImlibLoader *best_loader;
|
ImlibLoader *best_loader;
|
||||||
char loader_ret = 0;
|
char loader_ret = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
if (!file) return NULL;
|
if (!file) return NULL;
|
||||||
if (file[0] == 0) return NULL;
|
if (file[0] == 0) return NULL;
|
||||||
|
@ -1063,13 +1064,16 @@ __imlib_LoadImage(const char *file, ImlibProgressFunction progress,
|
||||||
/* so produce a new one and load an image into that */
|
/* so produce a new one and load an image into that */
|
||||||
im = __imlib_ProduceImage();
|
im = __imlib_ProduceImage();
|
||||||
im->file = strdup(file);
|
im->file = strdup(file);
|
||||||
if (raw_file_mode)
|
printf("file is %s\n", file);
|
||||||
|
if(__imlib_IsRealFile(file))
|
||||||
{
|
{
|
||||||
|
printf("file %s exists\n", file);
|
||||||
im->real_file = strdup(im->file);
|
im->real_file = strdup(im->file);
|
||||||
im->key = NULL;
|
im->key = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
printf("file %s does not exist\n", file);
|
||||||
im->real_file = __imlib_FileRealFile(file);
|
im->real_file = __imlib_FileRealFile(file);
|
||||||
im->key = __imlib_FileKey(file);
|
im->key = __imlib_FileKey(file);
|
||||||
}
|
}
|
||||||
|
@ -1315,7 +1319,9 @@ __imlib_SaveImage(ImlibImage * im, const char *file,
|
||||||
/* set the filename to the saved one */
|
/* set the filename to the saved one */
|
||||||
pfile = im->file;
|
pfile = im->file;
|
||||||
im->file = strdup(file);
|
im->file = strdup(file);
|
||||||
if (raw_file_mode)
|
im->real_file = strdup(im->file);
|
||||||
|
|
||||||
|
/* if (raw_file_mode)
|
||||||
{
|
{
|
||||||
if (im->real_file) free(im->real_file);
|
if (im->real_file) free(im->real_file);
|
||||||
if (im->key) free(im->key);
|
if (im->key) free(im->key);
|
||||||
|
@ -1328,7 +1334,9 @@ __imlib_SaveImage(ImlibImage * im, const char *file,
|
||||||
im->real_file = __imlib_FileRealFile(file);
|
im->real_file = __imlib_FileRealFile(file);
|
||||||
if (im->key) free(im->key);
|
if (im->key) free(im->key);
|
||||||
im->key = __imlib_FileKey(file);
|
im->key = __imlib_FileKey(file);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* find the laoder for the format - if its null use the extension */
|
/* find the laoder for the format - if its null use the extension */
|
||||||
l = __imlib_FindBestLoaderForFileFormat(im->real_file, im->format);
|
l = __imlib_FindBestLoaderForFileFormat(im->real_file, im->format);
|
||||||
/* no loader - abort */
|
/* no loader - abort */
|
||||||
|
|
Loading…
Reference in New Issue