dwm

dynamic window manager
git clone https://git.parazyd.org/dwm
Log | Files | Refs | README | LICENSE

commit 7e597ae204ce94398f8c722e335f20d5a4a30c8a
parent c39df91ab9826ef134bc1484b0d19186790132f3
Author: Anselm R. Garbe <arg@10kloc.org>
Date:   Wed, 23 Aug 2006 18:50:46 +0200

updated man page
Diffstat:
Mclient.c | 22+++++++++-------------
Mconfig.arg.h | 5++---
Mdraw.c | 96+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mdwm.1 | 8++++----
Mdwm.h | 2+-
Mtag.c | 2++
Mview.c | 8++++----
7 files changed, 69 insertions(+), 74 deletions(-)

diff --git a/client.c b/client.c @@ -28,19 +28,15 @@ resizetitle(Client *c) { int i; - c->tw = 0; - for(i = 0; i < ntags; i++) - if(c->tags[i]) - c->tw += textw(tags[i]); - c->tw += textw(c->name); + c->tw = textw(c->name); if(c->tw > c->w) c->tw = c->w + 2; c->tx = c->x + c->w - c->tw + 2; c->ty = c->y; if(isvisible(c)) - XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th); else - XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th); } @@ -65,7 +61,7 @@ void ban(Client *c) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); - XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); + XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty); } void @@ -106,7 +102,7 @@ getctitle(Window w) Client *c; for(c = clients; c; c = c->next) - if(c->title == w) + if(c->twin == w) return c; return NULL; } @@ -214,7 +210,7 @@ manage(Window w, XWindowAttributes *wa) twa.background_pixmap = ParentRelative; twa.event_mask = ExposureMask | EnterWindowMask; - c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, + c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); @@ -242,7 +238,7 @@ manage(Window w, XWindowAttributes *wa) sel = c; arrange(NULL); XMapWindow(dpy, c->win); - XMapWindow(dpy, c->title); + XMapWindow(dpy, c->twin); if(isvisible(c)) focus(c); } @@ -329,7 +325,7 @@ void settitle(Client *c) { char **list = NULL; - int n; + int i, n; XTextProperty name; name.nitems = 0; @@ -392,7 +388,7 @@ unmanage(Client *c) XSetErrorHandler(xerrordummy); XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - XDestroyWindow(dpy, c->title); + XDestroyWindow(dpy, c->twin); if(c->prev) c->prev->next = c->next; diff --git a/config.arg.h b/config.arg.h @@ -7,8 +7,7 @@ const char *tags[] = { "work", "net", "fnord", NULL }; #define DEFMODE dotile /* dofloat */ -#define TFONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" -#define FONT "-*-snap-*-*-*-*-*-*-*-*-*-*-*-*" +#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" #define BGCOLOR "#0d121d" #define FGCOLOR "#eeeeee" #define BORDERCOLOR "#3f484d" @@ -19,7 +18,7 @@ const char *tags[] = { "work", "net", "fnord", NULL }; static Key key[] = { \ /* modifier key function arguments */ \ { MODKEY|ShiftMask, XK_Return, spawn, \ - { .cmd = "exec uxterm +sb -bg black -fg '#eeeeee' -fn '"TFONT"'" } }, \ + { .cmd = "exec uxterm +sb -bg black -fg '#eeeeee' -fn '"FONT"'" } }, \ { MODKEY, XK_p, spawn, \ { .cmd = "exec `ls -lL /usr/bin /usr/X11R6/bin /usr/local/bin 2>/dev/null | " \ "awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u | dmenu`" } }, \ diff --git a/draw.c b/draw.c @@ -22,19 +22,9 @@ textnw(const char *text, unsigned int len) } static void -drawtext(const char *text, Bool invert) +drawborder() { - int x, y, w, h; - static char buf[256]; - unsigned int len, olen; - XGCValues gcv; XPoint points[5]; - XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - - XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); - XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); - XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); - XSetForeground(dpy, dc.gc, dc.border); points[0].x = dc.x; points[0].y = dc.y; points[1].x = dc.w - 1; @@ -46,6 +36,23 @@ drawtext(const char *text, Bool invert) points[4].x = 0; points[4].y = -(dc.h - 1); XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); +} + +static void +drawtext(const char *text, Bool invert, Bool highlight) +{ + int x, y, w, h; + static char buf[256]; + unsigned int len, olen; + DC tmp; + XGCValues gcv; + XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + + XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); + XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); + XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); + XSetForeground(dpy, dc.gc, dc.border); + drawborder(); if(!text) return; @@ -75,18 +82,25 @@ drawtext(const char *text, Bool invert) if(w > dc.w) return; /* too long */ - gcv.foreground = invert ? dc.bg : dc.fg; gcv.background = invert ? dc.fg : dc.bg; if(dc.font.set) { XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); - XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, - x, y, buf, len); + 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 | GCBackground | GCFont, &gcv); - XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); + XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); + } + if(highlight) { + tmp = dc; + dc.x += 2; + dc.y += 2; + dc.w -= 4; + dc.h -= 4; + drawborder(); + dc = tmp; } } @@ -110,36 +124,29 @@ drawstatus() dc.x = dc.y = 0; dc.w = bw; - drawtext(NULL, !istile); + drawtext(NULL, !istile, False); dc.w = 0; for(i = 0; i < ntags; i++) { dc.x += dc.w; dc.w = textw(tags[i]); if(istile) - drawtext(tags[i], seltag[i]); + drawtext(tags[i], seltag[i], sel && sel->tags[i]); else - drawtext(tags[i], !seltag[i]); + drawtext(tags[i], !seltag[i], sel && sel->tags[i]); } x = dc.x + dc.w; dc.w = textw(stext); dc.x = bx + bw - dc.w; - drawtext(stext, !istile); - - if(sel) { - for(i = 0; i < ntags; i++) - if(sel->tags[i]) { - dc.w = textw(tags[i]); - dc.x -= dc.w; - if(dc.x < x) - break; - drawtext(tags[i], istile); - } - if(dc.x > x && (dc.x - x) > bh) { - dc.w = dc.x - x; - dc.x = x; - drawtext(sel->name, istile); - } + if(dc.x < x) { + dc.x = x; + dc.w = bw - x; + } + drawtext(stext, !istile, False); + + if(sel && ((dc.w = dc.x - x) > bh)) { + dc.x = x; + drawtext(sel->name, istile, False); } XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); XSync(dpy, False); @@ -153,26 +160,17 @@ drawtitle(Client *c) if(c == sel && issel) { drawstatus(); - XUnmapWindow(dpy, c->title); + XUnmapWindow(dpy, c->twin); XSetWindowBorder(dpy, c->win, dc.fg); return; } XSetWindowBorder(dpy, c->win, dc.bg); - XMapWindow(dpy, c->title); - - dc.y = dc.w = 0; - dc.x = c->tw; - for(i = 0; i < ntags; i++) - if(c->tags[i]) { - dc.w = textw(tags[i]); - dc.x -= dc.w; - drawtext(tags[i], !istile); - } - dc.w = dc.x; - dc.x = 0; - drawtext(c->name, !istile); - XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0); + XMapWindow(dpy, c->twin); + dc.x = dc.y = 0; + dc.w = c->tw; + drawtext(c->name, !istile, False); + XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0); XSync(dpy, False); } diff --git a/dwm.1 b/dwm.1 @@ -21,12 +21,12 @@ tags. Selecting a certain tag for viewing will display all windows with that tag. .P .B dwm -contains a small status bar which displays all available tags, the title and the -tags of the focused window, and the text read from standard input. +contains a small status bar which displays all available tags, the title +of the focused window, and the text read from standard input. The tags of the +focused window are highlighted. .P .B dwm draws a 1-pixel border around windows to indicate the focus state. -Unfocused windows contain a small bar in front of them displaying their title -and tags. +Unfocused windows contain a small bar in front of them displaying their title. .SH OPTIONS .TP .B \-v diff --git a/dwm.h b/dwm.h @@ -60,7 +60,7 @@ struct Client { Client *next; Client *prev; Window win; - Window title; + Window twin; }; extern const char *tags[]; diff --git a/tag.c b/tag.c @@ -141,4 +141,6 @@ toggletag(Arg *arg) settitle(sel); if(!isvisible(sel)) arrange(NULL); + else + drawstatus(); } diff --git a/view.c b/view.c @@ -168,21 +168,21 @@ restack() fi = 0; mi = 2 * f; if(sel->isfloat || arrange == dofloat) { - wins[fi++] = sel->title; + wins[fi++] = sel->twin; wins[fi++] = sel->win; } else { - wins[mi++] = sel->title; + wins[mi++] = sel->twin; wins[mi++] = sel->win; } for(c = clients; c; c = c->next) if(isvisible(c) && c != sel) { if(c->isfloat || arrange == dofloat) { - wins[fi++] = c->title; + wins[fi++] = c->twin; wins[fi++] = c->win; } else { - wins[mi++] = c->title; + wins[mi++] = c->twin; wins[mi++] = c->win; } }