nsxiv4a282da
use dedicated function to process key/button bindings (#166)
+24 −29
2 files changed
| @@ -596,9 +596,27 @@ end: | |||
| 596 | 596 | redraw(); | |
| 597 | 597 | } | |
| 598 | 598 | ||
| 599 | − | void on_keypress(XKeyEvent *kev) | |
| 599 | + | bool process_bindings(const keymap_t *keys, unsigned int len, | |
| 600 | + | KeySym ksym_or_button, unsigned int state) | |
| 600 | 601 | { | |
| 601 | 602 | unsigned int i; | |
| 603 | + | bool dirty = false; | |
| 604 | + | ||
| 605 | + | for (i = 0; i < len; i++) { | |
| 606 | + | if (keys[i].ksym_or_button == ksym_or_button && | |
| 607 | + | MODMASK(keys[i].mask) == MODMASK(state) && | |
| 608 | + | keys[i].cmd.func && | |
| 609 | + | (keys[i].cmd.mode == MODE_ALL || keys[i].cmd.mode == mode)) | |
| 610 | + | { | |
| 611 | + | if (keys[i].cmd.func(keys[i].arg)) | |
| 612 | + | dirty = true; | |
| 613 | + | } | |
| 614 | + | } | |
| 615 | + | return dirty; | |
| 616 | + | } | |
| 617 | + | ||
| 618 | + | void on_keypress(XKeyEvent *kev) | |
| 619 | + | { | |
| 602 | 620 | unsigned int sh = 0; | |
| 603 | 621 | KeySym ksym, shksym; | |
| 604 | 622 | char dummy, key; | |
| @@ -624,15 +642,8 @@ void on_keypress(XKeyEvent *kev) | |||
| 624 | 642 | /* number prefix for commands */ | |
| 625 | 643 | prefix = prefix * 10 + (int) (key - '0'); | |
| 626 | 644 | return; | |
| 627 | − | } else for (i = 0; i < ARRLEN(keys); i++) { | |
| 628 | − | if (keys[i].ksym == ksym && | |
| 629 | − | MODMASK(keys[i].mask | sh) == MODMASK(kev->state) && | |
| 630 | − | keys[i].cmd.func && | |
| 631 | − | (keys[i].cmd.mode == MODE_ALL || keys[i].cmd.mode == mode)) | |
| 632 | − | { | |
| 633 | − | if (keys[i].cmd.func(keys[i].arg)) | |
| 634 | − | dirty = true; | |
| 635 | − | } | |
| 645 | + | } else { | |
| 646 | + | dirty = process_bindings(keys, ARRLEN(keys), ksym, kev->state & ~sh); | |
| 636 | 647 | } | |
| 637 | 648 | if (dirty) | |
| 638 | 649 | redraw(); | |
| @@ -642,24 +653,13 @@ void on_keypress(XKeyEvent *kev) | |||
| 642 | 653 | void on_buttonpress(XButtonEvent *bev) | |
| 643 | 654 | { | |
| 644 | 655 | int sel; | |
| 645 | − | unsigned int i; | |
| 646 | 656 | bool dirty = false; | |
| 647 | 657 | static Time firstclick; | |
| 648 | 658 | ||
| 649 | 659 | if (mode == MODE_IMAGE) { | |
| 650 | 660 | set_timeout(reset_cursor, TO_CURSOR_HIDE, true); | |
| 651 | 661 | reset_cursor(); | |
| 652 | − | ||
| 653 | − | for (i = 0; i < ARRLEN(buttons); i++) { | |
| 654 | − | if (buttons[i].button == bev->button && | |
| 655 | − | MODMASK(buttons[i].mask) == MODMASK(bev->state) && | |
| 656 | − | buttons[i].cmd.func && | |
| 657 | − | (buttons[i].cmd.mode == MODE_ALL || buttons[i].cmd.mode == mode)) | |
| 658 | − | { | |
| 659 | − | if (buttons[i].cmd.func(buttons[i].arg)) | |
| 660 | − | dirty = true; | |
| 661 | − | } | |
| 662 | − | } | |
| 662 | + | dirty = process_bindings(buttons, ARRLEN(buttons), bev->button, bev->state); | |
| 663 | 663 | if (dirty) | |
| 664 | 664 | redraw(); | |
| 665 | 665 | } else { | |
| @@ -172,17 +172,12 @@ typedef struct { | |||
| 172 | 172 | ||
| 173 | 173 | typedef struct { | |
| 174 | 174 | unsigned int mask; | |
| 175 | − | KeySym ksym; | |
| 175 | + | KeySym ksym_or_button; | |
| 176 | 176 | cmd_t cmd; | |
| 177 | 177 | arg_t arg; | |
| 178 | 178 | } keymap_t; | |
| 179 | 179 | ||
| 180 | − | typedef struct { | |
| 181 | − | unsigned int mask; | |
| 182 | − | unsigned int button; | |
| 183 | − | cmd_t cmd; | |
| 184 | − | arg_t arg; | |
| 185 | − | } button_t; | |
| 180 | + | typedef keymap_t button_t; | |
| 186 | 181 | ||
| 187 | 182 | ||
| 188 | 183 | /* image.c */ | |