9front - general discussion about 9front
 help / color / mirror / Atom feed
From: ori@eigenstate.org
To: 9front@9front.org
Subject: vt: improve chording
Date: Mon, 12 Oct 2020 18:09:01 -0700	[thread overview]
Message-ID: <86C92F8F7EE0642E736345D405DB3DE4@eigenstate.org> (raw)

This change modifies the vt chording code so you can switch
chords without fully releasing the chord -- so, you can drag
a selection, snarf it, and paste it without jarring full
releases between each step.

diff -r 44eae9a7e98b sys/src/cmd/vt/main.c
--- a/sys/src/cmd/vt/main.c	Sun Oct 11 14:59:49 2020 +0200
+++ b/sys/src/cmd/vt/main.c	Mon Oct 12 18:05:04 2020 -0700
@@ -67,6 +67,7 @@
 int	peekc;
 int	blocksel = 0;
 int	cursoron = 1;
+int	chording = 0;
 int	hostclosed = 0;
 Menu	menu2;
 Menu	menu3;
@@ -156,6 +157,7 @@
 struct funckey *fk, *appfk;
 
 /* functions */
+int	input(void);
 int	waitchar(void);
 void	waitio(void);
 int	rcvchar(void);
@@ -648,144 +650,157 @@
 }
 
 int
