Background scanning tweaks and cleanups.

SVN revision: 40529
This commit is contained in:
Kim Woelders 2009-05-06 17:17:31 +00:00
parent 9eac526959
commit a9b5c1cf6a
3 changed files with 76 additions and 81 deletions

View File

@ -317,6 +317,9 @@ typedef struct {
struct {
unsigned int startup_id;
} apps;
struct {
char force_scan;
} backgrounds;
struct {
char *name;
char *dir;

View File

@ -1206,6 +1206,8 @@ BackgroundsConfigLoadUser(void)
char s[4096];
Esnprintf(s, sizeof(s), "%s.backgrounds", EGetSavePrefix());
if (!exists(s))
Mode.backgrounds.force_scan = 1;
ConfigFileLoad(s, NULL, ConfigFileRead, 0);
}
@ -1727,6 +1729,10 @@ CB_BGScan(Dialog * d, int val __UNUSED__, void *data __UNUSED__)
int num;
SoundPlay(SOUND_WAIT);
/* Forcing re-scan should not be necessary but provides the progress bars
* so it actually looks like something is going on */
Mode.backgrounds.force_scan = 1;
ScanBackgroundMenu();
num = ecore_list_count(bg_list);

View File

@ -62,6 +62,30 @@ MenuItemCreateFromBackground(const char *bgid, const char *file)
return mi;
}
static const char *
_dircache_filename(char *buf, unsigned int len, struct stat *st)
{
static const char chmap[] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
int aa, bb, cc;
aa = (int)st->st_ino;
bb = filedev_map((int)st->st_dev);
cc = (st->st_mtime > st->st_ctime) ? st->st_mtime : st->st_ctime;
Esnprintf(buf, len, ".%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
chmap[(aa >> 0) & 0x3f], chmap[(aa >> 6) & 0x3f],
chmap[(aa >> 12) & 0x3f], chmap[(aa >> 18) & 0x3f],
chmap[(aa >> 24) & 0x3f], chmap[(aa >> 28) & 0x3f],
chmap[(bb >> 0) & 0x3f], chmap[(bb >> 6) & 0x3f],
chmap[(bb >> 12) & 0x3f], chmap[(bb >> 18) & 0x3f],
chmap[(bb >> 24) & 0x3f], chmap[(bb >> 28) & 0x3f],
chmap[(cc >> 0) & 0x3f], chmap[(cc >> 6) & 0x3f],
chmap[(cc >> 12) & 0x3f], chmap[(cc >> 18) & 0x3f],
chmap[(cc >> 24) & 0x3f], chmap[(cc >> 28) & 0x3f]);
return buf;
}
static int
MenuLoadFromDirectory(Menu * m)
{
@ -73,84 +97,64 @@ MenuLoadFromDirectory(Menu * m)
const char *ext;
MenuItem *mi;
struct stat st;
const char *chmap =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
FILE *f;
time_t lastmod;
dir = MenuGetData(m);
lastmod = moddate(dir);
if (lastmod <= MenuGetTimestamp(m))
if (!menu_scan_recursive && lastmod <= MenuGetTimestamp(m))
return 0;
MenuSetTimestamp(m, lastmod);
MenuEmpty(m, 0);
cs[0] = '\0'; /* FIXME - Check this */
if (stat(dir, &st) < 0)
return 1;
if (stat(dir, &st) >= 0)
if (Mode.backgrounds.force_scan)
goto skip_dir_cache;
Esnprintf(cs, sizeof(cs), "%s/cached/img/%s",
EDirUserCache(), _dircache_filename(ss, sizeof(ss), &st));
if (exists(cs))
{
int aa, bb, cc;
aa = (int)st.st_ino;
bb = filedev_map((int)st.st_dev);
cc = 0;
if (st.st_mtime > st.st_ctime)
cc = st.st_mtime;
else
cc = st.st_ctime;
Esnprintf(cs, sizeof(cs),
"%s/cached/img/.%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
EDirUserCache(), chmap[(aa >> 0) & 0x3f],
chmap[(aa >> 6) & 0x3f], chmap[(aa >> 12) & 0x3f],
chmap[(aa >> 18) & 0x3f], chmap[(aa >> 24) & 0x3f],
chmap[(aa >> 28) & 0x3f], chmap[(bb >> 0) & 0x3f],
chmap[(bb >> 6) & 0x3f], chmap[(bb >> 12) & 0x3f],
chmap[(bb >> 18) & 0x3f], chmap[(bb >> 24) & 0x3f],
chmap[(bb >> 28) & 0x3f], chmap[(cc >> 0) & 0x3f],
chmap[(cc >> 6) & 0x3f], chmap[(cc >> 12) & 0x3f],
chmap[(cc >> 18) & 0x3f], chmap[(cc >> 24) & 0x3f],
chmap[(cc >> 28) & 0x3f]);
/* cached dir listing - use it */
if (exists(cs))
{
f = fopen(cs, "r");
if (!f)
return 1;
while (fgets(s, sizeof(s), f))
{
char s2[4096];
s[strlen(s) - 1] = 0;
len = 0;
sscanf(s, "%1000s %1000s %n", ss, s2, &len);
if (!strcmp(ss, "BG"))
{
Esnprintf(ss, sizeof(ss), "%s/%s", dir, s2);
mi = MenuItemCreateFromBackground(s + len, ss);
MenuAddItem(m, mi);
}
else if (!strcmp(ss, "EXE"))
{
Esnprintf(ss, sizeof(ss), "exec %s/%s", dir, s2);
mi = MenuItemCreate(NULL, NULL, ss, NULL);
MenuAddItem(m, mi);
}
else if (!strcmp(ss, "DIR"))
{
Esnprintf(s, sizeof(s), "%s/%s:%s", dir, s2,
MenuGetName(m));
Esnprintf(ss, sizeof(ss), "%s/%s", dir, s2);
mm = MenuCreateFromDirectory(s, m, NULL, ss);
mi = MenuItemCreate(s2, NULL, NULL, mm);
MenuAddItem(m, mi);
}
f = fopen(cs, "r");
if (!f)
return 1;
while (fgets(s, sizeof(s), f))
{
char s2[4096];
s[strlen(s) - 1] = 0;
len = 0;
sscanf(s, "%1000s %1000s %n", ss, s2, &len);
if (!strcmp(ss, "BG"))
{
Esnprintf(ss, sizeof(ss), "%s/%s", dir, s2);
mi = MenuItemCreateFromBackground(s + len, ss);
MenuAddItem(m, mi);
}
else if (!strcmp(ss, "EXE"))
{
Esnprintf(ss, sizeof(ss), "exec %s/%s", dir, s2);
mi = MenuItemCreate(NULL, NULL, ss, NULL);
MenuAddItem(m, mi);
}
else if (!strcmp(ss, "DIR"))
{
Esnprintf(ss, sizeof(ss), "%s/%s", dir, s2);
mm = MenuCreateFromDirectory(ss, m, NULL, ss);
mi = MenuItemCreate(s2, NULL, NULL, mm);
MenuAddItem(m, mi);
}
fclose(f);
return 1;
}
fclose(f);
return 1;
}
skip_dir_cache:
Esnprintf(s, sizeof(s), "Scanning %s", dir);
if (!Mode.wm.restart)
@ -174,8 +178,7 @@ MenuLoadFromDirectory(Menu * m)
if (S_ISDIR(st.st_mode))
{
/* Submenu */
Esnprintf(s, sizeof(s), "%s/%s:%s", dir, list[i], MenuGetName(m));
mm = MenuCreateFromDirectory(s, m, NULL, ss);
mm = MenuCreateFromDirectory(ss, m, NULL, ss);
mi = MenuItemCreate(list[i], NULL, NULL, mm);
MenuAddItem(m, mi);
if (f)
@ -198,26 +201,8 @@ MenuLoadFromDirectory(Menu * m)
{
/* Background */
char s3[512];
int aa, bb, cc;
aa = (int)st.st_ino;
bb = filedev_map((int)st.st_dev);
cc = 0;
if (st.st_mtime > st.st_ctime)
cc = st.st_mtime;
else
cc = st.st_ctime;
Esnprintf(s3, sizeof(s3),
".%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
chmap[(aa >> 0) & 0x3f], chmap[(aa >> 6) & 0x3f],
chmap[(aa >> 12) & 0x3f], chmap[(aa >> 18) & 0x3f],
chmap[(aa >> 24) & 0x3f], chmap[(aa >> 28) & 0x3f],
chmap[(bb >> 0) & 0x3f], chmap[(bb >> 6) & 0x3f],
chmap[(bb >> 12) & 0x3f], chmap[(bb >> 18) & 0x3f],
chmap[(bb >> 24) & 0x3f], chmap[(bb >> 28) & 0x3f],
chmap[(cc >> 0) & 0x3f], chmap[(cc >> 6) & 0x3f],
chmap[(cc >> 12) & 0x3f], chmap[(cc >> 18) & 0x3f],
chmap[(cc >> 24) & 0x3f], chmap[(cc >> 28) & 0x3f]);
_dircache_filename(s3, sizeof(s3), &st);
mi = MenuItemCreateFromBackground(s3, ss);
if (mi)
@ -267,6 +252,7 @@ ScanBackgroundMenu(void)
{
menu_scan_recursive = 1;
MenuLoad(MenuFind("BACKGROUNDS_MENU", NULL));
Mode.backgrounds.force_scan = 0;
menu_scan_recursive = 0;
}