summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2020-03-24 14:47:29 +0000
committerokan <okan>2020-03-24 14:47:29 +0000
commit6c20772841684c18d85b45888de01e538f2999b4 (patch)
tree4a8c5cc0e54fe1161a1d06b260948b961444a939
parent0a7d8cc5c4bfa8df89c7b876d9f52bea14f37014 (diff)
downloadcwm-6c20772841684c18d85b45888de01e538f2999b4.tar.gz
cwm-6c20772841684c18d85b45888de01e538f2999b4.tar.xz
cwm-6c20772841684c18d85b45888de01e538f2999b4.zip
Instead of using _NET_ACTIVE_WINDOW on restart, use the pointer location
to determine what client to set active. Reduces a round trip for every
window.
-rw-r--r--calmwm.h3
-rw-r--r--client.c12
-rw-r--r--screen.c27
-rw-r--r--xevents.c2
-rw-r--r--xutil.c16
5 files changed, 20 insertions, 40 deletions
diff --git a/calmwm.h b/calmwm.h
index b15a39e..6fa5906 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -395,7 +395,7 @@ void			 client_get_sizehints(struct client_ctx *);
 void			 client_hide(struct client_ctx *);
 void 			 client_htile(struct client_ctx *);
 int			 client_inbound(struct client_ctx *, int, int);
-struct client_ctx	*client_init(Window, struct screen_ctx *, int);
+struct client_ctx	*client_init(Window, struct screen_ctx *);
 void			 client_lower(struct client_ctx *);
 void			 client_move(struct client_ctx *);
 void			 client_mtf(struct client_ctx *);
@@ -563,7 +563,6 @@ void			 xu_ewmh_net_workarea(struct screen_ctx *);
 void			 xu_ewmh_net_client_list(struct screen_ctx *);
 void			 xu_ewmh_net_client_list_stacking(struct screen_ctx *);
 void			 xu_ewmh_net_active_window(struct screen_ctx *, Window);
-Window			 xu_ewmh_get_net_active_window(struct screen_ctx *);
 void			 xu_ewmh_net_number_of_desktops(struct screen_ctx *);
 void			 xu_ewmh_net_showing_desktop(struct screen_ctx *);
 void			 xu_ewmh_net_virtual_roots(struct screen_ctx *);
diff --git a/client.c b/client.c
index 21c51bc..61b2cf4 100644
--- a/client.c
+++ b/client.c
@@ -37,14 +37,11 @@ static void			 client_mwm_hints(struct client_ctx *);
 static void			 client_wm_protocols(struct client_ctx *);
 
 struct client_ctx *
-client_init(Window win, struct screen_ctx *sc, int active)
+client_init(Window win, struct screen_ctx *sc)
 {
 	struct client_ctx	*cc;
 	XWindowAttributes	 wattr;
 	int			 mapped;
-	Window			 rwin, cwin;
-	int			 x, y, wx, wy;
-	unsigned int		 mask;
 	long			 state;
 
 	if (win == None)
@@ -108,10 +105,6 @@ client_init(Window win, struct screen_ctx *sc, int active)
 		client_resize(cc, 0);
 		if (cc->initial_state)
 			xu_set_wm_state(cc->win, cc->initial_state);
-	} else {
-		if ((active == 0) && (XQueryPointer(X_Dpy, cc->win, &rwin,
-		    &cwin, &x, &y, &wx, &wy, &mask)) && (cwin != None))
-			active = 1;
 	}
 
 	XSelectInput(X_Dpy, cc->win,
@@ -152,9 +145,6 @@ out:
 	XSync(X_Dpy, False);
 	XUngrabServer(X_Dpy);
 
-	if (active)
-		client_set_active(cc);
-
 	return cc;
 }
 
diff --git a/screen.c b/screen.c
index b1e70e9..373ff71 100644
--- a/screen.c
+++ b/screen.c
@@ -33,13 +33,12 @@
 #include "calmwm.h"
 
 static struct geom screen_apply_gap(struct screen_ctx *, struct geom);
