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:
okan 2013-11-01 14:07:19 +00:00
parent 6e17b41f56
commit 06eb13dfd9
2 changed files with 18 additions and 8 deletions

View File

@ -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)

View File

@ -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