about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client.c36
-rw-r--r--dwm.h4
-rw-r--r--layout.c17
-rw-r--r--main.c28
4 files changed, 39 insertions, 46 deletions
diff --git a/client.c b/client.c
index d11ef7f..d94c0ed 100644
--- a/client.c
+++ b/client.c
@@ -185,15 +185,8 @@ Bool
 loadprops(Client *c) {
 	unsigned int i;
 	Bool result = False;
-	XTextProperty name;
-
-	/* check if window has set a property */
-	name.nitems = 0;
-	XGetTextProperty(dpy, c->win, &name, dwmprops);
-	if(name.nitems && name.encoding == XA_STRING) {
-		strncpy(prop, (char *)name.value, sizeof prop - 1);
-		prop[sizeof prop - 1] = '\0';
-		XFree(name.value);
+
+	if(gettextprop(c->win, dwmprops, prop, sizeof prop)) {
 		for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
 			if((c->tags[i] = prop[i] == '1'))
 				result = True;
@@ -424,27 +417,6 @@ updatesizehints(Client *c) {
 
 void
 updatetitle(Client *c) {
-	char **list = NULL;
-	int n;
-	XTextProperty name;
-
-	name.nitems = 0;
-	c->name[0] = 0;
-	XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]);
-	if(!name.nitems)
-		XGetWMName(dpy, c->win, &name);
-	if(!name.nitems)
-		return;
-	if(name.encoding == XA_STRING)
-		strncpy(c->name, (char *)name.value, sizeof c->name - 1);
-	else {
-		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
-		&& n > 0 && *list)
-		{
-			strncpy(c->name, *list, sizeof c->name - 1);
-			XFreeStringList(list);
-		}
-	}
-	c->name[sizeof c->name - 1] = '\0';
-	XFree(name.value);
+	if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
+		gettextprop(c->win, wmatom[WMName], c->name, sizeof c->name);
 }
diff --git a/dwm.h b/dwm.h
index 9dd764f..36a0266 100644
--- a/dwm.h
+++ b/dwm.h
@@ -39,7 +39,7 @@ enum { BarTop, BarBot, BarOff };			/* bar position */
 enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };		/* color */
 enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
-enum { WMProtocols, WMDelete, WMState, WMLast };	/* default atoms */
+enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 
 typedef struct Client Client;
 struct Client {
@@ -131,6 +131,8 @@ void togglebar(const char *arg);	/* shows/hides the bar */
 void togglemax(const char *arg);	/* toggles maximization of floating client */
 
 /* main.c */
+Bool gettextprop(Window w, Atom atom,
+		char *text, unsigned int size); /* return text property, UTF-8 compliant */
 void updatebarpos(void);		/* updates the bar position */
 void quit(const char *arg);		/* quit dwm nicely */
 int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */
diff --git a/layout.c b/layout.c
index 96e125a..2763d2c 100644
--- a/layout.c
+++ b/layout.c
@@ -98,7 +98,6 @@ void
 initlayouts(void) {
 	unsigned int i, w;
 
-	/* TODO deserialize ltidx if present */
 	nlayouts = sizeof layouts / sizeof layouts[0];
 	for(blw = i = 0; i < nlayouts; i++) {
 		w = textw(layouts[i].symbol);
@@ -110,21 +109,13 @@ initlayouts(void) {
 void
 loaddwmprops(void) {
 	unsigned int i;
-	XTextProperty name;
-
-	/* check if window has set a property */
-	name.nitems = 0;
-	XGetTextProperty(dpy, root, &name, dwmprops);
-	if(name.nitems && name.encoding == XA_STRING) {
-		strncpy(prop, (char *)name.value, sizeof prop - 1);
-		prop[sizeof prop - 1] = '\0';
-		XFree(name.value);
+
+	if(gettextprop(root, dwmprops, prop, sizeof prop)) {
 		for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
 			seltags[i] = prop[i] == '1';
 		if(i < sizeof prop - 1 && prop[i] != '\0') {
-			i = prop[i];
-			if(i < nlayouts)
-				ltidx = i;
+			if(prop[i] < nlayouts)
+				ltidx = prop[i];
 		}
 	}
 }
diff --git a/main.c b/main.c
index 7cc5ecf..9127d16 100644
--- a/main.c
+++ b/main.c
@@ -143,6 +143,7 @@ setup(void) {
 	dwmprops = XInternAtom(dpy, "_DWM_PROPERTIES", False);
 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
 	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
+	wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
 	wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
 	netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
 	netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
@@ -220,6 +221,33 @@ xerrorstart(Display *dsply, XErrorEvent *ee) {
 
 /* extern */
 
+Bool
+gettextprop(Window w, Atom atom, char *text, unsigned int size) {
+	char **list = NULL;
+	int n;
+	XTextProperty name;
+
+	if(!text || size == 0)
+		return False;
+	text[0] = '\0';
+	XGetTextProperty(dpy, w, &name, atom);
+	if(!name.nitems)
+		return False;
+	if(name.encoding == XA_STRING)
+		strncpy(text, (char *)name.value, size - 1);
+	else {
+		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
+		&& n > 0 && *list)
+		{
+			strncpy(text, *list, size - 1);
+			XFreeStringList(list);
+		}
+	}
+	text[size - 1] = '\0';
+	XFree(name.value);
+	return True;
+}
+
 void
 quit(const char *arg) {
 	readin = running = False;