Xinqi Bao's Git
projects
/
dwm.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
setlayout and setgeom are now togglable again
[dwm.git]
/
dwm.c
diff --git
a/dwm.c
b/dwm.c
index
f83e800
..
e1c8c20
100644
(file)
--- a/
dwm.c
+++ b/
dwm.c
@@
-69,7
+69,7
@@
struct Client {
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int minax, maxax, minay, maxay;
long flags;
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int minax, maxax, minay, maxay;
long flags;
- unsigned int b
order, oldborder
;
+ unsigned int b
w, oldbw
;
Bool isbanned, isfixed, isfloating, isurgent;
Bool *tags;
Client *next;
Bool isbanned, isfixed, isfloating, isurgent;
Bool *tags;
Client *next;
@@
-210,7
+210,7
@@
void zoom(const char *arg);
char stext[256], buf[256];
int screen, sx, sy, sw, sh;
int (*xerrorxlib)(Display *, XErrorEvent *);
char stext[256], buf[256];
int screen, sx, sy, sw, sh;
int (*xerrorxlib)(Display *, XErrorEvent *);
-int bx, by, bw, bh, blw, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh;
+int bx, by, bw, bh, blw,
bgw,
mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh;
unsigned int numlockmask = 0;
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
unsigned int numlockmask = 0;
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
@@
-259,7
+259,7
@@
applyrules(Client *c) {
XGetClassHint(dpy, c->win, &ch);
for(i = 0; i < LENGTH(rules); i++) {
r = &rules[i];
XGetClassHint(dpy, c->win, &ch);
for(i = 0; i < LENGTH(rules); i++) {
r = &rules[i];
- if(
strstr(c->name, r->title
)
+ if(
(r->title && strstr(c->name, r->title)
)
|| (ch.res_class && r->class && strstr(ch.res_class, r->class))
|| (ch.res_name && r->instance && strstr(ch.res_name, r->instance)))
{
|| (ch.res_class && r->class && strstr(ch.res_class, r->class))
|| (ch.res_name && r->instance && strstr(ch.res_name, r->instance)))
{
@@
-322,10
+322,14
@@
buttonpress(XEvent *e) {
XButtonPressedEvent *ev = &e->xbutton;
if(ev->window == barwin) {
XButtonPressedEvent *ev = &e->xbutton;
if(ev->window == barwin) {
- x = 0;
+ if((ev->x < bgw) && ev->button == Button1) {
+ setgeom(NULL);
+ return;
+ }
+ x = bgw;
for(i = 0; i < LENGTH(tags); i++) {
x += textw(tags[i]);
for(i = 0; i < LENGTH(tags); i++) {
x += textw(tags[i]);
- if(ev->x < x) {
+ if(ev->x
> bgw && ev->x
< x) {
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(tags[i]);
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(tags[i]);
@@
-341,6
+345,8
@@
buttonpress(XEvent *e) {
return;
}
}
return;
}
}
+ if((ev->x < x + blw) && ev->button == Button1)
+ setlayout(NULL);
}
else if((c = getclient(ev->window))) {
focus(c);
}
else if((c = getclient(ev->window))) {
focus(c);
@@
-413,7
+419,7
@@
configure(Client *c) {
ce.y = c->y;
ce.width = c->w;
ce.height = c->h;
ce.y = c->y;
ce.width = c->w;
ce.height = c->h;
- ce.border_width = c->b
order
;
+ ce.border_width = c->b
w
;
ce.above = None;
ce.override_redirect = False;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
ce.above = None;
ce.override_redirect = False;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
@@
-423,8
+429,11
@@
void
configurenotify(XEvent *e) {
XConfigureEvent *ev = &e->xconfigure;
configurenotify(XEvent *e) {
XConfigureEvent *ev = &e->xconfigure;
- if(ev->window == root && (ev->width != sw || ev->height != sh))
- setgeom(NULL);
+ if(ev->window == root && (ev->width != sw || ev->height != sh)) {
+ sw = ev->width;
+ sh = ev->height;
+ setgeom(geom->symbol);
+ }
}
void
}
void
@@
-435,7
+444,7
@@
configurerequest(XEvent *e) {
if((c = getclient(ev->window))) {
if(ev->value_mask & CWBorderWidth)
if((c = getclient(ev->window))) {
if(ev->value_mask & CWBorderWidth)
- c->b
order
= ev->border_width;
+ c->b
w
= ev->border_width;
if(c->isfixed || c->isfloating || lt->isfloating) {
if(ev->value_mask & CWX)
c->x = sx + ev->x;
if(c->isfixed || c->isfloating || lt->isfloating) {
if(ev->value_mask & CWX)
c->x = sx + ev->x;
@@
-514,6
+523,11
@@
drawbar(void) {
Client *c;
dc.x = 0;
Client *c;
dc.x = 0;
+ if(bgw > 0) {
+ dc.w = bgw;
+ drawtext(geom->symbol, dc.norm, False);
+ dc.x += bgw;
+ }
for(c = stack; c && !isvisible(c); c = c->snext);
for(i = 0; i < LENGTH(tags); i++) {
dc.w = textw(tags[i]);
for(c = stack; c && !isvisible(c); c = c->snext);
for(i = 0; i < LENGTH(tags); i++) {
dc.w = textw(tags[i]);
@@
-527,9
+541,13
@@
drawbar(void) {
}
dc.x += dc.w;
}
}
dc.x += dc.w;
}
- dc.w = blw;
- drawtext(lt->symbol, dc.norm, False);
- x = dc.x + dc.w;
+ if(blw > 0) {
+ dc.w = blw;
+ drawtext(lt->symbol, dc.norm, False);
+ x = dc.x + dc.w;
+ }
+ else
+ x = dc.x;
dc.w = textw(stext);
dc.x = bw - dc.w;
if(dc.x < x) {
dc.w = textw(stext);
dc.x = bw - dc.w;
if(dc.x < x) {
@@
-854,7
+872,7
@@
unsigned int
idxoftag(const char *t) {
unsigned int i;
idxoftag(const char *t) {
unsigned int i;
- for(i = 0; (i < LENGTH(tags)) &&
(tags[i] !=
t); i++);
+ for(i = 0; (i < LENGTH(tags)) &&
t && strcmp(tags[i],
t); i++);
return (i < LENGTH(tags)) ? i : 0;
}
return (i < LENGTH(tags)) ? i : 0;
}
@@
-997,25
+1015,25
@@
manage(Window w, XWindowAttributes *wa) {
c->y = wa->y;
c->w = wa->width;
c->h = wa->height;
c->y = wa->y;
c->w = wa->width;
c->h = wa->height;
- c->oldb
order
= wa->border_width;
+ c->oldb
w
= wa->border_width;
if(c->w == sw && c->h == sh) {
c->x = sx;
c->y = sy;
if(c->w == sw && c->h == sh) {
c->x = sx;
c->y = sy;
- c->b
order
= wa->border_width;
+ c->b
w
= wa->border_width;
}
else {
}
else {
- if(c->x + c->w + 2 * c->b
order
> wx + ww)
- c->x = wx + ww - c->w - 2 * c->b
order
;
- if(c->y + c->h + 2 * c->b
order
> wy + wh)
- c->y = wy + wh - c->h - 2 * c->b
order
;
+ if(c->x + c->w + 2 * c->b
w
> wx + ww)
+ c->x = wx + ww - c->w - 2 * c->b
w
;
+ if(c->y + c->h + 2 * c->b
w
> wy + wh)
+ c->y = wy + wh - c->h - 2 * c->b
w
;
if(c->x < wx)
c->x = wx;
if(c->y < wy)
c->y = wy;
if(c->x < wx)
c->x = wx;
if(c->y < wy)
c->y = wy;
- c->b
order
= BORDERPX;
+ c->b
w
= BORDERPX;
}
}
- wc.border_width = c->b
order
;
+ wc.border_width = c->b
w
;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
@@
-1068,7
+1086,7
@@
monocle(void) {
for(c = clients; c; c = c->next)
if(isvisible(c))
for(c = clients; c; c = c->next)
if(isvisible(c))
- resize(c, mox, moy, mow
, moh
, RESIZEHINTS);
+ resize(c, mox, moy, mow
- 2 * c->bw, moh - 2 * c->bw
, RESIZEHINTS);
}
void
}
void
@@
-1101,12
+1119,12
@@
movemouse(Client *c) {
ny = ocy + (ev.xmotion.y - y1);
if(abs(wx - nx) < SNAP)
nx = wx;
ny = ocy + (ev.xmotion.y - y1);
if(abs(wx - nx) < SNAP)
nx = wx;
- else if(abs((wx + ww) - (nx + c->w + 2 * c->b
order
)) < SNAP)
- nx = wx + ww - c->w - 2 * c->b
order
;
+ else if(abs((wx + ww) - (nx + c->w + 2 * c->b
w
)) < SNAP)
+ nx = wx + ww - c->w - 2 * c->b
w
;
if(abs(wy - ny) < SNAP)
ny = wy;
if(abs(wy - ny) < SNAP)
ny = wy;
- else if(abs((wy + wh) - (ny + c->h + 2 * c->b
order
)) < SNAP)
- ny = wy + wh - c->h - 2 * c->b
order
;
+ else if(abs((wy + wh) - (ny + c->h + 2 * c->b
w
)) < SNAP)
+ ny = wy + wh - c->h - 2 * c->b
w
;
if(!c->isfloating && !lt->isfloating && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
togglefloating(NULL);
if((lt->isfloating) || c->isfloating)
if(!c->isfloating && !lt->isfloating && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
togglefloating(NULL);
if((lt->isfloating) || c->isfloating)
@@
-1216,19
+1234,19
@@
resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
if(w <= 0 || h <= 0)
return;
if(x > sx + sw)
if(w <= 0 || h <= 0)
return;
if(x > sx + sw)
- x = sw - w - 2 * c->b
order
;
+ x = sw - w - 2 * c->b
w
;
if(y > sy + sh)
if(y > sy + sh)
- y = sh - h - 2 * c->b
order
;
- if(x + w + 2 * c->b
order
< sx)
+ y = sh - h - 2 * c->b
w
;
+ if(x + w + 2 * c->b
w
< sx)
x = sx;
x = sx;
- if(y + h + 2 * c->b
order
< sy)
+ if(y + h + 2 * c->b
w
< sy)
y = sy;
if(c->x != x || c->y != y || c->w != w || c->h != h) {
c->x = wc.x = x;
c->y = wc.y = y;
c->w = wc.width = w;
c->h = wc.height = h;
y = sy;
if(c->x != x || c->y != y || c->w != w || c->h != h) {
c->x = wc.x = x;
c->y = wc.y = y;
c->w = wc.width = w;
c->h = wc.height = h;
- wc.border_width = c->b
order
;
+ wc.border_width = c->b
w
;
XConfigureWindow(dpy, c->win,
CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
configure(c);
XConfigureWindow(dpy, c->win,
CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
configure(c);
@@
-1247,13
+1265,13
@@
resizemouse(Client *c) {
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->b
order - 1, c->h + c->border
- 1);
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->b
w - 1, c->h + c->bw
- 1);
for(;;) {
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask , &ev);
switch(ev.type) {
case ButtonRelease:
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
for(;;) {
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask , &ev);
switch(ev.type) {
case ButtonRelease:
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
- c->w + c->b
order - 1, c->h + c->border
- 1);
+ c->w + c->b
w - 1, c->h + c->bw
- 1);
XUngrabPointer(dpy, CurrentTime);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
return;
XUngrabPointer(dpy, CurrentTime);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
return;
@@
-1264,9
+1282,9
@@
resizemouse(Client *c) {
break;
case MotionNotify:
XSync(dpy, False);
break;
case MotionNotify:
XSync(dpy, False);
- if((nw = ev.xmotion.x - ocx - 2 * c->b
order
+ 1) <= 0)
+ if((nw = ev.xmotion.x - ocx - 2 * c->b
w
+ 1) <= 0)
nw = 1;
nw = 1;
- if((nh = ev.xmotion.y - ocy - 2 * c->b
order
+ 1) <= 0)
+ if((nh = ev.xmotion.y - ocy - 2 * c->b
w
+ 1) <= 0)
nh = 1;
if(!c->isfloating && !lt->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
togglefloating(NULL);
nh = 1;
if(!c->isfloating && !lt->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
togglefloating(NULL);
@@
-1405,12
+1423,18
@@
void
setgeom(const char *arg) {
unsigned int i;
setgeom(const char *arg) {
unsigned int i;
- for(i = 0; arg && i < LENGTH(geoms); i++)
- if(!strcmp(geoms[i].symbol, arg))
- break;
- if(i == LENGTH(geoms))
- return;
- geom = &geoms[i];
+ if(!arg) {
+ if(++geom == &geoms[LENGTH(geoms)])
+ geom = &geoms[0];
+ }
+ else {
+ for(i = 0; i < LENGTH(geoms); i++)
+ if(!strcmp(geoms[i].symbol, arg))
+ break;
+ if(i == LENGTH(geoms))
+ return;
+ geom = &geoms[i];
+ }
geom->apply();
updatebarpos();
arrange();
geom->apply();
updatebarpos();
arrange();
@@
-1418,20
+1442,18
@@
setgeom(const char *arg) {
void
setlayout(const char *arg) {
void
setlayout(const char *arg) {
- static Layout *revert = 0;
unsigned int i;
unsigned int i;
- if(!arg)
- return;
- for(i = 0; i < LENGTH(layouts); i++)
- if(!strcmp(arg, layouts[i].symbol))
- break;
- if(i == LENGTH(layouts))
- return;
- if(revert && &layouts[i] == lt)
- lt = revert;
+ if(!arg) {
+ if(++lt == &layouts[LENGTH(layouts)])
+ lt = &layouts[0];
+ }
else {
else {
- revert = lt;
+ for(i = 0; i < LENGTH(layouts); i++)
+ if(!strcmp(arg, layouts[i].symbol))
+ break;
+ if(i == LENGTH(layouts))
+ return;
lt = &layouts[i];
}
if(sel)
lt = &layouts[i];
}
if(sel)
@@
-1442,7
+1464,7
@@
setlayout(const char *arg) {
void
setup(void) {
void
setup(void) {
- unsigned int i;
+ unsigned int i
, w
;
XSetWindowAttributes wa;
/* init screen */
XSetWindowAttributes wa;
/* init screen */
@@
-1496,10
+1518,15
@@
setup(void) {
lt = &layouts[0];
/* init bar */
lt = &layouts[0];
/* init bar */
- for(blw = i = 0; i < LENGTH(layouts); i++) {
- i = textw(layouts[i].symbol);
- if(i > blw)
- blw = i;
+ for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
+ w = textw(layouts[i].symbol);
+ if(w > blw)
+ blw = w;
+ }
+ for(bgw = i = 0; LENGTH(geoms) > 1 && i < LENGTH(geoms); i++) {
+ w = textw(geoms[i].symbol);
+ if(w > bgw)
+ bgw = w;
}
wa.override_redirect = 1;
}
wa.override_redirect = 1;
@@
-1600,11
+1627,11
@@
tileh(void) {
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
- tileresize(c, x, ty, (tx + tw) - x - 2 * c->b
order, th - 2 * c->border
);
+ tileresize(c, x, ty, (tx + tw) - x - 2 * c->b
w, th - 2 * c->bw
);
else
else
- tileresize(c, x, ty, w - 2 * c->b
order, th - 2 * c->border
);
+ tileresize(c, x, ty, w - 2 * c->b
w, th - 2 * c->bw
);
if(w != tw)
if(w != tw)
- x = c->x + c->w + 2 * c->b
order
;
+ x = c->x + c->w + 2 * c->b
w
;
}
}
}
}
@@
-1613,9
+1640,9
@@
tilemaster(unsigned int n) {
Client *c = nexttiled(clients);
if(n == 1)
Client *c = nexttiled(clients);
if(n == 1)
- tileresize(c, mox, moy, mow - 2 * c->b
order, moh - 2 * c->border
);
+ tileresize(c, mox, moy, mow - 2 * c->b
w, moh - 2 * c->bw
);
else
else
- tileresize(c, mx, my, mw - 2 * c->b
order, mh - 2 * c->border
);
+ tileresize(c, mx, my, mw - 2 * c->b
w, mh - 2 * c->bw
);
return c;
}
return c;
}
@@
-1646,11
+1673,11
@@
tilev(void) {
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
- tileresize(c, tx, y, tw - 2 * c->b
order, (ty + th) - y - 2 * c->border
);
+ tileresize(c, tx, y, tw - 2 * c->b
w, (ty + th) - y - 2 * c->bw
);
else
else
- tileresize(c, tx, y, tw - 2 * c->b
order, h - 2 * c->border
);
+ tileresize(c, tx, y, tw - 2 * c->b
w, h - 2 * c->bw
);
if(h != th)
if(h != th)
- y = c->y + c->h + 2 * c->b
order
;
+ y = c->y + c->h + 2 * c->b
w
;
}
}
}
}
@@
-1702,7
+1729,7
@@
void
unmanage(Client *c) {
XWindowChanges wc;
unmanage(Client *c) {
XWindowChanges wc;
- wc.border_width = c->oldb
order
;
+ wc.border_width = c->oldb
w
;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);