Compare commits

...

24 Commits
4.0 ... 4.1

Author SHA1 Message Date
fa32f02a43 no that change breaks fullscreen apps 2007-05-16 22:05:02 +02:00
598e22907e raise barwin in restack, that's the most elegant solution I think 2007-05-16 21:59:53 +02:00
1e826ddd3e simplification 2007-05-15 14:06:18 +02:00
a967d7f664 raising the barwin has no effect becasue of restack 2007-05-15 13:58:29 +02:00
ce450c5bf1 fix 2007-05-15 13:56:47 +02:00
8f5f7a5b5a barwindow raising 2007-05-15 13:56:06 +02:00
5ad2828c57 using BarTop as fallback if BARPOS is set to BarOff as default for toggling 2007-05-15 13:49:43 +02:00
b896b58d6d removed strip, added -s to LDFLAGS 2007-05-15 13:44:04 +02:00
fef6c5c66b added new Mod1-b functionality to dwm(1) 2007-05-15 13:42:07 +02:00
37e062b0ed another fix, call lt->arrange() in togglebar only 2007-05-15 13:36:04 +02:00
cf58091736 fixed bpos init 2007-05-15 13:23:51 +02:00
2aef8b9b4c made bar togglalble 2007-05-15 12:09:18 +02:00
d96307cbe4 thanks to Jukka 2007-05-14 16:24:01 +02:00
124866e269 added the GTK Save-As bug report to BUGS section of dwm(1) 2007-05-14 13:42:00 +02:00
ab3d6a7dfe applied dfenze cleanups, fixed some comments in dwm.h 2007-05-14 11:54:30 +02:00
c67dbb28e4 small fix of fix 2007-05-10 13:49:17 +02:00
b8bccb4ac5 fixed a potential security flaw 2007-05-10 13:47:44 +02:00
b6b2f584ec applied Maarten Maathuis recenter-patch for floating clients only requesting new width and height exceeding the screen space 2007-05-09 11:31:14 +02:00
f7bdb39d9e s/remain/remainder/ 2007-05-09 10:12:55 +02:00
ecd9c3e222 fixing remaining space calculation 2007-05-09 10:11:34 +02:00
216099d072 thanks to Juka to check -Wall ;) 2007-05-08 08:52:34 +02:00
fc2e3eae20 next version is 4.1 2007-05-07 13:14:55 +02:00
f9e7a33019 applied patch of Paul Liu to allow onthefly resizing due to xrandr changes 2007-05-07 13:12:41 +02:00
7c9fa2566f Added tag 4.0 for changeset 018c38468422 2007-04-19 09:26:44 +02:00
11 changed files with 117 additions and 44 deletions

View File

@ -42,3 +42,4 @@ d3876aa792923f9a95f7ad0c7f0134533404df35 3.2.2
baee494346e520f8dee2cee9491b8350064770d2 3.7
2ea201354cf016407ea93e1e390d1422940d29b0 3.8
55478328b2422c700c5404a774c85e77322f41a3 3.9
018c3846842291cb6c009dc087e7fe2f0ef53bea 4.0

View File

@ -27,7 +27,6 @@ config.h:
dwm: ${OBJ}
@echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
@strip $@
clean:
@echo cleaning

View File

