about summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
authorokan <okan>2013-10-25 19:46:16 +0000
committerokan <okan>2013-10-25 19:46:16 +0000
commit6e17b41f566865629d3dd35a6a60e081e6e2b089 (patch)
tree936ef98f0d1f8a5c6293e010a40fc9059c24ab4e /client.c
parent6867821abefd761a840befcfee5a1f1f2fef9831 (diff)
downloadcwm-6e17b41f566865629d3dd35a6a60e081e6e2b089.tar.gz
cwm-6e17b41f566865629d3dd35a6a60e081e6e2b089.tar.xz
cwm-6e17b41f566865629d3dd35a6a60e081e6e2b089.zip
A client_delete should behave differently depending on whether the
triggering event was unmap (with pending destroy) log destroy; we only
need to grab/ungrab the server lock, set WithdrawnState and
XRemoveFromSaveSet clients coming from an unmap event - doing so for
clients coming from destroy are already gone, hence we generate errors.
Diffstat (limited to 'client.c')
-rw-r--r--client.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/client.c b/client.c
index 1c41d7e..d9184df 100644
--- a/client.c
+++ b/client.c
@@ -145,17 +145,19 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
 }
 
 void
-client_delete(struct client_ctx *cc)
+client_delete(struct client_ctx *cc, int destroy)
 {
 	struct screen_ctx	*sc = cc->sc;
 	struct winname		*wn;
 
-	XGrabServer(X_Dpy);
-	cc->state = WithdrawnState;
-	xu_set_wm_state(cc->win, cc->state);
-	XRemoveFromSaveSet(X_Dpy, cc->win);
-	XSync(X_Dpy, False);
-	XUngrabServer(X_Dpy);
+	if (destroy) {
+		XGrabServer(X_Dpy);
+		cc->state = WithdrawnState;
+		xu_set_wm_state(cc->win, cc->state);
+		XRemoveFromSaveSet(X_Dpy, cc->win);
+		XSync(X_Dpy, False);
+		XUngrabServer(X_Dpy);
+	}
 
 	TAILQ_REMOVE(&sc->mruq, cc, mru_entry);
 	TAILQ_REMOVE(&Clientq, cc, entry);