added logo+description
This commit is contained in:
		
							parent
							
								
									d7e17087ed
								
							
						
					
					
						commit
						650a1fb4e1
					
				
							
								
								
									
										24
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,18 +1,18 @@ | |||||||
| # gridwm - grid window manager
 | # dwm - dynamic window manager
 | ||||||
| #   (C)opyright MMVI Anselm R. Garbe
 | #   (C)opyright MMVI Anselm R. Garbe
 | ||||||
| 
 | 
 | ||||||
| include config.mk | include config.mk | ||||||
| 
 | 
 | ||||||
| SRC = client.c draw.c event.c kb.c mouse.c util.c wm.c | SRC = client.c draw.c event.c kb.c mouse.c util.c wm.c | ||||||
| OBJ = ${SRC:.c=.o} | OBJ = ${SRC:.c=.o} | ||||||
| MAN1 = gridwm.1  | MAN1 = dwm.1  | ||||||
| BIN = gridwm | BIN = dwm | ||||||
| 
 | 
 | ||||||
| all: config gridwm | all: config dwm | ||||||
| 	@echo finished | 	@echo finished | ||||||
| 
 | 
 | ||||||
| config: | config: | ||||||
| 	@echo gridwm build options: | 	@echo dwm build options: | ||||||
| 	@echo "LIBS     = ${LIBS}" | 	@echo "LIBS     = ${LIBS}" | ||||||
| 	@echo "CFLAGS   = ${CFLAGS}" | 	@echo "CFLAGS   = ${CFLAGS}" | ||||||
| 	@echo "LDFLAGS  = ${LDFLAGS}" | 	@echo "LDFLAGS  = ${LDFLAGS}" | ||||||
| @ -24,19 +24,19 @@ config: | |||||||
| 
 | 
 | ||||||
| ${OBJ}: wm.h | ${OBJ}: wm.h | ||||||
| 
 | 
 | ||||||
| gridwm: ${OBJ} | dwm: ${OBJ} | ||||||
| 	@echo LD $@ | 	@echo LD $@ | ||||||
| 	@${CC} -o $@ ${OBJ} ${LDFLAGS} | 	@${CC} -o $@ ${OBJ} ${LDFLAGS} | ||||||
| 
 | 
 | ||||||
| clean: | clean: | ||||||
| 	rm -f gridwm *.o core | 	rm -f dwm *.o core | ||||||
| 
 | 
 | ||||||
| dist: clean | dist: clean | ||||||
| 	mkdir -p gridwm-${VERSION} | 	mkdir -p dwm-${VERSION} | ||||||
| 	cp -R Makefile README LICENSE config.mk *.h *.c ${MAN} gridwm-${VERSION} | 	cp -R Makefile README LICENSE config.mk *.h *.c ${MAN} dwm-${VERSION} | ||||||
| 	tar -cf gridwm-${VERSION}.tar gridwm-${VERSION} | 	tar -cf dwm-${VERSION}.tar dwm-${VERSION} | ||||||
| 	gzip gridwm-${VERSION}.tar | 	gzip dwm-${VERSION}.tar | ||||||
| 	rm -rf gridwm-${VERSION} | 	rm -rf dwm-${VERSION} | ||||||
| 
 | 
 | ||||||
| install: all | install: all | ||||||
| 	@mkdir -p ${DESTDIR}${PREFIX}/bin | 	@mkdir -p ${DESTDIR}${PREFIX}/bin | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README
									
									
									
									
									
								
							| @ -1,41 +1,40 @@ | |||||||
| gridwm | dwm | ||||||
| ------ | ------ | ||||||
| 
 | 
 | ||||||
| gridwm is an extremly fast, small, and automatic X11 window manager.  It | dwm is an extremly fast, small, and dynamic X11 window manager. | ||||||
| arranges all windows in a grid. |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Requirements | Requirements | ||||||
| ------------ | ------------ | ||||||
| In order to build gridwm you need the Xlib header files. | In order to build dwm you need the Xlib header files. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Installation | Installation | ||||||
| ------------ | ------------ | ||||||
| Edit config.mk to match your local setup. gridwm is installed into | Edit config.mk to match your local setup. dwm is installed into | ||||||
| the /usr/local namespace by default. | the /usr/local namespace by default. | ||||||
| 
 | 
 | ||||||
| Afterwards enter the following command to build and install gridwm (if | Afterwards enter the following command to build and install dwm (if | ||||||
| necessary as root): | necessary as root): | ||||||
| 
 | 
 | ||||||
