diff options
author | okan <okan> | 2013-10-25 19:46:16 +0000 |
---|---|---|
committer | okan <okan> | 2013-10-25 19:46:16 +0000 |
commit | 6e17b41f566865629d3dd35a6a60e081e6e2b089 (patch) | |
tree | 936ef98f0d1f8a5c6293e010a40fc9059c24ab4e /client.c | |
parent | 6867821abefd761a840befcfee5a1f1f2fef9831 (diff) | |
download | cwm-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.c | 16 |
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); |