diff --git a/Makefile b/Makefile index 6743a29..d4bcf95 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ all: sxiv -VERSION=git-20110218 +VERSION=git-20110219 CC?=gcc PREFIX?=/usr/local diff --git a/main.c b/main.c index 46e8e6b..7d8bf3e 100644 --- a/main.c +++ b/main.c @@ -386,7 +386,7 @@ void on_keypress(XKeyEvent *kev) { else tns.sel = 0; mode = MODE_THUMBS; - changed = 1; + changed = tns.dirty = 1; } break; @@ -416,19 +416,19 @@ void on_keypress(XKeyEvent *kev) { /* move selection */ case XK_h: case XK_Left: - tns_move_selection(&tns, &win, MOVE_LEFT); + changed = tns_move_selection(&tns, &win, MOVE_LEFT); break; case XK_j: case XK_Down: - tns_move_selection(&tns, &win, MOVE_DOWN); + changed = tns_move_selection(&tns, &win, MOVE_DOWN); break; case XK_k: case XK_Up: - tns_move_selection(&tns, &win, MOVE_UP); + changed = tns_move_selection(&tns, &win, MOVE_UP); break; case XK_l: case XK_Right: - tns_move_selection(&tns, &win, MOVE_RIGHT); + changed = tns_move_selection(&tns, &win, MOVE_RIGHT); break; } } @@ -594,6 +594,8 @@ void run() { timeout = 75000; if (mode == MODE_NORMAL) img.checkpan = 1; + else + tns.dirty = 1; } break; case ClientMessage: diff --git a/thumbs.c b/thumbs.c index ab9a5f4..5fc0ff9 100644 --- a/thumbs.c +++ b/thumbs.c @@ -35,6 +35,7 @@ void tns_init(tns_t *tns, int cnt) { tns->cnt = tns->first = tns->sel = 0; tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); memset(tns->thumbs, 0, cnt * sizeof(thumb_t)); + tns->dirty = 0; } void tns_free(tns_t *tns, win_t *win) { @@ -81,12 +82,14 @@ void tns_load(tns_t *tns, win_t *win, const char *filename) { imlib_render_image_part_on_drawable_at_size(0, 0, w, h, 0, 0, t->w, t->h); imlib_free_image(); + + tns->dirty = 1; } void tns_render(tns_t *tns, win_t *win) { int i, cnt, x, y; - if (!tns || !win) + if (!tns || !tns->dirty || !win) return; tns->cols = MAX(1, win->w / thumb_dim); @@ -117,6 +120,8 @@ void tns_render(tns_t *tns, win_t *win) { } } + tns->dirty = 0; + tns_highlight(tns, win, -1); } @@ -138,13 +143,13 @@ void tns_highlight(tns_t *tns, win_t *win, int old) { win_draw(win); } -void tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { +int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { int sel, old; if (!tns || !win) - return; + return 0; - sel = tns->sel; + sel = old = tns->sel; switch (dir) { case MOVE_LEFT: @@ -165,11 +170,12 @@ void tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { break; } - if (sel != tns->sel && tns->thumbs[sel].x != 0) { - old = tns->sel; + if (sel != old && tns->thumbs[sel].x != 0) { tns->sel = sel; tns_highlight(tns, win, old); } + + return sel != old; } int tns_translate(tns_t *tns, int x, int y) { diff --git a/thumbs.h b/thumbs.h index e6c6e7f..2f1c14d 100644 --- a/thumbs.h +++ b/thumbs.h @@ -45,6 +45,7 @@ typedef struct tns_s { int rows; int first; int sel; + unsigned char dirty; } tns_t; void tns_init(tns_t*, int); @@ -55,7 +56,7 @@ void tns_load(tns_t*, win_t*, const char*); void tns_render(tns_t*, win_t*); void tns_highlight(tns_t*, win_t*, int); -void tns_move_selection(tns_t*, win_t*, movedir_t); +int tns_move_selection(tns_t*, win_t*, movedir_t); int tns_translate(tns_t*, int, int);