shithub: riow

ref: 41ad3df95a6ac98a5133c850c4aea9dad1589719
dir: /9front.diff/

View raw version
diff -r 95e095480480 sys/include/keyboard.h
--- a/sys/include/keyboard.h	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/include/keyboard.h	Sun Mar 29 15:03:32 2020 +0200
@@ -44,6 +44,8 @@
 	Kscrolloneup=	KF|0x20,
 	Kscrollonedown=	KF|0x21,
 
+	Kglenda=	KF|0x22,
+
 	Ksoh=	0x01,
 	Kstx=	0x02,
 	Ketx=	0x03,
diff -r 95e095480480 sys/lib/kbmap/fi
--- a/sys/lib/kbmap/fi	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/lib/kbmap/fi	Sun Mar 29 15:03:32 2020 +0200
@@ -32,6 +32,8 @@
 1	52	':
 1	53	'_
 1	86	'>
+2	91	0xf022
+2	125	0xf022
 3	3	'@
 3	4	'£
 3	5	'$
@@ -44,3 +46,5 @@
 3	27	'~
 3	46	'¢
 3	86	'|
+3	91	0xf022
+4	91	0xf022
diff -r 95e095480480 sys/lib/kbmap/us
--- a/sys/lib/kbmap/us	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/lib/kbmap/us	Sun Mar 29 15:03:32 2020 +0200
@@ -345,7 +345,7 @@
 2	88	0
 2	89	0
 2	90	0
-2	91	0
+2	91	0xf022
 2	92	0
 2	93	0
 2	94	0
@@ -379,7 +379,7 @@
 2	122	0
 2	123	0
 2	124	0
-2	125	0
+2	125	0xf022
 2	126	0
 2	127	0
 3	0	0
@@ -473,7 +473,7 @@
 3	88	0
 3	89	0
 3	90	0
-3	91	0
+3	91	0xf022
 3	92	0
 3	93	0
 3	94	0
@@ -601,7 +601,7 @@
 4	88	^L
 4	89	0
 4	90	0
-4	91	0
+4	91	0xf022
 4	92	0
 4	93	0
 4	94	0
diff -r 95e095480480 sys/src/cmd/aux/kbdfs/kbdfs.c
--- a/sys/src/cmd/aux/kbdfs/kbdfs.c	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c	Sun Mar 29 15:03:32 2020 +0200
@@ -42,6 +42,7 @@
 	int	ctl;
 	int	alt;
 	int	altgr;
+	int glenda;
 	int	leds;
 };
 
@@ -178,11 +179,11 @@
 [0x40]	0,	0,	0,	0,	0,	0,	Kbreak,	Khome,
 [0x48]	Kup,	Kpgup,	0,	Kleft,	0,	Kright,	0,	Kend,
 [0x50]	Kdown,	Kpgdown,Kins,	Kdel,	0,	0,	0,	0,
-[0x58]	0,	0,	0,	0,	0,	0,	0,	0,
+[0x58]	0,	0,	0,	Kglenda,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x70]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x78]	0,	Kup,	0,	0,	0,	0,	0,	0,
+[0x78]	0,	Kup,	0,	0,	0,	Kglenda,	0,	0,
 };
 
 Rune kbtabshiftesc1[Nscan] =
@@ -198,11 +199,11 @@
 [0x40]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x48]	Kup,	0,	0,	0,	0,	0,	0,	0,
 [0x50]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x58]	0,	0,	0,	0,	0,	0,	0,	0,
+[0x58]	0,	0,	0,	Kglenda,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x70]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x78]	0,	Kup,	0,	0,	0,	0,	0,	0,
+[0x78]	0,	Kup,	0,	0,	0,	Kglenda,	0,	0,
 };
 
 Rune kbtabctrlesc1[Nscan] =
@@ -218,11 +219,11 @@
 [0x40]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x48]	Kup,	0,	0,	0,	0,	0,	0,	0,
 [0x50]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x58]	0,	0,	0,	0,	0,	0,	0,	0,
