nsxiv1cdbeb9
Added screen-wise scrolling for thumbnail mode
+57 −44
9 files changed
- M Makefile +1 −1
- M README.md +1 −0
- M commands.c +4 −4
- M commands.h +3 −3
- M config.def.h +26 −26
- M main.c +2 −1
- M sxiv.1 +6 −0
- M thumbs.c +13 −8
- M thumbs.h +1 −1
| @@ -1,4 +1,4 @@ | |||
| 1 | − | VERSION = git-20111017 | |
| 1 | + | VERSION = git-20111027 | |
| 2 | 2 | ||
| 3 | 3 | CC = gcc | |
| 4 | 4 | CFLAGS = -ansi -Wall -pedantic -O2 | |
| @@ -102,6 +102,7 @@ The following general key commands are available: | |||
| 102 | 102 | The following additional key commands are available in *thumbnail mode*: | |
| 103 | 103 | ||
| 104 | 104 | h,j,k,l Move selection left/down/up/right | |
| 105 | + | Ctrl-j,k Scroll thumbnail grid one window height down/up | |
| 105 | 106 | ||
| 106 | 107 | The following additional key commands are available in *image mode*: | |
| 107 | 108 | ||
| @@ -188,7 +188,7 @@ bool i_toggle_animation(arg_t a) { | |||
| 188 | 188 | return true; | |
| 189 | 189 | } | |
| 190 | 190 | ||
| 191 | − | bool it_move(arg_t a) { | |
| 191 | + | bool it_scroll_move(arg_t a) { | |
| 192 | 192 | direction_t dir = (direction_t) a; | |
| 193 | 193 | ||
| 194 | 194 | if (mode == MODE_IMAGE) | |
| @@ -197,16 +197,16 @@ bool it_move(arg_t a) { | |||
| 197 | 197 | return tns_move_selection(&tns, dir); | |
| 198 | 198 | } | |
| 199 | 199 | ||
| 200 | − | bool i_pan_screen(arg_t a) { | |
| 200 | + | bool it_scroll_screen(arg_t a) { | |
| 201 | 201 | direction_t dir = (direction_t) a; | |
| 202 | 202 | ||
| 203 | 203 | if (mode == MODE_IMAGE) | |
| 204 | 204 | return img_pan(&img, dir, -1); | |
| 205 | 205 | else | |
| 206 | − | return false; | |
| 206 | + | return tns_scroll(&tns, dir, true); | |
| 207 | 207 | } | |
| 208 | 208 | ||
| 209 | − | bool i_pan_edge(arg_t a) { | |
| 209 | + | bool i_scroll_to_edge(arg_t a) { | |
| 210 | 210 | direction_t dir = (direction_t) a; | |
| 211 | 211 | ||
| 212 | 212 | if (mode == MODE_IMAGE) | |
| @@ -51,9 +51,9 @@ bool it_first(arg_t); | |||
| 51 | 51 | bool it_n_or_last(arg_t); | |
| 52 | 52 | bool i_navigate_frame(arg_t); | |
| 53 | 53 | bool i_toggle_animation(arg_t); | |
| 54 | − | bool it_move(arg_t); | |
| 55 | − | bool i_pan_screen(arg_t); | |
| 56 | − | bool i_pan_edge(arg_t); | |
| 54 | + | bool it_scroll_move(arg_t); | |
| 55 | + | bool it_scroll_screen(arg_t); | |
| 56 | + | bool i_scroll_to_edge(arg_t); | |
| 57 | 57 | bool i_drag(arg_t); | |
| 58 | 58 | bool i_zoom(arg_t); | |
| 59 | 59 | bool i_set_zoom(arg_t); | |
| @@ -85,28 +85,28 @@ static const keymap_t keys[] = { | |||
| 85 | 85 | { true, XK_p, i_navigate_frame, (arg_t) -1 }, | |
| 86 | 86 | { true, XK_space, i_toggle_animation, (arg_t) None }, | |
| 87 | 87 | ||
| 88 | − | { false, XK_h, it_move, (arg_t) DIR_LEFT }, | |
| 89 | − | { false, XK_Left, it_move, (arg_t) DIR_LEFT }, | |
| 90 | − | { false, XK_j, it_move, (arg_t) DIR_DOWN }, | |
| 91 | − | { false, XK_Down, it_move, (arg_t) DIR_DOWN }, | |
| 92 | − | { false, XK_k, it_move, (arg_t) DIR_UP }, | |
| 93 | − | { false, XK_Up, it_move, (arg_t) DIR_UP }, | |
| 94 | − | { false, XK_l, it_move, (arg_t) DIR_RIGHT }, | |
| 95 | − | { false, XK_Right, it_move, (arg_t) DIR_RIGHT }, | |
| 96 | − | ||
| 97 | − | { true, XK_h, i_pan_screen, (arg_t) DIR_LEFT }, | |
| 98 | − | { true, XK_Left, i_pan_screen, (arg_t) DIR_LEFT }, | |
| 99 | − | { true, XK_j, i_pan_screen, (arg_t) DIR_DOWN }, | |
| 100 | − | { true, XK_Down, i_pan_screen, (arg_t) DIR_DOWN }, | |
| 101 | − | { true, XK_k, i_pan_screen, (arg_t) DIR_UP }, | |
| 102 | − | { true, XK_Up, i_pan_screen, (arg_t) DIR_UP }, | |
| 103 | − | { true, XK_l, i_pan_screen, (arg_t) DIR_RIGHT }, | |
| 104 | − | { true, XK_Right, i_pan_screen, (arg_t) DIR_RIGHT }, | |
| 105 | − | ||
| 106 | − | { false, XK_H, i_pan_edge, (arg_t) DIR_LEFT }, | |
| 107 | − | { false, XK_J, i_pan_edge, (arg_t) DIR_DOWN }, | |
| 108 | − | { false, XK_K, i_pan_edge, (arg_t) DIR_UP }, | |
| 109 | − | { false, XK_L, i_pan_edge, (arg_t) DIR_RIGHT }, | |
| 88 | + | { false, XK_h, it_scroll_move, (arg_t) DIR_LEFT }, | |
| 89 | + | { false, XK_Left, it_scroll_move, (arg_t) DIR_LEFT }, | |
| 90 | + | { false, XK_j, it_scroll_move, (arg_t) DIR_DOWN }, | |
| 91 | + | { false, XK_Down, it_scroll_move, (arg_t) DIR_DOWN }, | |
| 92 | + | { false, XK_k, it_scroll_move, (arg_t) DIR_UP }, | |
| 93 | + | { false, XK_Up, it_scroll_move, (arg_t) DIR_UP }, | |
| 94 | + | { false, XK_l, it_scroll_move, (arg_t) DIR_RIGHT }, | |
| 95 | + | { false, XK_Right, it_scroll_move, (arg_t) DIR_RIGHT }, | |
| 96 | + | ||
| 97 | + | { true, XK_h, it_scroll_screen, (arg_t) DIR_LEFT }, | |
| 98 | + | { true, XK_Left, it_scroll_screen, (arg_t) DIR_LEFT }, | |
| 99 | + | { true, XK_j, it_scroll_screen, (arg_t) DIR_DOWN }, | |
| 100 | + | { true, XK_Down, it_scroll_screen, (arg_t) DIR_DOWN }, | |
| 101 | + | { true, XK_k, it_scroll_screen, (arg_t) DIR_UP }, | |
| 102 | + | { true, XK_Up, it_scroll_screen, (arg_t) DIR_UP }, | |
| 103 | + | { true, XK_l, it_scroll_screen, (arg_t) DIR_RIGHT }, | |
| 104 | + | { true, XK_Right, it_scroll_screen, (arg_t) DIR_RIGHT }, | |
| 105 | + | ||
| 106 | + | { false, XK_H, i_scroll_to_edge, (arg_t) DIR_LEFT }, | |
| 107 | + | { false, XK_J, i_scroll_to_edge, (arg_t) DIR_DOWN }, | |
| 108 | + | { false, XK_K, i_scroll_to_edge, (arg_t) DIR_UP }, | |
| 109 | + | { false, XK_L, i_scroll_to_edge, (arg_t) DIR_RIGHT }, | |
| 110 | 110 | ||
| 111 | 111 | { false, XK_plus, i_zoom, (arg_t) +1 }, | |
| 112 | 112 | { false, XK_KP_Add, i_zoom, (arg_t) +1 }, | |
| @@ -147,10 +147,10 @@ static const button_t buttons[] = { | |||
| 147 | 147 | { false, false, Button1, i_navigate, (arg_t) +1 }, | |
| 148 | 148 | { false, false, Button3, i_navigate, (arg_t) -1 }, | |
| 149 | 149 | { false, false, Button2, i_drag, (arg_t) None }, | |
| 150 | − | { false, false, Button4, it_move, (arg_t) DIR_UP }, | |
| 151 | − | { false, false, Button5, it_move, (arg_t) DIR_DOWN }, | |
| 152 | − | { false, true, Button4, it_move, (arg_t) DIR_LEFT }, | |
| 153 | − | { false, true, Button5, it_move, (arg_t) DIR_RIGHT }, | |
| 150 | + | { false, false, Button4, it_scroll_move, (arg_t) DIR_UP }, | |
| 151 | + | { false, false, Button5, it_scroll_move, (arg_t) DIR_DOWN }, | |
| 152 | + | { false, true, Button4, it_scroll_move, (arg_t) DIR_LEFT }, | |
| 153 | + | { false, true, Button5, it_scroll_move, (arg_t) DIR_RIGHT }, | |
| 154 | 154 | { true, false, Button4, i_zoom, (arg_t) +1 }, | |
| 155 | 155 | { true, false, Button5, i_zoom, (arg_t) -1 }, | |
| 156 | 156 | }; | |
| @@ -394,7 +394,8 @@ void on_buttonpress(XButtonEvent *bev) { | |||
| 394 | 394 | break; | |
| 395 | 395 | case Button4: | |
| 396 | 396 | case Button5: | |
| 397 | − | if (tns_scroll(&tns, bev->button == Button4 ? DIR_UP : DIR_DOWN)) | |
| 397 | + | if (tns_scroll(&tns, bev->button == Button4 ? DIR_UP : DIR_DOWN, | |
| 398 | + | (bev->state & ControlMask) != 0)) | |
| 398 | 399 | redraw(); | |
| 399 | 400 | break; | |
| 400 | 401 | } | |
| @@ -127,6 +127,12 @@ Move selection up. | |||
| 127 | 127 | .TP | |
| 128 | 128 | .BR l ", " Right | |
| 129 | 129 | Move selection right. | |
| 130 | + | .TP | |
| 131 | + | .BR Ctrl-j ", " Ctrl-Down | |
| 132 | + | Scroll thumbnail grid one window height down. | |
| 133 | + | .TP | |
| 134 | + | .BR Ctrl-k ", " Ctrl-Up | |
| 135 | + | Scroll thumbnail grid one window height up. | |
| 130 | 136 | .SH IMAGE KEYBOARD COMMANDS | |
| 131 | 137 | The following keyboard commands are only available in image mode: | |
| 132 | 138 | .SS Navigate image list | |
| @@ -430,20 +430,25 @@ bool tns_move_selection(tns_t *tns, direction_t dir) { | |||
| 430 | 430 | return tns->sel != old; | |
| 431 | 431 | } | |
| 432 | 432 | ||
| 433 | − | bool tns_scroll(tns_t *tns, direction_t dir) { | |
| 434 | − | int old; | |
| 433 | + | bool tns_scroll(tns_t *tns, direction_t dir, bool screen) { | |
| 434 | + | int d, max, old; | |
| 435 | 435 | ||
| 436 | 436 | if (tns == NULL) | |
| 437 | 437 | return false; | |
| 438 | 438 | ||
| 439 | 439 | old = tns->first; | |
| 440 | + | d = tns->cols * (screen ? tns->rows : 1); | |
| 441 | + | ||
| 442 | + | if (dir == DIR_DOWN) { | |
| 443 | + | max = tns->cnt - tns->cols * tns->rows; | |
| 444 | + | if (tns->cnt % tns->cols != 0) | |
| 445 | + | max += tns->cols - tns->cnt % tns->cols; | |
| 446 | + | tns->first = MIN(tns->first + d, max); | |
| 447 | + | } else if (dir == DIR_UP) { | |
| 448 | + | tns->first = MAX(tns->first - d, 0); | |
| 449 | + | } | |
| 440 | 450 | ||
| 441 | − | if (dir == DIR_DOWN && tns->first + tns->cols * tns->rows < tns->cnt) { | |
| 442 | − | tns->first += tns->cols; | |
| 443 | − | tns_check_view(tns, true); | |
| 444 | − | tns->dirty = true; | |
| 445 | − | } else if (dir == DIR_UP && tns->first >= tns->cols) { | |
| 446 | − | tns->first -= tns->cols; | |
| 451 | + | if (tns->first != old) { | |
| 447 | 452 | tns_check_view(tns, true); | |
| 448 | 453 | tns->dirty = true; | |
| 449 | 454 | } | |
| @@ -62,7 +62,7 @@ void tns_render(tns_t*); | |||
| 62 | 62 | void tns_highlight(tns_t*, int, bool); | |
| 63 | 63 | ||
| 64 | 64 | bool tns_move_selection(tns_t*, direction_t); | |
| 65 | − | bool tns_scroll(tns_t*, direction_t); | |
| 65 | + | bool tns_scroll(tns_t*, direction_t, bool); | |
| 66 | 66 | ||
| 67 | 67 | int tns_translate(tns_t*, int, int); | |
| 68 | 68 | ||