Xinqi Bao's Git
projects
/
dwm.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
first step to a more flexible dotile() algorithm
[dwm.git]
/
view.c
diff --git
a/view.c
b/view.c
index
5667134
..
90080fb
100644
(file)
--- a/
view.c
+++ b/
view.c
@@
-7,7
+7,7
@@
/* static */
static Client *
/* static */
static Client *
-minclient() {
+minclient(
void
) {
Client *c, *min;
if((clients && clients->isfloat) || arrange == dofloat)
Client *c, *min;
if((clients && clients->isfloat) || arrange == dofloat)
@@
-25,7
+25,7
@@
nexttiled(Client *c) {
}
static void
}
static void
-reorder() {
+reorder(
void
) {
Client *c, *newclients, *tail;
newclients = tail = NULL;
Client *c, *newclients, *tail;
newclients = tail = NULL;
@@
-45,17
+45,18
@@
reorder() {
static void
togglemax(Client *c)
{
static void
togglemax(Client *c)
{
+ XEvent ev;
if((c->ismax = !c->ismax)) {
c->rx = c->x; c->x = sx;
c->ry = c->y; c->y = bh;
if((c->ismax = !c->ismax)) {
c->rx = c->x; c->x = sx;
c->ry = c->y; c->y = bh;
- c->rw = c->w; c->w = sw;
- c->rh = c->h; c->h = sh;
+ c->rw = c->w; c->w = sw
- 2 * BORDERPX
;
+ c->rh = c->h; c->h = sh
- bh - 2 * BORDERPX
;
}
else {
c->x = c->rx;
c->y = c->ry;
}
else {
c->x = c->rx;
c->y = c->ry;
- c->w = c->w;
- c->h = c->h;
+ c->w = c->
r
w;
+ c->h = c->
r
h;
}
resize(c, True, TopLeft);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
resize(c, True, TopLeft);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
@@
-64,6
+65,8
@@
togglemax(Client *c)
/* extern */
void (*arrange)(Arg *) = DEFMODE;
/* extern */
void (*arrange)(Arg *) = DEFMODE;
+Bool isvertical = VERTICALSTACK;
+StackPos stackpos = STACKPOS;
void
detach(Client *c) {
void
detach(Client *c) {
@@
-94,26
+97,39
@@
dofloat(Arg *arg) {
restack();
}
restack();
}
+/* This algorithm is based on a (M)aster area and a (S)tacking area.
+ * It supports following arrangements:
+ * MMMS MMMM SMMM
+ * MMMS MMMM SMMM
+ * MMMS SSSS SMMM
+ */
void
dotile(Arg *arg) {
int h, i, n, w;
Client *c;
void
dotile(Arg *arg) {
int h, i, n, w;
Client *c;
- w = sw - mw;
- for(n = 0, c = clients; c; c = c->next)
- if(isvisible(c)) {
- if(c->isfloat) {
- if(c->ismax)
- togglemax(c);
- }
+ for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
+ n++;
+
+ if(isvertical) {
+ if(stackpos == StackBottom) {
+ w = sw;
+ if(n > 1)
+ h = (sh - bh) / (n - 1);
else
else
-
n++
;
+
h = sh - bh
;
}
}
+ else {
+ w = sw - master;
+ if(n > 1)
+ h = (sh - bh) / (n - 1);
+ else
+ h = sh - bh;
+ }
+ }
+ else { /* horizontal stack */
- if(n > 1)
- h = (sh - bh) / (n - 1);
- else
- h = sh - bh;
+ }
for(i = 0, c = clients; c; c = c->next) {
if(isvisible(c)) {
for(i = 0, c = clients; c; c = c->next) {
if(isvisible(c)) {
@@
-121,32
+137,33
@@
dotile(Arg *arg) {
resize(c, True, TopLeft);
continue;
}
resize(c, True, TopLeft);
continue;
}
+ c->ismax = False;
if(n == 1) {
c->x = sx;
c->y = sy + bh;
if(n == 1) {
c->x = sx;
c->y = sy + bh;
- c->w = sw - 2;
- c->h = sh - 2 - bh;
+ c->w = sw - 2
* BORDERPX
;
+ c->h = sh - 2
* BORDERPX
- bh;
}
else if(i == 0) {
c->x = sx;
c->y = sy + bh;
}
else if(i == 0) {
c->x = sx;
c->y = sy + bh;
- c->w = m
w - 2
;
- c->h = sh - 2 - bh;
+ c->w = m
aster - 2 * BORDERPX
;
+ c->h = sh - 2
* BORDERPX
- bh;
}
else if(h > bh) {
}
else if(h > bh) {
- c->x = sx + m
w
;
+ c->x = sx + m
aster
;
c->y = sy + (i - 1) * h + bh;
c->y = sy + (i - 1) * h + bh;
- c->w = w - 2;
+ c->w = w - 2
* BORDERPX
;
if(i + 1 == n)
if(i + 1 == n)
- c->h = sh - c->y - 2;
+ c->h = sh - c->y - 2
* BORDERPX
;
else
else
- c->h = h - 2;
+ c->h = h - 2
* BORDERPX
;
}
else { /* fallback if h < bh */
}
else { /* fallback if h < bh */
- c->x = sx + m
w
;
+ c->x = sx + m
aster
;
c->y = sy + bh;
c->y = sy + bh;
- c->w = w - 2;
- c->h = sh - 2 - bh;
+ c->w = w - 2
* BORDERPX
;
+ c->h = sh - 2
* BORDERPX
- bh;
}
resize(c, False, TopLeft);
i++;
}
resize(c, False, TopLeft);
i++;
@@
-211,27
+228,27
@@
resizecol(Arg *arg) {
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
- if(!sel || sel->isfloat || n < 2 || (arrange
!= dotile
))
+ if(!sel || sel->isfloat || n < 2 || (arrange
== dofloat
))
return;
if(sel == getnext(clients)) {
return;
if(sel == getnext(clients)) {
- if(m
w + arg->i > sw - 100 || mw
+ arg->i < 100)
+ if(m
aster + arg->i > sw - 100 || master
+ arg->i < 100)
return;
return;
- m
w
+= arg->i;
+ m
aster
+= arg->i;
}
else {
}
else {
- if(m
w - arg->i > sw - 100 || mw
- arg->i < 100)
+ if(m
aster - arg->i > sw - 100 || master
- arg->i < 100)
return;
return;
- m
w
-= arg->i;
+ m
aster
-= arg->i;
}
arrange(NULL);
}
void
}
arrange(NULL);
}
void
-restack() {
+restack(
void
) {
Client *c;
XEvent ev;
Client *c;
XEvent ev;
-
+
if(!sel) {
drawstatus();
return;
if(!sel) {
drawstatus();
return;
@@
-296,7
+313,6
@@
void
zoom(Arg *arg) {
unsigned int n;
Client *c;
zoom(Arg *arg) {
unsigned int n;
Client *c;
- XEvent ev;
if(!sel)
return;
if(!sel)
return;
@@
-309,7
+325,7
@@
zoom(Arg *arg) {
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
- if(n < 2 || (arrange
!= dotile
))
+ if(n < 2 || (arrange
== dofloat
))
return;
if((c = sel) == nexttiled(clients))
return;
if((c = sel) == nexttiled(clients))