shithub: patch

ref: 45adb253790f75a5d55d7b42a1e8da1c05989c03
dir: /samterm-fullfrontalnudity/

View raw version
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);