mirror of
https://git.suckless.org/dwm
synced 2024-12-27 03:16:32 +00:00
added logo+description
This commit is contained in:
parent
d7e17087ed
commit
650a1fb4e1
12 changed files with 194 additions and 115 deletions
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 },
|
||||||
|
|
BIN
logo.png
Normal file
BIN
logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 387 B |
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…
Reference in a new issue