From 5b01c15176298b0335432e089d70e55c84379756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Sat, 16 Aug 2014 18:36:17 +0200 Subject: [PATCH] Unified file index variable for image & thumbnail mode --- commands.c | 46 ++++++++++++++++++---------------------------- main.c | 48 ++++++++++++++++++++++-------------------------- thumbs.c | 45 +++++++++++++++++++++++---------------------- thumbs.h | 4 ++-- 4 files changed, 65 insertions(+), 78 deletions(-) diff --git a/commands.c b/commands.c index 41e59e8..830c6af 100644 --- a/commands.c +++ b/commands.c @@ -76,18 +76,17 @@ bool cg_switch_mode(arg_t a) { if (mode == MODE_IMAGE) { if (tns.thumbs == NULL) - tns_init(&tns, filecnt, &win); + tns_init(&tns, filecnt, &win, &fileidx); img_close(&img, false); reset_timeout(reset_cursor); if (img.ss.on) { img.ss.on = false; reset_timeout(slideshow); } - tns.sel = fileidx; tns.dirty = true; mode = MODE_THUMB; } else { - load_image(tns.sel); + load_image(fileidx); mode = MODE_IMAGE; } return true; @@ -130,11 +129,9 @@ bool cg_reload_image(arg_t a) load_image(fileidx); } else { win_set_cursor(&win, CURSOR_WATCH); - if (!tns_load(&tns, tns.sel, &files[tns.sel], true, false)) { - remove_file(tns.sel, false); + if (!tns_load(&tns, fileidx, &files[fileidx], true, false)) { + remove_file(fileidx, false); tns.dirty = true; - if (tns.sel >= tns.cnt) - tns.sel = tns.cnt - 1; } } return true; @@ -146,11 +143,9 @@ bool cg_remove_image(arg_t a) remove_file(fileidx, true); load_image(fileidx >= filecnt ? filecnt - 1 : fileidx); return true; - } else if (tns.sel < tns.cnt) { - remove_file(tns.sel, true); + } else if (fileidx < tns.cnt) { + remove_file(fileidx, true); tns.dirty = true; - if (tns.sel >= tns.cnt) - tns.sel = tns.cnt - 1; return true; } else { return false; @@ -162,8 +157,8 @@ bool cg_first(arg_t a) if (mode == MODE_IMAGE && fileidx != 0) { load_image(0); return true; - } else if (mode == MODE_THUMB && tns.sel != 0) { - tns.sel = 0; + } else if (mode == MODE_THUMB && fileidx != 0) { + fileidx = 0; tns.dirty = true; return true; } else { @@ -178,8 +173,8 @@ bool cg_n_or_last(arg_t a) if (mode == MODE_IMAGE && fileidx != n) { load_image(n); return true; - } else if (mode == MODE_THUMB && tns.sel != n) { - tns.sel = n; + } else if (mode == MODE_THUMB && fileidx != n) { + fileidx = n; tns.dirty = true; return true; } else { @@ -199,11 +194,9 @@ bool cg_scroll_screen(arg_t a) bool cg_toggle_image_mark(arg_t a) { - int sel = mode == MODE_IMAGE ? fileidx : tns.sel; - - files[sel].marked = !files[sel].marked; + files[fileidx].marked = !files[fileidx].marked; if (mode == MODE_THUMB) - tns_mark(&tns, sel, files[sel].marked); + tns_mark(&tns, fileidx, files[fileidx].marked); return true; } @@ -221,26 +214,23 @@ bool cg_reverse_marks(arg_t a) bool cg_navigate_marked(arg_t a) { long n = (long) a; - int d, i, cnt, sel, new; + int d, i; + int cnt = mode == MODE_IMAGE ? filecnt : tns.cnt, new = fileidx; - if (mode == MODE_IMAGE) - cnt = filecnt, sel = new = fileidx; - else - cnt = tns.cnt, sel = new = tns.sel; if (prefix > 0) n *= prefix; d = n > 0 ? 1 : -1; - for (i = sel + d; n != 0 && i >= 0 && i < cnt; i += d) { + for (i = fileidx + d; n != 0 && i >= 0 && i < cnt; i += d) { if (files[i].marked) { n -= d; new = i; } } - if (new != sel) { + if (new != fileidx) { if (mode == MODE_IMAGE) { load_image(new); } else { - tns.sel = new; + fileidx = new; tns.dirty = true; } return true; @@ -462,7 +452,7 @@ bool ct_move_sel(arg_t a) bool ct_reload_all(arg_t a) { tns_free(&tns); - tns_init(&tns, filecnt, &win); + tns_init(&tns, filecnt, &win, &fileidx); return false; } diff --git a/main.c b/main.c index 9deba15..48eca54 100644 --- a/main.c +++ b/main.c @@ -184,6 +184,8 @@ void remove_file(int n, bool manual) filecnt--; if (n < tns.cnt) tns.cnt--; + if (mode == MODE_THUMB && fileidx >= tns.cnt) + fileidx = tns.cnt - 1; if (n < alternate) alternate--; } @@ -340,7 +342,6 @@ void load_image(int new) void update_info(void) { - int sel; unsigned int i, fn, fw, n; unsigned int llen = sizeof(win.bar.l), rlen = sizeof(win.bar.r); char *lt = win.bar.l, *rt = win.bar.r, title[TITLE_LEN]; @@ -348,23 +349,22 @@ void update_info(void) bool ow_info; for (fw = 0, i = filecnt; i > 0; fw++, i /= 10); - sel = mode == MODE_IMAGE ? fileidx : tns.sel; /* update window title */ if (mode == MODE_THUMB) { win_set_title(&win, "sxiv"); } else { - snprintf(title, sizeof(title), "sxiv - %s", files[sel].name); + snprintf(title, sizeof(title), "sxiv - %s", files[fileidx].name); win_set_title(&win, title); } /* update bar contents */ if (win.bar.h == 0) return; - mark = files[sel].marked ? "* " : ""; + mark = files[fileidx].marked ? "* " : ""; if (mode == MODE_THUMB) { if (tns.loadnext >= filecnt) { - n = snprintf(rt, rlen, "%s%0*d/%d", mark, fw, sel + 1, filecnt); + n = snprintf(rt, rlen, "%s%0*d/%d", mark, fw, fileidx + 1, filecnt); ow_info = true; } else { snprintf(lt, llen, "Loading... %0*d/%d", fw, tns.loadnext, filecnt); @@ -383,18 +383,18 @@ void update_info(void) n += snprintf(rt + n, rlen - n, "%0*d/%d | ", fn, img.multi.sel + 1, img.multi.cnt); } - n += snprintf(rt + n, rlen - n, "%0*d/%d", fw, sel + 1, filecnt); + n += snprintf(rt + n, rlen - n, "%0*d/%d", fw, fileidx + 1, filecnt); ow_info = info.cmd == NULL; } if (ow_info) { - fn = strlen(files[sel].name); + fn = strlen(files[fileidx].name); if (fn < llen && - win_textwidth(files[sel].name, fn, true) + + win_textwidth(files[fileidx].name, fn, true) + win_textwidth(rt, n, true) < win.w) { - strncpy(lt, files[sel].name, llen); + strncpy(lt, files[fileidx].name, llen); } else { - strncpy(lt, files[sel].base, llen); + strncpy(lt, files[fileidx].base, llen); } } } @@ -464,7 +464,7 @@ void clear_resize(void) void run_key_handler(const char *key, unsigned int mask) { pid_t pid; - int retval, status, n = mode == MODE_IMAGE ? fileidx : tns.sel; + int retval, status; char kstr[32], oldbar[sizeof(win.bar.l)]; bool restore_bar = mode == MODE_IMAGE && info.cmd != NULL; struct stat oldst, newst; @@ -489,10 +489,10 @@ void run_key_handler(const char *key, unsigned int mask) strncpy(win.bar.l, "Running key handler...", sizeof(win.bar.l)); win_draw(&win); win_set_cursor(&win, CURSOR_WATCH); - stat(files[n].path, &oldst); + stat(files[fileidx].path, &oldst); if ((pid = fork()) == 0) { - execl(keyhandler.cmd, keyhandler.cmd, kstr, files[n].path, NULL); + execl(keyhandler.cmd, keyhandler.cmd, kstr, files[fileidx].path, NULL); warn("could not exec key handler"); exit(EXIT_FAILURE); } else if (pid < 0) { @@ -504,7 +504,7 @@ void run_key_handler(const char *key, unsigned int mask) if (WIFEXITED(status) == 0 || retval != 0) warn("key handler exited with non-zero return value: %d", retval); - if (stat(files[n].path, &newst) == 0 && + if (stat(files[fileidx].path, &newst) == 0 && memcmp(&oldst.st_mtime, &newst.st_mtime, sizeof(oldst.st_mtime)) == 0) { /* file has not changed */ @@ -518,13 +518,11 @@ void run_key_handler(const char *key, unsigned int mask) img_close(&img, true); load_image(fileidx); } - if (!tns_load(&tns, n, &files[n], true, mode == MODE_IMAGE) && + if (!tns_load(&tns, fileidx, &files[fileidx], true, mode == MODE_IMAGE) && mode == MODE_THUMB) { - remove_file(tns.sel, false); + remove_file(fileidx, false); tns.dirty = true; - if (tns.sel >= tns.cnt) - tns.sel = tns.cnt - 1; } end: if (restore_bar) @@ -610,16 +608,16 @@ void on_buttonpress(XButtonEvent *bev) switch (bev->button) { case Button1: if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { - if (sel != tns.sel) { - tns_highlight(&tns, tns.sel, false); + if (sel != fileidx) { + tns_highlight(&tns, fileidx, false); tns_highlight(&tns, sel, true); - tns.sel = sel; + fileidx = sel; firstclick = bev->time; redraw(); } else if (bev->time - firstclick <= TO_DOUBLE_CLICK) { mode = MODE_IMAGE; set_timeout(reset_cursor, TO_CURSOR_HIDE, true); - load_image(tns.sel); + load_image(fileidx); redraw(); } else { firstclick = bev->time; @@ -665,8 +663,6 @@ void run(void) tns.cnt++; } else { remove_file(tns.loadnext, false); - if (tns.sel > 0 && tns.sel >= tns.cnt) - tns.sel--; } while (tns.loadnext < filecnt && tns.thumbs[tns.loadnext].loaded) tns.loadnext++; @@ -766,7 +762,7 @@ int main(int argc, char **argv) parse_options(argc, argv); if (options->clean_cache) { - tns_init(&tns, 0, NULL); + tns_init(&tns, 0, NULL, NULL); tns_clean_cache(&tns); exit(EXIT_SUCCESS); } @@ -859,7 +855,7 @@ int main(int argc, char **argv) if (options->thumb_mode) { mode = MODE_THUMB; - tns_init(&tns, filecnt, &win); + tns_init(&tns, filecnt, &win, &fileidx); while (!tns_load(&tns, 0, &files[0], false, false)) remove_file(0, false); tns.cnt = 1; diff --git a/thumbs.c b/thumbs.c index c617a45..369dfca 100644 --- a/thumbs.c +++ b/thumbs.c @@ -150,7 +150,7 @@ void tns_clean_cache(tns_t *tns) } -void tns_init(tns_t *tns, int cnt, win_t *win) +void tns_init(tns_t *tns, int cnt, win_t *win, int *sel) { int len; const char *homedir, *dsuffix = ""; @@ -165,7 +165,8 @@ void tns_init(tns_t *tns, int cnt, win_t *win) tns->thumbs = NULL; } tns->cap = cnt; - tns->cnt = tns->loadnext = tns->first = tns->sel = 0; + tns->cnt = tns->loadnext = tns->first = 0; + tns->sel = sel; tns->win = win; tns->dirty = false; @@ -338,21 +339,21 @@ void tns_check_view(tns_t *tns, bool scrolled) return; tns->first -= tns->first % tns->cols; - r = tns->sel % tns->cols; + r = *tns->sel % tns->cols; if (scrolled) { /* move selection into visible area */ - if (tns->sel >= tns->first + tns->cols * tns->rows) - tns->sel = tns->first + r + tns->cols * (tns->rows - 1); - else if (tns->sel < tns->first) - tns->sel = tns->first + r; + if (*tns->sel >= tns->first + tns->cols * tns->rows) + *tns->sel = tns->first + r + tns->cols * (tns->rows - 1); + else if (*tns->sel < tns->first) + *tns->sel = tns->first + r; } else { /* scroll to selection */ - if (tns->first + tns->cols * tns->rows <= tns->sel) { - tns->first = tns->sel - r - tns->cols * (tns->rows - 1); + if (tns->first + tns->cols * tns->rows <= *tns->sel) { + tns->first = *tns->sel - r - tns->cols * (tns->rows - 1); tns->dirty = true; - } else if (tns->first > tns->sel) { - tns->first = tns->sel - r; + } else if (tns->first > *tns->sel) { + tns->first = *tns->sel - r; tns->dirty = true; } } @@ -409,7 +410,7 @@ void tns_render(tns_t *tns) } } tns->dirty = false; - tns_highlight(tns, tns->sel, true); + tns_highlight(tns, *tns->sel, true); } void tns_mark(tns_t *tns, int n, bool mark) @@ -423,7 +424,7 @@ void tns_mark(tns_t *tns, int n, bool mark) win_t *win = tns->win; int x = t->x, y = t->y, w = t->w, h = t->h; - if (mark || n == tns->sel) + if (mark || n == *tns->sel) col = win->selcol; else if (win->fullscreen) col = win->fscol; @@ -473,33 +474,33 @@ bool tns_move_selection(tns_t *tns, direction_t dir, int cnt) if (tns == NULL || tns->thumbs == NULL) return false; - old = tns->sel; + old = *tns->sel; cnt = cnt > 1 ? cnt : 1; switch (dir) { case DIR_UP: - tns->sel = MAX(tns->sel - cnt * tns->cols, tns->sel % tns->cols); + *tns->sel = MAX(*tns->sel - cnt * tns->cols, *tns->sel % tns->cols); break; case DIR_DOWN: max = tns->cols * ((tns->cnt - 1) / tns->cols) + - MIN((tns->cnt - 1) % tns->cols, tns->sel % tns->cols); - tns->sel = MIN(tns->sel + cnt * tns->cols, max); + MIN((tns->cnt - 1) % tns->cols, *tns->sel % tns->cols); + *tns->sel = MIN(*tns->sel + cnt * tns->cols, max); break; case DIR_LEFT: - tns->sel = MAX(tns->sel - cnt, 0); + *tns->sel = MAX(*tns->sel - cnt, 0); break; case DIR_RIGHT: - tns->sel = MIN(tns->sel + cnt, tns->cnt - 1); + *tns->sel = MIN(*tns->sel + cnt, tns->cnt - 1); break; } - if (tns->sel != old) { + if (*tns->sel != old) { tns_highlight(tns, old, false); tns_check_view(tns, false); if (!tns->dirty) - tns_highlight(tns, tns->sel, true); + tns_highlight(tns, *tns->sel, true); } - return tns->sel != old; + return *tns->sel != old; } bool tns_scroll(tns_t *tns, direction_t dir, bool screen) diff --git a/thumbs.h b/thumbs.h index 4de80c3..35864c3 100644 --- a/thumbs.h +++ b/thumbs.h @@ -41,7 +41,7 @@ typedef struct { int cnt; int loadnext; int first; - int sel; + int *sel; win_t *win; int x; @@ -54,7 +54,7 @@ typedef struct { void tns_clean_cache(tns_t*); -void tns_init(tns_t*, int, win_t*); +void tns_init(tns_t*, int, win_t*, int*); void tns_free(tns_t*); bool tns_load(tns_t*, int, const fileinfo_t*, bool, bool);