code: plan9front

Download patch

ref: 8188b4f4f0e07b6669e6ae3c6c1099af917eaab4
parent: bd3c854f6022c48418ecd918fe921a9140d28f30
author: Jacob Moody <moody@posixcafe.org>
date: Sat Jan 28 05:30:00 EST 2023

rio: sync keyboard state with active window on switch

this addresses issues with stuck modifier keys when clicking
off and on from vncv with a modifier held.

--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -392,6 +392,7 @@
 	char *e;
 	char *watched;
 	Window *w, *cur;
+	static char keys[64];
 
 	threadsetname("keyboardtap");
 	enum { Awin, Actl, Afrom, Adev, Ato, Ainp, Awatch, NALT };
@@ -408,6 +409,7 @@
 
 	cur = nil;
 	watched = nil;
+	keys[0] = 0;
 	for(;;)
 		switch(alt(alts)){
 		case Awin:
@@ -414,16 +416,21 @@
 			cur = w;
 			if(cur != nil){
 				alts[Ainp].c = cur->ck;
-				if(tapseats[OREAD] == Tapoff)	
-					goto Reset;
-				if(alts[Awatch].op == CHANSND)
-					free(watched);
-				watched = smprint("%c%d", Tapfocus, cur->id);
-				alts[Awatch].op = CHANSND;
+				if(tapseats[OREAD] != Tapoff){	
+					if(alts[Awatch].op == CHANSND)
+						free(watched);
+					watched = smprint("%c%d", Tapfocus, cur->id);
+					alts[Awatch].op = CHANSND;
+				}
 			}
 			if(alts[Ainp].op != CHANNOP || alts[Ato].op != CHANNOP)
 				free(s);
-			goto Reset;
+			if(cur == nil)
+				goto Reset;
+			s = smprint("K%s", keys);
+			alts[Ainp].op = CHANSND;
+			alts[Ato].op = CHANNOP;
+			break;
 		case Actl:
 			e = tapctlmsg(ctl);
 			sendp(resptap, e);
@@ -444,6 +451,8 @@
 			alts[Ainp].op = CHANSND;
 			break;
 		case Adev:
+			if(*s == 'k' || *s == 'K')
+				strcpy(keys, s+1);
 			if(tapseats[OWRITE] == Tapoff && cur == nil){
 				free(s);
 				break;