code: 9ferno

Download patch

ref: 0ee70192a6748cb9adf572ac584ca7dd417cf1ef
parent: 3b9c359adee736531f204ac53500edf16d7c0fb2
author: 9ferno <gophone2015@gmail.com>
date: Mon Sep 13 06:21:54 EDT 2021

added consctl for raw mode

--- a/os/port/devcons.c
+++ b/os/port/devcons.c
@@ -406,9 +406,11 @@
 {
 	".",	{Qdir, 0, QTDIR},	0,		DMDIR|0555,
 	"cons",		{Qcons},	0,		0660,
+	"consctl",	{Qconsctl},	0,		0220,
 	"sysctl",	{Qsysctl},	0,		0644,
 	"drivers",	{Qdrivers},	0,		0444,
 	"hostowner",	{Qhostowner},	0,	0644,
+	"jit",		{Qjit},	0,	0666,
 	"keyboard",	{Qkeyboard},	0,		0666,
 	"klog",		{Qklog},	0,		0444,
 	"kprint",		{Qkprint},	0,		0444,
@@ -421,7 +423,6 @@
 	"sysname",	{Qsysname},	0,		0664,
 	"time",		{Qtime},	0,		0664,
 	"user",		{Quser},	0,	0644,
-	"jit",		{Qjit},	0,	0666,
 };
 
 ulong	boottime;		/* seconds since epoch at boot */
@@ -554,6 +555,15 @@
 	return devstat(c, dp, n, consdir, nelem(consdir), devgen);
 }
 
+static void
+flushkbdline(Queue *q)
+{
+	if(kbd.x){
+		qwrite(q, kbd.line, kbd.x);
+		kbd.x = 0;
+	}
+}
+
 static Chan*
 consopen(Chan *c, u32 omode)
 {
@@ -560,6 +570,14 @@
 	c->aux = nil;
 	c = devopen(c, omode, consdir, nelem(consdir), devgen);
 	switch((u64)c->qid.path){
+	case Qconsctl:
+		if(!iseve())
+			error(Eperm);
+		qlock(&kbd);
+		kbd.ctl++;
+		qunlock(&kbd);
+		break;
+
 	case Qkprint:
 		if(tas(&kprintinuse) != 0){
 			c->flag &= ~COPEN;
@@ -584,6 +602,14 @@
 consclose(Chan *c)
 {
 	switch((u64)c->qid.path){
+	case Qconsctl:
+		/* last close of control file turns off raw */
+		qlock(&kbd);
+		if(--kbd.ctl == 0)
+			kbd.raw = 0;
+		qunlock(&kbd);
+		break;
+
 	/* close of kprint allows other opens */
 	case Qkprint:
 		if(c->flag & COPEN){
@@ -773,7 +799,27 @@
 		break;
 
 	case Qconsctl:
-		error(Egreg);
+		if(n >= sizeof(buf))
+			n = sizeof(buf)-1;
+		strncpy(buf, a, n);
+		buf[n] = 0;
+		for(a = buf; a;){
+			if(strncmp(a, "rawon", 5) == 0){
+				qlock(&kbd);
+				flushkbdline(kbdq);
+				kbd.raw = 1;
+				qunlock(&kbd);
+			} else if(strncmp(a, "rawoff", 6) == 0){
+				qlock(&kbd);
+				kbd.raw = 0;
+				kbd.x = 0;
+				qunlock(&kbd);
+			}
+			if(a = strchr(a, ' '))
+				a++;
+		}
+		break;
+
 	
 	case Qtime:
 		if(n >= sizeof(buf))
@@ -1096,7 +1142,7 @@
 void
 kbdprocesschar(int ch)
 {
-	int s, c, i;
+	int c, i;
 	static int esc1, esc2;
 	static int alt, caps, ctl, num, shift;
 	static int collecting, nk;
@@ -1120,7 +1166,7 @@
 	if(c > sizeof kbtab){
 		c |= keyup;
 		if(c != 0xFF)	/* these come fairly often: CAPSLOCK U Y */
-			print("unknown key %ux\n", c);
+			print("kbdprocess: unknown key 0x%ux\n", c);
 		return;
 	}