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

This commit is contained in:
Kris Maglione 2008-10-18 09:27:34 -04:00
parent bec3694667
commit 827af3ac7b
3 changed files with 22 additions and 33 deletions

View File

@ -212,7 +212,7 @@ char* msg_selectarea(Area*, IxpMsg*);
char* msg_sendclient(View*, IxpMsg*, bool swap); char* msg_sendclient(View*, IxpMsg*, bool swap);
char* readctl_root(void); char* readctl_root(void);
char* readctl_view(View*); char* readctl_view(View*);
Area* strarea(View*, const char*); Area* strarea(View*, int, const char*);
void warning(const char*, ...); void warning(const char*, ...);
/* debug */ /* debug */
void debug(int, const char*, ...); void debug(int, const char*, ...);

View File

@ -639,7 +639,7 @@ Rectangle
constrain(Rectangle r, int inset) { constrain(Rectangle r, int inset) {
WMScreen **sp; WMScreen **sp;
WMScreen *s, *sbest; WMScreen *s, *sbest;
Rectangle isect, rbest; Rectangle isect;
Point p; Point p;
int best, n; int best, n;
@ -650,9 +650,8 @@ constrain(Rectangle r, int inset) {
* D(r) < 2 * isect * D(r) < 2 * isect
*/ */
sbest = nil;
rbest = ZR; /* SET(rbest) */
SET(best); SET(best);
sbest = nil;
for(sp=screens; (s = *sp); sp++) { for(sp=screens; (s = *sp); sp++) {
isect = rect_intersection(r, insetrect(s->r, inset)); isect = rect_intersection(r, insetrect(s->r, inset));
if(Dx(isect) >= 0 && Dy(isect) >= 0) if(Dx(isect) >= 0 && Dy(isect) >= 0)
@ -667,12 +666,11 @@ constrain(Rectangle r, int inset) {
} }
} }
p = ZP; isect = insetrect(sbest->r, inset);
rbest = insetrect(sbest->r, inset); p.x = min(r.max.x - isect.min.x, 0);
p.x -= min(r.max.x - rbest.min.x, 0); p.x -= max(r.min.x - isect.max.x, 0);
p.x -= max(r.min.x - rbest.max.x, 0); p.y = min(r.max.y - isect.min.y, 0);
p.y -= min(r.max.y - rbest.min.y, 0); p.y -= max(r.min.y - isect.max.y, 0);
p.y -= max(r.min.y - rbest.max.y, 0);
return rectaddpt(r, p); return rectaddpt(r, p);
} }

View File

@ -312,7 +312,7 @@ strclient(View *v, char *s) {
} }
Area* Area*
strarea(View *v, const char *s) { strarea(View *v, int scrn, const char *s) {
Area *a; Area *a;
long i; long i;
@ -331,22 +331,21 @@ strarea(View *v, const char *s) {
/* FIXME: Very broken! */ /* FIXME: Very broken! */
if(i > 0) { if(i > 0) {
for(a = v->firstarea; a; a = a->next) for(a = v->areas[scrn]; a; a = a->next)
if(i-- == 0) break; if(i-- == 1) break;
} }
else { 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(++i == 0) break;
if(a == v->firstarea)
a = nil;
} }
return a; return a;
} }
static Frame* static Frame*
getframe(View *v, IxpMsg *m) { getframe(View *v, int scrn, IxpMsg *m) {
Client *c; Client *c;
Frame *f; Frame *f;
Area *a; Area *a;
@ -361,7 +360,7 @@ getframe(View *v, IxpMsg *m) {
return client_viewframe(c, v); return client_viewframe(c, v);
} }
a = strarea(v, s); a = strarea(v, scrn, s);
if(a == nil) { if(a == nil) {
fprint(2, "a == nil\n"); fprint(2, "a == nil\n");
return nil; return nil;
@ -603,7 +602,7 @@ message_view(View *v, IxpMsg *m) {
switch(getsym(s)) { switch(getsym(s)) {
case LCOLMODE: case LCOLMODE:
s = msg_getword(m); s = msg_getword(m);
a = strarea(v, s); a = strarea(v, screen->idx, s);
if(a == nil) /* || a->floating) */ if(a == nil) /* || a->floating) */
return Ebadvalue; return Ebadvalue;
@ -711,7 +710,7 @@ msg_grow(View *v, IxpMsg *m) {
Point amount; Point amount;
int dir; int dir;
f = getframe(v, m); f = getframe(v, screen->idx, m);
if(f == nil) if(f == nil)
return "bad frame"; return "bad frame";
c = f->client; c = f->client;
@ -757,7 +756,7 @@ msg_nudge(View *v, IxpMsg *m) {
Point amount; Point amount;
int dir; int dir;
f = getframe(v, m); f = getframe(v, screen->idx, m);
if(f == nil) if(f == nil)
return "bad frame"; return "bad frame";
@ -870,17 +869,9 @@ msg_selectarea(Area *a, IxpMsg *m) {
ap = v->floating; ap = v->floating;
break; break;
default: default:
if(!strcmp(s, "sel")) ap = strarea(v, a->screen, s);
ap = v->sel; if(!ap || ap->floating)
else { return Ebadvalue;
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;
}
if((s = msg_getword(m))) { if((s = msg_getword(m))) {
if(!getulong(s, &i)) if(!getulong(s, &i))
return Ebadvalue; return Ebadvalue;