summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2015-09-23 14:09:40 +0000
committerokan <okan>2015-09-23 14:09:40 +0000
commit5fcf2516721dd441b435ba07f73c6315c104f5a3 (patch)
tree86e4cce5033d2bc4e26f65ac0cd5ed1ea4e63610
parent0fdcf3f3dfd336e7593482286dff49cd8be6ce44 (diff)
downloadcwm-5fcf2516721dd441b435ba07f73c6315c104f5a3.tar.gz
cwm-5fcf2516721dd441b435ba07f73c6315c104f5a3.tar.xz
cwm-5fcf2516721dd441b435ba07f73c6315c104f5a3.zip
Only when mapping clients from an initial wm start or restart, query the
pointer and if it matches the child window, activate it; new clients
will not need to make this roundtrip to the server.

Based on a patch from Preben Guldberg.
-rw-r--r--client.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/client.c b/client.c
index 54eced1..4df5be8 100644
--- a/client.c
+++ b/client.c
@@ -48,6 +48,9 @@ client_init(Window win, struct screen_ctx *sc)
 	struct client_ctx	*cc;
 	XWindowAttributes	 wattr;
 	int			 mapped;
+	Window			 rwin, cwin;
+	int			 x, y, wx, wy, activate = 0;
+	unsigned int		 mask;
 
 	if (win == None)
 		return(NULL);
@@ -97,6 +100,10 @@ client_init(Window win, struct screen_ctx *sc)
 		client_move(cc);
 		if ((cc->wmh) && (cc->wmh->flags & StateHint))
 			client_set_wm_state(cc, cc->wmh->initial_state);
+	} else {
+		if ((XQueryPointer(X_Dpy, cc->win, &rwin, &cwin,
+		    &x, &y, &wx, &wy, &mask)) && (cwin != None))
+			activate = 1;
 	}
 
 	XSelectInput(X_Dpy, cc->win, ColormapChangeMask | EnterWindowMask |
@@ -134,6 +141,9 @@ out:
 	XSync(X_Dpy, False);
 	XUngrabServer(X_Dpy);
 
+	if (activate)
+		client_setactive(cc);
+
 	return(cc);
 }