+[0x58]	0,	0,	0,	Kglenda,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x70]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x78]	0,	Kup,	0,	0,	0,	0,	0,	0,
+[0x78]	0,	Kup,	0,	0,	0,	Kglenda,	0,	0,
 };
 
 Rune kbtabaltgr[Nscan] =
@@ -238,11 +239,11 @@
 [0x40]	0,	0,	0,	0,	0,	0,	Kbreak,	Khome,
 [0x48]	Kup,	Kpgup,	0,	Kleft,	0,	Kright,	0,	Kend,
 [0x50]	Kdown,	Kpgdown,Kins,	Kdel,	0,	0,	0,	0,
-[0x58]	0,	0,	0,	0,	0,	0,	0,	0,
+[0x58]	0,	0,	0,	Kglenda,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x70]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x78]	0,	Kup,	0,	0,	0,	0,	0,	0,
+[0x78]	0,	Kup,	0,	0,	0,	Kglenda,	0,	0,
 };
 
 Rune kbtabctl[Nscan] =
@@ -258,11 +259,11 @@
 [0x40]	'', 	'', 	'', 	'
', 	'', 	'', 	'', 	'', 
 [0x48]	'', 	'', 	'
', 	'', 	'', 	'', 	'', 	'', 
 [0x50]	'', 	'', 	'', 	'', 	0,	0,	0,	'', 
-[0x58]	'', 	0,	0,	0,	0,	0,	0,	0,
+[0x58]	'', 	0,	0,	Kglenda,	0,	0,	0,	0,
 [0x60]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x68]	0,	0,	0,	0,	0,	0,	0,	0,
 [0x70]	0,	0,	0,	0,	0,	0,	0,	0,
-[0x78]	0,	'', 	0,	'\b',	0,	0,	0,	0,
+[0x78]	0,	'', 	0,	'\b',	0,	Kglenda,	0,	0,
 };
 
 Rune kbtabshiftaltgr[Nscan] =
@@ -344,7 +345,7 @@
 	if(scan->esc2){
 		scan->esc2--;
 		return;
-	} else if(c == 0xe1 || c == 0xe2){
+	} else if(c == 0xe1 || c == 0xe2 || c == 0xe3){
 		scan->esc2 = 2;
 		return;
 	} else if(c == 0xe0){
@@ -362,6 +363,7 @@
 	if(c != 0 && strchr("GHIKMOPQRS", c) != nil)
 		scan->esc1 |= !scan->num;
 
+	key.r = 0;
 	if(scan->esc1 && scan->ctl && kbtabctrlesc1[c] != 0)
 		key.r = kbtabctrlesc1[c];
 	else if(scan->esc1 && scan->shift && kbtabshiftesc1[c] != 0)
@@ -412,6 +414,9 @@
 	case Kcaps:
 		scan->caps ^= key.down;
 		break;
+	case Kglenda:
+		scan->glenda ^= key.down;
+		break;
 	}
 	scan->esc1 = 0;
 }
@@ -464,7 +469,7 @@
 			}
 		}
 		/* button unknown to kbtab, use rune if no modifier keys are active */
-		if(k.b == 0 && !a->shift && !a->altgr && !a->ctl)
+		if(k.b == 0 && !a->shift && !a->altgr && !a->ctl && !a->glenda)
 			k.b = k.r;
 		if(k.r == Kshift)
 			a->shift = k.down;
@@ -472,6 +477,8 @@
 			a->altgr = k.down;
 		else if(k.r == Kctl)
 			a->ctl = k.down;
+		else if(k.r == Kglenda)
+			a->glenda = k.down;
 		send(keychan, &k);
 		break;
 
@@ -664,6 +671,7 @@
 		case Knum:
 		case Kshift:
 		case Kaltgr:
+		case Kglenda:
 			/* ignore modifiers */
 			continue;
 
