Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.