diff options
| author | Anselm R Garbe <garbeam@gmail.com> | 2008-02-18 17:08:22 +0000 | 
|---|---|---|
| committer | Anselm R Garbe <garbeam@gmail.com> | 2008-02-18 17:08:22 +0000 | 
| commit | c2737b7b9317743e3430c71bc0a9afcc6b0f70f7 (patch) | |
| tree | 33449f7222435b6b7948073b18bbf0aeada483a4 | |
| parent | 191cb9ce283090c48f17c9518a9b6a553085c8e4 (diff) | |
removed Monitor->dc, unnecessary
| -rw-r--r-- | dwm.c | 249 | 
1 files changed, 125 insertions, 124 deletions
| @@ -117,10 +117,9 @@ typedef struct {  } Regs;  typedef struct { -	int screen; +	int monitor;  	Window barwin;  	int sx, sy, sw, sh, wax, way, wah, waw; -	DC dc;  	Bool *seltags;  	Bool *prevtags;  	Layout *layout; @@ -156,13 +155,13 @@ void focusin(XEvent *e);  void focusnext(const char *arg);  void focusprev(const char *arg);  Client *getclient(Window w); -unsigned long getcolor(const char *colstr, int screen); +unsigned long getcolor(const char *colstr);  long getstate(Window w);  Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);  void grabbuttons(Client *c, Bool focused);  void grabkeys(void);  unsigned int idxoftag(const char *tag); -void initfont(Monitor*, const char *fontstr); +void initfont(const char *fontstr);  Bool isoccupied(unsigned int monitor, unsigned int t);  Bool isprotodel(Client *c);  Bool isurgent(unsigned int monitor, unsigned int t); @@ -188,8 +187,8 @@ void setmwfact(const char *arg);  void setup(void);  void spawn(const char *arg);  void tag(const char *arg); -unsigned int textnw(Monitor*, const char *text, unsigned int len); -unsigned int textw(Monitor*, const char *text); +unsigned int textnw(const char *text, unsigned int len); +unsigned int textw(const char *text);  void tile(void);  void togglebar(const char *arg);  void togglefloating(const char *arg); @@ -216,6 +215,7 @@ void selectmonitor(const char *arg);  char stext[256];  int mcount = 1;  int selmonitor = 0; +int screen;  int (*xerrorxlib)(Display *, XErrorEvent *);  unsigned int bh, bpos;  unsigned int blw = 0; @@ -343,7 +343,7 @@ buttonpress(XEvent *e) {  	if(ev->window == m->barwin) {  		x = 0;  		for(i = 0; i < LENGTH(tags); i++) { -			x += textw(m, tags[i]); +			x += textw(tags[i]);  			if(ev->x < x) {  				if(ev->button == Button1) {  					if(ev->state & MODKEY) @@ -408,22 +408,21 @@ cleanup(void) {  		unban(stack);  		unmanage(stack);  	} -	for(i = 0; i < mcount; i++) { -		Monitor *m = &monitors[i]; -		if(m->dc.font.set) -			XFreeFontSet(dpy, m->dc.font.set); -		else -			XFreeFont(dpy, m->dc.font.xfont); -		XUngrabKey(dpy, AnyKey, AnyModifier, root); -		XFreePixmap(dpy, m->dc.drawable); -		XFreeGC(dpy, m->dc.gc); -		XDestroyWindow(dpy, m->barwin); -		XFreeCursor(dpy, cursor[CurNormal]); -		XFreeCursor(dpy, cursor[CurResize]); -		XFreeCursor(dpy, cursor[CurMove]); -		XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); -		XSync(dpy, False); -	} +	if(dc.font.set) +		XFreeFontSet(dpy, dc.font.set); +	else +		XFreeFont(dpy, dc.font.xfont); + +	XUngrabKey(dpy, AnyKey, AnyModifier, root); +	XFreePixmap(dpy, dc.drawable); +	XFreeGC(dpy, dc.gc); +	XFreeCursor(dpy, cursor[CurNormal]); +	XFreeCursor(dpy, cursor[CurResize]); +	XFreeCursor(dpy, cursor[CurMove]); +	for(i = 0; i < mcount; i++) +		XDestroyWindow(dpy, monitors[i].barwin); +	XSync(dpy, False); +	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);  }  void @@ -476,10 +475,11 @@ configurenotify(XEvent *e) {  	Monitor *m = &monitors[selmonitor];  	if(ev->window == root && (ev->width != m->sw || ev->height != m->sh)) { +		/* TODO -- update Xinerama dimensions here */  		m->sw = ev->width;  		m->sh = ev->height;  		XFreePixmap(dpy, dc.drawable); -		dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen)); +		dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(root, screen), bh, DefaultDepth(dpy, screen));  		XResizeWindow(dpy, m->barwin, m->sw, bh);  		updatebarpos(m);  		arrange(); @@ -566,47 +566,47 @@ drawbar(void) {  	for(i = 0; i < mcount; i++) {  		Monitor *m = &monitors[i]; -		m->dc.x = 0; +		dc.x = 0;  		for(c = stack; c && !isvisible(c, i); c = c->snext);  		fprintf(stderr, "m%d %s\n", i, c ? c->name : "NIL");  		for(j = 0; j < LENGTH(tags); j++) { -			m->dc.w = textw(m, tags[j]); +			dc.w = textw(tags[j]);  			if(m->seltags[j]) { -				drawtext(m, tags[j], m->dc.sel, isurgent(i, j)); +				drawtext(m, tags[j], dc.sel, isurgent(i, j));  				drawsquare(m, c && c->tags[j] && c->monitor == i, -						isoccupied(i, j), isurgent(i, j), m->dc.sel); +						isoccupied(i, j), isurgent(i, j), dc.sel);  			}  			else { -				drawtext(m, tags[j], m->dc.norm, isurgent(i, j)); +				drawtext(m, tags[j], dc.norm, isurgent(i, j));  				drawsquare(m, c && c->tags[j] && c->monitor == i, -						isoccupied(i, j), isurgent(i, j), m->dc.norm); +						isoccupied(i, j), isurgent(i, j), dc.norm);  			} -			m->dc.x += m->dc.w; +			dc.x += dc.w;  		} -		m->dc.w = blw; -		drawtext(m, m->layout->symbol, m->dc.norm, False); -		x = m->dc.x + m->dc.w; +		dc.w = blw; +		drawtext(m, m->layout->symbol, dc.norm, False); +		x = dc.x + dc.w;  		if(i == selmonitor) { -			m->dc.w = textw(m, stext); -			m->dc.x = m->sw - m->dc.w; -			if(m->dc.x < x) { -				m->dc.x = x; -				m->dc.w = m->sw - x; +			dc.w = textw(stext); +			dc.x = m->sw - dc.w; +			if(dc.x < x) { +				dc.x = x; +				dc.w = m->sw - x;  			} -			drawtext(m, stext, m->dc.norm, False); +			drawtext(m, stext, dc.norm, False);  		}  		else -			m->dc.x = m->sw; -		if((m->dc.w = m->dc.x - x) > bh) { -			m->dc.x = x; +			dc.x = m->sw; +		if((dc.w = dc.x - x) > bh) { +			dc.x = x;  			if(c) { -				drawtext(m, c->name, m->dc.sel, False); -				drawsquare(m, False, c->isfloating, False, m->dc.sel); +				drawtext(m, c->name, dc.sel, False); +				drawsquare(m, False, c->isfloating, False, dc.sel);  			}  			else -				drawtext(m, NULL, m->dc.norm, False); +				drawtext(m, NULL, dc.norm, False);  		} -		XCopyArea(dpy, m->dc.drawable, m->barwin, m->dc.gc, 0, 0, m->sw, bh, 0, 0); +		XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->sw, bh, 0, 0);  		XSync(dpy, False);  	}  } @@ -615,20 +615,20 @@ void  drawsquare(Monitor *m, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {  	int x;  	XGCValues gcv; -	XRectangle r = { m->dc.x, m->dc.y, m->dc.w, m->dc.h }; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h };  	gcv.foreground = col[invert ? ColBG : ColFG]; -	XChangeGC(dpy, m->dc.gc, GCForeground, &gcv); -	x = (m->dc.font.ascent + m->dc.font.descent + 2) / 4; -	r.x = m->dc.x + 1; -	r.y = m->dc.y + 1; +	XChangeGC(dpy, dc.gc, GCForeground, &gcv); +	x = (dc.font.ascent + dc.font.descent + 2) / 4; +	r.x = dc.x + 1; +	r.y = dc.y + 1;  	if(filled) {  		r.width = r.height = x + 1; -		XFillRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1); +		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	}  	else if(empty) {  		r.width = r.height = x; -		XDrawRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1); +		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	}  } @@ -637,10 +637,10 @@ drawtext(Monitor *m, const char *text, unsigned long col[ColLast], Bool invert)  	int x, y, w, h;  	static char buf[256];  	unsigned int len, olen; -	XRectangle r = { m->dc.x, m->dc.y, m->dc.w, m->dc.h }; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; -	XSetForeground(dpy, m->dc.gc, col[invert ? ColFG : ColBG]); -	XFillRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1); +	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]); +	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	if(!text)  		return;  	w = 0; @@ -649,11 +649,11 @@ drawtext(Monitor *m, const char *text, unsigned long col[ColLast], Bool invert)  		len = sizeof buf - 1;  	memcpy(buf, text, len);  	buf[len] = 0; -	h = m->dc.font.ascent + m->dc.font.descent; -	y = m->dc.y + (m->dc.h / 2) - (h / 2) + m->dc.font.ascent; -	x = m->dc.x + (h / 2); +	h = dc.font.ascent + dc.font.descent; +	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; +	x = dc.x + (h / 2);  	/* shorten text if necessary */ -	while(len && (w = textnw(m, buf, len)) > m->dc.w - h) +	while(len && (w = textnw(buf, len)) > dc.w - h)  		buf[--len] = 0;  	if(len < olen) {  		if(len > 1) @@ -663,13 +663,13 @@ drawtext(Monitor *m, const char *text, unsigned long col[ColLast], Bool invert)  		if(len > 3)  			buf[len - 3] = '.';  	} -	if(w > m->dc.w) +	if(w > dc.w)  		return; /* too long */ -	XSetForeground(dpy, m->dc.gc, col[invert ? ColBG : ColFG]); -	if(m->dc.font.set) -		XmbDrawString(dpy, m->dc.drawable, m->dc.font.set, m->dc.gc, x, y, buf, len); +	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); +	if(dc.font.set) +		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);  	else -		XDrawString(dpy, m->dc.drawable, m->dc.gc, x, y, buf, len); +		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);  }  void * @@ -740,7 +740,7 @@ focus(Client *c) {  		for(c = stack; c && !isvisible(c, c->monitor); c = c->snext);  	if(sel && sel != c) {  		grabbuttons(sel, False); -		XSetWindowBorder(dpy, sel->win, monitors[sel->monitor].dc.norm[ColBorder]); +		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);  	}  	if(c) {  		detachstack(c); @@ -750,7 +750,7 @@ focus(Client *c) {  	sel = c;  	drawbar();  	if(c) { -		XSetWindowBorder(dpy, c->win, m->dc.sel[ColBorder]); +		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);  		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);  		selmonitor = c->monitor;  	} @@ -809,7 +809,7 @@ getclient(Window w) {  }  unsigned long -getcolor(const char *colstr, int screen) { +getcolor(const char *colstr) {  	Colormap cmap = DefaultColormap(dpy, screen);  	XColor color; @@ -937,45 +937,45 @@ idxoftag(const char *tag) {  }  void -initfont(Monitor *m, const char *fontstr) { +initfont(const char *fontstr) {  	char *def, **missing;  	int i, n;  	missing = NULL; -	if(m->dc.font.set) -		XFreeFontSet(dpy, m->dc.font.set); -	m->dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); +	if(dc.font.set) +		XFreeFontSet(dpy, dc.font.set); +	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);  	if(missing) {  		while(n--)  			fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);  		XFreeStringList(missing);  	} -	if(m->dc.font.set) { +	if(dc.font.set) {  		XFontSetExtents *font_extents;  		XFontStruct **xfonts;  		char **font_names; -		m->dc.font.ascent = m->dc.font.descent = 0; -		font_extents = XExtentsOfFontSet(m->dc.font.set); -		n = XFontsOfFontSet(m->dc.font.set, &xfonts, &font_names); -		for(i = 0, m->dc.font.ascent = 0, m->dc.font.descent = 0; i < n; i++) { -			if(m->dc.font.ascent < (*xfonts)->ascent) -				m->dc.font.ascent = (*xfonts)->ascent; -			if(m->dc.font.descent < (*xfonts)->descent) -				m->dc.font.descent = (*xfonts)->descent; +		dc.font.ascent = dc.font.descent = 0; +		font_extents = XExtentsOfFontSet(dc.font.set); +		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); +		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { +			if(dc.font.ascent < (*xfonts)->ascent) +				dc.font.ascent = (*xfonts)->ascent; +			if(dc.font.descent < (*xfonts)->descent) +				dc.font.descent = (*xfonts)->descent;  			xfonts++;  		}  	}  	else { -		if(m->dc.font.xfont) -			XFreeFont(dpy, m->dc.font.xfont); -		m->dc.font.xfont = NULL; -		if(!(m->dc.font.xfont = XLoadQueryFont(dpy, fontstr)) -		&& !(m->dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) +		if(dc.font.xfont) +			XFreeFont(dpy, dc.font.xfont); +		dc.font.xfont = NULL; +		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) +		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))  			eprint("error, cannot load font: '%s'\n", fontstr); -		m->dc.font.ascent = m->dc.font.xfont->ascent; -		m->dc.font.descent = m->dc.font.xfont->descent; +		dc.font.ascent = dc.font.xfont->ascent; +		dc.font.descent = dc.font.xfont->descent;  	} -	m->dc.font.height = m->dc.font.ascent + m->dc.font.descent; +	dc.font.height = dc.font.ascent + dc.font.descent;  }  Bool @@ -1101,7 +1101,7 @@ manage(Window w, XWindowAttributes *wa) {  	}  	wc.border_width = c->border;  	XConfigureWindow(dpy, w, CWBorderWidth, &wc); -	XSetWindowBorder(dpy, w, m->dc.norm[ColBorder]); +	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);  	configure(c); /* propagates border_width, if size doesn't change */  	updatesizehints(c);  	XSelectInput(dpy, w, EnterWindowMask | FocusChangeMask | PropertyChangeMask | StructureNotifyMask); @@ -1549,7 +1549,7 @@ setmwfact(const char *arg) {  void  setup(void) { -	unsigned int i, j, k; +	unsigned int i;  	Monitor *m;  	XSetWindowAttributes wa;  	XineramaScreenInfo *info = NULL; @@ -1573,13 +1573,34 @@ setup(void) {  		info = XineramaQueryScreens(dpy, &mcount);  	monitors = emallocz(mcount * sizeof(Monitor)); -	root = DefaultRootWindow(dpy); - +	screen = DefaultScreen(dpy); +	root = RootWindow(dpy, screen); + +	/* init appearance */ +	dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR); +	dc.norm[ColBG] = getcolor(NORMBGCOLOR); +	dc.norm[ColFG] = getcolor(NORMFGCOLOR); +	dc.sel[ColBorder] = getcolor(SELBORDERCOLOR); +	dc.sel[ColBG] = getcolor(SELBGCOLOR); +	dc.sel[ColFG] = getcolor(SELFGCOLOR); +	initfont(FONT); +	dc.h = bh = dc.font.height + 2; +	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); +	dc.gc = XCreateGC(dpy, root, 0, 0); +	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); +	if(!dc.font.set) +		XSetFont(dpy, dc.gc, dc.font.xfont->fid); + +	for(blw = i = 0; i < LENGTH(layouts); i++) { +		i = textw(layouts[i].symbol); +		if(i > blw) +			blw = i; +	}  	for(i = 0; i < mcount; i++) {  		/* init geometry */  		m = &monitors[i]; -		m->screen = isxinerama ? 0 : i; +		m->monitor = i;  		if (mcount != 1 && isxinerama) {  			m->sx = info[i].x_org; @@ -1591,8 +1612,8 @@ setup(void) {  		else {  			m->sx = 0;  			m->sy = 0; -			m->sw = DisplayWidth(dpy, m->screen); -			m->sh = DisplayHeight(dpy, m->screen); +			m->sw = DisplayWidth(dpy, screen); +			m->sh = DisplayHeight(dpy, screen);  		}  		m->seltags = emallocz(sizeof initags); @@ -1601,24 +1622,9 @@ setup(void) {  		memcpy(m->seltags, initags, sizeof initags);  		memcpy(m->prevtags, initags, sizeof initags); -		/* init appearance */ -		m->dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR, m->screen); -		m->dc.norm[ColBG] = getcolor(NORMBGCOLOR, m->screen); -		m->dc.norm[ColFG] = getcolor(NORMFGCOLOR, m->screen); -		m->dc.sel[ColBorder] = getcolor(SELBORDERCOLOR, m->screen); -		m->dc.sel[ColBG] = getcolor(SELBGCOLOR, m->screen); -		m->dc.sel[ColFG] = getcolor(SELFGCOLOR, m->screen); -		initfont(m, FONT); -		m->dc.h = bh = m->dc.font.height + 2; -  		/* init layouts */  		m->mwfact = MWFACT;  		m->layout = &layouts[0]; -		for(blw = k = 0; k < LENGTH(layouts); k++) { -			j = textw(m, layouts[k].symbol); -			if(j > blw) -				blw = j; -		}  		// TODO: bpos per screen?  		bpos = BARPOS; @@ -1628,17 +1634,12 @@ setup(void) {  		/* init bars */  		m->barwin = XCreateWindow(dpy, root, m->sx, m->sy, m->sw, bh, 0, -				DefaultDepth(dpy, m->screen), CopyFromParent, DefaultVisual(dpy, m->screen), +				DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),  				CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);  		XDefineCursor(dpy, m->barwin, cursor[CurNormal]);  		updatebarpos(m);  		XMapRaised(dpy, m->barwin);  		strcpy(stext, "dwm-"VERSION); -		m->dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen)); -		m->dc.gc = XCreateGC(dpy, root, 0, 0); -		XSetLineAttributes(dpy, m->dc.gc, 1, LineSolid, CapButt, JoinMiter); -		if(!m->dc.font.set) -			XSetFont(dpy, m->dc.gc, m->dc.font.xfont->fid);  		/* EWMH support per monitor */  		XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, @@ -1700,19 +1701,19 @@ tag(const char *arg) {  }  unsigned int -textnw(Monitor *m, const char *text, unsigned int len) { +textnw(const char *text, unsigned int len) {  	XRectangle r; -	if(m->dc.font.set) { -		XmbTextExtents(m->dc.font.set, text, len, NULL, &r); +	if(dc.font.set) { +		XmbTextExtents(dc.font.set, text, len, NULL, &r);  		return r.width;  	} -	return XTextWidth(m->dc.font.xfont, text, len); +	return XTextWidth(dc.font.xfont, text, len);  }  unsigned int -textw(Monitor *m, const char *text) { -	return textnw(m, text, strlen(text)) + m->dc.font.height; +textw(const char *text) { +	return textnw(text, strlen(text)) + dc.font.height;  }  void | 
