st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 7efa4514d104d51793c4dd01ddedd4976080be07
parent bf6cf05ba5211b35d7b10169624679428c5f4974
Author: Christoph Lohmann <20h@r-36.net>
Date:   Fri,  5 Oct 2012 22:59:08 +0200

Adding the patch of David Dufberg Töttrup to implement WM_DELETE_WINDOW. Thank you!

Diffstat:
Mst.c | 15++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/st.c b/st.c
@@ -197,7 +197,7 @@ typedef struct {
     Colormap cmap;
     Window win;
     XdbeBackBuffer buf;
-    Atom xembed;
+    Atom xembed, wmdeletewin;
     XIM xim;
     XIC xic;
     XftDraw *xft_draw;
@@ -850,12 +850,15 @@ execsh(void) {
 void
 sigchld(int a) {
     int stat = 0;
+
     if(waitpid(pid, &stat, 0) < 0)
         die("Waiting for pid %hd failed: %s\n",    pid, SERRNO);
-    if(WIFEXITED(stat))
+
+    if(WIFEXITED(stat)) {
         exit(WEXITSTATUS(stat));
-    else
+    } else {
         exit(EXIT_FAILURE);
+    }
 }
 
 void
@@ -2173,6 +2176,8 @@ xinit(void) {
         &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
 
     xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
+    xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
+    XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
 
     xresettitle();
     XMapWindow(xw.dpy, xw.win);
@@ -2475,6 +2480,10 @@ cmessage(XEvent *e) {
         } else if(e->xclient.data.l[1] == XEMBED_FOCUS_OUT) {
             xw.state &= ~WIN_FOCUSED;
         }
+    } else if(e->xclient.data.l[0] == xw.wmdeletewin) {
+        /* Send SIGHUP to shell */
+        kill(pid, SIGHUP);
+        exit(EXIT_SUCCESS);
     }
 }