-static void screen_scan(struct screen_ctx *, Window);
+static void screen_scan(struct screen_ctx *);
 
 void
 screen_init(int which)
 {
 	struct screen_ctx	*sc;
-	Window			active = None;
 	XSetWindowAttributes	 attr;
 
 	sc = xmalloc(sizeof(*sc));
@@ -67,7 +66,6 @@ screen_init(int which)
 	xu_ewmh_net_number_of_desktops(sc);
 	xu_ewmh_net_showing_desktop(sc);
 	xu_ewmh_net_virtual_roots(sc);
-	active = xu_ewmh_get_net_active_window(sc);
 
 	attr.cursor = Conf.cursor[CF_NORMAL];
 	attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask |
@@ -77,7 +75,7 @@ screen_init(int which)
 	if (Conf.xrandr)
 		XRRSelectInput(X_Dpy, sc->rootwin, RRScreenChangeNotifyMask);
 
-	screen_scan(sc, active);
+	screen_scan(sc);
 	screen_updatestackingorder(sc);
 
 	TAILQ_INSERT_TAIL(&Screenq, sc, entry);
@@ -86,17 +84,26 @@ screen_init(int which)
 }
 
 static void
-screen_scan(struct screen_ctx *sc, Window active)
+screen_scan(struct screen_ctx *sc)
 {
-	Window			*wins, w0, w1;
-	unsigned int		 nwins, i;
+	struct client_ctx	 *cc, *active = NULL;
+	Window			*wins, w0, w1, rwin, cwin;
+	unsigned int		 nwins, i, mask;
+	int			 rx, ry, wx, wy;
 
-	if (XQueryTree(X_Dpy, sc->rootwin, &w0, &w1, &wins, &nwins)) {
-		for (i = 0; i < nwins; i++)
-			(void)client_init(wins[i], sc, (active == wins[i]));
+	XQueryPointer(X_Dpy, sc->rootwin, &rwin, &cwin,
+	    &rx, &ry, &wx, &wy, &mask);
 
+	if (XQueryTree(X_Dpy, sc->rootwin, &w0, &w1, &wins, &nwins)) {
+		for (i = 0; i < nwins; i++) {
+			if ((cc = client_init(wins[i], sc)) != NULL)
+				if (cc->win == cwin)
+					active = cc;
+		}
 		XFree(wins);
 	}
+	if (active)
+		client_set_active(active);
 }
 
 struct screen_ctx *
diff --git a/xevents.c b/xevents.c
index 090886a..1aaa929 100644
--- a/xevents.c
+++ b/xevents.c
@@ -87,7 +87,7 @@ xev_handle_maprequest(XEvent *ee)
 		client_ptr_save(old_cc);
 
 	if ((cc = client_find(e->window)) == NULL)
-		cc = client_init(e->window, NULL, 0);
+		cc = client_init(e->window, NULL);
 
 	if ((cc != NULL) && (!(cc->flags & CLIENT_IGNORE)))
 		client_ptr_warp(cc);
diff --git a/xutil.c b/xutil.c
index 69da471..37af7db 100644
--- a/xutil.c
+++ b/xutil.c
@@ -296,22 +296,6 @@ xu_ewmh_net_active_window(struct screen_ctx *sc, Window w)
 	    XA_WINDOW, 32, PropModeReplace, (unsigned char *)&w, 1);
 }
 
-Window
-xu_ewmh_get_net_active_window(struct screen_ctx *sc)
-{
-	long		*p;
-	Window		 win;
-
-	if ((xu_get_prop(sc->rootwin, ewmh[_NET_ACTIVE_WINDOW],
-	    XA_WINDOW, 32, (unsigned char **)&p)) <= 0)
-		return None;
-
-	win = (Window)*p;
-	XFree(p);
-
-	return win;
-}
-
 void
 xu_ewmh_net_number_of_desktops(struct screen_ctx *sc)
 {