shithub: cflood

Download patch

ref: b503317e6c71100ce331e24715d8cc538781840b
parent: 1ddcc3285eb5ade62c7ce95c800c0665981e3361
author: Sigrid Solveig Haflínudóttir <[email protected]>
date: Sun Dec 16 19:19:54 EST 2012

kbd/kbdbind: initial version

--- /dev/null
+++ b/kbd/kbdbind.c
@@ -1,0 +1,72 @@
+#include <u.h>
+#include <libc.h>
+
+enum {
+	NumF = 12
+};
+
+static char *funcs[NumF];
+
+void main(int, char**) {
+	funcs[0] = "Fi";
+	funcs[1] = "Ru";
+	funcs[2] = "window";
+
+	int in = open("/dev/kbd", OREAD);
+	if(in < 0)
+		sysfatal("open failed: %r");
+
+	int p[2];
+	pipe(p);
+	int fd = create("/srv/kbdbind", OWRITE, 0600);
+	if(fd < 0)
+		sysfatal("create failed: %r");
+	fprint(fd, "%d", p[0]);
+	close(fd);
+	close(p[0]);
+	int out = p[1];
+
+	for(;;) {
+		uchar b[128];
+		long size = read(in, b, sizeof(b));
+
+		if(size < 0)
+			break;
+		for(long i = 0; i < size;) {
+			int isfunc =
+				size >= 5 &&
+				(b[i] == 'k' || b[i] == 'c') &&
+				b[i+1] == 0xef &&
+				b[i+2] == 0x80 &&
+				(b[i+3] >= 0x81 && b[i+3] <= (0x81+NumF));
+			int funcid = isfunc ? b[i+3] - 0x81 : -1;
+
+			if(funcid < 0 || funcs[funcid] == nil) {
+				int k = i;
+				for(; i < size; i++) {
+					if(!b[i]) {
+						i++;
+						break;
+					}
+				}
+				if(i - k > 0) {
+					write(out, &b[k], i - k);
+				}
+			} else {
+				int down = b[i] == 'k';
+				i += 5;
+				if(!down)
+					continue;
+				switch(rfork(RFFDG|RFREND|RFPROC|RFNOWAIT)) {
+				case 0:
+					if(execl("/bin/rc", "/bin/rc", funcs[funcid], 0) < 0)
+						fprint(2, "execl failed: %r");
+					break;
+				case -1:
+					fprint(2, "rfork failed: %r");
+					break;
+				}
+			}
+		}
+	}
+}
--- /dev/null
+++ b/kbd/mkfile
@@ -1,0 +1,7 @@
+</$objtype/mkfile
+
+TARG=kbdbind
+OFILES=kbdbind.$O
+BIN=/$objtype/bin
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/kbd/rio-kbd-file-option.patch
@@ -1,0 +1,92 @@
+diff -r 9e12b43399af sys/man/1/rio
+--- a/sys/man/1/rio	Fri Dec 14 17:16:50 2012 +0100
++++ b/sys/man/1/rio	Sun Dec 16 22:38:55 2012 +0100
+@@ -10,6 +10,9 @@
+ .BI "-k '"kbdcmd '
+ ]
+ [
++.BI "-K '"kbdfile '
++]
++[
+ .B -s
+ ]
+ [
+@@ -89,6 +92,14 @@
+ program described in
+ .IR bitsyload (1)
+ is the usual choice.
++The
++.B -K
++option instructs
++.I rio
++to read keyboard input from
++.I kbdfile
++instead of a default
++.BR /dev/kbd .
+ .PP
+ The
+ .B -s
+diff -r 9e12b43399af sys/man/4/rio
+--- a/sys/man/4/rio	Fri Dec 14 17:16:50 2012 +0100
++++ b/sys/man/4/rio	Sun Dec 16 22:38:55 2012 +0100
+@@ -12,6 +12,10 @@
+ .BI ' kbdcmd '
+ ]
+ [
++.B -K
++.BI ' kbdfile '
++]
++[
+ .B -s
+ ]
+ [
+diff -r 9e12b43399af sys/src/cmd/rio/rio.c
+--- a/sys/src/cmd/rio/rio.c	Fri Dec 14 17:16:50 2012 +0100
++++ b/sys/src/cmd/rio/rio.c	Sun Dec 16 22:38:55 2012 +0100
+@@ -45,6 +45,7 @@
+ Channel* initkbd(void);
+ 
+ char		*fontname;
++char		*kbdname;
+ 
+ enum
+ {
+@@ -112,7 +113,7 @@
+ void
+ usage(void)
+ {
+-	fprint(2, "usage: rio [-b] [-f font] [-i initcmd] [-k kbdcmd] [-s]\n");
++	fprint(2, "usage: rio [-b] [-f font] [-i initcmd] [-k kbdcmd] [-K kbdfile] [-s]\n");
+ 	exits("usage");
+ }
+ 
+@@ -153,6 +154,11 @@
+ 		if(kbdin == nil)
+ 			usage();
+ 		break;
++	case 'K':
++		kbdname = ARGF();
++		if(kbdname == nil)
++			usage();
++		break;
+ 	case 's':
+ 		scrolling = TRUE;
+ 		break;
+@@ -164,6 +170,8 @@
+ 		startdir = estrdup(buf);
+ 	if(fontname == nil)
+ 		fontname = getenv("font");
++	if(kbdname == nil)
++		kbdname = "/dev/kbd";
+ 	s = getenv("tabstop");
+ 	if(s != nil)
+ 		maxtab = strtol(s, nil, 0);
+@@ -1302,7 +1310,7 @@
+ 	if(sendp(c, nil) <= 0)
+ 		return;
+ 
+-	if((kfd = open("/dev/kbd", OREAD)) >= 0){
++	if((kfd = open(kbdname, OREAD)) >= 0){
+ 		close(fd);
+ 
+ 		/* read kbd state */