⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kb_input.c

📁 功能强大的文本编辑器
💻 C
📖 第 1 页 / 共 5 页
字号:
                  case 'V': return KEY_PGUP ; break;
                  case 'U': return KEY_PGDN ; break;

                  case 'a': return KEY_UP   ; break;   /* CTRL_UP */
                  case 'b': return KEY_DOWN ; break;   /* CTRL_DOWN */
                  case 'c': return CTRL_RIGHT; break;
                  case 'd': return CTRL_LEFT ; break;

                  case 'h': return CTRL_HOME ; break;
                  case '`': return KEY_INS  ; break;   /* CTRL_INS */
                  case 'p': return KEY_DEL  ; break;   /* CTRL_DEL */
                  case 'y': return CTRL_END  ; break;
                  case 'v': return CTRL_PGUP ; break;
                  case 'u': return CTRL_PGDN ; break;

                  case '1':
                  case '2':
                  case '3':
                  case '4':
                  case '5':
                  case '6':
                  case '7':
                  case '8':
                     value = key - '0';    /* build a 1- or 2-digit-number */
                     for (ii = 0 ; ii < 2 ; ii++)  /* read next bytes */
                     {
                        key = get_1_byte ();
                        if (key == '~') break;     /* last char in sequence */
                        value = 10 * value + (key - '0');
                     }

                     switch (value)
                     {
                        case 1: return CTRL_F1   ; break;
                        case 2: return CTRL_F2   ; break;
                        case 3: return CTRL_F3   ; break;
                        case 4: return CTRL_F4   ; break;
                        case 5: return CTRL_F5   ; break;
                        case 6: return CTRL_F6   ; break;
                        case 7: return CTRL_F7   ; break;
                        case 8: return CTRL_F8   ; break;
                        case 9: return CTRL_F9   ; break;
                        case 10: return CTRL_F10   ; break;

                        case 17: return ALT_F1   ; break;
                        case 18: return ALT_F2   ; break;
                        case 19: return ALT_F3   ; break;
                        case 20: return ALT_F4   ; break;
                        case 21: return ALT_F5   ; break;
                        case 22: return ALT_F6   ; break;
                        case 23: return ALT_F7   ; break;
                        case 24: return ALT_F8   ; break;
                        case 25: return ALT_F9   ; break;
                        case 26: return ALT_F10   ; break;

                        default: return INVALID  ; break;
                     }

                  default:
                     return INVALID;
                     break;                  
               }
               break;

            case 'O':           /* <PF> keys */
               key = get_1_byte ();
               switch (key)
               {
                  case 'P': return KEY_F1; break;
                  case 'Q': return KEY_F2; break;
                  case 'R': return KEY_F3; break;
                  case 'S': return KEY_F4; break;

                  case 'T': return KEY_F5; break;
                  case 'U': return KEY_F6; break;
                  case 'V': return KEY_F7; break;
                  case 'W': return KEY_F8; break;

                  case 'X': return KEY_F9; break;
                  case 'Y': return KEY_F10; break;
                  case 'Z': return KEY_F11; break;
                  case 'A': return KEY_F12; break;

                  case 'p': return SHIFT_F1; break;
                  case 'q': return SHIFT_F2; break;
                  case 'r': return SHIFT_F3; break;
                  case 's': return SHIFT_F4; break;

                  case 't': return SHIFT_F5; break;
                  case 'u': return SHIFT_F6; break;
                  case 'v': return SHIFT_F7; break;
                  case 'w': return SHIFT_F8; break;

                  case 'x': return SHIFT_F9; break;
                  case 'y': return SHIFT_F10; break;

                  default:  return INVALID; break;
               }
               break;

            case 'N':           /* ALT keys */
               key = get_1_byte ();
               switch (key)
               {
                  case 'a': return ALT_A; break;
                  case 'b': return ALT_B; break;
                  case 'c': return ALT_C; break;
                  case 'd': return ALT_D; break;
                  case 'e': return ALT_E; break;
                  case 'f': return ALT_F; break;
                  case 'g': return ALT_G; break;
                  case 'h': return ALT_H; break;
                  case 'i': return ALT_I; break;
                  case 'j': return ALT_J; break;
                  case 'k': return ALT_K; break;
                  case 'l': return ALT_L; break;
                  case 'm': return ALT_M; break;
                  case 'n': return ALT_N; break;
                  case 'o': return ALT_O; break;
                  case 'p': return ALT_P; break;
                  case 'q': return ALT_Q; break;
                  case 'r': return ALT_R; break;
                  case 's': return ALT_S; break;
                  case 't': return ALT_T; break;
                  case 'u': return ALT_U; break;
                  case 'v': return ALT_V; break;
                  case 'w': return ALT_W; break;
                  case 'x': return ALT_X; break;
                  case 'y': return ALT_Y; break;
                  case 'z': return ALT_Z; break;

                  default:  return INVALID; break;
               }
               break;

            default:                  /* <esc> followed by any other char */
               esc_buff = key;        /* may also be a new <esc> sequence */
               return 0x1b;
               break;
         }  /* switch (key) */
      }  /* <esc> sequence */
   }  /* check for <esc> sequence */
   else
   {               
      return key;              /* send directly */ 
   }

}  /* loc_get_1_int */

