about summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2013-11-01 14:07:19 +0000
committerokan <okan>2013-11-01 14:07:19 +0000
commit06eb13dfd949199a730e9373529ef2a7e9f4b1e6 (patch)
tree6c24c061e4ab582d5c23d66ba244c1b369a86af7
parent6e17b41f566865629d3dd35a6a60e081e6e2b089 (diff)
downloadcwm-06eb13dfd949199a730e9373529ef2a7e9f4b1e6.tar.gz
cwm-06eb13dfd949199a730e9373529ef2a7e9f4b1e6.tar.xz
cwm-06eb13dfd949199a730e9373529ef2a7e9f4b1e6.zip
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.
-rw-r--r--calmwm.h1
-rw-r--r--client.c25
2 files changed, 18 insertions, 8 deletions
diff --git a/calmwm.h b/calmwm.h
index 4f20a81..439c16f 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -165,6 +165,7 @@ struct client_ctx {
 #define CLIENT_FREEZE			0x0010
 #define CLIENT_GROUP			0x0020
 #define CLIENT_UNGROUP			0x0040
+#define CLIENT_INPUT			0x0080
 
 #define CLIENT_HIGHLIGHT		(CLIENT_GROUP | CLIENT_UNGROUP)
 #define CLIENT_MAXFLAGS			(CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)
diff --git a/client.c b/client.c
index d9184df..60d9b2c 100644
--- a/client.c
+++ b/client.c
@@ -99,17 +99,22 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
 	cc->geom.h = wattr.height;
 	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) {
 		client_placecalc(cc);
 		client_move(cc);
-		if ((wmhints = XGetWMHints(X_Dpy, cc->win)) != NULL) {
-			if (wmhints->flags & StateHint) {
-				cc->state = wmhints->initial_state;
-				xu_set_wm_state(cc->win, cc->state);
-			}
-			XFree(wmhints);
+		if ((wmhints) && (wmhints->flags & StateHint)) {
+			cc->state = wmhints->initial_state;
+			xu_set_wm_state(cc->win, cc->state);
 		}
 	}
+	if (wmhints)
+		XFree(wmhints);
 	client_draw_border(cc);
 
 	if (xu_get_wm_state(cc->win, &state) < 0)
@@ -208,8 +213,12 @@ client_setactive(struct client_ctx *cc, int fg)
 
 	if (fg) {
 		XInstallColormap(X_Dpy, cc->colormap);
-		XSetInputFocus(X_Dpy, cc->win,
-		    RevertToPointerRoot, CurrentTime);
+		if (cc->flags & CLIENT_INPUT) {
+			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);
 		/*
 		 * If we're in the middle of alt-tabbing, don't change