ref: a757798f9113eeb71a57f24fa0edc9600eb62a8c
dir: /samterm-fullfrontalnudity/
diff 614f1d6268fd986fc628eec3754bd4599363ad13 uncommitted --- a//sys/src/cmd/samterm/flayer.h +++ b//sys/src/cmd/samterm/flayer.h @@ -42,9 +42,9 @@ void flupfront(Flayer*); Flayer *flwhich(Point); -#define FLMARGIN 4 +#define FLMARGIN 2 #define FLSCROLLWID 12 -#define FLGAP 4 +#define FLGAP 0 extern Image *maincols[NCOL]; extern Image *cmdcols[NCOL]; --- a//sys/src/cmd/samterm/main.c +++ b//sys/src/cmd/samterm/main.c @@ -44,6 +44,8 @@ nscralloc = 100; r = screen->r; r.max.y = r.min.y+Dy(r)/5; + if(Dy(r) < font->height) + r.max.y = r.min.y + font->height + 2*FLMARGIN; flstart(screen->clipr); rinit(&cmd.rasp); flnew(&cmd.l[0], gettext, 1, &cmd); @@ -240,30 +242,66 @@ getmouse(); } -int -getr(Rectangle *rp) +Rectangle +inflatepoint(Point p) { - Point p; + Rectangle *c; Rectangle r; - - *rp = getrect(3, mousectl); - if(rp->max.x && rp->max.x-rp->min.x<=5 && rp->max.y-rp->min.y<=5){ - p = rp->min; - r = cmd.l[cmd.front].entire; - *rp = screen->r; - if(cmd.nwin==1){ - if (p.y <= r.min.y) - rp->max.y = r.min.y; - else if (p.y >= r.max.y) - rp->min.y = r.max.y; - if (p.x <= r.min.x) - rp->max.x = r.min.x; - else if (p.x >= r.max.x) - rp->min.x = r.max.x; - } + + r = screen->r; + c = &cmd.l[cmd.front].entire; + if(ptinrect(p, *c)) + return r; + // L + if(p.x < c->min.x) + r.max.x = c->min.x; + // R + else if(p.x >= c->max.x) + r.min.x = c->max.x; + // M + else{ + r.min.x = c->min.x; + //r.max.x = screen->max.x; + // A + if(p.y <= c->min.y) + r.max.y = c->min.y; + // B + else + r.min.y = c->max.y; } - return rectclip(rp, screen->r) && - rp->max.x-rp->min.x>100 && rp->max.y-rp->min.y>40; + return r; +} + +Rectangle +defaultrect(void) +{ + Rectangle *c; + Rectangle L, M, R; + + c = &cmd.l[cmd.front].entire; + L = inflatepoint(Pt(c->min.x - 1, c->min.y)); + M = inflatepoint(Pt(c->min.x, c->max.y)); + R = inflatepoint(Pt(c->max.x + 1, c->min.y)); + if(Dx(L) >= Dx(M) && Dx(L) >= Dx(R)) + return L; + else if(Dx(M) > Dx(L) && Dx(M) > Dx(R)) + return M; + return R; +} + +int +promptrect(Rectangle *r) +{ + *r = getrect(3, mousectl); + if(eqrect(*r, Rect(0,0,0,0))) + return 0; + if(Dx(*r) < 8*font->width && Dy(*r) < 2*font->height) + *r = inflatepoint(r->min); + if(rectclip(r, screen->r) == 0) + *r = defaultrect(); + if(Dx(*r) < 2*FLMARGIN || Dy(*r) < 2*FLMARGIN) + *r = cmd.l[cmd.front].entire; + return 1; } void --- a//sys/src/cmd/samterm/menu.c +++ b//sys/src/cmd/samterm/menu.c @@ -127,6 +127,7 @@ int m, i; Text *t; + l = which; mw = -1; switch(m = menuhit(3, mousectl, &menu3, nil)){ case -1: @@ -139,46 +140,29 @@ case Zerox: case Resize: - if(!hostlock){ - setcursor(mousectl, &bullseye); - buttons(Down); - if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && getr(&r)) - duplicate(l, r, l->f.font, m==Resize); - else - setcursor(mousectl, cursor); - buttons(Up); - } + if(hostlock || l == nil) + break; + if(promptrect(&r)) + duplicate(l, r, l->f.font, m == Resize); break; case Close: - if(!hostlock){ - setcursor(mousectl, &bullseye); - buttons(Down); - if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && !hostlock){ - t=(Text *)l->user1; - if (t->nwin>1) - closeup(l); - else if(t!=&cmd) { - outTs(Tclose, t->tag); - setlock(); - } - } - setcursor(mousectl, cursor); - buttons(Up); + if(hostlock || l == nil) + break; + t=(Text *)l->user1; + if (t->nwin>1) + closeup(l); + else if(t!=&cmd) { + outTs(Tclose, t->tag); + setlock(); } break; case Write: - if(!hostlock){ - setcursor(mousectl, &bullseye); - buttons(Down); - if((mousep->buttons&4) && (l = flwhich(mousep->xy))){ - outTs(Twrite, ((Text *)l->user1)->tag); - setlock(); - }else - setcursor(mousectl, cursor); - buttons(Up); - } + if(hostlock || l == nil) + break; + outTs(Twrite, ((Text *)l->user1)->tag); + setlock(); break; default: @@ -205,23 +189,27 @@ Rectangle r; Text *t; - if(getr(&r) && (t = malloc(sizeof(Text)))){ - memset((void*)t, 0, sizeof(Text)); - current((Flayer *)0); - flnew(&t->l[0], gettext, 0, (char *)t); - flinit(&t->l[0], r, font, maincols); /*bnl*/ - t->nwin = 1; + if((t = mallocz(sizeof(*t), 1)) == nil) + return nil; + if(new) + r = inflatepoint(mousep->xy); + else + r = defaultrect(); + if(Dx(r) < 2*FLMARGIN || Dy(r) < 2*FLMARGIN) + r = cmd.l[cmd.front].entire; + current((Flayer *)0); + flnew(&t->l[0], gettext, 0, (char *)t); + flinit(&t->l[0], r, font, maincols); /*bnl*/ + t->nwin = 1; + rinit(&t->rasp); + if(new) + startnewfile(Tstartnewfile, t); + else{ rinit(&t->rasp); - if(new) - startnewfile(Tstartnewfile, t); - else{ - rinit(&t->rasp); - t->tag = tag; - startfile(t); - } - return t; + t->tag = tag; + startfile(t); } - return 0; + return t; } int --- a//sys/src/cmd/samterm/samterm.h +++ b//sys/src/cmd/samterm/samterm.h @@ -118,7 +118,6 @@ int center(Flayer*, long); int xmenuhit(int, Menu*); void buttons(int); -int getr(Rectangle*); void current(Flayer*); void duplicate(Flayer*, Rectangle, Font*, int); void startfile(Text*); @@ -162,6 +161,9 @@ void dumperrmsg(int, int, int, int); int screensize(int*,int*); void getmouse(void); +Rectangle inflatepoint(Point); +Rectangle defaultrect(void); +int promptrect(Rectangle*); #include "mesg.h" --- a//sys/src/cmd/samterm/scroll.c +++ b//sys/src/cmd/samterm/scroll.c @@ -111,9 +111,6 @@ int x, y, my, oy, h; long p0; - if(l->visible==None) - return; - s = l->scroll; x = s.min.x+FLSCROLLWID/2; scr = scrpos(l->scroll, l->origin, l->origin+l->f.nchars, tot);