summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2014-02-03 20:20:39 +0000
committerokan <okan>2014-02-03 20:20:39 +0000
commitad96c168386aced17e3fa4859dad1e1e2d80bb57 (patch)
treea559609931d906f63e721bc0c8b1901de7ee47bf
parentad76995af7e1bbae8ec81dd917def917453c379b (diff)
downloadcwm-ad96c168386aced17e3fa4859dad1e1e2d80bb57.tar.gz
cwm-ad96c168386aced17e3fa4859dad1e1e2d80bb57.tar.xz
cwm-ad96c168386aced17e3fa4859dad1e1e2d80bb57.zip
Move redundant bits from screen_init (while dealing with existing
clients) directly into client_init, performing the X roundtrip only
once. With the previous change in maprequest, this moves decision making
into one place for creating new clients.
-rw-r--r--calmwm.h2
-rw-r--r--client.c12
-rw-r--r--screen.c16
-rw-r--r--xevents.c2
4 files changed, 17 insertions, 15 deletions
diff --git a/calmwm.h b/calmwm.h
index aa77bc0..9d81cf5 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -383,7 +383,7 @@ void			 client_map(struct client_ctx *);
 void			 client_maximize(struct client_ctx *);
 void			 client_msg(struct client_ctx *, Atom, Time);
 void			 client_move(struct client_ctx *);
-struct client_ctx	*client_init(Window, struct screen_ctx *, int);
+struct client_ctx	*client_init(Window, struct screen_ctx *);
 void			 client_ptrsave(struct client_ctx *);
 void			 client_ptrwarp(struct client_ctx *);
 void			 client_raise(struct client_ctx *);
diff --git a/client.c b/client.c
index 632f3f3..1cb0021 100644
--- a/client.c
+++ b/client.c
@@ -55,18 +55,26 @@ client_find(Window win)
 }
 
 struct client_ctx *
-client_init(Window win, struct screen_ctx *sc, int mapped)
+client_init(Window win, struct screen_ctx *sc)
 {
 	struct client_ctx	*cc;
 	XWindowAttributes	 wattr;
 	long			 state;
+	int			 mapped;
 
 	if (win == None)
 		return (NULL);
 	if (!XGetWindowAttributes(X_Dpy, win, &wattr))
 		return (NULL);
-	if (sc == NULL)
+
+	if (sc == NULL) {
 		sc = screen_fromroot(wattr.root);
+		mapped = 1;
+	} else {
+		if (wattr.override_redirect || wattr.map_state != IsViewable)
+			return (NULL);
+		mapped = wattr.map_state != IsUnmapped;
+	}
 
 	cc = xcalloc(1, sizeof(*cc));
 
diff --git a/screen.c b/screen.c
index df19c08..a9c051d 100644
--- a/screen.c
+++ b/screen.c
@@ -35,7 +35,6 @@ screen_init(int which)
 {
 	struct screen_ctx	*sc;
 	Window			*wins, w0, w1;
-	XWindowAttributes	 winattr;
 	XSetWindowAttributes	 rootattr;
 	unsigned int		 nwins, i;
 
@@ -62,17 +61,12 @@ screen_init(int which)
 	    CWEventMask|CWCursor, &rootattr);
 
 	/* Deal with existing clients. */
-	XQueryTree(X_Dpy, sc->rootwin, &w0, &w1, &wins, &nwins);
-	for (i = 0; i < nwins; i++) {
-		XGetWindowAttributes(X_Dpy, wins[i], &winattr);
-		if (winattr.override_redirect ||
-		    winattr.map_state != IsViewable)
-			continue;
-		(void)client_init(wins[i], sc, winattr.map_state != IsUnmapped);
-	}
-	if (wins)
-		XFree(wins);
+	if (XQueryTree(X_Dpy, sc->rootwin, &w0, &w1, &wins, &nwins)) {
+		for (i = 0; i < nwins; i++)
+			(void)client_init(wins[i], sc);
 
+		XFree(wins);
+	}
 	screen_updatestackingorder(sc);
 
 	if (HasRandr)
diff --git a/xevents.c b/xevents.c
index 06551e8..cbba674 100644
--- a/xevents.c
+++ b/xevents.c
@@ -80,7 +80,7 @@ xev_handle_maprequest(XEvent *ee)
 		client_ptrsave(old_cc);
 
 	if ((cc = client_find(e->window)) == NULL)
-		cc = client_init(e->window, NULL, 1);
+		cc = client_init(e->window, NULL);
 
 	if ((cc != NULL) && ((cc->flags & CLIENT_IGNORE) == 0))
 		client_ptrwarp(cc);