diff options
| author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-09-16 18:03:44 +0200 | 
|---|---|---|
| committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-09-16 18:03:44 +0200 | 
| commit | 8d2d8848e8ac7117adffe9e1d168c5125934dfcf (patch) | |
| tree | 53d940753d45b9131c32c5b893e89e2bdcd9c5ee | |
| parent | d5f3d120eae2377b8a2f80c94fbb5e4bd7a6189d (diff) | |
| download | st-fork-8d2d8848e8ac7117adffe9e1d168c5125934dfcf.tar.gz | |
tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian)
| -rw-r--r-- | st.c | 26 | 
1 files changed, 23 insertions, 3 deletions
| @@ -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 @@ -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; | 
