From 7efa4514d104d51793c4dd01ddedd4976080be07 Mon Sep 17 00:00:00 2001
From: Christoph Lohmann <20h@r-36.net>
Date: Fri, 5 Oct 2012 22:59:08 +0200
Subject: [PATCH] =?UTF-8?q?Adding=20the=20patch=20of=20David=20Dufberg=20T?=
 =?UTF-8?q?=C3=B6ttrup=20to=20implement=20WM=5FDELETE=5FWINDOW.=20Thank=20?=
 =?UTF-8?q?you!?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 st.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/st.c b/st.c
index 7ae9d8c..1ac7fde 100644
--- 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);
 	}
 }