X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/cddbd6eee59104a029087c30f9ff5e7e415bc584..8d2d8848e8ac7117adffe9e1d168c5125934dfcf:/st.c diff --git a/st.c b/st.c index df8353a..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,6 +242,7 @@ static int isfullutf8(char *, int); static void (*handler[LASTEvent])(XEvent *) = { [KeyPress] = kpress, + [ClientMessage] = cmessage, [ConfigureNotify] = resize, [VisibilityNotify] = visibility, [UnmapNotify] = unmap, @@ -262,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) { @@ -1625,8 +1632,8 @@ xinit(void) { xloadcols(); /* window - default size */ - xw.bufh = 24 * xw.ch; - xw.bufw = 80 * xw.cw; + xw.bufh = term.row * xw.ch; + xw.bufw = term.col * xw.cw; xw.h = xw.bufh + 2*BORDER; xw.w = xw.bufw + 2*BORDER; @@ -1635,7 +1642,8 @@ xinit(void) { attrs.bit_gravity = NorthWestGravity; attrs.event_mask = FocusChangeMask | KeyPressMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask - | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; + | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask + | EnterWindowMask | LeaveWindowMask; attrs.colormap = xw.cmap; parent = opt_embed ? strtol(opt_embed, NULL, 0) : XRootWindow(xw.dpy, xw.scr); @@ -1663,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(); @@ -1886,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;