-waitchar(void)
+input(void)
 {
 	static char echobuf[4*BSIZE];
 
+Again:
+	if(resize_flag)
+		resized();
+	if(backp)
+		return(0);
+	if(snarffp) {
+		int c;
+
+		if((c = Bgetrune(snarffp)) < 0) {
+			Bterm(snarffp);
+			snarffp = nil;
+			goto Again;
+		}
+		kbdchar = c;
+	}
+	if(kbdchar) {
+		if(backc){
+			backc = 0;
+			backup(backc);
+		}
+		if(blocked)
+			resize_flag = 1;
+		if(cs->raw) {
+			switch(kbdchar){
+			case Kins:
+				if(!sendfk("insert"))
+					goto Send;
+				break;
+			case Kdel:
+				if(!sendfk("delete"))
+					goto Send;
+				break;
+			case Khome:
+				if(!sendfk("home"))
+					goto Send;
+				break;
+			case Kend:
+				if(!sendfk("end"))
+					goto Send;
+				break;
+
+			case Kpgup:
+				sendfk("page up");
+				break;
+			case Kpgdown:
+				sendfk("page down");
+				break;
+
+			case Kup:
+				sendfk("up key");
+				break;
+			case Kdown:
+				sendfk("down key");
+				break;
+			case Kleft:
+				sendfk("left key");
+				break;
+			case Kright:
+				sendfk("right key");
+				break;
+
+			case KF|1:
+				sendfk("F1");
+				break;
+			case KF|2:
+				sendfk("F2");
+				break;
+			case KF|3:
+				sendfk("F3");
+				break;
+			case KF|4:
+				sendfk("F4");
+				break;
+			case KF|5:
+				sendfk("F5");
+				break;
+			case KF|6:
+				sendfk("F6");
+				break;
+			case KF|7:
+				sendfk("F7");
+				break;
+			case KF|8:
+				sendfk("F8");
+				break;
+			case KF|9:
+				sendfk("F9");
+				break;
+			case KF|10:
+				sendfk("F10");
+				break;
+			case KF|11:
+				sendfk("F11");
+				break;
+			case KF|12:
+				sendfk("F12");
+				break;
+
+			case '\n':
+				echobuf[0] = '\r';
+				sendnchars(1, echobuf);
+				break;
+			case '\r':
+				echobuf[0] = '\n';
+				sendnchars(1, echobuf);
+				break;
+			default:
+			Send:
+				sendnchars(runetochar(echobuf, &kbdchar), echobuf);
+				break;
+			}
+		} else {
+			switch(canon(echobuf, kbdchar)){
+			case SCROLL:
+				if(!blocked)
+					bigscroll();
+				break;
+			default:
+				strcat(echo_input,echobuf);
+			}
+		}
+		blocked = 0;
+		kbdchar = 0;
+		goto Again;
+	} else if(nbrecv(kc->c, &kbdchar))
+		goto Again;
+	if(!blocked){
+		if(host_avail())
+			return(rcvchar());
+		free(hostbuf);
+		hostbufp = hostbuf = nbrecvp(hc[1]);
+		if(host_avail() && nrand(32))
+			return(rcvchar());
+	}
+	return -1;
+}
+
+
+int
+waitchar(void)
+{
+	int r;
+
 	for(;;) {
-		if(resize_flag)
-			resized();
-		if(backp)
-			return(0);
-		if(snarffp) {
-			int c;
-
-			if((c = Bgetrune(snarffp)) < 0) {
-				Bterm(snarffp);
-				snarffp = nil;
-				continue;
-			}
-			kbdchar = c;
-		}
-		if(kbdchar) {
-			if(backc){
-				backc = 0;
-				backup(backc);
-			}
-			if(blocked)
-				resize_flag = 1;
-			if(cs->raw) {
-				switch(kbdchar){
-				case Kins:
-					if(!sendfk("insert"))
-						goto Send;
-					break;
-				case Kdel:
-					if(!sendfk("delete"))
-						goto Send;
-					break;
-				case Khome:
-					if(!sendfk("home"))
-						goto Send;
-					break;
-				case Kend:
-					if(!sendfk("end"))
-						goto Send;
-					break;
-
-				case Kpgup:
-					sendfk("page up");
-					break;
-				case Kpgdown:
-					sendfk("page down");
-					break;
-
-				case Kup:
-					sendfk("up key");
-					break;
-				case Kdown:
-					sendfk("down key");
-					break;
-				case Kleft:
-					sendfk("left key");
-					break;
-				case Kright:
-					sendfk("right key");
-					break;
-
-				case KF|1:
-					sendfk("F1");
-					break;
-				case KF|2:
-					sendfk("F2");
-					break;
-				case KF|3:
-					sendfk("F3");
-					break;
-				case KF|4:
-					sendfk("F4");
-					break;
-				case KF|5:
-					sendfk("F5");
-					break;
-				case KF|6:
-					sendfk("F6");
-					break;
-				case KF|7:
-					sendfk("F7");
-					break;
-				case KF|8:
-					sendfk("F8");
-					break;
-				case KF|9:
-					sendfk("F9");
-					break;
-				case KF|10:
-					sendfk("F10");
-					break;
-				case KF|11:
-					sendfk("F11");
-					break;
-				case KF|12:
-					sendfk("F12");
-					break;
-
-				case '\n':
-					echobuf[0] = '\r';
-					sendnchars(1, echobuf);
-					break;
-				case '\r':
-					echobuf[0] = '\n';
-					sendnchars(1, echobuf);
-					break;
-				default:
-				Send:
-					sendnchars(runetochar(echobuf, &kbdchar), echobuf);
-					break;
-				}
-			} else {
-				switch(canon(echobuf, kbdchar)){
-				case SCROLL:
-					if(!blocked)
-						bigscroll();
-					break;
-				default:
-					strcat(echo_input,echobuf);
-				}
-			}
-			blocked = 0;
-			kbdchar = 0;
-			continue;
-		} else if(nbrecv(kc->c, &kbdchar))
-			continue;
-		if(!blocked){
-			if(host_avail())
-				return(rcvchar());
-			free(hostbuf);
-			hostbufp = hostbuf = nbrecvp(hc[1]);
-			if(host_avail() && nrand(32))
-				return(rcvchar());
-		}
+		r = input();
+		if(r != -1)
+			return r;
 		drawscreen();
 		drawcursor();
 		waitio();
@@ -817,7 +832,7 @@
 		flushimage(display, 1);
 	switch(alt(a)){
 	case AMOUSE:
-		if(button1())
+		if(button1() || chording)
 			selecting();
 		else if(button2() || button3())
 			readmenu();
@@ -1111,11 +1126,14 @@
 		drawscreen();
 		readmouse(mc);
 	} while(button1());
+
+	chording = 1;
 	switch(mc->buttons & 0x7){
+	case 0:	chording = 0;	break;
 	case 3:	snarfsel();	break;
 	case 5:	paste();	break;
 	}
-	while(mc->buttons&7) readmouse(mc);
+	drawscreen();
 	t = -mc->msec;
 }
 



             reply	other threads:[~2020-10-13  1:09 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-13  1:09 ori [this message]
2020-10-13  2:13 ` [9front] " Marshall Conover

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=86C92F8F7EE0642E736345D405DB3DE4@eigenstate.org \
    --to=ori@eigenstate.org \
    --cc=9front@9front.org \
    /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).