From 8d2d8848e8ac7117adffe9e1d168c5125934dfcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 16 Sep 2011 18:03:44 +0200 Subject: [PATCH] tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian) --- st.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/st.c b/st.c index 4649079..6f292ba 100644 --- a/st.c +++ b/st.c @@ -37,6 +37,10 @@ "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;