prepared merging layout.c and tag.c into screen.c 96d7fe16
Anselm R. Garbe · 2007-08-19 10:40 4 file(s) · +37 −44
client.c +3 −31
185 185
loadprops(Client *c) {
186 186
	unsigned int i;
187 187
	Bool result = False;
188 -
	XTextProperty name;
189 188
190 -
	/* check if window has set a property */
191 -
	name.nitems = 0;
192 -
	XGetTextProperty(dpy, c->win, &name, dwmprops);
193 -
	if(name.nitems && name.encoding == XA_STRING) {
194 -
		strncpy(prop, (char *)name.value, sizeof prop - 1);
195 -
		prop[sizeof prop - 1] = '\0';
196 -
		XFree(name.value);
189 +
	if(gettextprop(c->win, dwmprops, prop, sizeof prop)) {
197 190
		for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
198 191
			if((c->tags[i] = prop[i] == '1'))
199 192
				result = True;
424 417
425 418
void
426 419
updatetitle(Client *c) {
427 -
	char **list = NULL;
428 -
	int n;
429 -
	XTextProperty name;
430 -
431 -
	name.nitems = 0;
432 -
	c->name[0] = 0;
433 -
	XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]);
434 -
	if(!name.nitems)
435 -
		XGetWMName(dpy, c->win, &name);
436 -
	if(!name.nitems)
437 -
		return;
438 -
	if(name.encoding == XA_STRING)
439 -
		strncpy(c->name, (char *)name.value, sizeof c->name - 1);
440 -
	else {
441 -
		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
442 -
		&& n > 0 && *list)
443 -
		{
444 -
			strncpy(c->name, *list, sizeof c->name - 1);
445 -
			XFreeStringList(list);
446 -
		}
447 -
	}
448 -
	c->name[sizeof c->name - 1] = '\0';
449 -
	XFree(name.value);
420 +
	if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
421 +
		gettextprop(c->win, wmatom[WMName], c->name, sizeof c->name);
450 422
}
dwm.h +3 −1
39 39
enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */
40 40
enum { ColBorder, ColFG, ColBG, ColLast };		/* color */
41 41
enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
42 -
enum { WMProtocols, WMDelete, WMState, WMLast };	/* default atoms */
42 +
enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
43 43
44 44
typedef struct Client Client;
45 45
struct Client {
131 131
void togglemax(const char *arg);	/* toggles maximization of floating client */
132 132
133 133
/* main.c */
134 +
Bool gettextprop(Window w, Atom atom,
135 +
		char *text, unsigned int size); /* return text property, UTF-8 compliant */
134 136
void updatebarpos(void);		/* updates the bar position */
135 137
void quit(const char *arg);		/* quit dwm nicely */
136 138
int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */
layout.c +3 −12
98 98
initlayouts(void) {
99 99
	unsigned int i, w;
100 100
101 -
	/* TODO deserialize ltidx if present */
102 101
	nlayouts = sizeof layouts / sizeof layouts[0];
103 102
	for(blw = i = 0; i < nlayouts; i++) {
104 103
		w = textw(layouts[i].symbol);
110 109
void
111 110
loaddwmprops(void) {
112 111
	unsigned int i;
113 -
	XTextProperty name;
114 112
115 -
	/* check if window has set a property */
116 -
	name.nitems = 0;
117 -
	XGetTextProperty(dpy, root, &name, dwmprops);
118 -
	if(name.nitems && name.encoding == XA_STRING) {
119 -
		strncpy(prop, (char *)name.value, sizeof prop - 1);
120 -
		prop[sizeof prop - 1] = '\0';
121 -
		XFree(name.value);
113 +
	if(gettextprop(root, dwmprops, prop, sizeof prop)) {
122 114
		for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
123 115
			seltags[i] = prop[i] == '1';
124 116
		if(i < sizeof prop - 1 && prop[i] != '\0') {
125 -
			i = prop[i];
126 -
			if(i < nlayouts)
127 -
				ltidx = i;
117 +
			if(prop[i] < nlayouts)
118 +
				ltidx = prop[i];
128 119
		}
129 120
	}
130 121
}
main.c +28 −0
143 143
	dwmprops = XInternAtom(dpy, "_DWM_PROPERTIES", False);
144 144
	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
145 145
	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
146 +
	wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
146 147
	wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
147 148
	netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
148 149
	netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
219 220
}
220 221
221 222
/* extern */
223 +
224 +
Bool
225 +
gettextprop(Window w, Atom atom, char *text, unsigned int size) {
226 +
	char **list = NULL;
227 +
	int n;
228 +
	XTextProperty name;
229 +
230 +
	if(!text || size == 0)
231 +
		return False;
232 +
	text[0] = '\0';
233 +
	XGetTextProperty(dpy, w, &name, atom);
234 +
	if(!name.nitems)
235 +
		return False;
236 +
	if(name.encoding == XA_STRING)
237 +
		strncpy(text, (char *)name.value, size - 1);
238 +
	else {
239 +
		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
240 +
		&& n > 0 && *list)
241 +
		{
242 +
			strncpy(text, *list, size - 1);
243 +
			XFreeStringList(list);
244 +
		}
245 +
	}
246 +
	text[size - 1] = '\0';
247 +
	XFree(name.value);
248 +
	return True;
249 +
}
222 250
223 251
void
224 252
quit(const char *arg) {