|     make clean install |     make clean install | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Running gridwm | Running dwm | ||||||
| -------------- | -------------- | ||||||
| Add the following line to your .xinitrc to start gridwm using startx: | Add the following line to your .xinitrc to start dwm using startx: | ||||||
| 
 | 
 | ||||||
|     exec gridwm |     exec dwm | ||||||
| 
 | 
 | ||||||
| In order to connect gridwm to a specific display, make sure that | In order to connect dwm to a specific display, make sure that | ||||||
| the DISPLAY environment variable is set correctly, e.g.: | the DISPLAY environment variable is set correctly, e.g.: | ||||||
| 
 | 
 | ||||||
|     DISPLAY=foo.bar:1 exec gridwm |     DISPLAY=foo.bar:1 exec dwm | ||||||
| 
 | 
 | ||||||
| This will start gridwm on display :1 of the host foo.bar. | This will start dwm on display :1 of the host foo.bar. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Configuration | Configuration | ||||||
| ------------- | ------------- | ||||||
| The configuration of gridwm is done by customizing the wm.h source file. To | The configuration of dwm is done by customizing the wm.h source file. To | ||||||
| customize the key bindings edit kb.c. | customize the key bindings edit kb.c. | ||||||
|  | |||||||
							
								
								
									
										55
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								client.c
									
									
									
									
									
								
							| @ -11,7 +11,9 @@ | |||||||
| 
 | 
 | ||||||
| #include "wm.h" | #include "wm.h" | ||||||
| 
 | 
 | ||||||
