home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume24 / mced / part01 / getch.c < prev    next >
C/C++ Source or Header  |  1991-10-26  |  3KB  |  151 lines

  1.  
  2. /*
  3.  * This software is Copyright (c) 1989, 1990, 1991 by Patrick J. Wolfe.
  4.  *
  5.  * Permission is hereby granted to copy, distribute or otherwise
  6.  * use any part of this package as long as you do not try to make
  7.  * money from it or pretend that you wrote it.  This copyright
  8.  * notice must be maintained in any copy made.
  9.  *
  10.  * Use of this software constitutes acceptance for use in an AS IS
  11.  * condition. There are NO warranties with regard to this software.
  12.  * In no event shall the author be liable for any damages whatsoever
  13.  * arising out of or in connection with the use or performance of this
  14.  * software.  Any use of this software is at the user's own risk.
  15.  *
  16.  * If you make modifications to this software that you feel
  17.  * increases it usefulness for the rest of the community, please
  18.  * email the changes, enhancements, bug fixes as well as any and
  19.  * all ideas to me. This software is going to be maintained and
  20.  * enhanced as deemed necessary by the community.
  21.  *
  22.  *              Patrick J. Wolfe
  23.  *              uunet!uiucuxc!kailand!pwolfe
  24.  *              pwolfe@kailand.kai.com
  25.  */
  26.  
  27. /*****************************************************************
  28.  * Modifications made by aknight to support emacs escape functions,
  29.  * Sun R function keys and vi escape, wiped out un-needed stuff
  30.  * for vt120, vt220
  31.  *****************************************************************/
  32.  
  33. #include "config.h"
  34.  
  35. #define NORMAL    100
  36. #define ESCAPE    200
  37. #define FKEY    300
  38.  
  39. extern int      edit_mode;
  40.  
  41.  
  42. int
  43. pwolfe_getch(winptr)
  44.     WINDOW         *winptr;
  45. {
  46.     char            c;
  47.     int             state = NORMAL;
  48.     int             fkeycount = 0;
  49.  
  50.     while (1)
  51.     {
  52.     c = wgetch(winptr);    /* call the real getch() */
  53.     switch (state)
  54.     {
  55.  
  56.     case FKEY:
  57.         switch (c)
  58.         {
  59.  
  60.         /* numeric function keys */
  61.         case '0':
  62.         case '1':
  63.         case '2':
  64.         case '3':
  65.         case '4':
  66.         case '5':
  67.         case '6':
  68.         case '7':
  69.         case '8':
  70.         case '9':
  71.         fkeycount = (fkeycount * 10) + (c - '0');
  72.         break;
  73.  
  74. /* lines deleted, aknight*/
  75.  
  76.         case 'A':
  77.         return KEY_UP;
  78.         case 'B':
  79.         return KEY_DOWN;
  80.         case 'C':
  81.         return KEY_RIGHT;
  82.         case 'D':
  83.         return KEY_LEFT;
  84.  
  85. /* added by aknight, R1 - R15 keys on Sun*/
  86.         case 'z':
  87.         return fkeycount + 1000;
  88.  
  89.         default:
  90.         beep();
  91.         state = NORMAL;
  92.         }
  93.         break;
  94.  
  95.     case ESCAPE:
  96.         switch (c)
  97.         {
  98.         case 'O':
  99.         case '[':
  100.         state = FKEY;
  101.         fkeycount = 0;
  102.         break;
  103. /* added by aknight, Escape - key functions */
  104.         case 'f':
  105.         return EscapeF;
  106.         case 'b':
  107.         return EscapeB;
  108.         case 'd':
  109.         return EscapeD;
  110.         case 'c':
  111.         return EscapeC;
  112.         case 'l':
  113.         return EscapeL;
  114.         case 'u':
  115.         return EscapeU;
  116.         case 'm':
  117.         return EscapeM;
  118.         case Delete:
  119.         return EscapeDEL;
  120.         case Escape:
  121.         state = ESCAPE;
  122.         break;
  123.  
  124.         default:
  125.         state = NORMAL;
  126.         beep();
  127.         }
  128.         break;
  129.  
  130.     default:
  131.         switch (c)
  132.         {
  133.         case Escape:
  134.         state = ESCAPE;
  135. /* added by aknight */
  136.         if (edit_mode == VI_INS_MODE || edit_mode == VI_R_MODE)
  137.             return Escape;
  138.         break;
  139.  
  140.         case CSI:
  141.         state = FKEY;
  142.         fkeycount = 0;
  143.         break;
  144.  
  145.         default:
  146.         return (c);
  147.         }
  148.     }
  149.     }
  150. }
  151.