wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 827af3ac7bef3c494fb5a92b62bd16e14e6eaf0a
parent bec3694667fd2852d439983d7df71d93075a892b
Author: Kris Maglione <jg@suckless.org>
Date:   Sat, 18 Oct 2008 09:27:34 -0400

Fix some Xinerama-related off-by-ones for area indexes in the FS.

Diffstat:
cmd/wmii/fns.h | 2+-
cmd/wmii/frame.c | 16+++++++---------
cmd/wmii/message.c | 37++++++++++++++-----------------------
3 files changed, 22 insertions(+), 33 deletions(-)

diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h @@ -212,7 +212,7 @@ char* msg_selectarea(Area*, IxpMsg*); char* msg_sendclient(View*, IxpMsg*, bool swap); char* readctl_root(void); char* readctl_view(View*); -Area* strarea(View*, const char*); +Area* strarea(View*, int, const char*); void warning(const char*, ...); /* debug */ void debug(int, const char*, ...); diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -639,7 +639,7 @@ Rectangle constrain(Rectangle r, int inset) { WMScreen **sp; WMScreen *s, *sbest; - Rectangle isect, rbest; + Rectangle isect; Point p; int best, n; @@ -650,9 +650,8 @@ constrain(Rectangle r, int inset) { * D(r) < 2 * isect */ - sbest = nil; - rbest = ZR; /* SET(rbest) */ SET(best); + sbest = nil; for(sp=screens; (s = *sp); sp++) { isect = rect_intersection(r, insetrect(s->r, inset)); if(Dx(isect) >= 0 && Dy(isect) >= 0) @@ -667,12 +666,11 @@ constrain(Rectangle r, int inset) { } } - p = ZP; - rbest = insetrect(sbest->r, inset); - p.x -= min(r.max.x - rbest.min.x, 0); - p.x -= max(r.min.x - rbest.max.x, 0); - p.y -= min(r.max.y - rbest.min.y, 0); - p.y -= max(r.min.y - rbest.max.y, 0); + isect = insetrect(sbest->r, inset); + p.x = min(r.max.x - isect.min.x, 0); + p.x -= max(r.min.x - isect.max.x, 0); + p.y = min(r.max.y - isect.min.y, 0); + p.y -= max(r.min.y - isect.max.y, 0); return rectaddpt(r, p); } diff --git a/cmd/wmii/message.c b/cmd/wmii/message.c @@ -312,7 +312,7 @@ strclient(View *v, char *s) { } Area* -strarea(View *v, const char *s) { +strarea(View *v, int scrn, const char *s) { Area *a; long i; @@ -331,22 +331,21 @@ strarea(View *v, const char *s) { /* FIXME: Very broken! */ if(i > 0) { - for(a = v->firstarea; a; a = a->next) - if(i-- == 0) break; + for(a = v->areas[scrn]; a; a = a->next) + if(i-- == 1) break; } else { - for(a = v->firstarea; a->next; a = a->next) + /* FIXME: Switch to circularly linked list. */ + for(a = v->areas[scrn]; a->next; a = a->next) ; - for(; a != v->firstarea; a = a->prev) + for(; a; a = a->prev) if(++i == 0) break; - if(a == v->firstarea) - a = nil; } return a; } static Frame* -getframe(View *v, IxpMsg *m) { +getframe(View *v, int scrn, IxpMsg *m) { Client *c; Frame *f; Area *a; @@ -361,7 +360,7 @@ getframe(View *v, IxpMsg *m) { return client_viewframe(c, v); } - a = strarea(v, s); + a = strarea(v, scrn, s); if(a == nil) { fprint(2, "a == nil\n"); return nil; @@ -603,7 +602,7 @@ message_view(View *v, IxpMsg *m) { switch(getsym(s)) { case LCOLMODE: s = msg_getword(m); - a = strarea(v, s); + a = strarea(v, screen->idx, s); if(a == nil) /* || a->floating) */ return Ebadvalue; @@ -711,7 +710,7 @@ msg_grow(View *v, IxpMsg *m) { Point amount; int dir; - f = getframe(v, m); + f = getframe(v, screen->idx, m); if(f == nil) return "bad frame"; c = f->client; @@ -757,7 +756,7 @@ msg_nudge(View *v, IxpMsg *m) { Point amount; int dir; - f = getframe(v, m); + f = getframe(v, screen->idx, m); if(f == nil) return "bad frame"; @@ -870,17 +869,9 @@ msg_selectarea(Area *a, IxpMsg *m) { ap = v->floating; break; default: - if(!strcmp(s, "sel")) - ap = v->sel; - else { - if(!getulong(s, &i) || i == 0) - return Ebadvalue; - /* XXX: Multihead. */ - for(ap=v->firstarea; ap; ap=ap->next) - if(--i == 0) break; - if(i != 0) - return Ebadvalue; - } + ap = strarea(v, a->screen, s); + if(!ap || ap->floating) + return Ebadvalue; if((s = msg_getword(m))) { if(!getulong(s, &i)) return Ebadvalue;