ttweak focus to support XEMBED client message and remove focus on EnterNotify. … | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 8d2d8848e8ac7117adffe9e1d168c5125934dfcf | |
parent d5f3d120eae2377b8a2f80c94fbb5e4bd7a6189d | |
Author: Aurélien Aptel <[email protected]> | |
Date: Fri, 16 Sep 2011 18:03:44 +0200 | |
ttweak focus to support XEMBED client message and remove focus on EnterNotify. … | |
Diffstat: | |
M st.c | 26 +++++++++++++++++++++++--- | |
1 file changed, 23 insertions(+), 3 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 | |
t@@ -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 *); | |
t@@ -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, | |
t@@ -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) { | |
t@@ -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(); | |
t@@ -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 | |
t@@ -1890,6 +1897,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; | |