| void (*arrange)(void *aux); | static void floating(void); | ||||||
|  | static void tiling(void); | ||||||
|  | static void (*arrange)(void) = tiling; | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| max(void *aux) | max(void *aux) | ||||||
| @ -26,25 +28,23 @@ max(void *aux) | |||||||
| 	discard_events(EnterWindowMask); | 	discard_events(EnterWindowMask); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | static void | ||||||
| floating(void *aux) | floating(void) | ||||||
| { | { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 
 | 
 | ||||||
| 	arrange = floating; |  | ||||||
| 	for(c = stack; c; c = c->snext) | 	for(c = stack; c; c = c->snext) | ||||||
| 		resize(c); | 		resize(c); | ||||||
| 	discard_events(EnterWindowMask); | 	discard_events(EnterWindowMask); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | static void | ||||||
| grid(void *aux) | tiling(void) | ||||||
| { | { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 	int n, cols, rows, gw, gh, i, j; | 	int n, cols, rows, gw, gh, i, j; | ||||||
|     float rt, fd; |     float rt, fd; | ||||||
| 
 | 
 | ||||||
| 	arrange = grid; |  | ||||||
| 	if(!clients) | 	if(!clients) | ||||||
| 		return; | 		return; | ||||||
| 	for(n = 0, c = clients; c; c = c->next, n++); | 	for(n = 0, c = clients; c; c = c->next, n++); | ||||||
| @ -75,6 +75,17 @@ grid(void *aux) | |||||||
| 	discard_events(EnterWindowMask); | 	discard_events(EnterWindowMask); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | toggle(void *aux) | ||||||
|  | { | ||||||
|  | 	if(arrange == floating) | ||||||
|  | 		arrange = tiling; | ||||||
|  | 	else | ||||||
|  | 		arrange = floating; | ||||||
|  | 	arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void | void | ||||||
| sel(void *aux) | sel(void *aux) | ||||||
| { | { | ||||||
| @ -114,8 +125,8 @@ resize_title(Client *c) | |||||||
| 	c->tw = 0; | 	c->tw = 0; | ||||||
| 	for(i = 0; i < TLast; i++) | 	for(i = 0; i < TLast; i++) | ||||||
| 		if(c->tags[i]) | 		if(c->tags[i]) | ||||||
| 			c->tw += textw(&brush.font, c->tags[i]) + brush.font.height; | 			c->tw += textw(&dc.font, c->tags[i]) + dc.font.height; | ||||||
| 	c->tw += textw(&brush.font, c->name) + brush.font.height; | 	c->tw += textw(&dc.font, c->name) + dc.font.height; | ||||||
| 	if(c->tw > c->w) | 	if(c->tw > c->w) | ||||||
| 		c->tw = c->w + 2; | 		c->tw = c->w + 2; | ||||||
| 	c->tx = c->x + c->w - c->tw + 2; | 	c->tx = c->x + c->w - c->tw + 2; | ||||||
| @ -240,7 +251,7 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 	c->border = 1; | 	c->border = 1; | ||||||
| 	update_size(c); | 	update_size(c); | ||||||
| 	XSetWindowBorderWidth(dpy, c->win, 1); | 	XSetWindowBorderWidth(dpy, c->win, 1); | ||||||
| 	XSetWindowBorder(dpy, c->win, brush.border); | 	XSetWindowBorder(dpy, c->win, dc.border); | ||||||
| 	XSelectInput(dpy, c->win, | 	XSelectInput(dpy, c->win, | ||||||
| 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | ||||||
| 	XGetTransientForHint(dpy, c->win, &c->trans); | 	XGetTransientForHint(dpy, c->win, &c->trans); | ||||||
| @ -266,7 +277,7 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 			GrabModeAsync, GrabModeSync, None, None); | 			GrabModeAsync, GrabModeSync, None, None); | ||||||
| 	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, | 	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, | ||||||
| 			GrabModeAsync, GrabModeSync, None, None); | 			GrabModeAsync, GrabModeSync, None, None); | ||||||
| 	arrange(NULL); | 	arrange(); | ||||||
| 	focus(c); | 	focus(c); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -385,7 +396,7 @@ unmanage(Client *c) | |||||||
| 	XFlush(dpy); | 	XFlush(dpy); | ||||||
| 	XSetErrorHandler(error_handler); | 	XSetErrorHandler(error_handler); | ||||||
| 	XUngrabServer(dpy); | 	XUngrabServer(dpy); | ||||||
| 	arrange(NULL); | 	arrange(); | ||||||
| 	if(stack) | 	if(stack) | ||||||
| 		focus(stack); | 		focus(stack); | ||||||
| } | } | ||||||
| @ -417,21 +428,21 @@ draw_client(Client *c) | |||||||
| 	if(c == stack) | 	if(c == stack) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	brush.x = brush.y = 0; | 	dc.x = dc.y = 0; | ||||||
| 	brush.h = c->th; | 	dc.h = c->th; | ||||||
| 
 | 
 | ||||||
| 	brush.w = 0; | 	dc.w = 0; | ||||||
| 	for(i = 0; i < TLast; i++) { | 	for(i = 0; i < TLast; i++) { | ||||||
| 		if(c->tags[i]) { | 		if(c->tags[i]) { | ||||||
| 			brush.x += brush.w; | 			dc.x += dc.w; | ||||||
| 			brush.w = textw(&brush.font, c->tags[i]) + brush.font.height; | 			dc.w = textw(&dc.font, c->tags[i]) + dc.font.height; | ||||||
| 			draw(&brush, True, c->tags[i]); | 			draw(True, c->tags[i]); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	brush.x += brush.w; | 	dc.x += dc.w; | ||||||
| 	brush.w = textw(&brush.font, c->name) + brush.font.height; | 	dc.w = textw(&dc.font, c->name) + dc.font.height; | ||||||
| 	draw(&brush, True, c->name); | 	draw(True, c->name); | ||||||
| 	XCopyArea(dpy, brush.drawable, c->title, brush.gc, | 	XCopyArea(dpy, dc.drawable, c->title, dc.gc, | ||||||
| 			0, 0, c->tw, c->th, 0, 0); | 			0, 0, c->tw, c->th, 0, 0); | ||||||
| 	XFlush(dpy); | 	XFlush(dpy); | ||||||
| } | } | ||||||
|  | |||||||
| @ -14,14 +14,10 @@ VERSION = 0.0 | |||||||
| LIBS = -L${PREFIX}/lib -L/usr/lib -lc -lm -L${X11LIB} -lX11 | LIBS = -L${PREFIX}/lib -L/usr/lib -lc -lm -L${X11LIB} -lX11 | ||||||
| 
 | 
 | ||||||
| # Linux/BSD
 | # Linux/BSD
 | ||||||
| CFLAGS = -Os -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 | CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 | ||||||
| 	-DVERSION=\"${VERSION}\" | 	-DVERSION=\"${VERSION}\" | ||||||
| LDFLAGS = ${LIBS} | LDFLAGS = -g ${LIBS} | ||||||
| #CFLAGS  += -W -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wcast-qual -Wshadow -Waggregate-return -Wnested-externs -Winline -Wwrite-strings -Wundef -Wsign-compare -Wmissing-prototypes -Wredundant-decls
 |  | ||||||
| 
 | 
 | ||||||
| #CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 |  | ||||||
| #	-DVERSION=\"${VERSION}\"
 |  | ||||||
| #LDFLAGS = -g ${LIBS}
 |  | ||||||
| 
 | 
 | ||||||
| # Solaris
 | # Solaris
 | ||||||
| #CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\"
 | #CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\"
 | ||||||
|  | |||||||
							
								
								
									
										73
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								draw.c
									
									
									
									
									
								
							| @ -11,39 +11,39 @@ | |||||||
| #include "wm.h" | #include "wm.h" | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| drawborder(Brush *b) | drawborder(void) | ||||||
| { | { | ||||||
| 	XPoint points[5]; | 	XPoint points[5]; | ||||||
| 	XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter); | 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | ||||||
| 	XSetForeground(dpy, b->gc, b->border); | 	XSetForeground(dpy, dc.gc, dc.border); | ||||||
| 	points[0].x = b->x; | 	points[0].x = dc.x; | ||||||
| 	points[0].y = b->y; | 	points[0].y = dc.y; | ||||||
| 	points[1].x = b->w - 1; | 	points[1].x = dc.w - 1; | ||||||
| 	points[1].y = 0; | 	points[1].y = 0; | ||||||
| 	points[2].x = 0; | 	points[2].x = 0; | ||||||
| 	points[2].y = b->h - 1; | 	points[2].y = dc.h - 1; | ||||||
| 	points[3].x = -(b->w - 1); | 	points[3].x = -(dc.w - 1); | ||||||
| 	points[3].y = 0; | 	points[3].y = 0; | ||||||
| 	points[4].x = 0; | 	points[4].x = 0; | ||||||
| 	points[4].y = -(b->h - 1); | 	points[4].y = -(dc.h - 1); | ||||||
| 	XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious); | 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| draw(Brush *b, Bool border, const char *text) | draw(Bool border, const char *text) | ||||||
| { | { | ||||||
| 	int x, y, w, h; | 	int x, y, w, h; | ||||||
| 	unsigned int len; | 	unsigned int len; | ||||||
| 	static char buf[256]; | 	static char buf[256]; | ||||||
| 	XGCValues gcv; | 	XGCValues gcv; | ||||||
| 	XRectangle r = { b->x, b->y, b->w, b->h }; | 	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; | ||||||
| 
 | 
 | ||||||
| 	XSetForeground(dpy, b->gc, b->bg); | 	XSetForeground(dpy, dc.gc, dc.bg); | ||||||
| 	XFillRectangles(dpy, b->drawable, b->gc, &r, 1); | 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | ||||||
| 
 | 
 | ||||||
| 	w = 0; | 	w = 0; | ||||||
| 	if(border) | 	if(border) | ||||||
| 		drawborder(b); | 		drawborder(); | ||||||
| 
 | 
 | ||||||
| 	if(!text) | 	if(!text) | ||||||
| 		return; | 		return; | ||||||
| @ -54,33 +54,33 @@ draw(Brush *b, Bool border, const char *text) | |||||||
| 	memcpy(buf, text, len); | 	memcpy(buf, text, len); | ||||||
| 	buf[len] = 0; | 	buf[len] = 0; | ||||||
| 
 | 
 | ||||||
| 	h = b->font.ascent + b->font.descent; | 	h = dc.font.ascent + dc.font.descent; | ||||||
| 	y = b->y + (b->h / 2) - (h / 2) + b->font.ascent; | 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; | ||||||
| 	x = b->x + (h / 2); | 	x = dc.x + (h / 2); | ||||||
| 
 | 
 | ||||||
| 	/* shorten text if necessary */ | 	/* shorten text if necessary */ | ||||||
| 	while(len && (w = textnw(&b->font, buf, len)) > b->w - h) | 	while(len && (w = textnw(&dc.font, buf, len)) > dc.w - h) | ||||||
| 		buf[--len] = 0; | 		buf[--len] = 0; | ||||||
| 
 | 
 | ||||||
| 	if(w > b->w) | 	if(w > dc.w) | ||||||
| 		return; /* too long */ | 		return; /* too long */ | ||||||
| 
 | 
 | ||||||
| 	gcv.foreground = b->fg; | 	gcv.foreground = dc.fg; | ||||||
| 	gcv.background = b->bg; | 	gcv.background = dc.bg; | ||||||
| 	if(b->font.set) { | 	if(dc.font.set) { | ||||||
| 		XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv); | 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); | ||||||
| 		XmbDrawImageString(dpy, b->drawable, b->font.set, b->gc, | 		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, | ||||||
| 				x, y, buf, len); | 				x, y, buf, len); | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 		gcv.font = b->font.xfont->fid; | 		gcv.font = dc.font.xfont->fid; | ||||||
| 		XChangeGC(dpy, b->gc, GCForeground | GCBackground | GCFont, &gcv); | 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); | ||||||
| 		XDrawImageString(dpy, b->drawable, b->gc, x, y, buf, len); | 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned long | static unsigned long | ||||||
| xloadcolors(Colormap cmap, const char *colstr) | xinitcolors(Colormap cmap, const char *colstr) | ||||||
| { | { | ||||||
| 	XColor color; | 	XColor color; | ||||||
| 	XAllocNamedColor(dpy, cmap, colstr, &color, &color); | 	XAllocNamedColor(dpy, cmap, colstr, &color, &color); | ||||||
| @ -88,13 +88,12 @@ xloadcolors(Colormap cmap, const char *colstr) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| loadcolors(int scr, Brush *b, | initcolors(const char *bg, const char *fg, const char *border) | ||||||
| 		const char *bg, const char *fg, const char *border) |  | ||||||
| { | { | ||||||
| 	Colormap cmap = DefaultColormap(dpy, scr); | 	Colormap cmap = DefaultColormap(dpy, screen); | ||||||
| 	b->bg = xloadcolors(cmap, bg); | 	dc.bg = xinitcolors(cmap, bg); | ||||||
| 	b->fg = xloadcolors(cmap, fg); | 	dc.fg = xinitcolors(cmap, fg); | ||||||
| 	b->border = xloadcolors(cmap, border); | 	dc.border = xinitcolors(cmap, border); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| unsigned int | unsigned int | ||||||
| @ -121,7 +120,7 @@ texth(Fnt *font) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| loadfont(Fnt *font, const char *fontstr) | initfont(Fnt *font, const char *fontstr) | ||||||
| { | { | ||||||
| 	char **missing, *def; | 	char **missing, *def; | ||||||
| 	int i, n; | 	int i, n; | ||||||
| @ -164,7 +163,7 @@ loadfont(Fnt *font, const char *fontstr) | |||||||
| 		if (!font->xfont) | 		if (!font->xfont) | ||||||
| 			font->xfont = XLoadQueryFont(dpy, "fixed"); | 			font->xfont = XLoadQueryFont(dpy, "fixed"); | ||||||
| 		if (!font->xfont) | 		if (!font->xfont) | ||||||
| 			error("error, cannot load 'fixed' font\n"); | 			error("error, cannot init 'fixed' font\n"); | ||||||
| 		font->ascent = font->xfont->ascent; | 		font->ascent = font->xfont->ascent; | ||||||
| 		font->descent = font->xfont->descent; | 		font->descent = font->xfont->descent; | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										77
									
								
								dwm.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								dwm.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | <html> | ||||||
|  | 	<head> | ||||||
|  | 		<title>dwm - dynamic window manager</title> | ||||||
|  | 		<meta name="author" content="Anselm R. Garbe"> | ||||||
|  | 		<meta name="generator" content="ed"> | ||||||
|  | 		<meta name="copyright" content="(C)opyright 2006 by Anselm R. Garbe"> | ||||||
|  | 		<style type="text/css"> | ||||||
|  | 			body { | ||||||
|  | 				color: #000000; | ||||||
|  | 				font-family: sans-serif; | ||||||
|  | 			} | ||||||
|  | 		</style> | ||||||
|  | 	</head> | ||||||
|  | 	<body> | ||||||
|  | 		<center> | ||||||
|  | 			<img src="logo.png"/><br /> | ||||||
|  | 			<h3>dynamic window manager</h3> | ||||||
|  | 		<center> | ||||||
|  | 		<h2>Description</h3> | ||||||
|  | 		<p> | ||||||
|  | 		dwm is a dynamic window manager for X11. | ||||||
|  | 		</p> | ||||||
|  | 		<h2>Differences to wmii</h2	 | ||||||
|  | 		<p> | ||||||
|  | 		In contrast to wmii, dwm is only a window manager, and nothing else. | ||||||
|  | 		Hence, it is much smaller, faster and simpler. dwm does | ||||||
|  | 		<b>not</b> include following features wmii provides: | ||||||
|  | 		</p> | ||||||
|  | 		<ul> | ||||||
|  | 			<li>9P support</li> | ||||||
|  | 			<li>status bar</li> | ||||||
|  | 			<li>menu</li> | ||||||
|  | 			<li>editable tagbars</li> | ||||||
|  | 			<li>shell-based config/control file</li> | ||||||
|  | 			<li>small tools (selection printer, mouse warper)</li> | ||||||
|  | 		</ul> | ||||||
|  | 		<p> | ||||||
|  | 		dwm is only a single binary, it's source code is intended to never | ||||||
|  | 		exceed 2000 SLOC. | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		dwm is customized through editing its source code, that makes it | ||||||
|  | 		extremely fast and secure - it does not process any input data which | ||||||
|  | 		hasn't been known at compile time, except window title names. | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		dwm is based on tagging and dynamic window management (however simpler | ||||||
|  | 		than wmii or larswm). | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		dwm don't distinguishes between layers, there is no floating or managed | ||||||
|  | 		layer. Wether the clients of currently selected tag are managed or not | ||||||
|  | 		managed, you can re-arrange all clients on the fly. Popup- and | ||||||
|  | 		fixed-size windows are treated unmanaged.  | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		dwm uses 1-pixel borders to provide the maximum of screen real | ||||||
|  | 		estate to clients. Small titlebars are only drawn in front of unfocused | ||||||
|  | 		clients. | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		garbeam <b>don't</b> wants any feedback to dwm. If you ask for support, | ||||||
|  | 		feature requests or if you report bugs, they will be <b>ignored</b> | ||||||
|  | 		with a high chance. dwm is only intended to fit garbeam's needs, | ||||||
|  | 		however you are free to download and distribute/relicense it, with the | ||||||
|  | 		conditions of the <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm?f=f10eb1139362;file=LICENSE;style=raw">MIT/X Consortium license</a>. | ||||||
|  | 		</p> | ||||||
|  | 		<h2>Development</h2> | ||||||
|  | 		<p> | ||||||
|  | 		dwm is actively developed in parallel to wmii. You can <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm">browse</a> its source code repository or get a copy using <a href="http://www.selenic.com/mercurial/">Mercurial</a> with following command: | ||||||
|  | 		</p> | ||||||
|  | 		<p> | ||||||
|  | 		<em>hg clone http://wmii.de/cgi-bin/hgwebdir.cgi/dwm</em> | ||||||
|  | 		</p> | ||||||
|  | 		<p>--Anselm</p> | ||||||
|  | 	</body> | ||||||
|  | </html> | ||||||
							
								
								
									
										5
									
								
								kb.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								kb.c
									
									
									
									
									
								
							| @ -13,13 +13,14 @@ const char *term[] = { | |||||||
| 	"aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", | 	"aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", | ||||||
| 	"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL | 	"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL | ||||||
| }; | }; | ||||||
|  | const char *browse[] = { "firefox", NULL }; | ||||||
| 
 | 
 | ||||||
| static Key key[] = { | static Key key[] = { | ||||||
| 	{ Mod1Mask, XK_Return, (void (*)(void *))spawn, term }, | 	{ Mod1Mask, XK_Return, (void (*)(void *))spawn, term }, | ||||||
|  | 	{ Mod1Mask, XK_w, (void (*)(void *))spawn, browse }, | ||||||
| 	{ Mod1Mask, XK_k, sel, "prev" },  | 	{ Mod1Mask, XK_k, sel, "prev" },  | ||||||
| 	{ Mod1Mask, XK_j, sel, "next" },  | 	{ Mod1Mask, XK_j, sel, "next" },  | ||||||
| 	{ Mod1Mask, XK_g, grid, NULL },  | 	{ Mod1Mask, XK_space, toggle, NULL },  | ||||||
| 	{ Mod1Mask, XK_f, floating, NULL },  |  | ||||||
| 	{ Mod1Mask, XK_m, max, NULL },  | 	{ Mod1Mask, XK_m, max, NULL },  | ||||||
| 	{ Mod1Mask | ShiftMask, XK_c, ckill, NULL },  | 	{ Mod1Mask | ShiftMask, XK_c, ckill, NULL },  | ||||||
| 	{ Mod1Mask | ShiftMask, XK_q, quit, NULL }, | 	{ Mod1Mask | ShiftMask, XK_q, quit, NULL }, | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								util.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								util.c
									
									
									
									
									
								
							| @ -85,7 +85,7 @@ spawn(char *argv[]) | |||||||
| 				close(ConnectionNumber(dpy)); | 				close(ConnectionNumber(dpy)); | ||||||
| 			setsid(); | 			setsid(); | ||||||
| 			execvp(argv[0], argv); | 			execvp(argv[0], argv); | ||||||
| 			fprintf(stderr, "gridwm: execvp %s", argv[0]); | 			fprintf(stderr, "dwm: execvp %s", argv[0]); | ||||||
| 			perror(" failed"); | 			perror(" failed"); | ||||||
| 		} | 		} | ||||||
| 		exit (0); | 		exit (0); | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								wm.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								wm.c
									
									
									
									
									
								
							| @ -37,17 +37,17 @@ char stext[1024]; | |||||||
| int tsel = Tdev; /* default tag */ | int tsel = Tdev; /* default tag */ | ||||||
| int screen, sx, sy, sw, sh, th; | int screen, sx, sy, sw, sh, th; | ||||||
| 
 | 
 | ||||||
| Brush brush = {0}; | DC dc = {0}; | ||||||
| Client *clients = NULL; | Client *clients = NULL; | ||||||
| Client *stack = NULL; | Client *stack = NULL; | ||||||
| 
 | 
 | ||||||
| static Bool other_wm_running; | static Bool other_wm_running; | ||||||
| static const char version[] = | static const char version[] = | ||||||
| 	"gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; | 	"dwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; | ||||||
| static int (*x_error_handler) (Display *, XErrorEvent *); | static int (*x_error_handler) (Display *, XErrorEvent *); | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| usage() {	error("usage: gridwm [-v]\n"); } | usage() {	error("usage: dwm [-v]\n"); } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| scan_wins() | scan_wins() | ||||||
| @ -149,7 +149,7 @@ error_handler(Display *dpy, XErrorEvent *error) | |||||||
| 			|| (error->request_code == X_GrabKey | 			|| (error->request_code == X_GrabKey | ||||||
| 				&& error->error_code == BadAccess)) | 				&& error->error_code == BadAccess)) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	fprintf(stderr, "gridwm: fatal error: request code=%d, error code=%d\n", | 	fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", | ||||||
| 			error->request_code, error->error_code); | 			error->request_code, error->error_code); | ||||||
| 	return x_error_handler(dpy, error); /* may call exit() */ | 	return x_error_handler(dpy, error); /* may call exit() */ | ||||||
| } | } | ||||||
| @ -203,7 +203,7 @@ main(int argc, char *argv[]) | |||||||
| 
 | 
 | ||||||
| 	dpy = XOpenDisplay(0); | 	dpy = XOpenDisplay(0); | ||||||
| 	if(!dpy) | 	if(!dpy) | ||||||
| 		error("gridwm: cannot connect X server\n"); | 		error("dwm: cannot connect X server\n"); | ||||||
| 
 | 
 | ||||||
| 	screen = DefaultScreen(dpy); | 	screen = DefaultScreen(dpy); | ||||||
| 	root = RootWindow(dpy, screen); | 	root = RootWindow(dpy, screen); | ||||||
| @ -216,7 +216,7 @@ main(int argc, char *argv[]) | |||||||
| 	XFlush(dpy); | 	XFlush(dpy); | ||||||
| 
 | 
 | ||||||
| 	if(other_wm_running) | 	if(other_wm_running) | ||||||
| 		error("gridwm: another window manager is already running\n"); | 		error("dwm: another window manager is already running\n"); | ||||||
| 
 | 
 | ||||||
| 	sx = sy = 0; | 	sx = sy = 0; | ||||||
| 	sw = DisplayWidth(dpy, screen); | 	sw = DisplayWidth(dpy, screen); | ||||||
| @ -244,20 +244,19 @@ main(int argc, char *argv[]) | |||||||
| 	update_keys(); | 	update_keys(); | ||||||
| 
 | 
 | ||||||
| 	/* style */ | 	/* style */ | ||||||
| 	loadcolors(screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR); | 	initcolors(BGCOLOR, FGCOLOR, BORDERCOLOR); | ||||||
| 	loadfont(&brush.font, FONT); | 	initfont(&dc.font, FONT); | ||||||
| 
 | 
 | ||||||
| 	th = texth(&brush.font); | 	th = texth(&dc.font); | ||||||
| 
 | 
 | ||||||
| 	brush.drawable = XCreatePixmap(dpy, root, sw, th, DefaultDepth(dpy, screen)); | 	dc.drawable = XCreatePixmap(dpy, root, sw, th, DefaultDepth(dpy, screen)); | ||||||
| 	brush.gc = XCreateGC(dpy, root, 0, 0); | 	dc.gc = XCreateGC(dpy, root, 0, 0); | ||||||
| 
 | 
 | ||||||
| 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask \ | 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask \ | ||||||
| 					| LeaveWindowMask; | 					| LeaveWindowMask; | ||||||
| 	wa.cursor = cursor[CurNormal]; | 	wa.cursor = cursor[CurNormal]; | ||||||
| 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | ||||||
| 
 | 
 | ||||||
| 	arrange = grid; |  | ||||||
| 	scan_wins(); | 	scan_wins(); | ||||||
| 
 | 
 | ||||||
| 	while(running) { | 	while(running) { | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								wm.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								wm.h
									
									
									
									
									
								
							| @ -19,7 +19,7 @@ enum { Tscratch, Tdev, Tirc, Twww, Twork, TLast }; | |||||||
| 
 | 
 | ||||||
| /********** CUSTOMIZE **********/ | /********** CUSTOMIZE **********/ | ||||||
| 
 | 
 | ||||||
| typedef struct Brush Brush; | typedef struct DC DC; | ||||||
| typedef struct Client Client; | typedef struct Client Client; | ||||||
| typedef struct Fnt Fnt; | typedef struct Fnt Fnt; | ||||||
| typedef struct Key Key; | typedef struct Key Key; | ||||||
| @ -39,7 +39,7 @@ struct Fnt { | |||||||
| 	int height; | 	int height; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct Brush { | struct DC { /* draw context */ | ||||||
| 	GC gc; | 	GC gc; | ||||||
| 	Drawable drawable; | 	Drawable drawable; | ||||||
| 	int x, y, w, h; | 	int x, y, w, h; | ||||||
| @ -79,12 +79,11 @@ extern Atom wm_atom[WMLast], net_atom[NetLast]; | |||||||
| extern Cursor cursor[CurLast]; | extern Cursor cursor[CurLast]; | ||||||
| extern Bool running, issel; | extern Bool running, issel; | ||||||
| extern void (*handler[LASTEvent]) (XEvent *); | extern void (*handler[LASTEvent]) (XEvent *); | ||||||
| extern void (*arrange)(void *aux); |  | ||||||
| 
 | 
 | ||||||
| extern int tsel, screen, sx, sy, sw, sh, th; | extern int tsel, screen, sx, sy, sw, sh, th; | ||||||
| extern char stext[1024], *tags[TLast]; | extern char stext[1024], *tags[TLast]; | ||||||
| 
 | 
 | ||||||
| extern Brush brush; | extern DC dc; | ||||||
| extern Client *clients, *stack; | extern Client *clients, *stack; | ||||||
| 
 | 
 | ||||||
| /* client.c */ | /* client.c */ | ||||||
| @ -102,15 +101,13 @@ extern void lower(Client *c); | |||||||
| extern void ckill(void *aux); | extern void ckill(void *aux); | ||||||
| extern void sel(void *aux); | extern void sel(void *aux); | ||||||
| extern void max(void *aux); | extern void max(void *aux); | ||||||
| extern void floating(void *aux); | extern void toggle(void *aux); | ||||||
| extern void grid(void *aux); |  | ||||||
| extern void gravitate(Client *c, Bool invert); | extern void gravitate(Client *c, Bool invert); | ||||||
| 
 | 
 | ||||||
| /* draw.c */ | /* draw.c */ | ||||||
| extern void draw(Brush *b, Bool border, const char *text); | extern void draw(Bool border, const char *text); | ||||||
| extern void loadcolors(int scr, Brush *b, | extern void initcolors(const char *bg, const char *fg, const char *bo); | ||||||
| 		const char *bg, const char *fg, const char *bo); | extern void initfont(Fnt *font, const char *fontstr); | ||||||
| extern void loadfont(Fnt *font, const char *fontstr); |  | ||||||
| extern unsigned int textnw(Fnt *font, char *text, unsigned int len); | extern unsigned int textnw(Fnt *font, char *text, unsigned int len); | ||||||
| extern unsigned int textw(Fnt *font, char *text); | extern unsigned int textw(Fnt *font, char *text); | ||||||
| extern unsigned int texth(Fnt *font); | extern unsigned int texth(Fnt *font); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R. Garbe
						Anselm R. Garbe