diff options
| author | Anselm R. Garbe <arg@suckless.org> | 2007-02-19 15:17:31 +0100 | 
|---|---|---|
| committer | Anselm R. Garbe <arg@suckless.org> | 2007-02-19 15:17:31 +0100 | 
| commit | f8415019d4edc1cd4f310adb256e6656e85bfe75 (patch) | |
| tree | 2813e15f6dbd4a3c1326a3d2c08ab2bcea3c61af | |
| parent | 238dd5d2b15b8bdc0f05d5be7f86a1ca03d2920b (diff) | |
draw.c is useless (belongs to main.c now)
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | client.c | 12 | ||||
| -rw-r--r-- | draw.c | 175 | ||||
| -rw-r--r-- | dwm.h | 11 | ||||
| -rw-r--r-- | event.c | 8 | ||||
| -rw-r--r-- | main.c | 165 | 
6 files changed, 178 insertions, 195 deletions
| @@ -3,7 +3,7 @@  include config.mk -SRC = client.c draw.c event.c main.c screen.c util.c +SRC = client.c event.c main.c screen.c util.c  OBJ = ${SRC:.c=.o}  all: options dwm @@ -200,16 +200,6 @@ focusprev(Arg *arg) {  	}  } -Client * -getclient(Window w) { -	Client *c; - -	for(c = clients; c; c = c->next) -		if(c->win == w) -			return c; -	return NULL; -} -  void  killclient(Arg *arg) {  	if(!sel) @@ -259,7 +249,7 @@ manage(Window w, XWindowAttributes *wa) {  	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);  	configure(c); /* propagates border_width, if size doesn't change */  	updatetitle(c); -	t = getclient(trans); +	for(t = clients; t && t->win != c->win; t = t->next);  	settags(c, t);  	if(!c->isfloat)  		c->isfloat = (t != 0) || c->isfixed; @@ -1,175 +0,0 @@ -/* (C)opyright MMIV-MMVII Anselm R. Garbe <garbeam at gmail dot com> - * See LICENSE file for license details. - */ -#include "dwm.h" -#include <stdio.h> -#include <string.h> - -/* static */ - -static Bool -isoccupied(unsigned int t) -{ -	Client *c; -	for(c = clients; c; c = c->next) -		if(c->tags[t]) -			return True; -	return False; -} - -static unsigned int -textnw(const char *text, unsigned int len) { -	XRectangle r; - -	if(dc.font.set) { -		XmbTextExtents(dc.font.set, text, len, NULL, &r); -		return r.width; -	} -	return XTextWidth(dc.font.xfont, text, len); -} - -static void -drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) { -	int x, y, w, h; -	static char buf[256]; -	unsigned int len, olen; -	XGCValues gcv; -	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - -	XSetForeground(dpy, dc.gc, col[ColBG]); -	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	if(!text) -		return; -	w = 0; -	olen = len = strlen(text); -	if(len >= sizeof buf) -		len = sizeof buf - 1; -	memcpy(buf, text, len); -	buf[len] = 0; -	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(buf, len)) > dc.w - h) -		buf[--len] = 0; -	if(len < olen) { -		if(len > 1) -			buf[len - 1] = '.'; -		if(len > 2) -			buf[len - 2] = '.'; -		if(len > 3) -			buf[len - 3] = '.'; -	} -	if(w > dc.w) -		return; /* too long */ -	gcv.foreground = col[ColFG]; -	if(dc.font.set) { -		XChangeGC(dpy, dc.gc, GCForeground, &gcv); -		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); -	} -	else { -		gcv.font = dc.font.xfont->fid; -		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); -		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); -	} -	x = (h + 2) / 4; -	r.x = dc.x + 1; -	r.y = dc.y + 1; -	if(filledsquare) { -		r.width = r.height = x + 1; -		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	} -	else if(emptysquare) { -		r.width = r.height = x; -		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	} -} - -/* extern */ - -void -drawstatus(void) { -	int i, x; - -	dc.x = dc.y = 0; -	for(i = 0; i < ntags; i++) { -		dc.w = textw(tags[i]); -		if(seltag[i]) -			drawtext(tags[i], dc.sel, sel && sel->tags[i], isoccupied(i)); -		else -			drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i)); -		dc.x += dc.w; -	} -	dc.w = bmw; -	drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.norm, False, False); -	x = dc.x + dc.w; -	dc.w = textw(stext); -	dc.x = sw - dc.w; -	if(dc.x < x) { -		dc.x = x; -		dc.w = sw - x; -	} -	drawtext(stext, dc.norm, False, False); -	if((dc.w = dc.x - x) > bh) { -		dc.x = x; -		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False); -	} -	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); -	XSync(dpy, False); -} - -unsigned long -getcolor(const char *colstr) { -	Colormap cmap = DefaultColormap(dpy, screen); -	XColor color; - -	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) -		eprint("error, cannot allocate color '%s'\n", colstr); -	return color.pixel; -} - -void -setfont(const char *fontstr) { -	char *def, **missing; -	int i, n; - -	missing = NULL; -	if(dc.font.set) -		XFreeFontSet(dpy, dc.font.set); -	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); -	if(missing) { -		while(n--) -			fprintf(stderr, "missing fontset: %s\n", missing[n]); -		XFreeStringList(missing); -	} -	if(dc.font.set) { -		XFontSetExtents *font_extents; -		XFontStruct **xfonts; -		char **font_names; -		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(dc.font.xfont) -			XFreeFont(dpy, dc.font.xfont); -		dc.font.xfont = NULL; -		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))) -			eprint("error, cannot load font: '%s'\n", fontstr); -		dc.font.ascent = dc.font.xfont->ascent; -		dc.font.descent = dc.font.xfont->descent; -	} -	dc.font.height = dc.font.ascent + dc.font.descent; -} - -unsigned int -textw(const char *text) { -	return textnw(text, strlen(text)) + dc.font.height; -} @@ -103,28 +103,23 @@ extern void configure(Client *c);		/* send synthetic configure event */  extern void focus(Client *c);			/* focus c, c may be NULL */  extern void focusnext(Arg *arg);		/* focuses next visible client, arg is ignored  */  extern void focusprev(Arg *arg);		/* focuses previous visible client, arg is ignored */ -extern Client *getclient(Window w);		/* return client of w */  extern void killclient(Arg *arg);		/* kill c nicely */  extern void manage(Window w, XWindowAttributes *wa);	/* manage new client */  Client *nexttiled(Client *c);			/* returns tiled successor of c */  extern void resize(Client *c, int x, int y, -		int w, int h, Bool sizehints);	/* resize c*/ +		int w, int h, Bool sizehints);	/* resize with given coordinates c*/  extern void updatesizehints(Client *c);		/* update the size hint variables of c */  extern void updatetitle(Client *c);		/* update the name of c */  extern void unmanage(Client *c);		/* destroy c */  extern void zoom(Arg *arg);			/* zooms the focused client to master area, arg is ignored */ -/* draw.c */ -extern void drawstatus(void);			/* draw the bar */ -extern unsigned long getcolor(const char *colstr);	/* return color of colstr */ -extern void setfont(const char *fontstr);	/* set the font for DC */ -extern unsigned int textw(const char *text);	/* return the width of text in px*/ -  /* event.c */  extern void grabkeys(void);			/* grab all keys defined in config.h */  extern void procevent(void);			/* process pending X events */  /* main.c */ +extern void drawstatus(void);			/* draw the bar */ +extern unsigned int textw(const char *text);	/* return the width of text in px*/  extern void quit(Arg *arg);			/* quit dwm nicely */  extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */  extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ @@ -20,6 +20,14 @@ KEYS  #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))  #define MOUSEMASK		(BUTTONMASK | PointerMotionMask) +static Client * +getclient(Window w) { +	Client *c; + +	for(c = clients; c && c->win != w; c = c->next); +	return c; +} +  static void  movemouse(Client *c) {  	int x1, y1, ocx, ocy, di, nx, ny; @@ -61,6 +61,94 @@ cleanup(void) {  	free(seltag);  } +static unsigned int +textnw(const char *text, unsigned int len) { +	XRectangle r; + +	if(dc.font.set) { +		XmbTextExtents(dc.font.set, text, len, NULL, &r); +		return r.width; +	} +	return XTextWidth(dc.font.xfont, text, len); +} + +static void +drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) { +	int x, y, w, h; +	static char buf[256]; +	unsigned int len, olen; +	XGCValues gcv; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + +	XSetForeground(dpy, dc.gc, col[ColBG]); +	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	if(!text) +		return; +	w = 0; +	olen = len = strlen(text); +	if(len >= sizeof buf) +		len = sizeof buf - 1; +	memcpy(buf, text, len); +	buf[len] = 0; +	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(buf, len)) > dc.w - h) +		buf[--len] = 0; +	if(len < olen) { +		if(len > 1) +			buf[len - 1] = '.'; +		if(len > 2) +			buf[len - 2] = '.'; +		if(len > 3) +			buf[len - 3] = '.'; +	} +	if(w > dc.w) +		return; /* too long */ +	gcv.foreground = col[ColFG]; +	if(dc.font.set) { +		XChangeGC(dpy, dc.gc, GCForeground, &gcv); +		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); +	} +	else { +		gcv.font = dc.font.xfont->fid; +		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); +		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); +	} +	x = (h + 2) / 4; +	r.x = dc.x + 1; +	r.y = dc.y + 1; +	if(filledsquare) { +		r.width = r.height = x + 1; +		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	} +	else if(emptysquare) { +		r.width = r.height = x; +		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	} +} + +static unsigned long +getcolor(const char *colstr) { +	Colormap cmap = DefaultColormap(dpy, screen); +	XColor color; + +	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) +		eprint("error, cannot allocate color '%s'\n", colstr); +	return color.pixel; +} + +static Bool +isoccupied(unsigned int t) { +	Client *c; + +	for(c = clients; c; c = c->next) +		if(c->tags[t]) +			return True; +	return False; +} +  static void  scan(void) {  	unsigned int i, num; @@ -82,6 +170,47 @@ scan(void) {  }  static void +setfont(const char *fontstr) { +	char *def, **missing; +	int i, n; + +	missing = NULL; +	if(dc.font.set) +		XFreeFontSet(dpy, dc.font.set); +	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); +	if(missing) { +		while(n--) +			fprintf(stderr, "missing fontset: %s\n", missing[n]); +		XFreeStringList(missing); +	} +	if(dc.font.set) { +		XFontSetExtents *font_extents; +		XFontStruct **xfonts; +		char **font_names; +		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(dc.font.xfont) +			XFreeFont(dpy, dc.font.xfont); +		dc.font.xfont = NULL; +		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))) +			eprint("error, cannot load font: '%s'\n", fontstr); +		dc.font.ascent = dc.font.xfont->ascent; +		dc.font.descent = dc.font.xfont->descent; +	} +	dc.font.height = dc.font.ascent + dc.font.descent; +} + +static void  setup(void) {  	int i, j;  	unsigned int mask; @@ -171,6 +300,37 @@ xerrorstart(Display *dsply, XErrorEvent *ee) {  /* extern */  void +drawstatus(void) { +	int i, x; + +	dc.x = dc.y = 0; +	for(i = 0; i < ntags; i++) { +		dc.w = textw(tags[i]); +		if(seltag[i]) +			drawtext(tags[i], dc.sel, sel && sel->tags[i], isoccupied(i)); +		else +			drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i)); +		dc.x += dc.w; +	} +	dc.w = bmw; +	drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.norm, False, False); +	x = dc.x + dc.w; +	dc.w = textw(stext); +	dc.x = sw - dc.w; +	if(dc.x < x) { +		dc.x = x; +		dc.w = sw - x; +	} +	drawtext(stext, dc.norm, False, False); +	if((dc.w = dc.x - x) > bh) { +		dc.x = x; +		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False); +	} +	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); +	XSync(dpy, False); +} + +void  sendevent(Window w, Atom a, long value) {  	XEvent e; @@ -184,6 +344,11 @@ sendevent(Window w, Atom a, long value) {  	XSync(dpy, False);  } +unsigned int +textw(const char *text) { +	return textnw(text, strlen(text)) + dc.font.height; +} +  void  quit(Arg *arg) {  	readin = running = False; | 
