tremoved ugly ban(), extended resize() that it only resets the size if necessar… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 6e22ccf7b1602b33624692eefd51b6398ffa5454 | |
parent 8a5f002c4182abf6dcaac354a3da04cc18830ad9 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Fri, 16 Feb 2007 16:38:40 +0100 | |
removed ugly ban(), extended resize() that it only resets the size if necessary… | |
Diffstat: | |
M client.c | 81 +++++++++++++++++------------… | |
M dwm.h | 4 ++-- | |
M event.c | 42 +++++++++++++++--------------… | |
M main.c | 3 ++- | |
M view.c | 63 ++++++++++++++++-------------… | |
5 files changed, 100 insertions(+), 93 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -158,6 +158,7 @@ void | |
manage(Window w, XWindowAttributes *wa) { | |
Client *c, *t; | |
Window trans; | |
+ XWindowChanges wc; | |
c = emallocz(sizeof(Client)); | |
c->tags = emallocz(ntags * sizeof(Bool)); | |
t@@ -187,7 +188,10 @@ manage(Window w, XWindowAttributes *wa) { | |
StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | |
XGetTransientForHint(dpy, c->win, &trans); | |
grabbuttons(c, False); | |
+ wc.border_width = c->border; | |
+ XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); | |
XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); | |
+ configure(c); /* propagates border_width, if size doesn't change */ | |
updatetitle(c); | |
t = getclient(trans); | |
settags(c, t); | |
t@@ -198,7 +202,8 @@ manage(Window w, XWindowAttributes *wa) { | |
c->next = clients; | |
c->snext = stack; | |
stack = clients = c; | |
- ban(c); | |
+ c->isbanned = True; | |
+ XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
XMapWindow(dpy, c->win); | |
setclientstate(c, NormalState); | |
if(isvisible(c)) | |
t@@ -207,25 +212,25 @@ manage(Window w, XWindowAttributes *wa) { | |
} | |
void | |
-resize(Client *c, Bool sizehints) { | |
+resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | |
float actual, dx, dy, max, min; | |
XWindowChanges wc; | |
- if(c->w <= 0 || c->h <= 0) | |
+ if(w <= 0 || h <= 0) | |
return; | |
if(sizehints) { | |
- if(c->minw && c->w < c->minw) | |
- c->w = c->minw; | |
- if(c->minh && c->h < c->minh) | |
- c->h = c->minh; | |
- if(c->maxw && c->w > c->maxw) | |
- c->w = c->maxw; | |
- if(c->maxh && c->h > c->maxh) | |
- c->h = c->maxh; | |
+ if(c->minw && w < c->minw) | |
+ w = c->minw; | |
+ if(c->minh && h < c->minh) | |
+ h = c->minh; | |
+ if(c->maxw && w > c->maxw) | |
+ w = c->maxw; | |
+ if(c->maxh && h > c->maxh) | |
+ h = c->maxh; | |
/* inspired by algorithm from fluxbox */ | |
- if(c->minay > 0 && c->maxay && (c->h - c->baseh) > 0) { | |
- dx = (float)(c->w - c->basew); | |
- dy = (float)(c->h - c->baseh); | |
+ if(c->minay > 0 && c->maxay && (h - c->baseh) > 0) { | |
+ dx = (float)(w - c->basew); | |
+ dy = (float)(h - c->baseh); | |
min = (float)(c->minax) / (float)(c->minay); | |
max = (float)(c->maxax) / (float)(c->maxay); | |
actual = dx / dy; | |
t@@ -233,43 +238,45 @@ resize(Client *c, Bool sizehints) { | |
if(actual < min) { | |
dy = (dx * min + dy) / (min * min + 1); | |
dx = dy * min; | |
- c->w = (int)dx + c->basew; | |
- c->h = (int)dy + c->baseh; | |
+ w = (int)dx + c->basew; | |
+ h = (int)dy + c->baseh; | |
} | |
else if(actual > max) { | |
dy = (dx * min + dy) / (max * max + 1); | |
dx = dy * min; | |
- c->w = (int)dx + c->basew; | |
- c->h = (int)dy + c->baseh; | |
+ w = (int)dx + c->basew; | |
+ h = (int)dy + c->baseh; | |
} | |
} | |
} | |
if(c->incw) | |
- c->w -= (c->w - c->basew) % c->incw; | |
+ w -= (w - c->basew) % c->incw; | |
if(c->inch) | |
- c->h -= (c->h - c->baseh) % c->inch; | |
+ h -= (h - c->baseh) % c->inch; | |
} | |
- if(c->w == sw && c->h == sh) | |
+ if(w == sw && h == sh) | |
c->border = 0; | |
else | |
c->border = BORDERPX; | |
/* offscreen appearance fixes */ | |
- if(c->x > sw) | |
- c->x = sw - c->w - 2 * c->border; | |
- if(c->y > sh) | |
- c->y = sh - c->h - 2 * c->border; | |
- if(c->x + c->w + 2 * c->border < sx) | |
- c->x = sx; | |
- if(c->y + c->h + 2 * c->border < sy) | |
- c->y = sy; | |
- wc.x = c->x; | |
- wc.y = c->y; | |
- wc.width = c->w; | |
- wc.height = c->h; | |
- wc.border_width = c->border; | |
- XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorde… | |
- configure(c); | |
- XSync(dpy, False); | |
+ if(x > sw) | |
+ x = sw - w - 2 * c->border; | |
+ if(y > sh) | |
+ y = sh - h - 2 * c->border; | |
+ if(x + w + 2 * c->border < sx) | |
+ x = sx; | |
+ if(y + h + 2 * c->border < 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; | |
+ wc.border_width = c->border; | |
+ XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight |… | |
+ configure(c); | |
+ XSync(dpy, False); | |
+ } | |
} | |
void | |
diff --git a/dwm.h b/dwm.h | |
t@@ -99,14 +99,14 @@ extern Display *dpy; | |
extern Window root, barwin; | |
/* client.c */ | |
-extern void ban(Client *c); /* ban c */ | |
extern void configure(Client *c); /* send synthetic configure e… | |
extern void focus(Client *c); /* focus c, c may be NULL… | |
extern Client *getclient(Window w); /* return client of w */ | |
extern Bool isprotodel(Client *c); /* returns True if c->win su… | |
extern void killclient(Arg *arg); /* kill c nicely */ | |
extern void manage(Window w, XWindowAttributes *wa); /* manage new clie… | |
-extern void resize(Client *c, Bool sizehints); /* resize c*/ | |
+extern void resize(Client *c, int x, int y, | |
+ int w, int h, Bool sizehints); /* resize c*/ | |
extern void updatesizehints(Client *c); /* update the size hint… | |
extern void updatetitle(Client *c); /* update the name of c */ | |
extern void unmanage(Client *c); /* destroy c */ | |
diff --git a/event.c b/event.c | |
t@@ -22,13 +22,13 @@ KEYS | |
static void | |
movemouse(Client *c) { | |
- int x1, y1, ocx, ocy, di; | |
+ int x1, y1, ocx, ocy, di, nx, ny; | |
unsigned int dui; | |
Window dummy; | |
XEvent ev; | |
- ocx = c->x; | |
- ocy = c->y; | |
+ ocx = nx = c->x; | |
+ ocy = ny = c->y; | |
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAs… | |
None, cursor[CurMove], CurrentTime) != GrabSuccess) | |
return; | |
t@@ -38,7 +38,6 @@ movemouse(Client *c) { | |
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirec… | |
switch (ev.type) { | |
case ButtonRelease: | |
- resize(c, True); | |
XUngrabPointer(dpy, CurrentTime); | |
return; | |
case ConfigureRequest: | |
t@@ -48,17 +47,17 @@ movemouse(Client *c) { | |
break; | |
case MotionNotify: | |
XSync(dpy, False); | |
- c->x = ocx + (ev.xmotion.x - x1); | |
- c->y = ocy + (ev.xmotion.y - y1); | |
- if(abs(wax + c->x) < SNAP) | |
- c->x = wax; | |
- else if(abs((wax + waw) - (c->x + c->w + 2 * c->border… | |
- c->x = wax + waw - c->w - 2 * c->border; | |
- if(abs(way - c->y) < SNAP) | |
- c->y = way; | |
- else if(abs((way + wah) - (c->y + c->h + 2 * c->border… | |
- c->y = way + wah - c->h - 2 * c->border; | |
- resize(c, False); | |
+ nx = ocx + (ev.xmotion.x - x1); | |
+ ny = ocy + (ev.xmotion.y - y1); | |
+ if(abs(wax + nx) < SNAP) | |
+ nx = wax; | |
+ else if(abs((wax + waw) - (nx + c->w + 2 * c->border))… | |
+ nx = wax + waw - c->w - 2 * c->border; | |
+ if(abs(way - ny) < SNAP) | |
+ ny = way; | |
+ else if(abs((way + wah) - (ny + c->h + 2 * c->border))… | |
+ ny = way + wah - c->h - 2 * c->border; | |
+ resize(c, nx, ny, c->w, c->h, False); | |
break; | |
} | |
} | |
t@@ -81,7 +80,6 @@ resizemouse(Client *c) { | |
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirec… | |
switch(ev.type) { | |
case ButtonRelease: | |
- resize(c, True); | |
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, | |
c->w + c->border - 1, c->h + c->border… | |
XUngrabPointer(dpy, CurrentTime); | |
t@@ -94,11 +92,11 @@ resizemouse(Client *c) { | |
break; | |
case MotionNotify: | |
XSync(dpy, False); | |
- nw = ev.xmotion.x - ocx - 2 * c->border + 1; | |
- c->w = nw > 0 ? nw : 1; | |
- nh = ev.xmotion.y - ocy - 2 * c->border + 1; | |
- c->h = nh > 0 ? nh : 1; | |
- resize(c, True); | |
+ if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0) | |
+ nw = 1; | |
+ if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0) | |
+ nh = 1; | |
+ resize(c, c->x, c->y, nw, nh, True); | |
break; | |
} | |
} | |
t@@ -187,7 +185,7 @@ configurerequest(XEvent *e) { | |
if((ev->value_mask & (CWX | CWY)) | |
&& !(ev->value_mask & (CWWidth | CWHeight))) | |
configure(c); | |
- resize(c, False); | |
+ resize(c, c->x, c->y, c->w, c->h, False); | |
if(!isvisible(c)) | |
ban(c); | |
} | |
diff --git a/main.c b/main.c | |
t@@ -41,7 +41,8 @@ static void | |
cleanup(void) { | |
close(STDIN_FILENO); | |
while(stack) { | |
- resize(stack, True); | |
+ if(stack->isbanned) | |
+ XMoveWindow(dpy, stack->win, stack->x, stack->y); | |
unmanage(stack); | |
} | |
if(dc.font.set) | |
diff --git a/view.c b/view.c | |
t@@ -20,18 +20,14 @@ togglemax(Client *c) { | |
return; | |
if((c->ismax = !c->ismax)) { | |
- c->rx = c->x; c->x = wax; | |
- c->ry = c->y; c->y = way; | |
- c->rw = c->w; c->w = waw - 2 * BORDERPX; | |
- c->rh = c->h; c->h = wah - 2 * BORDERPX; | |
+ c->rx = c->x; | |
+ c->ry = c->y; | |
+ c->rw = c->w; | |
+ c->rh = c->h; | |
+ resize(c, wax, way, waw - 2 * BORDERPX, wah - 2 * BORDERPX, Tr… | |
} | |
- else { | |
- c->x = c->rx; | |
- c->y = c->ry; | |
- c->w = c->rw; | |
- c->h = c->rh; | |
- } | |
- resize(c, True); | |
+ else | |
+ resize(c, c->rx, c->ry, c->rw, c->rh, True); | |
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
} | |
t@@ -56,11 +52,14 @@ dofloat(void) { | |
for(c = clients; c; c = c->next) { | |
if(isvisible(c)) { | |
+ if(c->isbanned) | |
+ XMoveWindow(dpy, c->win, c->x, c->y); | |
c->isbanned = False; | |
- resize(c, True); | |
} | |
- else | |
- ban(c); | |
+ else { | |
+ 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); | |
t@@ -71,7 +70,7 @@ dofloat(void) { | |
void | |
dotile(void) { | |
- unsigned int i, n, mw, mh, tw, th; | |
+ unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th; | |
Client *c; | |
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | |
t@@ -84,34 +83,36 @@ dotile(void) { | |
for(i = 0, c = clients; c; c = c->next) | |
if(isvisible(c)) { | |
+ if(c->isbanned) | |
+ XMoveWindow(dpy, c->win, c->x, c->y); | |
c->isbanned = False; | |
- if(c->isfloat) { | |
- resize(c, True); | |
+ if(c->isfloat) | |
continue; | |
- } | |
c->ismax = False; | |
- c->x = wax; | |
- c->y = way; | |
+ nx = wax; | |
+ ny = way; | |
if(i < nmaster) { | |
- c->y += i * mh; | |
- c->w = mw - 2 * BORDERPX; | |
- c->h = mh - 2 * BORDERPX; | |
+ ny += i * mh; | |
+ nw = mw - 2 * BORDERPX; | |
+ nh = mh - 2 * BORDERPX; | |
} | |
else { /* tile window */ | |
- c->x += mw; | |
- c->w = tw - 2 * BORDERPX; | |
+ nx += mw; | |
+ nw = tw - 2 * BORDERPX; | |
if(th > 2 * BORDERPX) { | |
- c->y += (i - nmaster) * th; | |
- c->h = th - 2 * BORDERPX; | |
+ ny += (i - nmaster) * th; | |
+ nh = th - 2 * BORDERPX; | |
} | |
else /* fallback if th <= 2 * BORDERPX */ | |
- c->h = wah - 2 * BORDERPX; | |
+ nh = wah - 2 * BORDERPX; | |
} | |
- resize(c, False); | |
+ resize(c, nx, ny, nw, nh, False); | |
i++; | |
} | |
- else | |
- ban(c); | |
+ else { | |
+ 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); |