nsxivdc727b8
Added support for number prefix for commands
+21 −10
4 files changed
- M commands.c +9 −5
- M commands.h +1 −1
- M config.def.h +2 −4
- M main.c +9 −0
| @@ -46,6 +46,8 @@ extern win_t win; | |||
| 46 | 46 | extern fileinfo_t *files; | |
| 47 | 47 | extern int filecnt, fileidx; | |
| 48 | 48 | ||
| 49 | + | extern int prefix; | |
| 50 | + | ||
| 49 | 51 | bool it_quit(arg_t a) { | |
| 50 | 52 | cleanup(); | |
| 51 | 53 | exit(EXIT_SUCCESS); | |
| @@ -143,12 +145,14 @@ bool it_first(arg_t a) { | |||
| 143 | 145 | } | |
| 144 | 146 | } | |
| 145 | 147 | ||
| 146 | − | bool it_last(arg_t a) { | |
| 147 | − | if (mode == MODE_IMAGE && fileidx != filecnt - 1) { | |
| 148 | − | load_image(filecnt - 1); | |
| 148 | + | bool it_n_or_last(arg_t a) { | |
| 149 | + | int n = prefix != 0 && prefix - 1 < filecnt ? prefix - 1 : filecnt - 1; | |
| 150 | + | ||
| 151 | + | if (mode == MODE_IMAGE && fileidx != n) { | |
| 152 | + | load_image(n); | |
| 149 | 153 | return true; | |
| 150 | − | } else if (mode == MODE_THUMB && tns.sel != tns.cnt - 1) { | |
| 151 | − | tns.sel = tns.cnt - 1; | |
| 154 | + | } else if (mode == MODE_THUMB && tns.sel != n) { | |
| 155 | + | tns.sel = n; | |
| 152 | 156 | tns.dirty = true; | |
| 153 | 157 | return true; | |
| 154 | 158 | } else { | |
| @@ -48,7 +48,7 @@ bool it_reload_image(arg_t); | |||
| 48 | 48 | bool it_remove_image(arg_t); | |
| 49 | 49 | bool i_navigate(arg_t); | |
| 50 | 50 | bool it_first(arg_t); | |
| 51 | − | bool it_last(arg_t); | |
| 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 | 54 | bool it_move(arg_t); | |
| @@ -79,7 +79,7 @@ static const keymap_t keys[] = { | |||
| 79 | 79 | { false, XK_bracketright, i_navigate, (arg_t) +10 }, | |
| 80 | 80 | { false, XK_bracketleft, i_navigate, (arg_t) -10 }, | |
| 81 | 81 | { false, XK_g, it_first, (arg_t) None }, | |
| 82 | − | { false, XK_G, it_last, (arg_t) None }, | |
| 82 | + | { false, XK_G, it_n_or_last, (arg_t) None }, | |
| 83 | 83 | ||
| 84 | 84 | { true, XK_n, i_navigate_frame, (arg_t) +1 }, | |
| 85 | 85 | { true, XK_p, i_navigate_frame, (arg_t) -1 }, | |
| @@ -109,12 +109,10 @@ static const keymap_t keys[] = { | |||
| 109 | 109 | { false, XK_L, i_pan_edge, (arg_t) DIR_RIGHT }, | |
| 110 | 110 | ||
| 111 | 111 | { false, XK_plus, i_zoom, (arg_t) +1 }, | |
| 112 | − | { false, XK_equal, i_zoom, (arg_t) +1 }, | |
| 113 | 112 | { false, XK_KP_Add, i_zoom, (arg_t) +1 }, | |
| 114 | 113 | { false, XK_minus, i_zoom, (arg_t) -1 }, | |
| 115 | 114 | { false, XK_KP_Subtract, i_zoom, (arg_t) -1 }, | |
| 116 | − | { false, XK_0, i_zoom, (arg_t) None }, | |
| 117 | − | { false, XK_KP_0, i_zoom, (arg_t) None }, | |
| 115 | + | { false, XK_equal, i_zoom, (arg_t) None }, | |
| 118 | 116 | { false, XK_w, i_fit_to_win, (arg_t) None }, | |
| 119 | 117 | { false, XK_W, i_fit_to_img, (arg_t) None }, | |
| 120 | 118 | ||
| @@ -63,6 +63,8 @@ fileinfo_t *files; | |||
| 63 | 63 | int filecnt, fileidx; | |
| 64 | 64 | size_t filesize; | |
| 65 | 65 | ||
| 66 | + | int prefix; | |
| 67 | + | ||
| 66 | 68 | char win_title[TITLE_LEN]; | |
| 67 | 69 | ||
| 68 | 70 | timeout_t timeouts[] = { | |
| @@ -335,10 +337,17 @@ void on_keypress(XKeyEvent *kev) { | |||
| 335 | 337 | ||
| 336 | 338 | XLookupString(kev, &key, 1, &ksym, NULL); | |
| 337 | 339 | ||
| 340 | + | if (key >= '0' && key <= '9' && (kev->state & ControlMask) == 0) { | |
| 341 | + | /* number prefix for commands */ | |
| 342 | + | prefix = prefix * 10 + (int) (key - '0'); | |
| 343 | + | return; | |
| 344 | + | } | |
| 345 | + | ||
| 338 | 346 | for (i = 0; i < ARRLEN(keys); i++) { | |
| 339 | 347 | if (keys[i].ksym == ksym && keymask(&keys[i], kev->state)) { | |
| 340 | 348 | if (keys[i].cmd != NULL && keys[i].cmd(keys[i].arg)) | |
| 341 | 349 | redraw(); | |
| 350 | + | prefix = 0; | |
| 342 | 351 | return; | |
| 343 | 352 | } | |
| 344 | 353 | } | |