# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 8d2d8848e8ac7117adffe9e1d168c5125934dfcf
    parent d5f3d120eae2377b8a2f80c94fbb5e4bd7a6189d
    Author: Aurélien Aptel <aurelien.aptel@gmail.com>
    Date:   Fri, 16 Sep 2011 18:03:44 +0200

    tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian)

    Diffstat:
    Mst.c | 26+++++++++++++++++++++++---

    1 file changed, 23 insertions(+), 3 deletions(-)
    diff --git 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
    @@ -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;