shithub: riow

ref: 02d71d923ec7712d47e5a41db82441776d793407
dir: riow/9front.diff

View raw version
diff -r ab6ef2653d12 sys/src/cmd/rio/dat.h
--- a/sys/src/cmd/rio/dat.h	Mon Dec 07 15:15:02 2020 +0100
+++ b/sys/src/cmd/rio/dat.h	Mon Dec 07 15:56:46 2020 +0100
@@ -346,11 +346,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		mod4down;
 int		debug;
diff -r ab6ef2653d12 sys/src/cmd/rio/fsys.c
--- a/sys/src/cmd/rio/fsys.c	Mon Dec 07 15:15:02 2020 +0100
+++ b/sys/src/cmd/rio/fsys.c	Mon Dec 07 15:56:46 2020 +0100
@@ -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)
 {
@@ -142,6 +171,12 @@
 	post(srvwctl, "wctl", p0);
 	close(p0);
 
+	if(cexecpipe(&p0, &gkbdfd) < 0)
+		goto Rescue;
+	snprint(srvgkbd, sizeof(srvgkbd), "/srv/riogkbd.%s.%lud", fs->user, (ulong)getpid());
+	post(srvgkbd, "gkbd", p0);
+	close(p0);
+
 	/*
 	 * Start server processes
 	 */
@@ -150,6 +185,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 ab6ef2653d12 sys/src/cmd/rio/rio.c
--- a/sys/src/cmd/rio/rio.c	Mon Dec 07 15:15:02 2020 +0100
+++ b/sys/src/cmd/rio/rio.c	Mon Dec 07 15:56:46 2020 +0100
@@ -340,13 +340,20 @@
 keyboardthread(void*)
 {
 	char *s;
+	int mod4downnew;
 
 	threadsetname("keyboardthread");
 
+	mod4downnew = 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)
+			mod4downnew = utfrune(s+1, Kmod4) != nil;
+		}
+		if(mod4down || mod4downnew){
+			mod4down = mod4downnew;
+			sendp(gkbdc, s);
+		}else if(input == nil || sendp(input->ck, s) <= 0)
 			free(s);
 	}
 }