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;
}