mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
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@
This commit is contained in:
parent
e767ac9c65
commit
b276a2ef00
1
calmwm.c
1
calmwm.c
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
char **cwm_argv;
|
char **cwm_argv;
|
||||||
Display *X_Dpy;
|
Display *X_Dpy;
|
||||||
|
Time Last_Event_Time = CurrentTime;
|
||||||
Atom cwmh[CWMH_NITEMS];
|
Atom cwmh[CWMH_NITEMS];
|
||||||
Atom ewmh[EWMH_NITEMS];
|
Atom ewmh[EWMH_NITEMS];
|
||||||
|
|
||||||
|
3
calmwm.h
3
calmwm.h
@ -316,6 +316,7 @@ struct mwm_hints {
|
|||||||
#define MWM_DECOR_BORDER (1<<1)
|
#define MWM_DECOR_BORDER (1<<1)
|
||||||
|
|
||||||
extern Display *X_Dpy;
|
extern Display *X_Dpy;
|
||||||
|
extern Time Last_Event_Time;
|
||||||
extern struct screen_ctx_q Screenq;
|
extern struct screen_ctx_q Screenq;
|
||||||
extern struct client_ctx_q Clientq;
|
extern struct client_ctx_q Clientq;
|
||||||
extern struct conf Conf;
|
extern struct conf Conf;
|
||||||
@ -381,7 +382,7 @@ void client_htile(struct client_ctx *);
|
|||||||
void client_lower(struct client_ctx *);
|
void client_lower(struct client_ctx *);
|
||||||
void client_map(struct client_ctx *);
|
void client_map(struct client_ctx *);
|
||||||
void client_maximize(struct client_ctx *);
|
void client_maximize(struct client_ctx *);
|
||||||
void client_msg(struct client_ctx *, Atom);
|
void client_msg(struct client_ctx *, Atom, Time);
|
||||||
void client_move(struct client_ctx *);
|
void client_move(struct client_ctx *);
|
||||||
struct client_ctx *client_init(Window, struct screen_ctx *, int);
|
struct client_ctx *client_init(Window, struct screen_ctx *, int);
|
||||||
void client_ptrsave(struct client_ctx *);
|
void client_ptrsave(struct client_ctx *);
|
||||||
|
11
client.c
11
client.c
@ -168,6 +168,9 @@ client_setactive(struct client_ctx *cc)
|
|||||||
struct screen_ctx *sc = cc->sc;
|
struct screen_ctx *sc = cc->sc;
|
||||||
struct client_ctx *oldcc;
|
struct client_ctx *oldcc;
|
||||||
|
|
||||||
|
if (cc->flags & CLIENT_HIDDEN)
|
||||||
|
return;
|
||||||
|
|
||||||
XInstallColormap(X_Dpy, cc->colormap);
|
XInstallColormap(X_Dpy, cc->colormap);
|
||||||
|
|
||||||
if ((cc->flags & CLIENT_INPUT) ||
|
if ((cc->flags & CLIENT_INPUT) ||
|
||||||
@ -176,7 +179,7 @@ client_setactive(struct client_ctx *cc)
|
|||||||
RevertToPointerRoot, CurrentTime);
|
RevertToPointerRoot, CurrentTime);
|
||||||
}
|
}
|
||||||
if (cc->flags & CLIENT_WM_TAKE_FOCUS)
|
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())) {
|
if ((oldcc = client_current())) {
|
||||||
oldcc->active = 0;
|
oldcc->active = 0;
|
||||||
@ -511,7 +514,7 @@ client_wm_hints(struct client_ctx *cc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
client_msg(struct client_ctx *cc, Atom proto)
|
client_msg(struct client_ctx *cc, Atom proto, Time ts)
|
||||||
{
|
{
|
||||||
XClientMessageEvent cm;
|
XClientMessageEvent cm;
|
||||||
|
|
||||||
@ -521,7 +524,7 @@ client_msg(struct client_ctx *cc, Atom proto)
|
|||||||
cm.message_type = cwmh[WM_PROTOCOLS];
|
cm.message_type = cwmh[WM_PROTOCOLS];
|
||||||
cm.format = 32;
|
cm.format = 32;
|
||||||
cm.data.l[0] = proto;
|
cm.data.l[0] = proto;
|
||||||
cm.data.l[1] = CurrentTime;
|
cm.data.l[1] = ts;
|
||||||
|
|
||||||
XSendEvent(X_Dpy, cc->win, False, NoEventMask, (XEvent *)&cm);
|
XSendEvent(X_Dpy, cc->win, False, NoEventMask, (XEvent *)&cm);
|
||||||
}
|
}
|
||||||
@ -530,7 +533,7 @@ void
|
|||||||
client_send_delete(struct client_ctx *cc)
|
client_send_delete(struct client_ctx *cc)
|
||||||
{
|
{
|
||||||
if (cc->flags & CLIENT_WM_DELETE_WINDOW)
|
if (cc->flags & CLIENT_WM_DELETE_WINDOW)
|
||||||
client_msg(cc, cwmh[WM_DELETE_WINDOW]);
|
client_msg(cc, cwmh[WM_DELETE_WINDOW], CurrentTime);
|
||||||
else
|
else
|
||||||
XKillClient(X_Dpy, cc->win);
|
XKillClient(X_Dpy, cc->win);
|
||||||
}
|
}
|
||||||
|
@ -212,6 +212,8 @@ xev_handle_enternotify(XEvent *ee)
|
|||||||
XCrossingEvent *e = &ee->xcrossing;
|
XCrossingEvent *e = &ee->xcrossing;
|
||||||
struct client_ctx *cc;
|
struct client_ctx *cc;
|
||||||
|
|
||||||
|
Last_Event_Time = e->time;
|
||||||
|
|
||||||
if ((cc = client_find(e->window)) != NULL)
|
if ((cc = client_find(e->window)) != NULL)
|
||||||
client_setactive(cc);
|
client_setactive(cc);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user