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);