nsxiv9c92de8
Added support for multiple commands per key/button mapping; elegant fix for issue #150
+22 −22
4 files changed
- M config.def.h +2 −0
- M image.c +8 −14
- M main.c +8 −4
- M types.h +4 −4
| @@ -102,8 +102,10 @@ static const keymap_t keys[] = { | |||
| 102 | 102 | { 0, XK_R, t_reload_all, (arg_t) None }, | |
| 103 | 103 | ||
| 104 | 104 | { 0, XK_n, i_navigate, (arg_t) +1 }, | |
| 105 | + | { 0, XK_n, i_scroll_to_edge, (arg_t) (DIR_LEFT | DIR_UP) }, | |
| 105 | 106 | { 0, XK_space, i_navigate, (arg_t) +1 }, | |
| 106 | 107 | { 0, XK_p, i_navigate, (arg_t) -1 }, | |
| 108 | + | { 0, XK_p, i_scroll_to_edge, (arg_t) (DIR_LEFT | DIR_UP) }, | |
| 107 | 109 | { 0, XK_BackSpace, i_navigate, (arg_t) -1 }, | |
| 108 | 110 | { 0, XK_bracketright, i_navigate, (arg_t) +10 }, | |
| 109 | 111 | { 0, XK_bracketleft, i_navigate, (arg_t) -10 }, | |
| @@ -687,20 +687,14 @@ bool img_pan_edge(img_t *img, direction_t dir) | |||
| 687 | 687 | ox = img->x; | |
| 688 | 688 | oy = img->y; | |
| 689 | 689 | ||
| 690 | − | switch (dir) { | |
| 691 | − | case DIR_LEFT: | |
| 692 | − | img->x = 0; | |
| 693 | − | break; | |
| 694 | − | case DIR_RIGHT: | |
| 695 | − | img->x = img->win->w - img->w * img->zoom; | |
| 696 | − | break; | |
| 697 | − | case DIR_UP: | |
| 698 | − | img->y = 0; | |
| 699 | − | break; | |
| 700 | − | case DIR_DOWN: | |
| 701 | − | img->y = img->win->h - img->h * img->zoom; | |
| 702 | − | break; | |
| 703 | − | } | |
| 690 | + | if (dir & DIR_LEFT) | |
| 691 | + | img->x = 0; | |
| 692 | + | if (dir & DIR_RIGHT) | |
| 693 | + | img->x = img->win->w - img->w * img->zoom; | |
| 694 | + | if (dir & DIR_UP) | |
| 695 | + | img->y = 0; | |
| 696 | + | if (dir & DIR_DOWN) | |
| 697 | + | img->y = img->win->h - img->h * img->zoom; | |
| 704 | 698 | ||
| 705 | 699 | img_check_pan(img, true); | |
| 706 | 700 | ||
| @@ -541,6 +541,7 @@ void on_keypress(XKeyEvent *kev) | |||
| 541 | 541 | unsigned int sh; | |
| 542 | 542 | KeySym ksym, shksym; | |
| 543 | 543 | char key; | |
| 544 | + | bool dirty = false; | |
| 544 | 545 | ||
| 545 | 546 | if (kev == NULL) | |
| 546 | 547 | return; | |
| @@ -571,16 +572,18 @@ void on_keypress(XKeyEvent *kev) | |||
| 571 | 572 | (cmds[keys[i].cmd].mode < 0 || cmds[keys[i].cmd].mode == mode)) | |
| 572 | 573 | { | |
| 573 | 574 | if (cmds[keys[i].cmd].func(keys[i].arg)) | |
| 574 | − | redraw(); | |
| 575 | − | break; | |
| 575 | + | dirty = true; | |
| 576 | 576 | } | |
| 577 | 577 | } | |
| 578 | + | if (dirty) | |
| 579 | + | redraw(); | |
| 578 | 580 | prefix = 0; | |
| 579 | 581 | } | |
| 580 | 582 | ||
| 581 | 583 | void on_buttonpress(XButtonEvent *bev) | |
| 582 | 584 | { | |
| 583 | 585 | int i, sel; | |
| 586 | + | bool dirty = false; | |
| 584 | 587 | static Time firstclick; | |
| 585 | 588 | ||
| 586 | 589 | if (bev == NULL) | |
| @@ -597,10 +600,11 @@ void on_buttonpress(XButtonEvent *bev) | |||
| 597 | 600 | (cmds[buttons[i].cmd].mode < 0 || cmds[buttons[i].cmd].mode == mode)) | |
| 598 | 601 | { | |
| 599 | 602 | if (cmds[buttons[i].cmd].func(buttons[i].arg)) | |
| 600 | − | redraw(); | |
| 601 | − | break; | |
| 603 | + | dirty = true; | |
| 602 | 604 | } | |
| 603 | 605 | } | |
| 606 | + | if (dirty) | |
| 607 | + | redraw(); | |
| 604 | 608 | } else { | |
| 605 | 609 | /* thumbnail mode (hard-coded) */ | |
| 606 | 610 | switch (bev->button) { | |
| @@ -32,10 +32,10 @@ typedef enum { | |||
| 32 | 32 | } appmode_t; | |
| 33 | 33 | ||
| 34 | 34 | typedef enum { | |
| 35 | − | DIR_LEFT, | |
| 36 | − | DIR_RIGHT, | |
| 37 | − | DIR_UP, | |
| 38 | − | DIR_DOWN | |
| 35 | + | DIR_LEFT = 1, | |
| 36 | + | DIR_RIGHT = 2, | |
| 37 | + | DIR_UP = 4, | |
| 38 | + | DIR_DOWN = 8 | |
| 39 | 39 | } direction_t; | |
| 40 | 40 | ||
| 41 | 41 | typedef enum { | |