diff options
author | okan <okan> | 2013-12-12 20:15:07 +0000 |
---|---|---|
committer | okan <okan> | 2013-12-12 20:15:07 +0000 |
commit | b276a2ef00a3333e0d474ad960c0e2b16880904d (patch) | |
tree | b3e1b5f66735ecf4b7d6e70981064d59210f3f41 /client.c | |
parent | e767ac9c6556d04c346b89e8d47d721c38cc366e (diff) | |
download | cwm-b276a2ef00a3333e0d474ad960c0e2b16880904d.tar.gz cwm-b276a2ef00a3333e0d474ad960c0e2b16880904d.tar.xz cwm-b276a2ef00a3333e0d474ad960c0e2b16880904d.zip |
ICCCM explicitly states that server time (CurrentTime) should *not* be
used for focus events, but rather the timestamp of the generated event. Track the last event timestamp and send it down for a WM_TAKE_FOCUS ClientMessage. I suspect we should do this for clients that don't announce this Atom as well, though the raciness gets us into a bind. Solves focus order issue since WM_TAKE_FOCUS; fix verified by sthen@ ok sthen@
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/client.c b/client.c index a601805..2ffeb34 100644 --- a/client.c +++ b/client.c @@ -168,6 +168,9 @@ client_setactive(struct client_ctx *cc) struct screen_ctx *sc = cc->sc; struct client_ctx *oldcc; + if (cc->flags & CLIENT_HIDDEN) + return; + XInstallColormap(X_Dpy, cc->colormap); if ((cc->flags & CLIENT_INPUT) || @@ -176,7 +179,7 @@ client_setactive(struct client_ctx *cc) RevertToPointerRoot, CurrentTime); } if (cc->flags & CLIENT_WM_TAKE_FOCUS) - client_msg(cc, cwmh[WM_TAKE_FOCUS]); + client_msg(cc, cwmh[WM_TAKE_FOCUS], Last_Event_Time); if ((oldcc = client_current())) { oldcc->active = 0; @@ -511,7 +514,7 @@ client_wm_hints(struct client_ctx *cc) } void -client_msg(struct client_ctx *cc, Atom proto) +client_msg(struct client_ctx *cc, Atom proto, Time ts) { XClientMessageEvent cm; @@ -521,7 +524,7 @@ client_msg(struct client_ctx *cc, Atom proto) cm.message_type = cwmh[WM_PROTOCOLS]; cm.format = 32; cm.data.l[0] = proto; - cm.data.l[1] = CurrentTime; + cm.data.l[1] = ts; XSendEvent(X_Dpy, cc->win, False, NoEventMask, (XEvent *)&cm); } @@ -530,7 +533,7 @@ void client_send_delete(struct client_ctx *cc) { if (cc->flags & CLIENT_WM_DELETE_WINDOW) - client_msg(cc, cwmh[WM_DELETE_WINDOW]); + client_msg(cc, cwmh[WM_DELETE_WINDOW], CurrentTime); else XKillClient(X_Dpy, cc->win); } |