summaryrefslogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
Diffstat (limited to 'st.c')
-rw-r--r--st.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/st.c b/st.c
index ba93f2f..477a8f8 100644
--- a/st.c
+++ b/st.c
@@ -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);
329static void tfulldirt(void); 328static void tfulldirt(void);
330static void techo(char *, int); 329static void techo(char *, int);
331 330
331static inline bool match(uint, uint);
332static void ttynew(void); 332static void ttynew(void);
333static void ttyread(void); 333static void ttyread(void);
334static void ttyresize(void); 334static void ttyresize(void);
@@ -2696,23 +2696,29 @@ focus(XEvent *ev) {
2696 } 2696 }
2697} 2697}
2698 2698
2699inline bool
2700match(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
2699char* 2710char*
2700kmap(KeySym k, uint state) { 2711kmap(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