home *** CD-ROM | disk | FTP | other *** search
/ Shareware 1 2 the Maxx / sw_1.zip / sw_1 / OS2 / BEAV132X.ZIP / KBD.C < prev    next >
C/C++ Source or Header  |  1992-01-06  |  4KB  |  184 lines

  1. /*                      KBD.C
  2. *       Terminal independent keyboard handling.
  3. */
  4. #include    "def.h"
  5.  
  6. char    *keystrings ();
  7.  
  8. extern    char    MSG_tab[];
  9. extern    char    MSG_esc[];
  10. extern    char    MSG_ctl_x[];
  11. extern    char    MSG_ctl[];
  12. extern    char    MSG_fn[];
  13. extern    char    MSG_ret[];
  14. extern    char    MSG_bksp[];
  15. extern    char    MSG_space[];
  16. extern    char    MSG_rubout[];
  17.  
  18.  
  19. /*
  20. * Read in a key, doing the terminal
  21. * independent prefix handling. The terminal specific
  22. * "getkbd" routine gets the first swing, and may return
  23. * one of the special codes used by the special keys
  24. * on the keyboard. The "getkbd" routine returns the
  25. * C0 controls as received; this routine moves them to
  26. * the right spot in 11 bit code.
  27. */
  28. int     getkey ()
  29. {
  30.  
  31.     register int    c;
  32.     c = getkbd ();
  33.     if (c == METACH)            /* M-           */
  34.     {
  35.         c = KMETA | getctl ();
  36. #ifdef VT100KEY
  37.         if ((c & KCHAR) == '[')
  38.             c = KMETA | KCTRL | KCTLX | getctl ();    /* flag VT100 sequence */
  39. #endif
  40.     }
  41.     else if (c == CTRLCH)        /* C-           */
  42.         c = KCTRL | getctl ();
  43.     else if (c == CTMECH)    /* C-M-         */
  44.         c = KCTRL | KMETA | getctl ();
  45.     else if (c >= 0x00 && c <= 0x1F)/* Relocate control.    */
  46.         c = KCTRL | (c + '@');
  47.  
  48.     if (c == (KCTRL | 'X'))     /* C-X          */
  49.         c = KCTLX | getctl ();
  50.     return (c);
  51. }
  52.  
  53.  
  54. /*
  55. * Used above.
  56. */
  57. int     getctl ()
  58. {
  59.  
  60.     register int    c;
  61.  
  62. #if 1
  63.     c = getkbd ();
  64.     if (c == METACH)            /* M-           */
  65.         c = KMETA | getctl ();
  66.     else
  67.         if (c == CTRLCH)        /* C-           */
  68.             c = KCTRL | getctl ();
  69.         else
  70.             if (c == CTMECH)    /* C-M-         */
  71.                 c = KCTRL | KMETA | getctl ();
  72.             else
  73.                 if (c >= 0x00 && c <= 0x1F)/* Relocate control.    */
  74.                     c = KCTRL | (c + '@');
  75. #else
  76.     c = getkey ();              /* Note recursion   */
  77.     if (ISLOWER (c & 0xFF))
  78.         c = (c & ~0xFF) | TOUPPER (c & 0xFF);
  79.     if (c >= 0x00 && c <= 0x1F) /* Relocate control.    */
  80.         c = KCTRL | (c + '@');
  81. #endif
  82.     if (ISLOWER (c & 0xFF))
  83.         c = (c & ~0xFF) | TOUPPER (c & 0xFF);
  84.     return (c);
  85. }
  86.  
  87.  
  88. /*
  89. * Transform a key code into a name,
  90. * using a table for the special keys and combination
  91. * of some hard code and some general processing for
  92. * the rest. None of this code is terminal specific any
  93. * more. This makes adding keys easier.
  94. */
  95. void keyname (cp, k)
  96. register char  *cp;
  97. register int    k;
  98. {
  99.     register char  *np;
  100.     char    nbuf[3];
  101.  
  102.     static char hex[] =
  103.     {
  104.         '0', '1', '2', '3',
  105.         '4', '5', '6', '7',
  106.         '8', '9', 'A', 'B',
  107.         'C', 'D', 'E', 'F'
  108.     };
  109.     *cp = 0;    /* terminate previous string */
  110. #ifdef VT100KEY
  111.     if ((k & (KMETA | KCTRL | KCTLX)) == (int)(KMETA | KCTRL | KCTLX))
  112.     {
  113.         sprintf (&cp[strlen (cp)], MSG_fn);
  114.         sprintf (&cp[strlen (cp)], "%c", k & KCHAR);
  115.         return;
  116.     }
  117. #endif
  118.     if (k & 0x800)
  119.     {
  120.         if ((np = keystrings (k)) != NULL)
  121.         {
  122.             if ((k & KMETA) != 0)
  123.                 sprintf (&cp[strlen (cp)], MSG_esc);
  124.  
  125.             strcat (cp, np);
  126.         }
  127.         else
  128.             cp[strlen (cp)] = 0;    /* null string */
  129.         return;
  130.     }
  131.  
  132.     if ((k & KCTLX) != 0)
  133.     {
  134.         /* Ctl-X prefix.      */
  135.         sprintf (&cp[strlen (cp)], MSG_ctl_x);
  136.         k &= ~KCTLX;
  137.     }
  138.  
  139.     if ((k & KMETA) != 0)
  140.     {
  141.         /* Add Esc- mark.     */
  142.         sprintf (&cp[strlen (cp)], MSG_esc);
  143.         k &= ~KMETA;
  144.     }
  145.  
  146.     if (k == (KCTRL | 'I'))/* Some specials.   */
  147.         np = MSG_tab;
  148.     else
  149.     {
  150.         if (k == (KCTRL | 'M'))
  151.             np = MSG_ret;
  152.         else if (k == (KCTRL | 'H'))
  153.             np = MSG_bksp;
  154.         else if (k == ' ')
  155.             np = MSG_space;
  156.         else if (k == 0x7F)
  157.             np = MSG_rubout;
  158.         else
  159.         {
  160.             if ((k & KCTRL) != 0)
  161.             {
  162.                 /* Add Ctl- mark.     */
  163.                 sprintf (&cp[strlen (cp)], MSG_ctl);
  164.             }
  165.             np = &nbuf[0];
  166.             if (((k & KCHAR) >= 0x20 && (k & KCHAR) <= 0x7E)
  167.                 || ((k & KCHAR) >= 0xA0 && (k & KCHAR) <= 0xFE))
  168.             {
  169.                 nbuf[0] = k & KCHAR;/* Graphic.     */
  170.                 nbuf[1] = 0;
  171.             }
  172.             else
  173.             {
  174.                 /* Non graphic.     */
  175.                 nbuf[0] = hex[(k >> 4) & 0x0F];
  176.                 nbuf[1] = hex[k & 0x0F];
  177.                 nbuf[2] = 0;
  178.             }
  179.         }
  180.     }
  181.     strcat (cp, np);
  182. }
  183.  
  184.