]> Zhao Yanbai Git Server - minix.git/commitdiff
Console function keys and color support:
authorDavid van Moolenbroek <david@minix3.org>
Tue, 22 Dec 2009 23:30:50 +0000 (23:30 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 22 Dec 2009 23:30:50 +0000 (23:30 +0000)
- if "debug_fkeys" boot monitor variable is set to 0:
  - pass Fn, Shift+Fn, Ctrl+Fn, Shift+Ctrl+Fn to applications
  - don't start IS
- update termcap files with function key, color, end key support

drivers/tty/keyboard.c
etc/rc
etc/termcap
etc/termcap.big

index ea5de57cf3a4cd5156e3096a60ea072695e8b810..cef8135431e963bfd8c2cb102dcaa70b9cdb53c8 100644 (file)
@@ -104,6 +104,10 @@ PRIVATE int locks[NR_CONS];        /* per console lock keys state */
 PRIVATE char numpad_map[] =
                {'H', 'Y', 'A', 'B', 'D', 'C', 'V', 'U', 'G', 'S', 'T', '@'};
 
+PRIVATE char *fkey_map[] =
+               {"11", "12", "13", "14", "15", "17",    /* F1-F6 */
+                "18", "19", "20", "21", "23", "24"};   /* F7-F12 */
+
 /* Variables and definition for observed function keys. */
 typedef struct observer { int proc_nr; int events; } obs_t;
 PRIVATE obs_t  fkey_obs[12];   /* observers for F1-F12 */
@@ -139,7 +143,8 @@ PRIVATE struct kbd_outack
 
 PRIVATE int kbd_watchdog_set= 0;
 PRIVATE int kbd_alive= 1;
-PRIVATE int sticky_alt_mode = 0;
+PRIVATE long sticky_alt_mode = 0;
+PRIVATE long debug_fkeys = 1;
 PRIVATE timer_t tmr_kbd_wd;
 
 FORWARD _PROTOTYPE( void handle_req, (struct kbd *kbdp, message *m)    );
@@ -561,7 +566,7 @@ tty_t *tp;
 int try;
 {
 /* Process characters from the circular keyboard buffer. */
-  char buf[3];
+  char buf[7], *p, suffix;
   int scode;
   unsigned ch;
 
@@ -577,8 +582,8 @@ int try;
        if (itail == ibuf + KB_IN_BYTES) itail = ibuf;
        icount--;
 
-       /* Function keys are being used for debug dumps. */
-       if (func_key(scode)) continue;
+       /* Function keys are being used for debug dumps (if enabled). */
+       if (debug_fkeys && func_key(scode)) continue;
 
        /* Perform make/break processing. */
        ch = make_break(scode);
@@ -595,6 +600,34 @@ int try;
                buf[2] = numpad_map[ch - HOME];
                (void) in_process(tp, buf, 3);
        } else
+       if ((F1 <= ch && ch <= F12) || (SF1 <= ch && ch <= SF12) ||
+                               (CF1 <= ch && ch <= CF12 && !debug_fkeys)) {
+               /* An escape sequence generated by function keys. */
+               if (F1 <= ch && ch <= F12) {
+                       ch -= F1;
+                       suffix = 0;
+               } else
+               if (SF1 <= ch && ch <= SF12) {
+                       ch -= SF1;
+                       suffix = '2';
+               } else
+               if (CF1 <= ch && ch <= CF12) {
+                       ch -= CF1;
+                       suffix = shift ? '6' : '5';
+               }
+               /* ^[[11~ for F1, ^[[24;5~ for CF12 etc */
+               buf[0] = ESC;
+               buf[1] = '[';
+               buf[2] = fkey_map[ch][0];
+               buf[3] = fkey_map[ch][1];
+               p = &buf[4];
+               if (suffix) {
+                       *p++ = ';';
+                       *p++ = suffix;
+               }
+               *p++ = '~';
+               (void) in_process(tp, buf, p - buf);
+       } else
        if (ch == ALEFT) {
                /* Choose lower numbered console as current console. */
                select_console(ccurrent - 1);
@@ -963,12 +996,9 @@ PUBLIC void kb_init_once(void)
 {
   int i;
   u8_t ccb;
-  char env[100];
 
-  if(env_get_param("sticky_alt", env, sizeof(env)-1) == OK
-   && atoi(env) == 1) {
-        sticky_alt_mode = 1; 
-  }
+  env_parse("sticky_alt", "d", 0, &sticky_alt_mode, 0, 1);
+  env_parse("debug_fkeys", "d", 0, &debug_fkeys, 0, 1);
 
   set_leds();                  /* turn off numlock led */
   scan_keyboard(NULL, NULL);   /* discard leftover keystroke */
diff --git a/etc/rc b/etc/rc
index 4e9b0286e6fa3d9384e656e7a36d91170cbea45e..0b48a651551f875cea622202a541a79407356a76 100755 (executable)
--- a/etc/rc
+++ b/etc/rc
@@ -51,7 +51,10 @@ start)
     # National keyboard?
     test -f /etc/keymap && loadkeys /etc/keymap
 
-    up is -period 5HZ
+    if [ "`sysenv debug_fkeys`" != 0 ]
+    then
+        up is -period 5HZ
+    fi
     echo .
 
     # Set timezone.
index 9693e9316f89bf92075f418ae77d23307b317f3d..3f7464220ae844aabed1244fce1653fe1ecd5760 100755 (executable)
@@ -1,13 +1,15 @@
 mx|minix|minix console:\
        :am:xn:bs:\
        :co#80:li#25:\
+       :cr=^M:nw=^M^J:\
+       :bl=^G:\
        :is=\E[0m:\
        :cd=\E[0J:cl=\E[H\E[0J:\
        :so=\E[7m:se=\E[0m:\
        :us=\E[4m:ue=\E[0m:\
        :mb=\E[5m:md=\E[1m:\
        :mr=\E[7m:me=\E[0m:\
-       :sr=\EM:\
+       :sr=\EM:sf=^J:\
        :cm=\E[%i%d;%dH:\
        :ho=\E[H:\
        :al=\E[L:AL=\E[%dL:\
@@ -16,7 +18,7 @@ mx|minix|minix console:\
        :DL=\E[%dM:dl=\E[M:\
        :DO=\E[%dB:do=\E[B:\
        :IC=\E[%d@:ic=\E[@:\
-       :it#8:\
+       :it#8:ta=^I:\
        :le=^H:LE=\E[%dD:\
        :nd=\E[C:RI=\E[%dC:\
        :up=\E[A:UP=\E[%dA:\
@@ -24,7 +26,15 @@ mx|minix|minix console:\
        :kl=\E[D:kr=\E[C:\
        :kh=\E[H:kb=^H:\
        :kD=\177:kI=\E[@:\
-       :kN=\E[U:kP=\E[V:
+       :kN=\E[U:kP=\E[V:\
+       :@7=\E[Y:\
+       :k1=\E[11~:k2=\E[12~:\
+       :k3=\E[13~:k4=\E[14~:\
+       :k5=\E[15~:k6=\E[17~:\
+       :k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:k;=\E[21~:\
+       :Co#8:pa#64:\
+       :AB=\E[4%dm:AF=\E[3%dm:
 du|dialup|Dialup line:\
        :bs:co#80:li#24:
 db|dumb|Really dumb terminal:\
index fe6bbaad1bed48dcf77751dba5bb007a12f5a761..9f5818e6c59359c7eb5799e7378e1011fc03d001 100644 (file)
@@ -12524,7 +12524,7 @@ osexec|Osborne executive:\
        :kb=^H:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:nl=^J:se=\Ek:\
        :so=\Ej:st=\E1:ue=\Em:up=^K:us=\El:
 
-#### Console types for obsolete UNIX clones
+#### Console types for obsolete and not-so-obsolete UNIX clones
 #
 # Coherent, Minix, Venix, and several lesser-known kin were OSs for 8088
 # machines that tried to emulate the UNIX look'n'feel.  Coherent and Venix
@@ -12538,19 +12538,21 @@ osexec|Osborne executive:\
 # even as single processes under SunOS and the Macintosh OS.
 #
 
-# This is the entry provided with minix 1.7.4, with bogus :ri: removed.
-minix|minix console (v1.7):\
-       :am:xn:\
+# This is the entry provided with MINIX 3.1.6.
+minix|minix console:\
+       :am:xn:bs:\
        :co#80:it#8:li#25:\
        :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
        :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:cd=\E[0J:\
        :ce=\E[K:cl=\E[H\E[0J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:\
-       :dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:is=\E[0m:k0=\E[Y:\
-       :k1=\E[V:k2=\E[U:k3=\E[T:k4=\E[S:k5=\E[G:kb=^H:kd=\E[B:\
-       :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:l0=End:l1=PgUp:l2=PgDn:\
-       :l3=Num +:l4=Num -:l5=Num 5:le=^H:mb=\E[5m:md=\E[1m:\
-       :me=\E[0m:mr=\E[7m:nd=\E[C:nw=^M^J:se=\E[0m:sf=^J:so=\E[7m:\
-       :sr=\EM:ta=^I:ue=\E[0m:up=\E[A:us=\E[4m:
+       :dl=\E[M:do=\E[B:ho=\E[H:ic=\E[@:is=\E[0m:k1=\E[11~:\
+       :k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:\
+       :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\177:\
+       :kI=\E[@:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[0m:\
+       :mr=\E[7m:nd=\E[C:nw=^M^J:se=\E[0m:sf=^J:so=\E[7m:\
+       :sr=\EM:ta=^I:ue=\E[0m:up=\E[A:us=\E[4m:@7=\E[Y:\
+       :Co#8:pa#64:AB=\E[4%dm:AF=\E[3%dm:
 # Corrected Jan 14, 1997 by Vincent Broman <broman@nosc.mil>
 minix-old|minix console (v1.5):\
        :xo:\