JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
move xembedatom in XWindow struct, add link to xembed specs.
[st.git] / st.c
diff --git a/st.c b/st.c
index df8353a..7ac02b9 100644 (file)
--- a/st.c
+++ b/st.c
        "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
@@ -120,6 +124,7 @@ typedef struct {
        Colormap cmap;
        Window win;
        Pixmap buf;
+       Atom xembed;
        XIM xim;
        XIC xic;
        int scr;
@@ -217,6 +222,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 +243,7 @@ static int isfullutf8(char *, int);
 
 static void (*handler[LASTEvent])(XEvent *) = {
        [KeyPress] = kpress,
+       [ClientMessage] = cmessage,
        [ConfigureNotify] = resize,
        [VisibilityNotify] = visibility,
        [UnmapNotify] = unmap,
@@ -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});
 
+       xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
+
        XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");
        XMapWindow(xw.dpy, xw.win);
        xhints();
@@ -1887,6 +1897,21 @@ kpress(XEvent *ev) {
 }
 
 void
+cmessage(XEvent *e) {
+       /* See xembed specs
+          http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html */
+       if (e->xclient.message_type == xw.xembed && 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;