home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_01 / 8n01096a < prev    next >
Text File  |  1990-02-19  |  2KB  |  87 lines

  1. *****Listing 3*****
  2.  
  3. /*
  4.  *  keys.c -    gets arrow and function keys from termcap,
  5.  *        returns terminfo codes
  6.  *        changes quit key for use as arrow
  7.  *
  8.  *         define NO_SYSV for versions of curses that do not look up
  9.  *             arrow & function keys from termcap
  10.  *
  11.  *  copyright 1988 Ronald Florence
  12.  *  changed VMIN & VTIME for wy99 @ 9600 ron@mlfarm (7/11/88)
  13.  */
  14.  
  15. #include <curses.h>
  16. #ifndef KEY_DOWN
  17. #include "keys.h"
  18. #endif
  19.  
  20. #define NKEYS    16
  21.  
  22. char    
  23. #ifdef NO_SYSV
  24.   *tcap_ids[] = {
  25.     "kd", "ku", "kl", "kr", "kh", "kb",
  26.     "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9", 0
  27.     },
  28. #endif
  29.   *fkeys[NKEYS];
  30.     
  31. lookupkeys()
  32. {
  33. #ifdef NO_SYSV
  34.   static char    sbuf[256];
  35.   char    **key, tbuf[1024], *fill = sbuf, *tgetstr(); 
  36.   int    i = 0;
  37.  
  38.   tgetent(tbuf, ttytype);
  39.   for (key = tcap_ids; *key; ++key) 
  40.     fkeys[i++] = tgetstr(*key, &fill);
  41. #else
  42.   fkeys[0] = KD;
  43.   fkeys[1] = KU;
  44.   fkeys[2] = KL;
  45.   fkeys[3] = KR;
  46.   fkeys[4] = KH;
  47.   fkeys[5] = KB;
  48.   fkeys[6] = K0;
  49.   fkeys[7] = K1;
  50.   fkeys[8] = K2;
  51.   fkeys[9] = K3;
  52.   fkeys[10] = K4;
  53.   fkeys[11] = K5;
  54.   fkeys[12] = K6;
  55.   fkeys[13] = K7;
  56.   fkeys[14] = K8;
  57.   fkeys[15] = K9;
  58. #endif
  59.   fixquit();
  60. }    
  61.  
  62.  
  63. getkey()
  64. {
  65.   char    cmd[6];
  66.   register    k;
  67.   
  68.   k = read(0, cmd, 6);
  69.   cmd[k] = '\0';
  70.   for (k = 0; k < NKEYS; k++)   
  71.     if (strcmp(cmd, fkeys[k]) == 0)
  72.       return (k + KEY_DOWN);
  73.   return ((int) *cmd);
  74. }
  75.  
  76.  
  77. fixquit()
  78. {
  79.   struct termio    new;
  80.  
  81.   ioctl(0, TCGETA, &new);
  82.   new.c_cc[VQUIT] = 0xff;    /* in case QUIT is an arrow */
  83.   new.c_cc[VTIME] = 1;        /* minimum timeout */
  84.   new.c_cc[VMIN] = 3;        /* three characters satisfy */
  85.   ioctl(0, TCSETA, &new);
  86. }
  87.