merge
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
index ed68ed1..5ca47b9 100644
--- a/src/cmd/9term/9term.c
+++ b/src/cmd/9term/9term.c
@@ -67,7 +67,7 @@
 		fontname = EARGF(usage());
 		break;
 	case 's':
-		/* no-op */
+		scrolling = TRUE;
 		break;
 	case 'c':
 		cooked = TRUE;
@@ -114,7 +114,7 @@
 	timerinit();
 	servedevtext();
 	rcpid = rcstart(argc, argv, &rcfd, &sfd);
-	w = new(screen, FALSE, rcpid, ".", nil, nil);
+	w = new(screen, FALSE, scrolling, rcpid, ".", nil, nil);
 
 	threadcreate(keyboardthread, nil, STACK);
 	threadcreate(mousethread, nil, STACK);
@@ -241,7 +241,7 @@
 }
 
 Window*
-new(Image *i, int hideit, int pid, char *dir, char *cmd, char **argv)
+new(Image *i, int hideit, int scrollit, int pid, char *dir, char *cmd, char **argv)
 {
 	Window *w;
 	Mousectl *mc;
@@ -258,7 +258,7 @@
 	*mc = *mousectl;
 /*	mc->image = i; */
 	mc->c = cm;
-	w = wmk(i, mc, ck, cctl);
+	w = wmk(i, mc, ck, cctl, scrollit);
 	free(mc);	/* wmk copies *mc */
 	window = erealloc(window, ++nwindow*sizeof(Window*));
 	window[nwindow-1] = w;
@@ -288,6 +288,7 @@
 	Snarf,
 	Plumb,
 	Send,
+	Scroll,
 	Cook
 };
 
@@ -298,6 +299,7 @@
 	"plumb",
 	"send",
 	"cook",
+	"scroll",
 	nil
 };
 
@@ -315,6 +317,10 @@
 	if(w->deleted)
 		return;
 	incref(&w->ref);
+	if(w->scrolling)
+		menu2str[Scroll] = "noscroll";
+	else
+		menu2str[Scroll] = "scroll";
 	if(cooked)
 		menu2str[Cook] = "nocook";
 	else
@@ -358,7 +364,11 @@
 		wsetselect(w, w->nr, w->nr);
 		wshow(w, w->nr);
 		break;
-	
+
+	case Scroll:
+		if(w->scrolling ^= 1)
+			wshow(w, w->nr);
+		break;
 	case Cook:
 		cooked ^= 1;
 		break;
diff --git a/src/cmd/9term/dat.h b/src/cmd/9term/dat.h
index 32b7541..c1af659 100644
--- a/src/cmd/9term/dat.h
+++ b/src/cmd/9term/dat.h
@@ -132,6 +132,7 @@
 	Rectangle		lastsr;
 	int			topped;
 	int			notefd;
+	uchar		scrolling;
 	Cursor		cursor;
 	Cursor		*cursorp;
 	uchar		holding;
@@ -149,7 +150,7 @@
 void		winctl(void*);
 void		winshell(void*);
 Window*	wlookid(int);
-Window*	wmk(Image*, Mousectl*, Channel*, Channel*);
+Window*	wmk(Image*, Mousectl*, Channel*, Channel*, int);
 Window*	wpointto(Point);
 Window*	wtop(Point);
 void		wtopme(Window*);
diff --git a/src/cmd/9term/fns.h b/src/cmd/9term/fns.h
index cdb5ff6..a0ae686 100644
--- a/src/cmd/9term/fns.h
+++ b/src/cmd/9term/fns.h
@@ -6,7 +6,7 @@
 int	wunhide(int);
 void	freescrtemps(void);
 int	parsewctl(char**, Rectangle, Rectangle*, int*, int*, int*, int*, char**, char*, char*);
-Window *new(Image*, int, int, char*, char*, char**);
+Window *new(Image*, int, int, int, char*, char*, char**);
 void	riosetcursor(Cursor*, int);
 int	min(int, int);
 int	max(int, int);
diff --git a/src/cmd/9term/wind.c b/src/cmd/9term/wind.c
index 4088990..f82cf15 100644
--- a/src/cmd/9term/wind.c
+++ b/src/cmd/9term/wind.c
@@ -17,7 +17,7 @@
 
 enum
 {
-	HiWater	= 640000,	/* max size of history */
+	HiWater	= 64000000,	/* max size of history */
 	LoWater	= 400000,	/* min size of history after max'ed */
 	MinWater	= 20000	/* room to leave available when reallocating */
 };
@@ -36,7 +36,7 @@
 static	Image	*paleholdcol;
 
 Window*
-wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl)
+wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl, int scrolling)
 {
 	Window *w;
 	Rectangle r;
@@ -77,6 +77,7 @@
 	w->topped = ++topped;
 	w->id = ++id;
 	w->notefd = -1;
+	w->scrolling = scrolling;
 	w->dir = estrdup(startdir);
 	w->label = estrdup("<unnamed>");
 	r = insetrect(w->i->r, Selborder);
@@ -247,6 +248,9 @@
 			alts[WMouseread].op = CHANSND;
 		else
 			alts[WMouseread].op = CHANNOP;
+		//	if(!w->scrolling && !w->mouseopen && w->qh>w->org+w->f.nchars)
+		//		alts[WCwrite].op = CHANNOP;
+		//	else
 		alts[WCwrite].op = CHANSND;
 		if(w->deleted || !w->wctlready)
 			alts[WWread].op = CHANNOP;
@@ -365,7 +369,7 @@
 				w->qh = qh;
 			}
 			nr = up - rp;
-			scrolling = w->org <= w->qh && w->qh <= w->org + w->f.nchars;
+			scrolling = w->scrolling && w->org <= w->qh && w->qh <= w->org + w->f.nchars;
 			w->qh = winsert(w, rp, nr, w->qh)+nr;
 			if(scrolling)
 				wshow(w, w->qh);