rect makerect(point p1, point p2) { /* make a rectangle from two points */ rect r; r.pt1 = p1; r.pt2 = p2; return canonrect(r); }
int main() { struct rect screen; screen.pt1 = makepoint(7, 1); screen.pt2 = makepoint(3, 10); struct rect canonscreen = canonrect(screen); printf("canon screen: (x1=%d, y1=%d), (x2=%d, y2=%d)\n", canonscreen.pt1.x, canonscreen.pt1.y, canonscreen.pt2.x, canonscreen.pt2.y); struct point inpoint = makepoint(4, 5); printf("point (%d, %d) in screen: %d\n", inpoint.x, inpoint.y, ptinrect(inpoint, canonscreen)); struct point outpoint = makepoint(-1, -7); printf("point (%d, %d) out of screen: %d\n", outpoint.x, outpoint.y, ptinrect(outpoint, canonscreen)); return 0; }
Rectangle rdbbox(char *p) { Rectangle r; int a; char *f[4]; while(*p == ':' || *p == ' ' || *p == '\t') p++; if(tokenize(p, f, 4) != 4) return Rect(0,0,0,0); r = Rect(atoi(f[0]), atoi(f[1]), atoi(f[2]), atoi(f[3])); r = canonrect(r); if(Dx(r) <= 0 || Dy(r) <= 0) return Rect(0,0,0,0); if(truetoboundingbox) return r; /* initdraw not called yet, can't use %R */ if(chatty) fprint(2, "[%d %d %d %d] -> ", R(r)); /* * attempt to sniff out A4, 8½×11, others * A4 is 596×842 * 8½×11 is 612×792 */ a = Dx(r)*Dy(r); if(a < 300*300){ /* really small, probably supposed to be */ /* empty */ } else if(Dx(r) <= 596 && r.max.x <= 596 && Dy(r) > 792 && Dy(r) <= 842 && r.max.y <= 842) /* A4 */ r = Rect(0, 0, 596, 842); else { /* cast up to 8½×11 */ if(Dx(r) <= 612 && r.max.x <= 612){ r.min.x = 0; r.max.x = 612; } if(Dy(r) <= 792 && r.max.y <= 792){ r.min.y = 0; r.max.y = 792; } } if(chatty) fprint(2, "[%d %d %d %d]\n", R(r)); return r; }
static char* tkcvssee(Tk *tk, char *arg, char **val) { Rectangle r; int n, coords[4]; char *e; USED(val); n = 0; while (n < 4) { if (*arg == '\0') break; e = tkfracword(tk->env->top, &arg, &coords[n++], nil); if (e != nil) return e; } if (n != 2 && n != 4) return TkFewpt; r.min.x = TKF2I(coords[0]); r.min.y = TKF2I(coords[1]); if (n == 4) { r.max.x = TKF2I(coords[2]); r.max.y = TKF2I(coords[3]); } else r.max = r.min; r = canonrect(r); /* * XXX should intersect r with scrollregion here, as you shouldn't * be able to display things outside the scroll region. (??) */ tkcvsseerect(tk, r, r.min); return nil; }
static void groupmouse(Control *c, Mouse *m) { Group *g; int i, lastkid; g = (Group*)c; if (g->type == Ctlstack){ i = g->selected; if (i >= 0 && g->kids[i]->mouse && ( ( ((m->buttons == 0) || (g->lastbut == 0)) && ptinrect(m->xy, g->kids[i]->rect) ) || ( ((m->buttons != 0) || (g->lastbut != 0)) && (g->lastkid == i) ) ) ) { if (debugm) fprint(2, "groupmouse %s mouse kid %s i=%d lastkid=%d buttons=%d lastbut=%d inrect=%d\n", g->name, g->kids[i]->name, i, g->lastkid, m->buttons, g->lastbut, ptinrect(m->xy, g->kids[i]->rect) ? 1 : 0); (g->kids[i]->mouse)(g->kids[i], m); g->lastkid = i; g->lastbut = m->buttons; } else { if (debugm) fprint(2, "groupmouse %s skip kid %s i=%d lastkid=%d buttons=%d lastbut=%d inrect=%d\n", g->name, g->kids[i]->name, i, g->lastkid, m->buttons, g->lastbut, ptinrect(m->xy, g->kids[i]->rect) ? 1 : 0); } return; } lastkid = -1; for(i=0; i<g->nkids; i++) { if(g->kids[i]->mouse && ( ( ((m->buttons == 0) || (g->lastbut == 0)) && ptinrect(m->xy, g->kids[i]->rect) ) || ( ((m->buttons != 0) || (g->lastbut != 0)) && (g->lastkid == i) ) ) ) { if (debugm) fprint(2, "groupmouse %s mouse kid %s i=%d lastkid=%d buttons=%d lastbut=%d inrect=%d\n", g->name, g->kids[i]->name, i, g->lastkid, m->buttons, g->lastbut, ptinrect(m->xy, g->kids[i]->rect) ? 1 : 0); (g->kids[i]->mouse)(g->kids[i], m); lastkid = i; } else { if (debugm) fprint(2, "groupmouse %s skip kid %s i=%d lastkid=%d buttons=%d lastbut=%d inrect=%d\n", g->name, g->kids[i]->name, i, g->lastkid, m->buttons, g->lastbut, ptinrect(m->xy, g->kids[i]->rect) ? 1 : 0); } } g->lastkid = lastkid; g->lastbut = m->buttons; #ifdef notdef if(m->buttons == 0){ /* buttons now up */ g->lastbut = 0; return; } if(g->lastbut == 0 && m->buttons != 0){ /* button went down, start tracking border */ switch(g->stacking){ default: return; case Vertical: p = Pt(m->xy.x, middle_of_border.y); p0 = Pt(g->r.min.x, m->xy.y); p1 = Pt(g->r.max.x, m->xy.y); break; case Horizontal: p = Pt(middle_of_border.x, m->xy.y); p0 = Pt(m->xy.x, g->r.min.y); p1 = Pt(m->xy.x, g->r.max.y); break; } // setcursor(); oi = nil; } else if (g->lastbut != 0 && s->m.buttons != 0){ /* button is down, keep tracking border */ if(!eqpt(s->m.xy, p)){ p = onscreen(s->m.xy); r = canonrect(Rpt(p0, p)); if(Dx(r)>5 && Dy(r)>5){ i = allocwindow(wscreen, r, Refnone, 0xEEEEEEFF); /* grey */ freeimage(oi); if(i == nil) goto Rescue; oi = i; border(i, r, Selborder, red, ZP); flushimage(display, 1); } } } else if (g->lastbut != 0 && s->m.buttons == 0){ /* button went up, resize kiddies */ } g->lastbut = s->m.buttons; #endif }