Compare commits

...

59 Commits
2.3 ... 2.7

Author SHA1 Message Date
c7da124149 applied Sanders patch 2006-12-13 14:15:38 +01:00
21bd90d7d3 fixed man page, status bar displays EOF instead of "broken pipe" 2006-12-13 13:53:10 +01:00
c8f96b5b4c added the java odyssee to CAVEATS section 2006-12-13 13:42:17 +01:00
ded60365d4 removed Client->grav 2006-12-12 19:14:38 +01:00
629647dfee removed gravitate for the moment 2006-12-11 16:45:02 +01:00
4ca3d861f0 disabling configure() during resize 2006-12-11 09:42:16 +01:00
069e7a6e24 made gravitate effectless, waiting for complains ;) 2006-12-11 08:31:30 +01:00
ac6e34ea06 fixed diagnostic error message 2006-12-08 11:11:52 +01:00
a308b7507a removed the hardcoded fixed fallback, it is useless in non-Latin1 environments 2006-12-08 10:40:09 +01:00
630e7ff26f we don't use the term clients anymore, windows is the better term 2006-12-07 16:38:57 +01:00
3764ab471b Added tag 2.6 for changeset 5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2006-12-07 14:55:29 +01:00
a3319c6f8e found compromise for fonts 2006-12-07 14:39:31 +01:00
66c699a701 nah, people should define 'fixed' to be compatible with their locale 2006-12-07 12:03:15 +01:00
aaf1e44da9 using a UTF-8 capable fixed font 2006-12-07 11:55:04 +01:00
1ef2307ec4 switching to uxterm again, I get kretze from this urxvt crap 2006-12-07 10:43:34 +01:00
d42c3ba2dc with this patch everything works fine for me 2006-12-07 10:02:46 +01:00
4b06155873 don't use Xlocale crap, let's use locale.h instead 2006-12-07 09:49:45 +01:00
857d825eeb using the portable Xmb+UTF-8 way of life, will see if this works well... 2006-12-07 09:47:55 +01:00
6b345353e3 improved the memory leak prevention 2006-12-06 11:19:06 +01:00
ab3b3a8f61 making terminus more explicit a regular font (otherwise olique font might be used in some setups like mine). 2006-12-05 14:21:18 +01:00
71b82fb1f6 also setting LC_CTYPE only 2006-12-05 13:31:29 +01:00
9bd9ea423e enforcing using fontsets even if they are incomplete for some encodings 2006-12-05 10:30:31 +01:00
99964398e7 Added tag 2.5.1 for changeset c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2006-12-04 21:01:14 +01:00
7009ebfa69 hotfix of a serious crashing bug 2006-12-04 21:00:26 +01:00
760e23dd3a Added tag 2.5 for changeset dcbbfabc8ecc5f33a6cc950584de87da1a368045 2006-12-04 15:39:43 +01:00
c53d9d516a applied Manuel's regex patch 2006-12-03 11:21:25 +01:00
7739e6b466 made squares equally sized, and 1px bigger 2006-12-01 17:55:46 +01:00
4881857458 if client is focused, the emptysquare don't needs to be drawed 2006-12-01 17:51:05 +01:00
c73d5cb7b6 and the winner is 2006-12-01 17:45:27 +01:00
6458803d21 sander1 proposal 2006-12-01 17:36:37 +01:00
6e72d781f7 dood 2006-12-01 16:55:42 +01:00
4e926a9ef2 darkening the fg colors somewhat 2006-12-01 15:50:22 +01:00
4ba3cfaee9 less obtrusive indicator (only a top line) 2006-12-01 15:03:42 +01:00
e655e8a7d5 final2 indicator 2006-12-01 12:52:16 +01:00
c34e4e4b39 removing the -1 on final indicators, looks cleaner 2006-12-01 12:39:13 +01:00
a678ee6365 final indicators 2006-12-01 12:25:23 +01:00
49f0ee329d changed things like I described in last mail 2006-12-01 10:16:10 +01:00
0c9d9a3d94 improved tag indicator 2006-12-01 09:52:15 +01:00
89e1acb0bb removed viewall signature from dwm.h 2006-11-30 17:01:39 +01:00
c2ed26b711 next version will be 2.5 2006-11-30 15:51:26 +01:00
42fd392e05 removed viewall(), replaced with view(-1); added tag(-1) to tag a client with all tags (new key combo MODKEY-Shift-0) 2006-11-30 15:27:43 +01:00
e06447ee88 Added tag 2.4 for changeset 32b246925086910d63147483160281a91a47479f 2006-11-30 09:19:52 +01:00
683dabe5e6 extended dwm.1 with last change 2006-11-28 17:36:00 +01:00
3aff96177c togglefloat should only work in dotile mode (thanks to Sander for this hint) 2006-11-28 17:35:31 +01:00
0a915eba8f applied Alex Elide's tricky patch, thanks! 2006-11-27 17:51:50 +01:00
19dcbc5717 returning to old Key struct 2006-11-27 17:49:58 +01:00
d2a4952956 applied Szabolcs Nagy's patch (thank you!) 2006-11-27 17:46:02 +01:00
0c97b21b61 applied patch by Jukka 2006-11-27 17:30:06 +01:00
19390b1a91 changing Key.func into Key.func[NFUNCS], this allows sequences execution of functions per keypress (avoids implementing useless masterfunctions which call atomic ones) 2006-11-27 13:21:38 +01:00
8dc86051df added man page entry 2006-11-27 11:05:47 +01:00
46d5f9d1bf added togglefloat to hg tip (i consider this useful for some cases), using MODKEY-Shift-space as shortcut 2006-11-27 10:57:37 +01:00
35e96b8deb applied Jukka's patch preventing some cornercases and making the EOF error message correct 2006-11-27 10:29:47 +01:00
2210ea7e3b applied yet another proposal of Manuel 2006-11-26 15:43:16 +01:00
61a1910f91 applied Jukka's sizeof K&R compliance patch, applied Manuels' last-line printage proposal for stdin reading. 2006-11-26 14:26:53 +01:00
27ef73507b applied Jukka's stdinread patch 2006-11-26 13:31:36 +01:00
2b35fb643e next version will be 2.4 2006-11-25 19:26:31 +01:00
478f6f95f1 applied Manuels patch (thanks to Manuel!) 2006-11-25 19:26:16 +01:00
44411d2d48 small fix of man page 2006-11-24 17:02:41 +01:00
a2175cf71a Added tag 2.3 for changeset 719b37b37b0df829d7cf017ac70e353088fe5849 2006-11-24 15:46:32 +01:00
12 changed files with 125 additions and 146 deletions

