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.
This commit is contained in:
okan 2013-10-25 19:46:16 +00:00
parent 6867821abe
commit 6e17b41f56
3 changed files with 12 additions and 10 deletions

View File

@ -373,7 +373,7 @@ struct client_ctx *client_current(void);
void client_cycle(struct screen_ctx *, int); void client_cycle(struct screen_ctx *, int);
void client_cycle_leave(struct screen_ctx *, void client_cycle_leave(struct screen_ctx *,
struct client_ctx *); struct client_ctx *);
void client_delete(struct client_ctx *); void client_delete(struct client_ctx *, int);
void client_draw_border(struct client_ctx *); void client_draw_border(struct client_ctx *);
struct client_ctx *client_find(Window); struct client_ctx *client_find(Window);
void client_freeze(struct client_ctx *); void client_freeze(struct client_ctx *);

View File

@ -145,17 +145,19 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
} }
void void
client_delete(struct client_ctx *cc) client_delete(struct client_ctx *cc, int destroy)
{ {
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
struct winname *wn; struct winname *wn;
XGrabServer(X_Dpy); if (destroy) {
cc->state = WithdrawnState; XGrabServer(X_Dpy);
xu_set_wm_state(cc->win, cc->state); cc->state = WithdrawnState;
XRemoveFromSaveSet(X_Dpy, cc->win); xu_set_wm_state(cc->win, cc->state);
XSync(X_Dpy, False); XRemoveFromSaveSet(X_Dpy, cc->win);
XUngrabServer(X_Dpy); XSync(X_Dpy, False);
XUngrabServer(X_Dpy);
}
TAILQ_REMOVE(&sc->mruq, cc, mru_entry); TAILQ_REMOVE(&sc->mruq, cc, mru_entry);
TAILQ_REMOVE(&Clientq, cc, entry); TAILQ_REMOVE(&Clientq, cc, entry);

View File

@ -113,7 +113,7 @@ xev_handle_unmapnotify(XEvent *ee)
*/ */
if (XCheckTypedWindowEvent(X_Dpy, cc->win, if (XCheckTypedWindowEvent(X_Dpy, cc->win,
DestroyNotify, &ev) || e->send_event != 0) { DestroyNotify, &ev) || e->send_event != 0) {
client_delete(cc); client_delete(cc, 1);
} else } else
client_hide(cc); client_hide(cc);
} }
@ -127,7 +127,7 @@ xev_handle_destroynotify(XEvent *ee)
struct client_ctx *cc; struct client_ctx *cc;
if ((cc = client_find(e->window)) != NULL) if ((cc = client_find(e->window)) != NULL)
client_delete(cc); client_delete(cc, 0);
} }
static void static void