From 1cdbeb972a64e1fb12db5dc05fbaa1428e72bb12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Thu, 27 Oct 2011 16:21:01 +0200 Subject: [PATCH] Added screen-wise scrolling for thumbnail mode --- Makefile | 2 +- README.md | 1 + commands.c | 8 ++++---- commands.h | 6 +++--- config.def.h | 48 ++++++++++++++++++++++++------------------------ main.c | 3 ++- sxiv.1 | 6 ++++++ thumbs.c | 21 +++++++++++++-------- thumbs.h | 2 +- 9 files changed, 55 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 25a40fc..d6360b8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION = git-20111017 +VERSION = git-20111027 CC = gcc CFLAGS = -ansi -Wall -pedantic -O2 diff --git a/README.md b/README.md index 854343f..5783635 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ The following general key commands are available: The following additional key commands are available in *thumbnail mode*: h,j,k,l Move selection left/down/up/right + Ctrl-j,k Scroll thumbnail grid one window height down/up The following additional key commands are available in *image mode*: diff --git a/commands.c b/commands.c index b869175..a8b9e77 100644 --- a/commands.c +++ b/commands.c @@ -188,7 +188,7 @@ bool i_toggle_animation(arg_t a) { return true; } -bool it_move(arg_t a) { +bool it_scroll_move(arg_t a) { direction_t dir = (direction_t) a; if (mode == MODE_IMAGE) @@ -197,16 +197,16 @@ bool it_move(arg_t a) { return tns_move_selection(&tns, dir); } -bool i_pan_screen(arg_t a) { +bool it_scroll_screen(arg_t a) { direction_t dir = (direction_t) a; if (mode == MODE_IMAGE) return img_pan(&img, dir, -1); else - return false; + return tns_scroll(&tns, dir, true); } -bool i_pan_edge(arg_t a) { +bool i_scroll_to_edge(arg_t a) { direction_t dir = (direction_t) a; if (mode == MODE_IMAGE) diff --git a/commands.h b/commands.h index 061ebc3..065982b 100644 --- a/commands.h +++ b/commands.h @@ -51,9 +51,9 @@ bool it_first(arg_t); bool it_n_or_last(arg_t); bool i_navigate_frame(arg_t); bool i_toggle_animation(arg_t); -bool it_move(arg_t); -bool i_pan_screen(arg_t); -bool i_pan_edge(arg_t); +bool it_scroll_move(arg_t); +bool it_scroll_screen(arg_t); +bool i_scroll_to_edge(arg_t); bool i_drag(arg_t); bool i_zoom(arg_t); bool i_set_zoom(arg_t); diff --git a/config.def.h b/config.def.h index d8bb47f..777cb80 100644 --- a/config.def.h +++ b/config.def.h @@ -85,28 +85,28 @@ static const keymap_t keys[] = { { true, XK_p, i_navigate_frame, (arg_t) -1 }, { true, XK_space, i_toggle_animation, (arg_t) None }, - { false, XK_h, it_move, (arg_t) DIR_LEFT }, - { false, XK_Left, it_move, (arg_t) DIR_LEFT }, - { false, XK_j, it_move, (arg_t) DIR_DOWN }, - { false, XK_Down, it_move, (arg_t) DIR_DOWN }, - { false, XK_k, it_move, (arg_t) DIR_UP }, - { false, XK_Up, it_move, (arg_t) DIR_UP }, - { false, XK_l, it_move, (arg_t) DIR_RIGHT }, - { false, XK_Right, it_move, (arg_t) DIR_RIGHT }, + { false, XK_h, it_scroll_move, (arg_t) DIR_LEFT }, + { false, XK_Left, it_scroll_move, (arg_t) DIR_LEFT }, + { false, XK_j, it_scroll_move, (arg_t) DIR_DOWN }, + { false, XK_Down, it_scroll_move, (arg_t) DIR_DOWN }, + { false, XK_k, it_scroll_move, (arg_t) DIR_UP }, + { false, XK_Up, it_scroll_move, (arg_t) DIR_UP }, + { false, XK_l, it_scroll_move, (arg_t) DIR_RIGHT }, + { false, XK_Right, it_scroll_move, (arg_t) DIR_RIGHT }, - { true, XK_h, i_pan_screen, (arg_t) DIR_LEFT }, - { true, XK_Left, i_pan_screen, (arg_t) DIR_LEFT }, - { true, XK_j, i_pan_screen, (arg_t) DIR_DOWN }, - { true, XK_Down, i_pan_screen, (arg_t) DIR_DOWN }, - { true, XK_k, i_pan_screen, (arg_t) DIR_UP }, - { true, XK_Up, i_pan_screen, (arg_t) DIR_UP }, - { true, XK_l, i_pan_screen, (arg_t) DIR_RIGHT }, - { true, XK_Right, i_pan_screen, (arg_t) DIR_RIGHT }, + { true, XK_h, it_scroll_screen, (arg_t) DIR_LEFT }, + { true, XK_Left, it_scroll_screen, (arg_t) DIR_LEFT }, + { true, XK_j, it_scroll_screen, (arg_t) DIR_DOWN }, + { true, XK_Down, it_scroll_screen, (arg_t) DIR_DOWN }, + { true, XK_k, it_scroll_screen, (arg_t) DIR_UP }, + { true, XK_Up, it_scroll_screen, (arg_t) DIR_UP }, + { true, XK_l, it_scroll_screen, (arg_t) DIR_RIGHT }, + { true, XK_Right, it_scroll_screen, (arg_t) DIR_RIGHT }, - { false, XK_H, i_pan_edge, (arg_t) DIR_LEFT }, - { false, XK_J, i_pan_edge, (arg_t) DIR_DOWN }, - { false, XK_K, i_pan_edge, (arg_t) DIR_UP }, - { false, XK_L, i_pan_edge, (arg_t) DIR_RIGHT }, + { false, XK_H, i_scroll_to_edge, (arg_t) DIR_LEFT }, + { false, XK_J, i_scroll_to_edge, (arg_t) DIR_DOWN }, + { false, XK_K, i_scroll_to_edge, (arg_t) DIR_UP }, + { false, XK_L, i_scroll_to_edge, (arg_t) DIR_RIGHT }, { false, XK_plus, i_zoom, (arg_t) +1 }, { false, XK_KP_Add, i_zoom, (arg_t) +1 }, @@ -147,10 +147,10 @@ static const button_t buttons[] = { { false, false, Button1, i_navigate, (arg_t) +1 }, { false, false, Button3, i_navigate, (arg_t) -1 }, { false, false, Button2, i_drag, (arg_t) None }, - { false, false, Button4, it_move, (arg_t) DIR_UP }, - { false, false, Button5, it_move, (arg_t) DIR_DOWN }, - { false, true, Button4, it_move, (arg_t) DIR_LEFT }, - { false, true, Button5, it_move, (arg_t) DIR_RIGHT }, + { false, false, Button4, it_scroll_move, (arg_t) DIR_UP }, + { false, false, Button5, it_scroll_move, (arg_t) DIR_DOWN }, + { false, true, Button4, it_scroll_move, (arg_t) DIR_LEFT }, + { false, true, Button5, it_scroll_move, (arg_t) DIR_RIGHT }, { true, false, Button4, i_zoom, (arg_t) +1 }, { true, false, Button5, i_zoom, (arg_t) -1 }, }; diff --git a/main.c b/main.c index 97dd2db..22729e9 100644 --- a/main.c +++ b/main.c @@ -394,7 +394,8 @@ void on_buttonpress(XButtonEvent *bev) { break; case Button4: case Button5: - if (tns_scroll(&tns, bev->button == Button4 ? DIR_UP : DIR_DOWN)) + if (tns_scroll(&tns, bev->button == Button4 ? DIR_UP : DIR_DOWN, + (bev->state & ControlMask) != 0)) redraw(); break; } diff --git a/sxiv.1 b/sxiv.1 index 69ee9c4..c2d20db 100644 --- a/sxiv.1 +++ b/sxiv.1 @@ -127,6 +127,12 @@ Move selection up. .TP .BR l ", " Right Move selection right. +.TP +.BR Ctrl-j ", " Ctrl-Down +Scroll thumbnail grid one window height down. +.TP +.BR Ctrl-k ", " Ctrl-Up +Scroll thumbnail grid one window height up. .SH IMAGE KEYBOARD COMMANDS The following keyboard commands are only available in image mode: .SS Navigate image list diff --git a/thumbs.c b/thumbs.c index 8f20336..69b2645 100644 --- a/thumbs.c +++ b/thumbs.c @@ -430,20 +430,25 @@ bool tns_move_selection(tns_t *tns, direction_t dir) { return tns->sel != old; } -bool tns_scroll(tns_t *tns, direction_t dir) { - int old; +bool tns_scroll(tns_t *tns, direction_t dir, bool screen) { + int d, max, old; if (tns == NULL) return false; old = tns->first; + d = tns->cols * (screen ? tns->rows : 1); - if (dir == DIR_DOWN && tns->first + tns->cols * tns->rows < tns->cnt) { - tns->first += tns->cols; - tns_check_view(tns, true); - tns->dirty = true; - } else if (dir == DIR_UP && tns->first >= tns->cols) { - tns->first -= tns->cols; + if (dir == DIR_DOWN) { + max = tns->cnt - tns->cols * tns->rows; + if (tns->cnt % tns->cols != 0) + max += tns->cols - tns->cnt % tns->cols; + tns->first = MIN(tns->first + d, max); + } else if (dir == DIR_UP) { + tns->first = MAX(tns->first - d, 0); + } + + if (tns->first != old) { tns_check_view(tns, true); tns->dirty = true; } diff --git a/thumbs.h b/thumbs.h index df83535..4a32347 100644 --- a/thumbs.h +++ b/thumbs.h @@ -62,7 +62,7 @@ void tns_render(tns_t*); void tns_highlight(tns_t*, int, bool); bool tns_move_selection(tns_t*, direction_t); -bool tns_scroll(tns_t*, direction_t); +bool tns_scroll(tns_t*, direction_t, bool); int tns_translate(tns_t*, int, int);