Cache out of view thumbnails in the background
This commit is contained in:
parent
9b9294bae6
commit
47af0dd7b5
@ -126,7 +126,7 @@ bool cg_reload_image(arg_t a)
|
|||||||
load_image(fileidx);
|
load_image(fileidx);
|
||||||
} else {
|
} else {
|
||||||
win_set_cursor(&win, CURSOR_WATCH);
|
win_set_cursor(&win, CURSOR_WATCH);
|
||||||
if (!tns_load(&tns, fileidx, true)) {
|
if (!tns_load(&tns, fileidx, true, false)) {
|
||||||
remove_file(fileidx, false);
|
remove_file(fileidx, false);
|
||||||
tns.dirty = true;
|
tns.dirty = true;
|
||||||
}
|
}
|
||||||
|
24
main.c
24
main.c
@ -385,7 +385,10 @@ void update_info(void)
|
|||||||
r->p = r->buf;
|
r->p = r->buf;
|
||||||
if (mode == MODE_THUMB) {
|
if (mode == MODE_THUMB) {
|
||||||
if (tns.loadnext < tns.end) {
|
if (tns.loadnext < tns.end) {
|
||||||
bar_put(l, "Loading... %0*d", fw, MAX(tns.loadnext, 1));
|
bar_put(l, "Loading... %0*d", fw, tns.loadnext + 1);
|
||||||
|
ow_info = false;
|
||||||
|
} else if (tns.initnext < filecnt) {
|
||||||
|
bar_put(l, "Caching... %0*d", fw, tns.initnext + 1);
|
||||||
ow_info = false;
|
ow_info = false;
|
||||||
} else {
|
} else {
|
||||||
ow_info = true;
|
ow_info = true;
|
||||||
@ -453,7 +456,7 @@ void reset_cursor(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (tns.loadnext < tns.end)
|
if (tns.loadnext < tns.end || tns.initnext < filecnt)
|
||||||
cursor = CURSOR_WATCH;
|
cursor = CURSOR_WATCH;
|
||||||
else
|
else
|
||||||
cursor = CURSOR_ARROW;
|
cursor = CURSOR_ARROW;
|
||||||
@ -694,26 +697,29 @@ void run(void)
|
|||||||
int xfd;
|
int xfd;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
bool discard, load_thumb, to_set;
|
bool discard, init_thumb, load_thumb, to_set;
|
||||||
XEvent ev, nextev;
|
XEvent ev, nextev;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
to_set = check_timeouts(&timeout);
|
to_set = check_timeouts(&timeout);
|
||||||
|
init_thumb = mode == MODE_THUMB && tns.initnext < filecnt;
|
||||||
load_thumb = mode == MODE_THUMB && tns.loadnext < tns.end;
|
load_thumb = mode == MODE_THUMB && tns.loadnext < tns.end;
|
||||||
|
|
||||||
if ((load_thumb || to_set || info.fd != -1) &&
|
if ((init_thumb || load_thumb || to_set || info.fd != -1) &&
|
||||||
XPending(win.env.dpy) == 0)
|
XPending(win.env.dpy) == 0)
|
||||||
{
|
{
|
||||||
if (load_thumb) {
|
if (load_thumb) {
|
||||||
set_timeout(redraw, TO_REDRAW_THUMBS, false);
|
set_timeout(redraw, TO_REDRAW_THUMBS, false);
|
||||||
if (!tns_load(&tns, tns.loadnext, false)) {
|
if (!tns_load(&tns, tns.loadnext, false, false)) {
|
||||||
remove_file(tns.loadnext, false);
|
remove_file(tns.loadnext, false);
|
||||||
tns.dirty = true;
|
tns.dirty = true;
|
||||||
}
|
}
|
||||||
while (tns.loadnext < tns.end && tns.thumbs[tns.loadnext].im != NULL)
|
|
||||||
tns.loadnext++;
|
|
||||||
if (tns.loadnext >= tns.end)
|
if (tns.loadnext >= tns.end)
|
||||||
redraw();
|
redraw();
|
||||||
|
} else if (init_thumb) {
|
||||||
|
set_timeout(redraw, TO_REDRAW_THUMBS, false);
|
||||||
|
if (!tns_load(&tns, tns.initnext, false, true))
|
||||||
|
remove_file(tns.initnext, false);
|
||||||
} else {
|
} else {
|
||||||
xfd = ConnectionNumber(win.env.dpy);
|
xfd = ConnectionNumber(win.env.dpy);
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
@ -899,8 +905,8 @@ int main(int argc, char **argv)
|
|||||||
if (options->thumb_mode) {
|
if (options->thumb_mode) {
|
||||||
mode = MODE_THUMB;
|
mode = MODE_THUMB;
|
||||||
tns_init(&tns, files, &filecnt, &fileidx, &win);
|
tns_init(&tns, files, &filecnt, &fileidx, &win);
|
||||||
while (!tns_load(&tns, 0, false))
|
while (!tns_load(&tns, fileidx, false, false))
|
||||||
remove_file(0, false);
|
remove_file(fileidx, false);
|
||||||
} else {
|
} else {
|
||||||
mode = MODE_IMAGE;
|
mode = MODE_IMAGE;
|
||||||
tns.thumbs = NULL;
|
tns.thumbs = NULL;
|
||||||
|
32
thumbs.c
32
thumbs.c
@ -152,7 +152,7 @@ void tns_clean_cache(tns_t *tns)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void tns_init(tns_t *tns, const fileinfo_t *files, const int *cnt, int *sel,
|
void tns_init(tns_t *tns, fileinfo_t *files, const int *cnt, int *sel,
|
||||||
win_t *win)
|
win_t *win)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
@ -169,7 +169,8 @@ void tns_init(tns_t *tns, const fileinfo_t *files, const int *cnt, int *sel,
|
|||||||
}
|
}
|
||||||
tns->files = files;
|
tns->files = files;
|
||||||
tns->cnt = cnt;
|
tns->cnt = cnt;
|
||||||
tns->loadnext = tns->first = tns->end = tns->r_first = tns->r_end = 0;
|
tns->initnext = tns->loadnext = 0;
|
||||||
|
tns->first = tns->end = tns->r_first = tns->r_end = 0;
|
||||||
tns->sel = sel;
|
tns->sel = sel;
|
||||||
tns->win = win;
|
tns->win = win;
|
||||||
tns->dirty = false;
|
tns->dirty = false;
|
||||||
@ -237,7 +238,7 @@ Imlib_Image tns_scale_down(Imlib_Image im, int dim)
|
|||||||
return im;
|
return im;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tns_load(tns_t *tns, int n, bool force)
|
bool tns_load(tns_t *tns, int n, bool force, bool cache_only)
|
||||||
{
|
{
|
||||||
int w, h;
|
int w, h;
|
||||||
int maxwh = thumb_sizes[ARRLEN(thumb_sizes)-1];
|
int maxwh = thumb_sizes[ARRLEN(thumb_sizes)-1];
|
||||||
@ -245,8 +246,8 @@ bool tns_load(tns_t *tns, int n, bool force)
|
|||||||
char *cfile;
|
char *cfile;
|
||||||
float zw, zh;
|
float zw, zh;
|
||||||
thumb_t *t;
|
thumb_t *t;
|
||||||
|
fileinfo_t *file;
|
||||||
Imlib_Image im = NULL;
|
Imlib_Image im = NULL;
|
||||||
const fileinfo_t *file;
|
|
||||||
|
|
||||||
if (tns == NULL || tns->thumbs == NULL)
|
if (tns == NULL || tns->thumbs == NULL)
|
||||||
return false;
|
return false;
|
||||||
@ -261,6 +262,7 @@ bool tns_load(tns_t *tns, int n, bool force)
|
|||||||
if (t->im != NULL) {
|
if (t->im != NULL) {
|
||||||
imlib_context_set_image(t->im);
|
imlib_context_set_image(t->im);
|
||||||
imlib_free_image();
|
imlib_free_image();
|
||||||
|
t->im = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!force) {
|
if (!force) {
|
||||||
@ -345,10 +347,10 @@ bool tns_load(tns_t *tns, int n, bool force)
|
|||||||
warn("could not open image: %s", file->name);
|
warn("could not open image: %s", file->name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
imlib_context_set_image(im);
|
||||||
|
|
||||||
if (!cache_hit) {
|
if (!cache_hit) {
|
||||||
#if HAVE_LIBEXIF
|
#if HAVE_LIBEXIF
|
||||||
imlib_context_set_image(im);
|
|
||||||
exif_auto_orientate(file);
|
exif_auto_orientate(file);
|
||||||
#endif
|
#endif
|
||||||
im = tns_scale_down(im, maxwh);
|
im = tns_scale_down(im, maxwh);
|
||||||
@ -357,12 +359,22 @@ bool tns_load(tns_t *tns, int n, bool force)
|
|||||||
tns_cache_write(im, file->path, true);
|
tns_cache_write(im, file->path, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
t->im = tns_scale_down(im, thumb_sizes[tns->zl]);
|
if (cache_only) {
|
||||||
imlib_context_set_image(t->im);
|
imlib_free_image_and_decache();
|
||||||
t->w = imlib_image_get_width();
|
} else {
|
||||||
t->h = imlib_image_get_height();
|
t->im = tns_scale_down(im, thumb_sizes[tns->zl]);
|
||||||
|
imlib_context_set_image(t->im);
|
||||||
|
t->w = imlib_image_get_width();
|
||||||
|
t->h = imlib_image_get_height();
|
||||||
|
tns->dirty = true;
|
||||||
|
}
|
||||||
|
file->flags |= FF_TN_INIT;
|
||||||
|
|
||||||
|
if (n == tns->initnext)
|
||||||
|
while (++tns->initnext < *tns->cnt && ((++file)->flags & FF_TN_INIT));
|
||||||
|
if (n == tns->loadnext && !cache_only)
|
||||||
|
while (++tns->loadnext < tns->end && (++t)->im != NULL);
|
||||||
|
|
||||||
tns->dirty = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
thumbs.h
7
thumbs.h
@ -34,10 +34,11 @@ typedef struct {
|
|||||||
} thumb_t;
|
} thumb_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const fileinfo_t *files;
|
fileinfo_t *files;
|
||||||
thumb_t *thumbs;
|
thumb_t *thumbs;
|
||||||
const int *cnt;
|
const int *cnt;
|
||||||
int *sel;
|
int *sel;
|
||||||
|
int initnext;
|
||||||
int loadnext;
|
int loadnext;
|
||||||
int first, end;
|
int first, end;
|
||||||
int r_first, r_end;
|
int r_first, r_end;
|
||||||
@ -56,10 +57,10 @@ typedef struct {
|
|||||||
|
|
||||||
void tns_clean_cache(tns_t*);
|
void tns_clean_cache(tns_t*);
|
||||||
|
|
||||||
void tns_init(tns_t*, const fileinfo_t*, const int*, int*, win_t*);
|
void tns_init(tns_t*, fileinfo_t*, const int*, int*, win_t*);
|
||||||
void tns_free(tns_t*);
|
void tns_free(tns_t*);
|
||||||
|
|
||||||
bool tns_load(tns_t*, int, bool);
|
bool tns_load(tns_t*, int, bool, bool);
|
||||||
void tns_unload(tns_t*, int);
|
void tns_unload(tns_t*, int);
|
||||||
|
|
||||||
void tns_render(tns_t*);
|
void tns_render(tns_t*);
|
||||||
|
Loading…
Reference in New Issue
Block a user