9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: trebol55555@yandex.ru
To: 9fans@9fans.net
Subject: [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
Date: Fri, 27 May 2016 18:11:26 +0100	[thread overview]
Message-ID: <e70dc798e53e8f98510f5ced3d1558b1@debpi> (raw)

flselect() must be changed in samterm/flayer.c to get the double click
selection working ok.


Anyone has hacked sam to use both the plumber and the pipe?

trebol.


diff -rpuN src/cmd/sam/cmd.c sam/cmd.c
--- src/cmd/sam/cmd.c	2016-04-18 19:07:22.000000000 +0100
+++ sam/cmd.c	2016-05-25 23:56:34.040909362 +0100
@@ -35,6 +35,8 @@ struct cmdtab cmdtab[]={
 	'>',	0,	0,	0,	0,	aDot,	0,	linex,	plan9_cmd,
 	'<',	0,	0,	0,	0,	aDot,	0,	linex,	plan9_cmd,
 	'|',	0,	0,	0,	0,	aDot,	0,	linex,	plan9_cmd,
+	'^',	0,	0,	0,	0,	aDot,	0,	linex,	plan9_cmd,
+	'_',	0,	0,	0,	0,	aDot,	0,	linex,	plan9_cmd,
 	'=',	0,	0,	0,	0,	aDot,	0,	linex,	eq_cmd,
 	'c'|0x100,0,	0,	0,	0,	aNo,	0,	wordx,	cd_cmd,
 	0,	0,	0,	0,	0,	0,	0,	0
@@ -76,7 +78,13 @@ inputc(void)

     Again:
 	nbuf = 0;
-	if(downloaded){
+	if(cmdbufpos > cmdbuf.nc && cmdbuf.nc > 0){
+		cmdbufpos = 0;
+		bufreset(&cmdbuf);
+	}
+	if(cmdbufpos < cmdbuf.nc && cmdbuf.nc > 0)
+		bufread(&cmdbuf, cmdbufpos++, &r, 1);
+	else if(downloaded){
 		while(termoutp == terminp){
 			cmdupdate();
 			if(patset)
diff -rpuN src/cmd/sam/sam.h sam/sam.h
--- src/cmd/sam/sam.h	2016-04-18 19:07:22.000000000 +0100
+++ sam/sam.h	2016-05-25 23:45:05.652931784 +0100
@@ -369,6 +369,8 @@ extern int	quitok;
 extern Address	addr;
 extern Buffer	snarfbuf;
 extern Buffer	plan9buf;
+extern Buffer	cmdbuf;
+extern int	cmdbufpos;
 extern List	file;
 extern List	tempfile;
 extern File	*cmd;
diff -rpuN src/cmd/sam/shell.c sam/shell.c
--- src/cmd/sam/shell.c	2016-04-18 19:07:22.000000000 +0100
+++ sam/shell.c	2016-05-25 23:46:25.262692361 +0100
@@ -6,6 +6,8 @@ extern	jmp_buf	mainloop;
 char	errfile[64];
 String	plan9cmd;	/* null terminated */
 Buffer	plan9buf;
+Buffer	cmdbuf;
+int	cmdbufpos;
 void	checkerrs(void);

 void
@@ -40,7 +42,7 @@ plan9(File *f, int type, String *s, int
 	}
 	if(type!='!' && pipe(pipe1)==-1)
 		error(Epipe);
-	if(type=='|')
+	if(type=='|' || type=='_')
 		snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1);
 	if((pid=fork()) == 0){
 		setname(f);
@@ -61,14 +63,14 @@ plan9(File *f, int type, String *s, int
 			}
 		}
 		if(type != '!') {
-			if(type=='<' || type=='|')
-				dup(pipe1[1], 1);
-			else if(type == '>')
+			if(type == '>')
 				dup(pipe1[0], 0);
+			else
+				dup(pipe1[1], 1);
 			close(pipe1[0]);
 			close(pipe1[1]);
 		}
-		if(type == '|'){
+		if(type == '|' || type == '_'){
 			if(pipe(pipe2) == -1)
 				exits("pipe");
 			if((pid = fork())==0){
@@ -100,7 +102,7 @@ plan9(File *f, int type, String *s, int
 			close(pipe2[0]);
 			close(pipe2[1]);
 		}
-		if(type=='<'){
+		if(type=='<' || type=='^'){
 			close(0);	/* so it won't read from terminal */
 			open("/dev/null", 0);
 		}
@@ -128,9 +130,14 @@ plan9(File *f, int type, String *s, int
 		writeio(f);
 		bpipeok = 0;
 		closeio((Posn)-1);
+	}else if(type == '^' || type == '_'){
+		int nulls;
+		close(pipe1[1]);
+		bufload(&cmdbuf, cmdbufpos, pipe1[0], &nulls);
+		close(pipe1[0]);
 	}
 	retcode = waitfor(pid);
-	if(type=='|' || type=='<')
+	if(type=='|' || type=='<' || type=='_' || type=='^')
 		if(retcode!=0)
 			warn(Wbadstatus);
 	if(downloaded)
diff -rpuN src/cmd/samterm/main.c samterm/main.c
--- src/cmd/samterm/main.c	2016-04-18 19:07:22.000000000 +0100
+++ samterm/main.c	2016-05-26 16:12:12.452556184 +0100
@@ -23,11 +23,8 @@ long	modified = 0;		/* strange lookahead
 char	hostlock = 1;
 char	hasunlocked = 0;
 int	maxtab = 8;
-int	chord;
 int	autoindent;

-#define chording 0	/* code here for reference but it causes deadlocks */
-
 void
 notifyf(void *a, char *msg)
 {
@@ -39,7 +36,7 @@ notifyf(void *a, char *msg)
 void
 threadmain(int argc, char *argv[])
 {
-	int i, got, scr, w;
+	int i, got, scr, chord, w;
 	Text *t;
 	Rectangle r;
 	Flayer *nwhich;
@@ -85,6 +82,7 @@ threadmain(int argc, char *argv[])

 	got = 0;
 	if(protodebug) print("loop\n");
+	chord = 0;
 	for(;;got = waitforio()){
 		if(hasunlocked && RESIZED())
 			resize();
@@ -108,19 +106,32 @@ threadmain(int argc, char *argv[])
 				continue;
 			}
 			nwhich = flwhich(mousep->xy);
-			scr = which && ptinrect(mousep->xy, which->scroll);
+			scr = which && (ptinrect(mousep->xy, which->scroll) ||
+				mousep->buttons&(8|16));
 			if(mousep->buttons)
 				flushtyping(1);
-			if(chording && chord==1 && !mousep->buttons)
+			if((mousep->buttons&1)==0)
 				chord = 0;
-			if(chording && chord)
+			if(chord && which && which==nwhich){
 				chord |= mousep->buttons;
-			else if(mousep->buttons&1){
+				t = (Text *)which->user1;
+				if(!t->lock){
+					w = which-t->l;
+					if(chord&2){
+						cut(t, w, 1, 1);
+						chord &= ~2;
+					}
+					if(chord&4){
+						paste(t, w);
+						chord &= ~4;
+					}
+				}
+			}else if(mousep->buttons&(1|8)){
 				if(nwhich){
 					if(nwhich!=which)
 						current(nwhich);
 					else if(scr)
-						scroll(which, 1);
+						scroll(which, (mousep->buttons&8) ? 4 : 1);
 					else{
 						t=(Text *)which->user1;
 						if(flselect(which)){
@@ -137,27 +148,14 @@ threadmain(int argc, char *argv[])
 					scroll(which, 2);
 				else
 					menu2hit();
-			}else if((mousep->buttons&4)){
+			}else if(mousep->buttons&(4|16)){
 				if(scr)
-					scroll(which, 3);
+					scroll(which, (mousep->buttons&16) ? 5 : 3);
 				else
 					menu3hit();
 			}
 			mouseunblock();
 		}
-		if(chording && chord){
-			t = (Text*)which->user1;
-			if(!t->lock && !hostlock){
-				w = which-t->l;
-				if(chord&2){
-					cut(t, w, 1, 1);
-					chord &= ~2;
-				}else if(chord&4){
-					paste(t, w);
-					chord &= ~4;
-				}
-			}
-		}
 	}
 }

@@ -497,6 +495,7 @@ flushtyping(int clearesc)
 #define	CUT	(Kcmd+'x')
 #define	COPY	(Kcmd+'c')
 #define	PASTE	(Kcmd+'v')
+#define	Kstx	0x02

 int
 nontypingkey(int c)
@@ -512,6 +511,7 @@ nontypingkey(int c)
 	case PAGEUP:
 	case RIGHTARROW:
 	case SCROLLKEY:
+	case Kstx:
 		return 1;
 	}
 	if(c >= Kcmd)
@@ -669,6 +669,15 @@ type(Flayer *l, int res)	/* what a blood
 				}
 			}
 		}
+	}else if(c == Kstx){
+		t = &cmd;
+		for(l=t->l; l->textfn==0; l++)
+			;
+		current(l);
+		flushtyping(0);
+		a = t->rasp.nrunes;
+		flsetselect(l, a, a);
+		center(l, a);
 	}else{
 		if(c==ESC && typeesc>=0){
 			l->p0 = typeesc;
diff -rpuN src/cmd/samterm/scroll.c samterm/scroll.c
--- src/cmd/samterm/scroll.c	2016-04-18 19:07:22.000000000 +0100
+++ samterm/scroll.c	2016-05-26 02:07:31.922977720 +0100
@@ -115,7 +115,7 @@ scroll(Flayer *l, int but)
 	draw(scrback, Rect(0,0,Dx(l->scroll), Dy(l->scroll)), l->f.b, nil, l->scroll.min);
 	do{
 		oin = in;
-		in = abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2;
+		in = (but > 3) || (but == 2) || abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2;
 		if(oin && !in)
 			scrunmark(l, r);
 		if(in){
@@ -126,9 +126,7 @@ scroll(Flayer *l, int but)
 				my = s.min.y;
 			if(my >= s.max.y)
 				my = s.max.y;
-			if(!eqpt(mousep->xy, Pt(x, my)))
-				moveto(mousectl, Pt(x, my));
-			if(but == 1){
+			if(but == 1 || but == 4){
 				p0 = l->origin-frcharofpt(&l->f, Pt(s.max.x, my));
 				rt = scrpos(l->scroll, p0, p0+l->f.nchars, tot);
 				y = rt.min.y;
@@ -136,7 +134,7 @@ scroll(Flayer *l, int but)
 				y = my;
 				if(y > s.max.y-2)
 					y = s.max.y-2;
-			}else if(but == 3){
+			}else if(but == 3 || but == 5){
 				p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my));
 				rt = scrpos(l->scroll, p0, p0+l->f.nchars, tot);
 				y = rt.min.y;
@@ -147,19 +145,21 @@ scroll(Flayer *l, int but)
 				scrmark(l, r);
 			}
 		}
-	}while(button(but));
+	}while(but <= 3 && button(but));
 	if(in){
 		h = s.max.y-s.min.y;
 		scrunmark(l, r);
 		p0 = 0;
-		if(but == 1)
+		if(but == 1 || but == 4){
+			but = 1;
 			p0 = (long)(my-s.min.y)/l->f.font->height+1;
-		else if(but == 2){
+		}else if(but == 2){
 			if(tot > 1024L*1024L)
 				p0 = ((tot>>10)*(y-s.min.y)/h)<<10;
 			else
 				p0 = tot*(y-s.min.y)/h;
-		}else if(but == 3){
+		}else if(but == 3 || but == 5){
+			but = 3;
 			p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my));
 			if(p0 > tot)
 				p0 = tot;
diff -rpuN src/cmd/samterm/flayer.c samterm/flayer.c
--- src/cmd/samterm/flayer.c	2016-05-27 17:46:30.431425669 +0100
+++ samterm/flayer.c	2016-04-18 19:07:22.000000000 +0100
@@ -254,21 +254,18 @@ fldelete(Flayer *l, long p0, long p1)
 int
 flselect(Flayer *l)
 {
-	int ret;
 	if(l->visible!=All)
 		flupfront(l);
-	frselect(&l->f, mousectl);
-	ret = 0;
-	if(l->f.p0==l->f.p1){
-		if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0){
-			ret = 1;
+	if(l->f.p0==l->f.p1)
+		if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0 &&
+			l->f.p0==frcharofpt(&l->f, mousep->xy)){
 			l->click = 0;
-		}else
-			l->click = mousep->msec;
-	}else
-		l->click = 0;
+			return 1;
+		}
+	l->click = mousep->msec;
+	frselect(&l->f, mousectl);
 	l->p0 = l->f.p0+l->origin, l->p1 = l->f.p1+l->origin;
-	return ret;
+	return 0;
 }

 void




             reply	other threads:[~2016-05-27 17:11 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-27 17:11 trebol55555 [this message]
2016-05-27 17:46 ` Mark Lee Smith
2016-05-27 18:04   ` trebol55555
2016-05-28 10:04     ` Mark Lee Smith
  -- strict thread matches above, loose matches on Subject: below --
2016-05-31  1:34 trebol55555
2016-05-30 16:35 trebol55555
2016-05-26 22:03 trebol55555
2016-05-27 20:57 ` Mark Lee Smith
2016-05-27 21:42   ` Tobias Kreisel
2016-05-27 22:16   ` Ethan Grammatikidis
2016-05-27 22:37     ` stanley lieber
2016-05-28 15:25       ` Ethan Grammatikidis
2016-05-27 23:09     ` Kurt H Maier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e70dc798e53e8f98510f5ced3d1558b1@debpi \
    --to=trebol55555@yandex.ru \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).