tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx...
authorAurélien Aptel <aurelien.aptel@gmail.com>
Fri, 16 Sep 2011 16:03:44 +0000 (18:03 +0200)
committerAurélien Aptel <aurelien.aptel@gmail.com>
Fri, 16 Sep 2011 16:03:44 +0000 (18:03 +0200)
st.c

diff --git a/st.c b/st.c
index 4649079..6f292ba 100644 (file)
--- a/st.c
+++ b/st.c
        "st-" VERSION ", (c) 2010-2011 st engineers\n" \
        "usage: st [-t title] [-c class] [-w windowid] [-v] [-e command...]\n"
 
+/* XEMBED messages */
+#define XEMBED_FOCUS_IN  4
+#define XEMBED_FOCUS_OUT 5
+
 /* Arbitrary sizes */
 #define ESC_TITLE_SIZ 256
 #define ESC_BUF_SIZ   256
@@ -217,6 +221,7 @@ static void visibility(XEvent *);
 static void unmap(XEvent *);
 static char* kmap(KeySym, unsigned int state);
 static void kpress(XEvent *);
+static void cmessage(XEvent *);
 static void resize(XEvent *);
 static void focus(XEvent *);
 static void brelease(XEvent *);
@@ -237,12 +242,11 @@ static int isfullutf8(char *, int);
 
 static void (*handler[LASTEvent])(XEvent *) = {
        [KeyPress] = kpress,
+       [ClientMessage] = cmessage,
        [ConfigureNotify] = resize,
        [VisibilityNotify] = visibility,
        [UnmapNotify] = unmap,
        [Expose] = expose,
-       [EnterNotify] = focus,
-       [LeaveNotify] = focus,
        [FocusIn] = focus,
        [FocusOut] = focus,
        [MotionNotify] = bmotion,
@@ -264,6 +268,7 @@ static char **opt_cmd  = NULL;
 static char *opt_title = NULL;
 static char *opt_embed = NULL;
 static char *opt_class = NULL;
+static Atom xembedatom;
 
 int
 utf8decode(char *s, long *u) {
@@ -1666,6 +1671,8 @@ xinit(void) {
                &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
                &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
 
+       xembedatom = XInternAtom(xw.dpy, "_XEMBED", False);
+
        XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");
        XMapWindow(xw.dpy, xw.win);
        xhints();
@@ -1822,7 +1829,7 @@ xseturgency(int add) {
 
 void
 focus(XEvent *ev) {
-       if(ev->type == FocusIn || ev->type == EnterNotify) {
+       if(ev->type == FocusIn) {
                xw.state |= WIN_FOCUSED;
                xseturgency(0);
        } else
@@ -1889,6 +1896,19 @@ kpress(XEvent *ev) {
                }
 }
 
+void
+cmessage(XEvent *e) {
+       if (e->xclient.message_type == xembedatom && e->xclient.format == 32) {
+               if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) {
+                       xw.state |= WIN_FOCUSED;
+                       xseturgency(0);
+               } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) {
+                       xw.state &= ~WIN_FOCUSED;
+               }
+               draw();
+       }
+}
+
 void
 resize(XEvent *e) {
        int col, row;