JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fix custom key handling.
[st.git] / st.c
diff --git a/st.c b/st.c
index df8353a..a60377b 100644 (file)
--- a/st.c
+++ b/st.c
@@ -43,6 +43,8 @@
 #define ESC_ARG_SIZ   16
 #define DRAW_BUF_SIZ  1024
 #define UTF_SIZ       4
+#define XK_NO_MOD     UINT_MAX
+#define XK_ANY_MOD    0
 
 #define SERRNO strerror(errno)
 #define MIN(a, b)  ((a) < (b) ? (a) : (b))
@@ -241,6 +243,8 @@ static void (*handler[LASTEvent])(XEvent *) = {
        [VisibilityNotify] = visibility,
        [UnmapNotify] = unmap,
        [Expose] = expose,
+       [EnterNotify] = focus,
+       [LeaveNotify] = focus,
        [FocusIn] = focus,
        [FocusOut] = focus,
        [MotionNotify] = bmotion,
@@ -1635,7 +1639,8 @@ xinit(void) {
        attrs.bit_gravity = NorthWestGravity;
        attrs.event_mask = FocusChangeMask | KeyPressMask
                | ExposureMask | VisibilityChangeMask | StructureNotifyMask
-               | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
+               | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask
+               | EnterWindowMask | LeaveWindowMask;
        attrs.colormap = xw.cmap;
 
        parent = opt_embed ? strtol(opt_embed, NULL, 0) : XRootWindow(xw.dpy, xw.scr);
@@ -1819,7 +1824,7 @@ xseturgency(int add) {
 
 void
 focus(XEvent *ev) {
-       if(ev->type == FocusIn) {
+       if(ev->type == FocusIn || ev->type == EnterNotify) {
                xw.state |= WIN_FOCUSED;
                xseturgency(0);
        } else
@@ -1830,9 +1835,12 @@ focus(XEvent *ev) {
 char*
 kmap(KeySym k, unsigned int state) {
        int i;
-       for(i = 0; i < LEN(key); i++)
-               if(key[i].k == k && (key[i].mask == 0 || key[i].mask & state))
+       state &= ~Mod2Mask;
+       for(i = 0; i < LEN(key); i++) {
+               unsigned int mask = key[i].mask;
+               if(key[i].k == k && ((state & mask) == mask || (mask == XK_NO_MOD && !state)))
                        return (char*)key[i].s;
+       }
        return NULL;
 }