View File

@ -21,3 +21,8 @@ a5567a0d30112822db2627a04a2e7aa3b6c38148 1.9
12deea36603da407e3f32640048846a3bd74a9ec 2.0
a2c465098a3b972bbed00feda9804b6aae1e9531 2.1
7e92f58754ae6edb3225f26d754bd89c1ff458cf 2.2
719b37b37b0df829d7cf017ac70e353088fe5849 2.3
32b246925086910d63147483160281a91a47479f 2.4
dcbbfabc8ecc5f33a6cc950584de87da1a368045 2.5
c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2.5.1
5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2.6

View File

@ -131,58 +131,6 @@ getctitle(Window w) {
return NULL;
}
void
gravitate(Client *c, Bool invert) {
int dx = 0, dy = 0;
switch(c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case NorthGravity:
case NorthEastGravity:
dy = c->border;
break;
case EastGravity:
case CenterGravity:
case WestGravity:
dy = -(c->h / 2) + c->border;
break;
case SouthEastGravity:
case SouthGravity:
case SouthWestGravity:
dy = -(c->h);
break;
}
switch (c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case WestGravity:
case SouthWestGravity:
dx = c->border;
break;
case NorthGravity:
case CenterGravity:
case SouthGravity:
dx = -(c->w / 2) + c->border;
break;
case NorthEastGravity:
case EastGravity:
case SouthEastGravity:
dx = -(c->w + c->border);
break;
}
if(invert) {
dx = -dx;
dy = -dy;
}
c->x += dx;
c->y += dy;
}
void
killclient(Arg *arg) {
if(!sel)
@ -341,10 +289,6 @@ updatesize(Client *c) {
c->minw = c->minh = 0;
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh &&
c->maxw == c->minw && c->maxh == c->minh);
if(c->flags & PWinGravity)
c->grav = size.win_gravity;
else
c->grav = NorthWestGravity;
}
void
@ -361,12 +305,12 @@ updatetitle(Client *c) {
if(!name.nitems)
return;
if(name.encoding == XA_STRING)
strncpy(c->name, (char *)name.value, sizeof(c->name));
strncpy(c->name, (char *)name.value, sizeof c->name);
else {
if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
&& n > 0 && *list)
{
strncpy(c->name, *list, sizeof(c->name));
strncpy(c->name, *list, sizeof c->name);
XFreeStringList(list);
}
}

