mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
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:
parent
6867821abe
commit
6e17b41f56
2
calmwm.h
2
calmwm.h
@ -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 *);
|
||||||
|
16
client.c
16
client.c
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user