@@ -1,6 +1,6 @@ | |||
all: sxiv | |||
VERSION=git-20110220 | |||
VERSION=git-20110221 | |||
CC?=gcc | |||
PREFIX?=/usr/local | |||
@@ -129,15 +129,14 @@ int main(int argc, char **argv) { | |||
win_open(&win); | |||
img_init(&img, &win); | |||
if (options->thumbnails) | |||
tns_init(&tns, filecnt); | |||
if (options->thumbnails == 2) { | |||
if (options->thumbnails) { | |||
mode = MODE_THUMBS; | |||
tns_init(&tns, filecnt); | |||
win_clear(&win); | |||
win_draw(&win); | |||
} else { | |||
mode = MODE_NORMAL; | |||
tns.thumbs = NULL; | |||
load_image(); | |||
img_render(&img, &win); | |||
} | |||
@@ -163,11 +162,11 @@ void update_title() { | |||
size = filesize; | |||
size_readable(&size, &unit); | |||
n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | |||
fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | |||
filenames[fileidx]); | |||
fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | |||
filenames[fileidx]); | |||
} else { | |||
n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] broken: %s", | |||
fileidx + 1, filecnt, filenames[fileidx]); | |||
fileidx + 1, filecnt, filenames[fileidx]); | |||
} | |||
} | |||
@@ -309,6 +308,18 @@ void on_keypress(XKeyEvent *kev) { | |||
changed = load_image(); | |||
} | |||
break; | |||
case XK_g: | |||
if (fileidx != 0) { | |||
fileidx = 0; | |||
changed = load_image(); | |||
} | |||
break; | |||
case XK_G: | |||
if (fileidx != filecnt - 1) { | |||
fileidx = filecnt - 1; | |||
changed = load_image(); | |||
} | |||
break; | |||
/* zooming */ | |||
case XK_plus: | |||
@@ -368,10 +379,11 @@ void on_keypress(XKeyEvent *kev) { | |||
/* switch to thumnail mode */ | |||
case XK_Return: | |||
if (options->thumbnails) { | |||
mode = MODE_THUMBS; | |||
changed = tns.dirty = 1; | |||
} | |||
if (!tns.thumbs) | |||
tns_init(&tns, filecnt); | |||
mode = MODE_THUMBS; | |||
tns.sel = fileidx; | |||
changed = tns.dirty = 1; | |||
break; | |||
/* miscellaneous */ | |||
@@ -388,6 +400,7 @@ void on_keypress(XKeyEvent *kev) { | |||
switch (ksym) { | |||
/* open selected image */ | |||
case XK_Return: | |||
fileidx = tns.sel; | |||
load_image(); | |||
mode = MODE_NORMAL; | |||
win_set_cursor(&win, CURSOR_ARROW); | |||
@@ -411,6 +424,17 @@ void on_keypress(XKeyEvent *kev) { | |||
case XK_Right: | |||
changed = tns_move_selection(&tns, &win, TNS_RIGHT); | |||
break; | |||
case XK_g: | |||
if (tns.sel != 0) { | |||
tns.sel = 0; | |||
changed = tns.dirty = 1; | |||
} | |||
break; | |||
case XK_G: | |||
if (tns.sel != tns.cnt - 1) { | |||
tns.sel = tns.cnt - 1; | |||
changed = tns.dirty = 1; | |||
} | |||
} | |||
} | |||
@@ -423,27 +447,6 @@ void on_keypress(XKeyEvent *kev) { | |||
cleanup(); | |||
exit(0); | |||
case XK_g: | |||
if (fileidx != 0) { | |||
fileidx = 0; | |||
changed = 1; | |||
if (mode == MODE_NORMAL) | |||
load_image(); | |||
else | |||
tns.dirty = 1; | |||
} | |||
break; | |||
case XK_G: | |||
if (fileidx != filecnt - 1) { | |||
fileidx = filecnt - 1; | |||
changed = 1; | |||
if (mode == MODE_NORMAL) | |||
load_image(); | |||
else | |||
tns.dirty = 1; | |||
} | |||
break; | |||
case XK_f: | |||
win_toggle_fullscreen(&win); | |||
/* render on next configurenotify */ | |||
@@ -511,14 +514,15 @@ void on_buttonpress(XButtonEvent *bev) { | |||
switch (bev->button) { | |||
case Button1: | |||
if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { | |||
if (sel == fileidx) { | |||
if (sel == tns.sel) { | |||
fileidx = tns.sel; | |||
load_image(); | |||
mode = MODE_NORMAL; | |||
win_set_cursor(&win, CURSOR_ARROW); | |||
} else { | |||
tns_highlight(&tns, &win, fileidx, False); | |||
tns_highlight(&tns, &win, tns.sel, False); | |||
tns_highlight(&tns, &win, sel, True); | |||
fileidx = sel; | |||
tns.sel = sel; | |||
} | |||
changed = 1; | |||
break; | |||
@@ -585,6 +589,7 @@ void run() { | |||
FD_SET(xfd, &fds); | |||
if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) | |||
/* timeout fired */ | |||
redraw(); | |||
} | |||
@@ -87,8 +87,7 @@ void parse_options(int argc, char **argv) { | |||
_options.scalemode = SCALE_FIT; | |||
break; | |||
case 't': | |||
if (_options.thumbnails < 2) | |||
++_options.thumbnails; | |||
_options.thumbnails = 1; | |||
break; | |||
case 'v': | |||
print_version(); | |||
@@ -25,16 +25,14 @@ | |||
#include "thumbs.h" | |||
#include "util.h" | |||
extern int fileidx; | |||
extern Imlib_Image *im_broken; | |||
const int thumb_dim = THUMB_SIZE + 10; | |||
void tns_init(tns_t *tns, int cnt) { | |||
if (!tns) | |||
return; | |||
tns->cnt = tns->first = 0; | |||
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; | |||
@@ -43,7 +41,7 @@ void tns_init(tns_t *tns, int cnt) { | |||
void tns_free(tns_t *tns, win_t *win) { | |||
int i; | |||
if (!tns) | |||
if (!tns || !tns->thumbs) | |||
return; | |||
for (i = 0; i < tns->cnt; ++i) | |||
@@ -94,21 +92,21 @@ void tns_check_view(tns_t *tns, Bool scrolled) { | |||
return; | |||
tns->first -= tns->first % tns->cols; | |||
r = fileidx % tns->cols; | |||
r = tns->sel % tns->cols; | |||
if (scrolled) { | |||
/* move selection into visible area */ | |||
if (fileidx >= tns->first + tns->cols * tns->rows) | |||
fileidx = tns->first + r + tns->cols * (tns->rows - 1); | |||
else if (fileidx < tns->first) | |||
fileidx = 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 <= fileidx) { | |||
tns->first = fileidx - 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 = 1; | |||
} else if (tns->first > fileidx) { | |||
tns->first = fileidx - r; | |||
} else if (tns->first > tns->sel) { | |||
tns->first = tns->sel - r; | |||
tns->dirty = 1; | |||
} | |||
} | |||
@@ -156,7 +154,7 @@ void tns_render(tns_t *tns, win_t *win) { | |||
} | |||
tns->dirty = 0; | |||
tns_highlight(tns, win, fileidx, True); | |||
tns_highlight(tns, win, tns->sel, True); | |||
} | |||
void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { | |||
@@ -179,35 +177,35 @@ int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) { | |||
if (!tns || !win) | |||
return 0; | |||
old = fileidx; | |||
old = tns->sel; | |||
switch (dir) { | |||
case TNS_LEFT: | |||
if (fileidx > 0) | |||
--fileidx; | |||
if (tns->sel > 0) | |||
--tns->sel; | |||
break; | |||
case TNS_RIGHT: | |||
if (fileidx < tns->cnt - 1) | |||
++fileidx; | |||
if (tns->sel < tns->cnt - 1) | |||
++tns->sel; | |||
break; | |||
case TNS_UP: | |||
if (fileidx >= tns->cols) | |||
fileidx -= tns->cols; | |||
if (tns->sel >= tns->cols) | |||
tns->sel -= tns->cols; | |||
break; | |||
case TNS_DOWN: | |||
if (fileidx + tns->cols < tns->cnt) | |||
fileidx += tns->cols; | |||
if (tns->sel + tns->cols < tns->cnt) | |||
tns->sel += tns->cols; | |||
break; | |||
} | |||
if (fileidx != old) { | |||
if (tns->sel != old) { | |||
tns_highlight(tns, win, old, False); | |||
tns_check_view(tns, False); | |||
if (!tns->dirty) | |||
tns_highlight(tns, win, fileidx, True); | |||
tns_highlight(tns, win, tns->sel, True); | |||
} | |||
return fileidx != old; | |||
return tns->sel != old; | |||
} | |||
int tns_scroll(tns_t *tns, tnsdir_t dir) { | |||