View File

@ -9,23 +9,23 @@ const char *tags[] = { "dev", "work", "net", "fnord", NULL };
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
#define FONT "-*-terminus-medium-r-*-*-14-*-*-*-*-*-*-*"
#define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#336699"
#define SELFGCOLOR "#eeeeee"
#define SELFGCOLOR "#dddddd"
#define STATUSBGCOLOR "#222222"
#define STATUSFGCOLOR "#99ccff"
#define MASTER 600 /* per thousand */
#define MASTER 600 /* per thousand */
#define MODKEY Mod1Mask
#define SNAP 40 /* pixel */
#define SNAP 40 /* pixel */
#define KEYS \
static Key key[] = { \
/* modifier key function arguments */ \
/* modifier key function argument */ \
{ MODKEY|ShiftMask, XK_Return, spawn, \
{ .cmd = "exec urxvtc -tr -bg black -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
{ .cmd = "exec uxterm -bg black -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
{ MODKEY, XK_p, spawn, \
{ .cmd = "exe=\"$(lsx `echo $PATH | sed 's/:/ /g'` | sort -u " \
" | dmenu -font '"FONT"' -normbg '"NORMBGCOLOR"' -normfg '"NORMFGCOLOR"' " \
@ -35,6 +35,7 @@ static Key key[] = { \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizemaster, { .i = 15 } }, \
{ MODKEY, XK_s, resizemaster, { .i = -15 } }, \
{ MODKEY|ShiftMask, XK_0, tag, { .i = -1 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
@ -45,7 +46,8 @@ static Key key[] = { \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY|ShiftMask, XK_space, togglefloat, { 0 } }, \
{ MODKEY, XK_0, view, { .i = -1 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \

View File

@ -9,7 +9,7 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "fixed"
#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#666699"
@ -17,19 +17,20 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define STATUSBGCOLOR "#dddddd"
#define STATUSFGCOLOR "#222222"
#define MASTER 600 /* per thousand */
#define MASTER 600 /* per thousand */
#define MODKEY Mod1Mask
#define SNAP 20 /* pixel */
#define SNAP 20 /* pixel */
#define KEYS \
static Key key[] = { \
/* modifier key function arguments */ \
/* modifier key function argument */ \
{ MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \
{ MODKEY, XK_Tab, focusnext, { 0 } }, \
{ MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizemaster, { .i = 15 } }, \
{ MODKEY, XK_s, resizemaster, { .i = -15 } }, \
{ MODKEY|ShiftMask, XK_0, tag, { .i = -1 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
@ -42,7 +43,8 @@ static Key key[] = { \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY|ShiftMask, XK_space, togglefloat, { 0 } }, \
{ MODKEY, XK_0, view, { .i = -1 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \

View File

@ -1,5 +1,5 @@
# dwm version
VERSION = 2.3
VERSION = 2.7
# Customize below to fit your system

48
draw.c
View File

@ -4,7 +4,6 @@
#include "dwm.h"
#include <stdio.h>
#include <string.h>
#include <X11/Xlocale.h>
/* static */
@ -30,12 +29,13 @@ textnw(const char *text, unsigned int len) {
}
static void
drawtext(const char *text, unsigned long col[ColLast], Bool ldot, Bool rdot) {
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 };
XPoint pt[5];
XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
@ -43,8 +43,8 @@ drawtext(const char *text, unsigned long col[ColLast], Bool ldot, Bool rdot) {
return;
w = 0;
olen = len = strlen(text);
if(len >= sizeof(buf))
len = sizeof(buf) - 1;
if(len >= sizeof buf)
len = sizeof buf - 1;
memcpy(buf, text, len);
buf[len] = 0;
h = dc.font.ascent + dc.font.descent;
@ -73,17 +73,25 @@ drawtext(const char *text, unsigned long col[ColLast], Bool ldot, Bool rdot) {
XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
if(ldot) {
r.x = dc.x + 2;
r.y = dc.y + 2;
r.width = r.height = (h + 2) / 4;
x = (h + 2) / 4;
if(filledsquare) {
r.x = dc.x + 1;
r.y = dc.y + 1;
r.width = r.height = x + 1;
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
}
if(rdot) {
r.width = r.height = (h + 2) / 4;
r.x = dc.x + dc.w - r.width - 2;
r.y = dc.y + dc.h - r.height - 2;
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
else if(emptysquare) {
pt[0].x = dc.x + 1;
pt[0].y = dc.y + 1;
pt[1].x = x;
pt[1].y = 0;
pt[2].x = 0;
pt[2].y = x;
pt[3].x = -x;
pt[3].y = 0;
pt[4].x = 0;
pt[4].y = -x;
XDrawLines(dpy, dc.drawable, dc.gc, pt, 5, CoordModePrevious);
}
}
@ -158,11 +166,10 @@ getcolor(const char *colstr) {
void
setfont(const char *fontstr) {
char **missing, *def;
char *def, **missing;
int i, n;
missing = NULL;
setlocale(LC_ALL, "");
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
@ -170,10 +177,6 @@ setfont(const char *fontstr) {
while(n--)
fprintf(stderr, "missing fontset: %s\n", missing[n]);
XFreeStringList(missing);
if(dc.font.set) {
XFreeFontSet(dpy, dc.font.set);
dc.font.set = NULL;
}
}
if(dc.font.set) {
XFontSetExtents *font_extents;
@ -194,11 +197,8 @@ setfont(const char *fontstr) {
if(dc.font.xfont)
XFreeFont(dpy, dc.font.xfont);
dc.font.xfont = NULL;
dc.font.xfont = XLoadQueryFont(dpy, fontstr);
if (!dc.font.xfont)
dc.font.xfont = XLoadQueryFont(dpy, "fixed");
if (!dc.font.xfont)
eprint("error, cannot init 'fixed' font\n");
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;
}

26
dwm.1
View File

@ -21,9 +21,9 @@ tags. Selecting certain tags displays all windows with these tags.
dwm contains a small status bar which displays all available tags, the mode,
the title of the focused window, and the text read from standard input. The
selected tags are indicated with a different color. The tags of the focused
window are indicated with a small point in the top left corner. The tags which
are applied by any client are indicated with a small point in the bottom
right corner.
window are indicated with a filled square in the top left corner. The tags
which are applied to one or more windows are indicated with an empty square in
the top left corner.
.P
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.
@ -75,6 +75,9 @@ Apply
.RB nth
tag to current window.
.TP
.B Mod1-Shift-0
Apply all tags to current window.
.TP
.B Mod1-Control-Shift-[1..n]
Add/remove
.B nth
@ -86,6 +89,9 @@ Close focused window.
.B Mod1-space
Toggle between tiling and floating mode (affects all windows).
.TP
.B Mod1-Shift-space
Toggle focused window between floating and non-floating state (tiling mode only).
.TP
.B Mod1-[1..n]
View all windows with
.BR nth
@ -116,9 +122,17 @@ dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH CAVEATS
The status bar may display
.BR "broken pipe"
when dwm has been started by
.BR "EOF"
when dwm has been started by an X session manager like
.BR xdm (1),
because it closes standard output before executing dwm.
because those close standard output before executing dwm.
.P
Java applications which use the XToolkit/XAWT backend may draw grey windows
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
JDK 1.6 versions, because it assumes a reparenting window manager. As a workaround
you can use JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or you
can set the following environment variable (to use the older Motif
backend instead):
.BR AWT_TOOLKIT=MToolkit .
.SH SEE ALSO
.BR dmenu (1)

4
dwm.h
View File

@ -80,7 +80,6 @@ struct Client {
int rx, ry, rw, rh; /* revert geometry */
int tx, ty, tw, th; /* title window geometry */
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int grav;
long flags;
unsigned int border;
Bool isfloat, isfixed, ismax;
@ -114,7 +113,6 @@ extern void configure(Client *c); /* send synthetic configure event */
extern void focus(Client *c); /* focus c, c may be NULL */
extern Client *getclient(Window w); /* return client of w */
extern Client *getctitle(Window w); /* return client of title window */
extern void gravitate(Client *c, Bool invert); /* gravitate c */
extern void killclient(Arg *arg); /* kill c nicely */
extern void manage(Window w, XWindowAttributes *wa); /* manage new client */
extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
@ -164,8 +162,8 @@ extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ign
extern Bool isvisible(Client *c); /* returns True if client is visible */
extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */
extern void restack(void); /* restores z layers of all clients */
extern void togglefloat(Arg *arg); /* toggles focusesd client between floating/non-floating state */
extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */
extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */
extern void view(Arg *arg); /* views the tag with arg's index */
extern void viewall(Arg *arg); /* views all tags, arg is ignored */
extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */

View File

@ -161,7 +161,6 @@ configurerequest(XEvent *e) {
if((c = getclient(ev->window))) {
c->ismax = False;
gravitate(c, True);
if(ev->value_mask & CWX)
c->x = ev->x;
if(ev->value_mask & CWY)
@ -172,7 +171,6 @@ configurerequest(XEvent *e) {
c->h = ev->height;
if(ev->value_mask & CWBorderWidth)
c->border = ev->border_width;
gravitate(c, False);
wc.x = c->x;
wc.y = c->y;
wc.width = c->w;
@ -244,7 +242,7 @@ expose(XEvent *e) {
static void
keypress(XEvent *e) {
static unsigned int len = sizeof(key) / sizeof(key[0]);
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeySym keysym;
XKeyEvent *ev = &e->xkey;
@ -256,7 +254,6 @@ keypress(XEvent *e) {
{
if(key[i].func)
key[i].func(&key[i].arg);
return;
}
}
}
@ -355,7 +352,7 @@ void (*handler[LASTEvent]) (XEvent *) = {
void
grabkeys(void) {
static unsigned int len = sizeof(key) / sizeof(key[0]);
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeyCode code;

48
main.c
View File

@ -4,6 +4,7 @@
#include "dwm.h"
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -51,6 +52,9 @@ cleanup(void) {
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, barwin);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
free(seltag);
@ -104,7 +108,7 @@ setup(void) {
numlockmask = (1 << i);
}
}
XFree(modmap);
XFreeModifiermap(modmap);
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask;
@ -227,6 +231,7 @@ xerror(Display *dpy, XErrorEvent *ee) {
int
main(int argc, char *argv[]) {
char *p;
int r, xfd;
fd_set rd;
@ -236,6 +241,7 @@ main(int argc, char *argv[]) {
}
else if(argc != 1)
eprint("usage: dwm [-v]\n");
setlocale(LC_CTYPE, "");
dpy = XOpenDisplay(0);
if(!dpy)
eprint("dwm: cannot open display\n");
@ -267,22 +273,32 @@ main(int argc, char *argv[]) {
if(readin)
FD_SET(STDIN_FILENO, &rd);
FD_SET(xfd, &rd);
r = select(xfd + 1, &rd, NULL, NULL, NULL);
if((r == -1) && (errno == EINTR))
continue;
if(r > 0) {
if(readin && FD_ISSET(STDIN_FILENO, &rd)) {
readin = NULL != fgets(stext, sizeof(stext), stdin);
if(readin)
stext[strlen(stext) - 1] = 0;
else
strcpy(stext, "broken pipe");
drawstatus();
}
}
else if(r < 0)
if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
if(errno == EINTR)
continue;
eprint("select failed\n");
procevent();
}
if(FD_ISSET(STDIN_FILENO, &rd)) {
switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)) {
case -1:
strncpy(stext, strerror(errno), sizeof stext - 1);
stext[sizeof stext - 1] = '\0';
readin = False;
break;
case 0:
strncpy(stext, "EOF", 4);
readin = False;
break;
default:
for(stext[r] = '\0', p = stext + strlen(stext) - 1; p >= stext && *p == '\n'; *p-- = '\0');
for(p = stext + strlen(stext) - 1; p >= stext && *p != '\n'; --p);
if(p > stext)
strncpy(stext, p + 1, sizeof stext);
}
drawstatus();
}
if(FD_ISSET(xfd, &rd))
procevent();
}
cleanup();
XCloseDisplay(dpy);

15
tag.c
View File

@ -50,19 +50,19 @@ initrregs(void) {
if(rreg)
return;
len = sizeof(rule) / sizeof(rule[0]);
len = sizeof rule / sizeof rule[0];
rreg = emallocz(len * sizeof(RReg));
for(i = 0; i < len; i++) {
if(rule[i].clpattern) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].clpattern, 0))
if(regcomp(reg, rule[i].clpattern, REG_EXTENDED))
free(reg);
else
rreg[i].clregex = reg;
}
if(rule[i].tpattern) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].tpattern, 0))
if(regcomp(reg, rule[i].tpattern, REG_EXTENDED))
free(reg);
else
rreg[i].tregex = reg;
@ -83,10 +83,10 @@ settags(Client *c, Client *trans) {
c->tags[i] = trans->tags[i];
}
else if(XGetClassHint(dpy, c->win, &ch)) {
snprintf(prop, sizeof(prop), "%s:%s:%s",
snprintf(prop, sizeof prop, "%s:%s:%s",
ch.res_class ? ch.res_class : "",
ch.res_name ? ch.res_name : "", c->name);
for(i = 0; !matched && i < len; i++)
for(i = 0; i < len; i++)
if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, 1, &tmp, 0)) {
c->isfloat = rule[i].isfloat;
for(j = 0; rreg[i].tregex && j < ntags; j++) {
@ -113,8 +113,9 @@ tag(Arg *arg) {
if(!sel)
return;
for(i = 0; i < ntags; i++)
sel->tags[i] = False;
sel->tags[arg->i] = True;
sel->tags[i] = (arg->i == -1) ? True : False;
if(arg->i >= 0 && arg->i < ntags)
sel->tags[arg->i] = True;
arrange();
}

26
view.c
View File

@ -91,7 +91,7 @@ dotile(void) {
c->h = wah - 2 * BORDERPX;
}
else if(i == 0) { /* master window */
c->w = waw - stackw - 2 * BORDERPX;
c->w = mpx - 2 * BORDERPX;
c->h = wah - 2 * BORDERPX;
th = wah / (n - 1);
}
@ -99,7 +99,7 @@ dotile(void) {
c->x += mpx;
c->w = stackw - 2 * BORDERPX;
if(th > bh) {
c->y = way + (i - 1) * th;
c->y += (i - 1) * th;
c->h = th - 2 * BORDERPX;
}
else /* fallback if th < bh */
@ -200,6 +200,14 @@ restack(void) {
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
togglefloat(Arg *arg) {
if (!sel || arrange == dofloat)
return;
sel->isfloat = !sel->isfloat;
arrange();
}
void
togglemode(Arg *arg) {
arrange = (arrange == dofloat) ? dotile : dofloat;
@ -225,17 +233,9 @@ view(Arg *arg) {
unsigned int i;
for(i = 0; i < ntags; i++)
seltag[i] = False;
seltag[arg->i] = True;
arrange();
}
void
viewall(Arg *arg) {
unsigned int i;
for(i = 0; i < ntags; i++)
seltag[i] = True;
seltag[i] = (arg->i == -1) ? True : False;
if(arg->i >= 0 && arg->i < ntags)
seltag[arg->i] = True;
arrange();
}