#else   /* QNX pterm ansi */

/* -FF-  */

/*****************************************/
/*                                       */
/*    VT 100 / VT 220 - Terminal         */
/*                                       */
/*****************************************/


/************************/
/*  get 1 key stroke    */
/************************/

static int loc_get_1_int (void)
{
/* translation from <esc> sequences in one single (negativ) int */

/* special keys (function, cursor keys, ...) are transferred as */
/* <esc> sequence with variable no of chars.                    */
/* This functions returns special keys in one (modified) int.   */

#define ALLOW_SLOW_CONNECTIONS 1   /* to surround problems with <ESC>s */
                                   /* @@ implement time survey !! */

int ii, last_key, result, value;

static int key;
static int esc_buff;   /* if a single <esc> is followed by a sequence,  */
                       /* this event must be handled in special manner. */ 

static int old_mode_flag, old_text_area, old_toggle;
static time_t act_time, esc_time, delta_time;
#define MAX_ESC_TIME 5   /* LSB = 1 Sec. */
char err_text [20];

#define ANSI_TERMINAL 1       /* <== 1 for SCO-Unix */
#define HP7_XTERM     1       /* <== 1 for hp 700   */


/* NEU !! */
   last_key = key;


/* NEU ! output buffer leerraeumen */
   fflush (stdout);


/* is there still a char in the queue ? */
   if (esc_buff)
   {
      key = esc_buff;        /* take it */
      esc_buff = 0;          /* clear buffer */
   }
   else
   {
      key = get_1_byte ();   /* get new byte from stdin */
   }


/* EOF bei input redirection ? */
   key = check_end_of_file (key);


/* input from file ? */
   if (input_redirected)
      return key;


/* <esc> handling */
#if (!ALLOW_SLOW_CONNECTIONS)
   if (key == 0x1b)            /* is it <esc> ? */
#else
   if ((key == 0x1b) ||
       ((key == '[') && (last_key == 0x1b)))
#endif
   {
   /* are there characters following immediately ? */
      if (key == 0x1b)
      {
         esc_time = time (NULL);
         result = get_1_byte_with_timeout (esc_waittime);
      }
      else
      {
      /* sequence: <esc> '[' (until now) */

      /* check time since <esc> */
         act_time = time (NULL);
         delta_time = act_time - esc_time;

         if (delta_time > MAX_ESC_TIME)
         {
            result = -1;   /* absolute timeout */
         }
         else
         {
            result = key;   /* '[' */
            if (old_mode_flag || old_text_area || old_toggle)
            {                             /* gimme just a little more time */
               esc_waittime = max (esc_waittime, 50);    /* min. 50 msec   */
               esc_waittime = (esc_waittime * 16) / 10;  /* factor 1.6     */
               esc_waittime = min (esc_waittime, 1000);  /* max. 1000 msec */
               sprintf (err_text, " (AE=%d msec)", esc_waittime);
               err_message_1 (ESCAPE_SEQUENCE_ERROR, err_text);
            }
         }
      }
                                       /* != 0, if in:                   */
      old_mode_flag = mode_flag;       /* insert / exchange mode         */
      old_text_area = text_area;       /* status line 2 / history window */
      old_toggle    = save_d.toggle;   /* 'B'uffer / 'D'elete            */


      if (result < 0)           /* timeout ? */
      {                         /* yes : single <esc> */
         return key;            /* send it ! */
      }
      else                      /* no : <esc> sequence */
      {
         key = result;          /* get following byte */
         switch (key)
         {
            case '[':
               key = get_1_byte ();
               switch (key)
               {
                  case 'A': return KEY_UP   ; break;   /* cursor keys */
                  case 'B': return KEY_DOWN ; break;
                  case 'C': return KEY_RIGHT; break;
                  case 'D': return KEY_LEFT ; break;

                  case '1':
                  case '2':
                  case '3':
                  case '4':
                  case '5':
                  case '6':
                  case '7':
                  case '8':
                     value = key - '0';    /* build a 1- or 2-digit-number */
                     for (ii = 0 ; ii < 2 ; ii++)  /* read next bytes */
                     {
                        key = get_1_byte ();
                        if (key == '~') break;     /* last char in sequence */
                        value = 10 * value + (key - '0');
                     }

                     switch (value)
                     {
                        case  1: return KEY_HOME ; break;
                        case  2: return KEY_INS  ; break;
                        case  3: return KEY_DEL  ; break;
                        case  4: return KEY_END  ; break;
                        case  5: return KEY_PGUP ; break;
                        case  6: return KEY_PGDN ; break;
                        case  7: return KEY_END  ; break;  /* hp / SCO */
                        case  8: return KEY_HOME ; break;  /* hp / SCO */

#if (HP7_XTERM)
                        case 11: return KEY_F1   ; break; /* HP7 XTERM F1 */
                        case 12: return KEY_F2   ; break; /* HP7 XTERM F2 */
                        case 13: return KEY_F3   ; break; /* HP7 XTERM F3 */
                        case 14: return KEY_F4   ; break; /* HP7 XTERM F4 */
                        case 15: return KEY_F5   ; break; /* HP7 XTERM F5 */
#endif

                        case 17: return KEY_F6   ; break;
                        case 18: return KEY_F7   ; break;
                        case 19: return KEY_F8   ; break;
                        case 20: return KEY_F9   ; break;
                        case 21: return KEY_F10  ; break;
                        case 23: return KEY_F11  ; break;
                        case 24: return KEY_F12  ; break;
                        
                        case 25: return KEY_F13  ; break;
                        case 26: return KEY_F14  ; break;
                        case 28: return KEY_HELP ; break;
                        case 29: return KEY_DO   ; break;
                        
                        case 31: return KEY_F17  ; break;
                        case 32: return KEY_F18  ; break;
                        case 33: return KEY_F19  ; break;
                        case 34: return KEY_F20  ; break;

#if (HP7_XTERM)
                        case 50: return CTRL_PGUP  ; break; /* HP7 */
                        case 51: return CTRL_HOME  ; break; /* w/ customized */
                        case 52: return CTRL_PGDN  ; break; /* xterm */
                        case 53: return CTRL_END   ; break; /* */
                        case 54: return CTRL_RIGHT ; break; /* */
                        case 55: return CTRL_LEFT  ; break; /* */

                        case 60: return ALT_F1     ; break; /* HP7 */
                        case 61: return ALT_F2     ; break; /* w/ customized */
                        case 62: return ALT_F3     ; break; /* xterm */
                        case 63: return ALT_F4     ; break; /* */
                        case 64: return ALT_F5     ; break; /* */
                        case 65: return ALT_F6     ; break; /* */
                        case 66: return ALT_F7     ; break; /* HP7 */
                        case 67: return ALT_F8     ; break; /* w/ customized */
                        case 68: return ALT_F9     ; break; /* xterm */
                        case 69: return ALT_F10    ; break; /* */
#endif

                        default: return INVALID  ; break;
                     }

#if (ANSI_TERMINAL)
                  case 'H': return KEY_HOME ; break;
                  case 'L': return KEY_INS  ; break;
                  case 'F': return KEY_END  ; break;
                  case 'I': return KEY_PGUP ; break;
                  case 'G': return KEY_PGDN ; break;

                  case 'M': return KEY_F1   ; break;
                  case 'N': return KEY_F2   ; break;
                  case 'O': return KEY_F3   ; break;
                  case 'P': return KEY_F4   ; break;
                  case 'Q': return KEY_F5   ; break;
                  case 'R': return KEY_F6   ; break;
                  case 'S': return KEY_F7   ; break;
                  case 'T': return KEY_F8   ; break;
                  case 'U': return KEY_F9   ; break;
                  case 'V': return KEY_F10  ; break;
                  case 'W': return KEY_F11  ; break;
                  case 'X': return KEY_F12  ; break;

                  case 'Y': return SHIFT_F1 ; break;
                  case 'Z': return SHIFT_F2 ; break;
                  case 'a': return SHIFT_F3 ; break;
                  case 'b': return SHIFT_F4 ; break;
                  case 'c': return SHIFT_F5 ; break;
                  case 'd': return SHIFT_F6 ; break;
                  case 'e': return SHIFT_F7 ; break;
                  case 'f': return SHIFT_F8 ; break;
                  case 'g': return SHIFT_F9 ; break;
                  case 'h': return SHIFT_F10; break;
                  case 'i': return INVALID  ; break;
                  case 'j': return INVALID  ; break;

                  case 'k': return CTRL_F1  ; break;
                  case 'l': return CTRL_F2  ; break;
                  case 'm': return CTRL_F3  ; break;
                  case 'n': return CTRL_F4  ; break;
                  case 'o': return CTRL_F5  ; break;
                  case 'p': return CTRL_F6  ; break;
                  case 'q': return CTRL_F7  ; break;
                  case 'r': return CTRL_F8  ; break;
                  case 's': return CTRL_F9  ; break;
                  case 't': return CTRL_F10 ; break;
                  case 'u': return INVALID  ; break;
                  case 'v': return INVALID  ; break;
#endif

                  default:
                     return INVALID;
                     break;                  
               }
               break;

            case 'O':           /* <PF> keys */
               key = get_1_byte ();
               switch (key)
               {
                  case 'P': return KEY_PF1; break;
                  case 'Q': return KEY_PF2; break;
                  case 'R': return KEY_PF3; break;
                  case 'S': return KEY_PF4; break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -