| @@ -69,17 +69,20 @@ void cleanup() { |
| 69 | 69 | | } |
| 70 | 70 | | } |
| 71 | 71 | | |
| 72 | | − | int load_image() { |
| 72 | + | int load_image(int new) { |
| 73 | 73 | | struct stat fstats; |
| 74 | 74 | | |
| 75 | | − | img_close(&img); |
| 76 | | − | |
| 77 | | − | if (!stat(filenames[fileidx], &fstats)) |
| 78 | | − | filesize = fstats.st_size; |
| 79 | | − | else |
| 80 | | − | filesize = 0; |
| 81 | | − | |
| 82 | | − | return img_load(&img, filenames[fileidx]); |
| 75 | + | if (new >= 0 && new < filecnt) { |
| 76 | + | img_close(&img); |
| 77 | + | fileidx = new; |
| 78 | + | if (!stat(filenames[fileidx], &fstats)) |
| 79 | + | filesize = fstats.st_size; |
| 80 | + | else |
| 81 | + | filesize = 0; |
| 82 | + | return img_load(&img, filenames[fileidx]); |
| 83 | + | } else { |
| 84 | + | return 0; |
| 85 | + | } |
| 83 | 86 | | } |
| 84 | 87 | | |
| 85 | 88 | | int main(int argc, char **argv) { |
| @@ -140,7 +143,7 @@ int main(int argc, char **argv) { |
| 140 | 143 | | } else { |
| 141 | 144 | | mode = MODE_NORMAL; |
| 142 | 145 | | tns.thumbs = NULL; |
| 143 | | − | load_image(); |
| 146 | + | load_image(fileidx); |
| 144 | 147 | | img_render(&img, &win); |
| 145 | 148 | | } |
| 146 | 149 | | |
| @@ -307,41 +310,29 @@ void on_keypress(XKeyEvent *kev) { |
| 307 | 310 | | /* navigate image list */ |
| 308 | 311 | | case XK_n: |
| 309 | 312 | | case XK_space: |
| 310 | | − | if (fileidx + 1 < filecnt) { |
| 311 | | − | ++fileidx; |
| 312 | | − | changed = load_image(); |
| 313 | | − | } |
| 313 | + | if (fileidx + 1 < filecnt) |
| 314 | + | changed = load_image(fileidx + 1); |
| 314 | 315 | | break; |
| 315 | 316 | | case XK_p: |
| 316 | 317 | | case XK_BackSpace: |
| 317 | | − | if (fileidx > 0) { |
| 318 | | − | --fileidx; |
| 319 | | − | changed = load_image(); |
| 320 | | − | } |
| 318 | + | if (fileidx > 0) |
| 319 | + | changed = load_image(fileidx - 1); |
| 321 | 320 | | break; |
| 322 | 321 | | case XK_bracketleft: |
| 323 | | − | if (fileidx != 0) { |
| 324 | | − | fileidx = MAX(0, fileidx - 10); |
| 325 | | − | changed = load_image(); |
| 326 | | − | } |
| 322 | + | if (fileidx != 0) |
| 323 | + | changed = load_image(MAX(0, fileidx - 10)); |
| 327 | 324 | | break; |
| 328 | 325 | | case XK_bracketright: |
| 329 | | − | if (fileidx != filecnt - 1) { |
| 330 | | − | fileidx = MIN(fileidx + 10, filecnt - 1); |
| 331 | | − | changed = load_image(); |
| 332 | | − | } |
| 326 | + | if (fileidx != filecnt - 1) |
| 327 | + | changed = load_image(MIN(fileidx + 10, filecnt - 1)); |
| 333 | 328 | | break; |
| 334 | 329 | | case XK_g: |
| 335 | | − | if (fileidx != 0) { |
| 336 | | − | fileidx = 0; |
| 337 | | − | changed = load_image(); |
| 338 | | − | } |
| 330 | + | if (fileidx != 0) |
| 331 | + | changed = load_image(0); |
| 339 | 332 | | break; |
| 340 | 333 | | case XK_G: |
| 341 | | − | if (fileidx != filecnt - 1) { |
| 342 | | − | fileidx = filecnt - 1; |
| 343 | | − | changed = load_image(); |
| 344 | | − | } |
| 334 | + | if (fileidx != filecnt - 1) |
| 335 | + | changed = load_image(filecnt - 1); |
| 345 | 336 | | break; |
| 346 | 337 | | |
| 347 | 338 | | /* zooming */ |
| @@ -418,7 +409,7 @@ void on_keypress(XKeyEvent *kev) { |
| 418 | 409 | | changed = 1; |
| 419 | 410 | | break; |
| 420 | 411 | | case XK_r: |
| 421 | | − | changed = load_image(); |
| 412 | + | changed = load_image(fileidx); |
| 422 | 413 | | break; |
| 423 | 414 | | } |
| 424 | 415 | | } else { |
| @@ -426,8 +417,7 @@ void on_keypress(XKeyEvent *kev) { |
| 426 | 417 | | switch (ksym) { |
| 427 | 418 | | /* open selected image */ |
| 428 | 419 | | case XK_Return: |
| 429 | | − | fileidx = tns.sel; |
| 430 | | − | load_image(); |
| 420 | + | load_image(tns.sel); |
| 431 | 421 | | mode = MODE_NORMAL; |
| 432 | 422 | | win_set_cursor(&win, CURSOR_NONE); |
| 433 | 423 | | changed = 1; |
| @@ -496,10 +486,8 @@ void on_buttonpress(XButtonEvent *bev) { |
| 496 | 486 | | if (mode == MODE_NORMAL) { |
| 497 | 487 | | switch (bev->button) { |
| 498 | 488 | | case Button1: |
| 499 | | − | if (fileidx + 1 < filecnt) { |
| 500 | | − | ++fileidx; |
| 501 | | − | changed = load_image(); |
| 502 | | − | } |
| 489 | + | if (fileidx + 1 < filecnt) |
| 490 | + | changed = load_image(fileidx + 1); |
| 503 | 491 | | break; |
| 504 | 492 | | case Button2: |
| 505 | 493 | | mox = bev->x; |
| @@ -509,10 +497,8 @@ void on_buttonpress(XButtonEvent *bev) { |
| 509 | 497 | | drag = 1; |
| 510 | 498 | | break; |
| 511 | 499 | | case Button3: |
| 512 | | − | if (fileidx > 0) { |
| 513 | | − | --fileidx; |
| 514 | | − | changed = load_image(); |
| 515 | | − | } |
| 500 | + | if (fileidx > 0) |
| 501 | + | changed = load_image(fileidx - 1); |
| 516 | 502 | | break; |
| 517 | 503 | | case Button4: |
| 518 | 504 | | if (mask == ControlMask) |
| @@ -543,8 +529,7 @@ void on_buttonpress(XButtonEvent *bev) { |
| 543 | 529 | | case Button1: |
| 544 | 530 | | if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { |
| 545 | 531 | | if (sel == tns.sel) { |
| 546 | | − | fileidx = tns.sel; |
| 547 | | − | load_image(); |
| 532 | + | load_image(tns.sel); |
| 548 | 533 | | mode = MODE_NORMAL; |
| 549 | 534 | | timo_cursor = TO_CURSOR_HIDE; |
| 550 | 535 | | } else { |
| @@ -600,7 +585,8 @@ void run() { |
| 600 | 585 | | gettimeofday(&t0, 0); |
| 601 | 586 | | |
| 602 | 587 | | while (!XPending(win.env.dpy) && tns.cnt < filecnt) { |
| 603 | | − | tns_load(&tns, &win, filenames[tns.cnt]); |
| 588 | + | /* tns.cnt is increased inside tns_load */ |
| 589 | + | tns_load(&tns, &win, tns.cnt, filenames[tns.cnt]); |
| 604 | 590 | | gettimeofday(&t1, 0); |
| 605 | 591 | | if (TV_TO_DOUBLE(t1) - TV_TO_DOUBLE(t0) >= 0.25) |
| 606 | 592 | | break; |