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