about summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2013-12-11 14:09:21 +0000
committerokan <okan>2013-12-11 14:09:21 +0000
commit23a1abdd8ac7025ff55e287bd4437594618781d2 (patch)
tree74e2c780d9febb278c8eb1a96ede249109760726
parent1d68f0683a784420b5a6ec0b8f1622b6ccd5fcc7 (diff)
downloadcwm-23a1abdd8ac7025ff55e287bd4437594618781d2.tar.gz
cwm-23a1abdd8ac7025ff55e287bd4437594618781d2.tar.xz
cwm-23a1abdd8ac7025ff55e287bd4437594618781d2.zip
Stash Class and WM Hints in client_ctx
-rw-r--r--calmwm.h4
-rw-r--r--client.c37
-rw-r--r--group.c6
-rw-r--r--search.c4
4 files changed, 23 insertions, 28 deletions
diff --git a/calmwm.h b/calmwm.h
index 8ceba9e..9c613b9 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -177,8 +177,8 @@ struct client_ctx {
 	char			*label;
 	char			*matchname;
 	struct group_ctx	*group;
-	char			*app_class;
-	char			*app_name;
+	XClassHint		ch;
+	XWMHints		*wmh;
 };
 TAILQ_HEAD(client_ctx_q, client_ctx);
 TAILQ_HEAD(cycle_entry_q, client_ctx);
diff --git a/client.c b/client.c
index d6019f6..d291bbc 100644
--- a/client.c
+++ b/client.c
@@ -58,9 +58,7 @@ struct client_ctx *
 client_init(Window win, struct screen_ctx *sc, int mapped)
 {
 	struct client_ctx	*cc;
-	XClassHint		 xch;
 	XWindowAttributes	 wattr;
-	XWMHints		*wmhints;
 	int			 state;
 
 	if (win == None)
@@ -74,18 +72,16 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
 	cc->sc = sc;
 	cc->win = win;
 
-	client_getsizehints(cc);
-
 	TAILQ_INIT(&cc->nameq);
 	client_setname(cc);
 
 	conf_client(cc);
 
-	if (XGetClassHint(X_Dpy, cc->win, &xch)) {
-		cc->app_name = xch.res_name;
-		cc->app_class = xch.res_class;
-	}
+	XGetClassHint(X_Dpy, cc->win, &cc->ch);
+	cc->wmh = XGetWMHints(X_Dpy, cc->win);
 	client_getmwmhints(cc);
+	client_wm_protocols(cc);
+	client_getsizehints(cc);
 
 	/* Saved pointer position */
 	cc->ptr.x = -1;
@@ -98,22 +94,20 @@ 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)
+	if (cc->wmh != NULL) {
+		if (cc->wmh->flags & InputHint) {
+			if (cc->wmh->input == 1)
 				cc->flags |= CLIENT_INPUT;
 		}
 	}
 	if (wattr.map_state != IsViewable) {
 		client_placecalc(cc);
 		client_move(cc);
-		if ((wmhints) && (wmhints->flags & StateHint)) {
-			cc->state = wmhints->initial_state;
+		if ((cc->wmh) && (cc->wmh->flags & StateHint)) {
+			cc->state = cc->wmh->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)
@@ -136,7 +130,6 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
 
 	xu_ewmh_net_client_list(sc);
 
-	client_wm_protocols(cc);
 	xu_ewmh_restore_net_wm_state(cc);
 
 	if (mapped)
@@ -165,17 +158,19 @@ client_delete(struct client_ctx *cc)
 	if (cc == client_current())
 		client_none(sc);
 
-	if (cc->app_name != NULL)
-		XFree(cc->app_name);
-	if (cc->app_class != NULL)
-		XFree(cc->app_class);
-
 	while ((wn = TAILQ_FIRST(&cc->nameq)) != NULL) {
 		TAILQ_REMOVE(&cc->nameq, wn, entry);
 		free(wn->name);
 		free(wn);
 	}
 
+	if (cc->ch.res_class)
+		XFree(cc->ch.res_class);
+	if (cc->ch.res_name)
+		XFree(cc->ch.res_name);
+	if (cc->wmh)
+		XFree(cc->wmh);
+
 	free(cc);
 }
 
diff --git a/group.c b/group.c
index 2c62ae6..94d881a 100644
--- a/group.c
+++ b/group.c
@@ -371,7 +371,7 @@ group_autogroup(struct client_ctx *cc)
 	int			 no = -1, both_match = 0;
 	long			*grpno;
 
-	if (cc->app_class == NULL || cc->app_name == NULL)
+	if (cc->ch.res_class == NULL || cc->ch.res_name == NULL)
 		return;
 
 	if (xu_getprop(cc->win, ewmh[_NET_WM_DESKTOP],
@@ -385,9 +385,9 @@ group_autogroup(struct client_ctx *cc)
 		XFree(grpno);
 	} else {
 		TAILQ_FOREACH(aw, &Conf.autogroupq, entry) {
-			if (strcmp(aw->class, cc->app_class) == 0) {
+			if (strcmp(aw->class, cc->ch.res_class) == 0) {
 				if ((aw->name != NULL) &&
-				    (strcmp(aw->name, cc->app_name) == 0)) {
+				    (strcmp(aw->name, cc->ch.res_name) == 0)) {
 					no = aw->num;
 					both_match = 1;
 				} else if (aw->name == NULL && !both_match)
diff --git a/search.c b/search.c
index 483a51b..9e59d87 100644
--- a/search.c
+++ b/search.c
@@ -85,8 +85,8 @@ search_match_client(struct menu_q *menuq, struct menu_q *resultq, char *search)
 		}
 
 		/* Then if there is a match on the window class name. */
-		if (tier < 0 && strsubmatch(search, cc->app_class, 0)) {
-			cc->matchname = cc->app_class;
+		if (tier < 0 && strsubmatch(search, cc->ch.res_class, 0)) {
+			cc->matchname = cc->ch.res_class;
 			tier = 3;
 		}