diff options
Diffstat (limited to 'st.c')
| -rw-r--r-- | st.c | 35 |
1 files changed, 20 insertions, 15 deletions
| @@ -65,7 +65,6 @@ | |||
| 65 | #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ | 65 | #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ |
| 66 | 66 | ||
| 67 | /* macros */ | 67 | /* macros */ |
| 68 | #define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) | ||
| 69 | #define SERRNO strerror(errno) | 68 | #define SERRNO strerror(errno) |
| 70 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) | 69 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
| 71 | #define MAX(a, b) ((a) < (b) ? (b) : (a)) | 70 | #define MAX(a, b) ((a) < (b) ? (b) : (a)) |
| @@ -329,6 +328,7 @@ static void tsetmode(bool, bool, int *, int); | |||
| 329 | static void tfulldirt(void); | 328 | static void tfulldirt(void); |
| 330 | static void techo(char *, int); | 329 | static void techo(char *, int); |
| 331 | 330 | ||
| 331 | static inline bool match(uint, uint); | ||
| 332 | static void ttynew(void); | 332 | static void ttynew(void); |
| 333 | static void ttyread(void); | 333 | static void ttyread(void); |
| 334 | static void ttyresize(void); | 334 | static void ttyresize(void); |
| @@ -2696,23 +2696,29 @@ focus(XEvent *ev) { | |||
| 2696 | } | 2696 | } |
| 2697 | } | 2697 | } |
| 2698 | 2698 | ||
| 2699 | inline bool | ||
| 2700 | match(uint mask, uint state) { | ||
| 2701 | if(mask == XK_NO_MOD && state) | ||
| 2702 | return false; | ||
| 2703 | if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state) | ||
| 2704 | return false; | ||
| 2705 | if((state & mask) != state) | ||
| 2706 | return false; | ||
| 2707 | return true; | ||
| 2708 | } | ||
| 2709 | |||
| 2699 | char* | 2710 | char* |
| 2700 | kmap(KeySym k, uint state) { | 2711 | kmap(KeySym k, uint state) { |
| 2701 | uint mask; | 2712 | uint mask; |
| 2702 | Key *kp; | 2713 | Key *kp; |
| 2703 | 2714 | ||
| 2704 | state &= ~Mod2Mask; | ||
| 2705 | for(kp = key; kp < key + LEN(key); kp++) { | 2715 | for(kp = key; kp < key + LEN(key); kp++) { |
| 2706 | mask = kp->mask; | 2716 | mask = kp->mask; |
| 2707 | 2717 | ||
| 2708 | if(kp->k != k) | 2718 | if(kp->k != k) |
| 2709 | continue; | 2719 | continue; |
| 2710 | 2720 | ||
| 2711 | if(mask == XK_NO_MOD && state) | 2721 | if(!match(mask, state)) |
| 2712 | continue; | ||
| 2713 | if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state) | ||
| 2714 | continue; | ||
| 2715 | if((state & mask) != state) | ||
| 2716 | continue; | 2722 | continue; |
| 2717 | 2723 | ||
| 2718 | if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) || | 2724 | if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) || |
| @@ -2741,21 +2747,20 @@ kpress(XEvent *ev) { | |||
| 2741 | XKeyEvent *e = &ev->xkey; | 2747 | XKeyEvent *e = &ev->xkey; |
| 2742 | KeySym ksym; | 2748 | KeySym ksym; |
| 2743 | char xstr[31], buf[32], *customkey, *cp = buf; | 2749 | char xstr[31], buf[32], *customkey, *cp = buf; |
| 2744 | int len, i; | 2750 | int len; |
| 2745 | Status status; | 2751 | Status status; |
| 2752 | Shortcut *bp; | ||
| 2746 | 2753 | ||
| 2747 | if (IS_SET(MODE_KBDLOCK)) | 2754 | if (IS_SET(MODE_KBDLOCK)) |
| 2748 | return; | 2755 | return; |
| 2749 | 2756 | ||
| 2750 | len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); | 2757 | len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); |
| 2751 | 2758 | e->state &= ~Mod2Mask; | |
| 2752 | /* 1. shortcuts */ | 2759 | /* 1. shortcuts */ |
| 2753 | for(i = 0; i < LEN(shortcuts); i++) { | 2760 | for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { |
| 2754 | if((ksym == shortcuts[i].keysym) | 2761 | if(ksym == bp->keysym && match(bp->mod, e->state)) { |
| 2755 | && (CLEANMASK(shortcuts[i].mod) == \ | 2762 | bp->func(&(bp->arg)); |
| 2756 | CLEANMASK(e->state)) | 2763 | return; |
| 2757 | && shortcuts[i].func) { | ||
| 2758 | shortcuts[i].func(&(shortcuts[i].arg)); | ||
| 2759 | } | 2764 | } |
| 2760 | } | 2765 | } |
| 2761 | 2766 | ||