diff -r 95e095480480 sys/src/cmd/rio/dat.h
--- a/sys/src/cmd/rio/dat.h	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/src/cmd/rio/dat.h	Sun Mar 29 15:03:32 2020 +0200
@@ -344,11 +344,15 @@
 char		*startdir;
 int		sweeping;
 int		wctlfd;
+int		gkbdfd;
+Channel*	gkbdc;
 char		srvpipe[];
 char		srvwctl[];
+char		srvgkbd[];
 int		errorshouldabort;
 int		menuing;		/* menu action is pending; waiting for window to be indicated */
 int		snarfversion;	/* updated each time it is written */
 int		messagesize;		/* negotiated in 9P version setup */
 int		shiftdown;
+int		glendadown;
 int		debug;
diff -r 95e095480480 sys/src/cmd/rio/fsys.c
--- a/sys/src/cmd/rio/fsys.c	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/src/cmd/rio/fsys.c	Sun Mar 29 15:03:32 2020 +0200
@@ -50,6 +50,7 @@
 
 char	srvpipe[64];
 char	srvwctl[64];
+char	srvgkbd[64];
 
 static	Xfid*	filsysflush(Filsys*, Xfid*, Fid*);
 static	Xfid*	filsysversion(Filsys*, Xfid*, Fid*);
@@ -115,6 +116,34 @@
 	return 0;
 }
 
+void
+gkbdproc(void *v)
+{
+	char *s;
+	int n, eofs;
+	Channel *c;
+
+	threadsetname("GKBDPROC");
+	c = v;
+
+	eofs = 0;
+	for(;;){
+		if((s = recvp(c)) == nil)
+			break;
+		n = write(gkbdfd, s, strlen(s));	/* room for \0 */
+		free(s);
+		if(n < 0)
+			break;
+		if(n == 0){
+			if(++eofs > 20)
+				break;
+			continue;
+		}
+		eofs = 0;
+	}
+	close(gkbdfd);
+}
+
 Filsys*
 filsysinit(Channel *cxfidalloc)
 {
@@ -152,6 +181,12 @@
 	post(srvwctl, "wctl", p0);
 	close(p0);
 
+	if(cexecpipe(&p0, &gkbdfd) < 0)
+		goto Rescue;
+	snprint(srvgkbd, sizeof(srvgkbd), "/srv/riogkbd.%s.%d", fs->user, pid);
+	post(srvgkbd, "gkbd", p0);
+	close(p0);
+
 	/*
 	 * Start server processes
 	 */
@@ -160,6 +195,12 @@
 		error("wctl channel");
 	proccreate(wctlproc, c, 4096);
 	threadcreate(wctlthread, c, 4096);
+
+	gkbdc = chancreate(sizeof(char*), 0);
+	if(gkbdc == nil)
+		error("gkbd channel");
+	proccreate(gkbdproc, gkbdc, 4096);
+
 	proccreate(filsysproc, fs, 10000);
 
 	/*
diff -r 95e095480480 sys/src/cmd/rio/rio.c
--- a/sys/src/cmd/rio/rio.c	Sat Mar 28 15:37:48 2020 +0100
+++ b/sys/src/cmd/rio/rio.c	Sun Mar 29 15:03:32 2020 +0200
@@ -340,13 +340,20 @@
 keyboardthread(void*)
 {
 	char *s;
+	int glendadownnew;
 
 	threadsetname("keyboardthread");
 
+	glendadownnew = 0;
 	while(s = recvp(kbdchan)){
-		if(*s == 'k' || *s == 'K')
+		if(*s == 'k' || *s == 'K'){
 			shiftdown = utfrune(s+1, Kshift) != nil;
-		if(input == nil || sendp(input->ck, s) <= 0)
+			glendadownnew = utfrune(s+1, Kglenda) != nil;
+		}
+		if(glendadown || glendadownnew){
+			glendadown = glendadownnew;
+			sendp(gkbdc, s);
+		}else if(input == nil || sendp(input->ck, s) <= 0)
 			free(s);
 	}
 }