@ -152,6 +152,14 @@ focus(Client *c) {
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
void
focustopvisible(void) {
Client *c;
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
void
killclient(const char *arg) {
XEvent ev;
@ -366,21 +374,21 @@ 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 - 1);
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 - 1);
XFreeStringList(list);
}
}
c->name[sizeof c->name - 1] = '\0';
XFree(name.value);
}
void
unmanage(Client *c) {
Client *nc;
XWindowChanges wc;
wc.border_width = c->oldborder;
@ -390,10 +398,8 @@ unmanage(Client *c) {
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
detach(c);
detachstack(c);
if(sel == c) {
for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
focus(nc);
}
if(sel == c)
focustopvisible();
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
free(c->tags);

View File

@ -3,6 +3,7 @@
* See LICENSE file for license details. */
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-pixelcarnage monospace-*-r-*-*-14-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#333"
@ -11,7 +12,6 @@
#define SELBORDERCOLOR "#8c8"
#define SELBGCOLOR "#555"
#define SELFGCOLOR "#fff"
#define TOPBAR True /* False */
/* tagging */
#define TAGS \
@ -47,6 +47,7 @@ static Key key[] = { \
{ MODKEY|ShiftMask, XK_Return, spawn, \
"exec urxvtcd -tr -bg '#222' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \

View File

@ -3,6 +3,7 @@
* See LICENSE file for license details. */
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#dddddd"
@ -11,7 +12,6 @@
#define SELBORDERCOLOR "#ff0000"
#define SELBGCOLOR "#006699"
#define SELFGCOLOR "#ffffff"
#define TOPBAR True /* False */
/* tagging */
#define TAGS \
@ -45,6 +45,7 @@ static Key key[] = { \
{ MODKEY|ShiftMask, XK_Return, spawn, "exec xterm" }, \
{ MODKEY, XK_p, spawn, "exe=`dmenu_path | dmenu` && exec $exe" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \

View File

@ -1,5 +1,5 @@
# dwm version
VERSION = 4.0
VERSION = 4.1
# Customize below to fit your system
@ -16,7 +16,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = ${LIBS}
LDFLAGS = -s ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS}

11
dwm.1
View File

@ -59,6 +59,9 @@ Start
.B Mod1\-Return
Zooms/cycles current window to/from master area (tiled layout only).
.TP
.B Mod1\-b
Shows/hides the status bar.
.TP
.B Mod1\-j
Focus next window.
.TP
@ -146,3 +149,11 @@ 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 .
.P
Recent GTK 2.10.9+ versions contain a broken
.BR Save\-As
file dialog implementation,
which requests to reconfigure its window size in an endless loop. However, its
window is still respondable during this state, so you can simply ignore the flicker
until a new GTK version appears, which will fix this bug, approximately
GTK 2.10.12+ versions.

24
dwm.h
View File

@ -37,10 +37,11 @@
/* mask shorthands, used in event.c and client.c */
#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
enum { BarTop, BarBot, BarOff }; /* bar position */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
typedef struct Client Client;
struct Client {
@ -83,7 +84,7 @@ extern const char *tags[]; /* all tags */
char stext[256]; /* status text */
int screen, sx, sy, sw, sh; /* screen geometry */
int wax, way, wah, waw; /* windowarea geometry */
unsigned int bh, blw; /* bar height, bar layout label width */
unsigned int bh, blw, bpos; /* bar height, bar layout label width, bar position */
unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */
void (*handler[LASTEvent])(XEvent *); /* event handler */
Atom wmatom[WMLast], netatom[NetLast];
@ -100,12 +101,13 @@ void attach(Client *c); /* attaches c to global client list */
void configure(Client *c); /* send synthetic configure event */
void detach(Client *c); /* detaches c from global client list */
void focus(Client *c); /* focus c, c may be NULL */
void killclient(const char *arg); /* kill c nicely */
void focustopvisible(void); /* focus top visible window on stack */
void killclient(const char *arg); /* kill sel nicely */
void manage(Window w, XWindowAttributes *wa); /* manage new client */
void resize(Client *c, int x, int y,
int w, int h, Bool sizehints); /* resize with given coordinates c*/
void togglefloating(const char *arg); /* toggles focused client between floating/tiled state */
void updatesizehints(Client *c); /* update the size hint variables of c */
void togglefloating(const char *arg); /* toggles sel between floating/tiled state */
void updatesizehints(Client *c); /* update the size hint variables of c */
void updatetitle(Client *c); /* update the name of c */
void unmanage(Client *c); /* destroy c */
@ -125,11 +127,13 @@ void incnmaster(const char *arg); /* increments nmaster with arg's index value *
void initlayouts(void); /* initialize layout array */
Client *nexttiled(Client *c); /* returns tiled successor of c */
void restack(void); /* restores z layers of all clients */
void setlayout(const char *arg); /* sets layout, -1 toggles */
void togglemax(const char *arg); /* toggles maximization of floating client */
void setlayout(const char *arg); /* sets layout, -1 toggles */
void togglebar(const char *arg); /* shows/hides the bar */
void togglemax(const char *arg); /* toggles maximization of floating client */
void zoom(const char *arg); /* zooms the focused client to master area, arg is ignored */
/* main.c */
void updatebarpos(void); /* updates the bar position */
void quit(const char *arg); /* quit dwm nicely */
int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
@ -137,8 +141,8 @@ int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
void compileregs(void); /* initialize regexps of rules defined in config.h */
Bool isvisible(Client *c); /* returns True if client is visible */
void settags(Client *c, Client *trans); /* sets tags of c */
void tag(const char *arg); /* tags c with arg's index */
void toggletag(const char *arg); /* toggles c tags with arg's index */
void tag(const char *arg); /* tags sel with arg's index */
void toggletag(const char *arg); /* toggles sel tags with arg's index */
void toggleview(const char *arg); /* toggles the tag with arg's index (in)visible */
void view(const char *arg); /* views the tag with arg's index */

24
event.c
View File

@ -185,6 +185,10 @@ configurerequest(XEvent *e) {
c->w = ev->width;
if(ev->value_mask & CWHeight)
c->h = ev->height;
if((c->x + c->w) > sw && c->isfloating)
c->x = sw / 2 - c->w / 2; /* center in x direction */
if((c->y + c->h) > sh && c->isfloating)
c->y = sh / 2 - c->h / 2; /* center in y direction */
if((ev->value_mask & (CWX | CWY))
&& !(ev->value_mask & (CWWidth | CWHeight)))
configure(c);
@ -207,6 +211,22 @@ configurerequest(XEvent *e) {
XSync(dpy, False);
}
static void
configurenotify(XEvent *e) {
XConfigureEvent *ev = &e->xconfigure;
if (ev->window == root && (ev->width != sw || ev->height != sh)) {
sw = ev->width;
sh = ev->height;
wah = sh - bh;
waw = sw;
XFreePixmap(dpy, dc.drawable);
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
XResizeWindow(dpy, barwin, sw, bh);
lt->arrange();
}
}
static void
destroynotify(XEvent *e) {
Client *c;
@ -227,8 +247,7 @@ enternotify(XEvent *e) {
focus(c);
else if(ev->window == root) {
selscreen = True;
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
focustopvisible();
}
}
@ -333,6 +352,7 @@ unmapnotify(XEvent *e) {
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ConfigureRequest] = configurerequest,
[ConfigureNotify] = configurenotify,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[LeaveNotify] = leavenotify,

View File

@ -15,7 +15,7 @@ static unsigned int nmaster = NMASTER;
static void
tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th, remainder;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
@ -24,6 +24,7 @@ tile(void) {
mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1);
mw = (n > nmaster) ? (waw * masterw) / 1000 : waw;
th = (n > nmaster) ? wah / (n - nmaster) : 0;
remainder = (n > nmaster) ? wah - th * (n - nmaster) : 0;
tw = waw - mw;
for(i = 0, c = clients; c; c = c->next)
@ -47,6 +48,8 @@ tile(void) {
if(th > 2 * c->border) {
ny += (i - nmaster) * th;
nh = th - 2 * c->border;
if (i == n - 1)
nh += remainder;
}
else /* fallback if th <= 2 * c->border */
nh = wah - 2 * c->border;
@ -58,10 +61,8 @@ tile(void) {
c->isbanned = True;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
}
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
if(!sel || !isvisible(sel))
focustopvisible();
restack();
}
@ -85,10 +86,8 @@ floating(void) {
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
}
}
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
if(!sel || !isvisible(sel))
focustopvisible();
restack();
}
@ -217,6 +216,16 @@ setlayout(const char *arg) {
drawstatus();
}
void
togglebar(const char *arg) {
if(bpos == BarOff)
bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
else
bpos = BarOff;
updatebarpos();
lt->arrange();
}
void
togglemax(const char *arg) {
XEvent ev;
@ -238,13 +247,10 @@ togglemax(const char *arg) {
void
zoom(const char *arg) {
unsigned int n;
Client *c;
if(!sel || lt->arrange != tile || sel->isfloating)
return;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;

40
main.c
View File

@ -18,7 +18,7 @@
char stext[256];
int screen, sx, sy, sw, sh, wax, way, waw, wah;
unsigned int bh, ntags, numlockmask;
unsigned int bh, bpos, ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool *seltag;
Bool selscreen = True;
@ -163,9 +163,10 @@ setup(void) {
XFreeModifiermap(modmap);
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask;
| EnterWindowMask | LeaveWindowMask | StructureNotifyMask;
wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
grabkeys();
compileregs();
for(ntags = 0; tags[ntags]; ntags++);
@ -189,17 +190,14 @@ setup(void) {
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ButtonPressMask | ExposureMask;
barwin = XCreateWindow(dpy, root, sx, sy + (TOPBAR ? 0 : sh - bh), sw, bh, 0,
barwin = XCreateWindow(dpy, root, sx, sy, sw, bh, 0,
DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, barwin, cursor[CurNormal]);
bpos = BARPOS;
updatebarpos();
XMapRaised(dpy, barwin);
strcpy(stext, "dwm-"VERSION);
/* windowarea */
wax = sx;
way = sy + (TOPBAR ? bh : 0);
wah = sh - bh;
waw = sw;
/* pixmap for everything */
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
@ -227,6 +225,32 @@ quit(const char *arg) {
readin = running = False;
}
void
updatebarpos(void) {
XEvent ev;
wax = sx;
way = sy;
wah = sh;
waw = sw;
switch(bpos) {
default:
wah -= bh;
way += bh;
XMoveWindow(dpy, barwin, sx, sy);
break;
case BarBot:
wah -= bh;
XMoveWindow(dpy, barwin, sx, sy + wah);
break;
case BarOff:
XMoveWindow(dpy, barwin, sx, sy - bh);
break;
}
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
/* There's no way to check accesses to destroyed windows, thus those cases are
* ignored (especially on UnmapNotify's). Other types of errors call Xlibs
* default error handler, which may call exit.