source: trunk/third/nvi/common/key.h @ 14302

Revision 14302, 7.9 KB checked in by ghudson, 25 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14301, which included commits to RCS files with non-trunk default branches.
Line 
1/*-
2 * Copyright (c) 1991, 1993, 1994
3 *      The Regents of the University of California.  All rights reserved.
4 * Copyright (c) 1991, 1993, 1994, 1995, 1996
5 *      Keith Bostic.  All rights reserved.
6 *
7 * See the LICENSE file for redistribution information.
8 *
9 *      @(#)key.h       10.18 (Berkeley) 6/30/96
10 */
11
12/*
13 * Fundamental character types.
14 *
15 * CHAR_T       An integral type that can hold any character.
16 * ARG_CHAR_T   The type of a CHAR_T when passed as an argument using
17 *              traditional promotion rules.  It should also be able
18 *              to be compared against any CHAR_T for equality without
19 *              problems.
20 * MAX_CHAR_T   The maximum value of any character.
21 *
22 * If no integral type can hold a character, don't even try the port.
23 */
24typedef u_char          CHAR_T;
25typedef u_int           ARG_CHAR_T;
26#define MAX_CHAR_T      0xff
27
28/* The maximum number of columns any character can take up on a screen. */
29#define MAX_CHARACTER_COLUMNS   4
30
31/*
32 * Event types.
33 *
34 * The program structure depends on the event loop being able to return
35 * E_EOF/E_ERR multiple times -- eventually enough things will end due
36 * to the events that vi will reach the command level for the screen, at
37 * which point the exit flags will be set and vi will exit.
38 */
39typedef enum {
40        E_NOTUSED = 0,                  /* Not set. */
41        E_CHARACTER,                    /* Input character: e_c set. */
42        E_EOF,                          /* End of input (NOT ^D). */
43        E_ERR,                          /* Input error. */
44        E_INTERRUPT,                    /* Interrupt. */
45        E_QUIT,                         /* Quit. */
46        E_REPAINT,                      /* Repaint: e_flno, e_tlno set. */
47        E_SIGHUP,                       /* SIGHUP. */
48        E_SIGTERM,                      /* SIGTERM. */
49        E_STRING,                       /* Input string: e_csp, e_len set. */
50        E_TIMEOUT,                      /* Timeout. */
51        E_WRESIZE,                      /* Window resize. */
52        E_WRITE                         /* Write. */
53} e_event_t;
54
55/*
56 * Character values.
57 */
58typedef enum {
59        K_NOTUSED = 0,                  /* Not set. */
60        K_BACKSLASH,                    /*  \ */
61        K_CARAT,                        /*  ^ */
62        K_CNTRLD,                       /* ^D */
63        K_CNTRLR,                       /* ^R */
64        K_CNTRLT,                       /* ^T */
65        K_CNTRLZ,                       /* ^Z */
66        K_COLON,                        /*  : */
67        K_CR,                           /* \r */
68        K_ESCAPE,                       /* ^[ */
69        K_FORMFEED,                     /* \f */
70        K_HEXCHAR,                      /* ^X */
71        K_NL,                           /* \n */
72        K_RIGHTBRACE,                   /*  } */
73        K_RIGHTPAREN,                   /*  ) */
74        K_TAB,                          /* \t */
75        K_VERASE,                       /* set from tty: default ^H */
76        K_VKILL,                        /* set from tty: default ^U */
77        K_VLNEXT,                       /* set from tty: default ^V */
78        K_VWERASE,                      /* set from tty: default ^W */
79        K_ZERO                          /*  0 */
80} e_key_t;
81
82struct _event {
83        TAILQ_ENTRY(_event) q;          /* Linked list of events. */
84        e_event_t e_event;              /* Event type. */
85        union {
86                struct {                /* Input character. */
87                        CHAR_T c;       /* Character. */
88                        e_key_t value;  /* Key type. */
89
90#define CH_ABBREVIATED  0x01            /* Character is from an abbreviation. */
91#define CH_MAPPED       0x02            /* Character is from a map. */
92#define CH_NOMAP        0x04            /* Do not map the character. */
93#define CH_QUOTED       0x08            /* Character is already quoted. */
94                        u_int8_t flags;
95                } _e_ch;
96#define e_ch    _u_event._e_ch          /* !!! The structure, not the char. */
97#define e_c     _u_event._e_ch.c
98#define e_value _u_event._e_ch.value
99#define e_flags _u_event._e_ch.flags
100
101                struct {                /* Screen position, size. */
102                        size_t lno1;    /* Line number. */
103                        size_t cno1;    /* Column number. */
104                        size_t lno2;    /* Line number. */
105                        size_t cno2;    /* Column number. */
106                } _e_mark;
107#define e_lno   _u_event._e_mark.lno1   /* Single location. */
108#define e_cno   _u_event._e_mark.cno1
109#define e_flno  _u_event._e_mark.lno1   /* Text region. */
110#define e_fcno  _u_event._e_mark.cno1
111#define e_tlno  _u_event._e_mark.lno2
112#define e_tcno  _u_event._e_mark.cno2
113
114                struct {                /* Input string. */
115                        CHAR_T  *asp;   /* Allocated string. */
116                        CHAR_T  *csp;   /* String. */
117                        size_t   len;   /* String length. */
118                } _e_str;
119#define e_asp   _u_event._e_str.asp
120#define e_csp   _u_event._e_str.csp
121#define e_len   _u_event._e_str.len
122        } _u_event;
123};
124
125typedef struct _keylist {
126        e_key_t value;                  /* Special value. */
127        CHAR_T ch;                      /* Key. */
128} KEYLIST;
129extern KEYLIST keylist[];
130
131                                        /* Return if more keys in queue. */
132#define KEYS_WAITING(sp)        ((sp)->gp->i_cnt != 0)
133#define MAPPED_KEYS_WAITING(sp)                                         \
134        (KEYS_WAITING(sp) &&                                            \
135            F_ISSET(&sp->gp->i_event[sp->gp->i_next].e_ch, CH_MAPPED))
136
137/*
138 * Ex/vi commands are generally separated by whitespace characters.  We
139 * can't use the standard isspace(3) macro because it returns true for
140 * characters like ^K in the ASCII character set.  The 4.4BSD isblank(3)
141 * macro does exactly what we want, but it's not portable yet.
142 *
143 * XXX
144 * Note side effect, ch is evaluated multiple times.
145 */
146#ifndef isblank
147#define isblank(ch)     ((ch) == ' ' || (ch) == '\t')
148#endif
149
150/* The "standard" tab width, for displaying things to users. */
151#define STANDARD_TAB    6
152
153/* Various special characters, messages. */
154#define CH_BSEARCH      '?'             /* Backward search prompt. */
155#define CH_CURSOR       ' '             /* Cursor character. */
156#define CH_ENDMARK      '$'             /* End of a range. */
157#define CH_EXPROMPT     ':'             /* Ex prompt. */
158#define CH_FSEARCH      '/'             /* Forward search prompt. */
159#define CH_HEX          '\030'          /* Leading hex character. */
160#define CH_LITERAL      '\026'          /* ASCII ^V. */
161#define CH_NO           'n'             /* No. */
162#define CH_NOT_DIGIT    'a'             /* A non-isdigit() character. */
163#define CH_QUIT         'q'             /* Quit. */
164#define CH_YES          'y'             /* Yes. */
165
166/*
167 * Checking for interrupts means that we look at the bit that gets set if the
168 * screen code supports asynchronous events, and call back into the event code
169 * so that non-asynchronous screens get a chance to post the interrupt.
170 *
171 * INTERRUPT_CHECK is the number of lines "operated" on before checking for
172 * interrupts.
173 */
174#define INTERRUPT_CHECK 100
175#define INTERRUPTED(sp)                                                 \
176        (F_ISSET((sp)->gp, G_INTERRUPTED) ||                            \
177        (!v_event_get(sp, NULL, 0, EC_INTERRUPT) &&                     \
178        F_ISSET((sp)->gp, G_INTERRUPTED)))
179#define CLR_INTERRUPT(sp)                                               \
180        F_CLR((sp)->gp, G_INTERRUPTED)
181
182/* Flags describing types of characters being requested. */
183#define EC_INTERRUPT    0x001           /* Checking for interrupts. */
184#define EC_MAPCOMMAND   0x002           /* Apply the command map. */
185#define EC_MAPINPUT     0x004           /* Apply the input map. */
186#define EC_MAPNODIGIT   0x008           /* Return to a digit. */
187#define EC_QUOTED       0x010           /* Try to quote next character */
188#define EC_RAW          0x020           /* Any next character. XXX: not used. */
189#define EC_TIMEOUT      0x040           /* Timeout to next character. */
190
191/* Flags describing text input special cases. */
192#define TXT_ADDNEWLINE  0x00000001      /* Replay starts on a new line. */
193#define TXT_AICHARS     0x00000002      /* Leading autoindent chars. */
194#define TXT_ALTWERASE   0x00000004      /* Option: altwerase. */
195#define TXT_APPENDEOL   0x00000008      /* Appending after EOL. */
196#define TXT_AUTOINDENT  0x00000010      /* Autoindent set this line. */
197#define TXT_BACKSLASH   0x00000020      /* Backslashes escape characters. */
198#define TXT_BEAUTIFY    0x00000040      /* Only printable characters. */
199#define TXT_BS          0x00000080      /* Backspace returns the buffer. */
200#define TXT_CEDIT       0x00000100      /* Can return TERM_CEDIT. */
201#define TXT_CNTRLD      0x00000200      /* Control-D is a command. */
202#define TXT_CNTRLT      0x00000400      /* Control-T is an indent special. */
203#define TXT_CR          0x00000800      /* CR returns the buffer. */
204#define TXT_DOTTERM     0x00001000      /* Leading '.' terminates the input. */
205#define TXT_EMARK       0x00002000      /* End of replacement mark. */
206#define TXT_EOFCHAR     0x00004000      /* ICANON set, return EOF character. */
207#define TXT_ESCAPE      0x00008000      /* Escape returns the buffer. */
208#define TXT_FILEC       0x00010000      /* Option: filec. */
209#define TXT_INFOLINE    0x00020000      /* Editing the info line. */
210#define TXT_MAPINPUT    0x00040000      /* Apply the input map. */
211#define TXT_NLECHO      0x00080000      /* Echo the newline. */
212#define TXT_NUMBER      0x00100000      /* Number the line. */
213#define TXT_OVERWRITE   0x00200000      /* Overwrite characters. */
214#define TXT_PROMPT      0x00400000      /* Display a prompt. */
215#define TXT_RECORD      0x00800000      /* Record for replay. */
216#define TXT_REPLACE     0x01000000      /* Replace; don't delete overwrite. */
217#define TXT_REPLAY      0x02000000      /* Replay the last input. */
218#define TXT_RESOLVE     0x04000000      /* Resolve the text into the file. */
219#define TXT_SEARCHINCR  0x08000000      /* Incremental search. */
220#define TXT_SHOWMATCH   0x10000000      /* Option: showmatch. */
221#define TXT_TTYWERASE   0x20000000      /* Option: ttywerase. */
222#define TXT_WRAPMARGIN  0x40000000      /* Option: wrapmargin. */
Note: See TracBrowser for help on using the repository browser.