mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
re-add support for WM_TAKE_FOCUS, and additionally this time only call
XSetInputFocus() for clients that have the InputHint; latter fix discovered by Valery Masiutsin with a PoC patch - solves keyboard input focus loss for java apps.
This commit is contained in:
parent
6e17b41f56
commit
06eb13dfd9
1
calmwm.h
1
calmwm.h
@ -165,6 +165,7 @@ struct client_ctx {
|
|||||||
#define CLIENT_FREEZE 0x0010
|
#define CLIENT_FREEZE 0x0010
|
||||||
#define CLIENT_GROUP 0x0020
|
#define CLIENT_GROUP 0x0020
|
||||||
#define CLIENT_UNGROUP 0x0040
|
#define CLIENT_UNGROUP 0x0040
|
||||||
|
#define CLIENT_INPUT 0x0080
|
||||||
|
|
||||||
#define CLIENT_HIGHLIGHT (CLIENT_GROUP | CLIENT_UNGROUP)
|
#define CLIENT_HIGHLIGHT (CLIENT_GROUP | CLIENT_UNGROUP)
|
||||||
#define CLIENT_MAXFLAGS (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)
|
#define CLIENT_MAXFLAGS (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)
|
||||||
|
25
client.c
25
client.c
@ -99,17 +99,22 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
|
|||||||
cc->geom.h = wattr.height;
|
cc->geom.h = wattr.height;
|
||||||
cc->colormap = wattr.colormap;
|
cc->colormap = wattr.colormap;
|
||||||
|
|
||||||
|
if ((wmhints = XGetWMHints(X_Dpy, cc->win)) != NULL) {
|
||||||
|
if (wmhints->flags & InputHint) {
|
||||||
|
if (wmhints->input == 1)
|
||||||
|
cc->flags |= CLIENT_INPUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (wattr.map_state != IsViewable) {
|
if (wattr.map_state != IsViewable) {
|
||||||
client_placecalc(cc);
|
client_placecalc(cc);
|
||||||
client_move(cc);
|
client_move(cc);
|
||||||
if ((wmhints = XGetWMHints(X_Dpy, cc->win)) != NULL) {
|
if ((wmhints) && (wmhints->flags & StateHint)) {
|
||||||
if (wmhints->flags & StateHint) {
|
cc->state = wmhints->initial_state;
|
||||||
cc->state = wmhints->initial_state;
|
xu_set_wm_state(cc->win, cc->state);
|
||||||
xu_set_wm_state(cc->win, cc->state);
|
|
||||||
}
|
|
||||||
XFree(wmhints);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (wmhints)
|
||||||
|
XFree(wmhints);
|
||||||
client_draw_border(cc);
|
client_draw_border(cc);
|
||||||
|
|
||||||
if (xu_get_wm_state(cc->win, &state) < 0)
|
if (xu_get_wm_state(cc->win, &state) < 0)
|
||||||
@ -208,8 +213,12 @@ client_setactive(struct client_ctx *cc, int fg)
|
|||||||
|
|
||||||
if (fg) {
|
if (fg) {
|
||||||
XInstallColormap(X_Dpy, cc->colormap);
|
XInstallColormap(X_Dpy, cc->colormap);
|
||||||
XSetInputFocus(X_Dpy, cc->win,
|
if (cc->flags & CLIENT_INPUT) {
|
||||||
RevertToPointerRoot, CurrentTime);
|
XSetInputFocus(X_Dpy, cc->win,
|
||||||
|
RevertToPointerRoot, CurrentTime);
|
||||||
|
}
|
||||||
|
if (cc->xproto & _WM_TAKE_FOCUS)
|
||||||
|
client_msg(cc, cwmh[WM_TAKE_FOCUS]);
|
||||||
conf_grab_mouse(cc->win);
|
conf_grab_mouse(cc->win);
|
||||||
/*
|
/*
|
||||||
* If we're in the middle of alt-tabbing, don't change
|
* If we're in the middle of alt-tabbing, don't change
|
||||||
|
Loading…
Reference in New Issue
Block a user