1 /* $LynxId: LYKeymap.h,v 1.55 2015/10/07 23:34:55 tom Exp $ */
2 #ifndef LYKEYMAP_H
3 #define LYKEYMAP_H
4 
5 #include <HTUtils.h>
6 #include <HTList.h>
7 #include <LYCurses.h>
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12     extern BOOLEAN LYisNonAlnumKeyname(int ch, int KeyName);
13     extern HTList *LYcommandList(void);
14     extern const char *lec_to_lecname(int code);
15     extern char *LYKeycodeToString(int c, int upper8);
16     extern char *fmt_keys(int lkc_first, int lkc_second);
17     extern char *key_for_func(int func);
18     extern char *key_for_func_ext(int lac, int context_code);
19     extern int LYReverseKeymap(int KeyName);
20     extern int LYStringToKeycode(char *src);
21     extern int lacname_to_lac(const char *func);
22     extern int lecname_to_lec(const char *func);
23     extern int lkcstring_to_lkc(const char *src);
24     extern int remap(char *key, const char *func, int for_dired);
25     extern void print_keymap(char **newfile);
26     extern void reset_emacs_keys(void);
27     extern void reset_numbers_as_arrows(void);
28     extern void reset_vi_keys(void);
29     extern void set_emacs_keys(void);
30     extern void set_numbers_as_arrows(void);
31     extern void set_vi_keys(void);
32     extern void set_vms_keys(void);
33 
34 /* We only use unsigned keycodes; if there's a problem matching with enum
35  * (which is supposed to be 'int'), that would be okay, but not as clean
36  * for type-checking.
37  */
38     typedef short LYKeymap_t;
39 
40 #define KEYMAP_SIZE 661
41     extern LYKeymap_t keymap[KEYMAP_SIZE];	/* main keymap matrix */
42 
43 #ifdef EXP_KEYBOARD_LAYOUT
44     typedef unsigned short LYKbLayout_t;
45     extern int current_layout;
46     extern LYKbLayout_t *LYKbLayouts[];
47     extern const char *LYKbLayoutNames[];
48     extern BOOLEAN LYSetKbLayout(char *layout_id);
49 #endif
50 
51 #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
52     extern LYKeymap_t key_override[];
53 #endif
54 
55 /* readable mapping for characters in edit- and key-maps */
56 #define CTL(c)		((c) & 0x1f)
57 #define KHR(c)		((c) + 1)
58 #define KTL(c)		(CTL(c) + 1)
59 
60 /* * *  LynxKeyCodes  * * */
61 #define LKC_ISLECLAC	0x8000	/* flag: contains lynxaction + editaction */
62 #define LKC_MOD1	0x4000	/* a modifier bit - currently for ^x-map */
63 #define LKC_MOD2	0x2000	/* another one - currently for esc-map */
64 #define LKC_MOD3	0x1000	/* another one - currently for double-map */
65 #define LKC_ISLAC	0x0800	/* flag: lynxkeycode already lynxactioncode */
66 
67 /* Used to distinguish internal Lynx keycodes of (say) extended ncurses once. */
68 #define LKC_ISLKC	0x0400	/* flag: already lynxkeycode (not native) */
69     /* 0x0400  is MOUSE_KEYSYM for slang in LYStrings.c */
70 #define LKC_MASK	0x07FF	/* mask for lynxkeycode proper */
71 
72 #define LKC_DONE	0x07FE	/* special value - operation done, not-a-key */
73 
74 /* * *  LynxActionCodes  * * */
75 #define LAC_SHIFT	8	/* shift for lynxactioncode - must not
76 				   overwrite any assigned LYK_* values */
77 #define LAC_MASK	((1<<LAC_SHIFT)-1)
78     /* mask for lynxactioncode - must cover all
79        assigned LYK_* values */
80 
81 /*  Return lkc masking single actioncode, given an lkc masking a lac + lec */
82 #define LKC2_TO_LKC(c)   (((c) == -1 || !((c) & LKC_ISLECLAC)) ? (c) : \
83 			    (((c) & LAC_MASK) | LKC_ISLAC))
84 
85 /*  Return lynxeditactioncode, given an lkc masking a lac + lec */
86 #define LKC2_TO_LEC(c)   (((c) == -1 || !((c) & LKC_ISLECLAC)) ? (c) : \
87 			    ((((c)&~LKC_ISLECLAC)>>LAC_SHIFT) & LAC_MASK))
88 
89 /*  Convert lynxkeycode to lynxactioncode.  Modifiers are dropped.  */
90 #define LKC_TO_LAC(ktab,c) (((c) == -1) ? ktab[0] : \
91 			    ((c) & (LKC_ISLECLAC|LKC_ISLAC)) ? ((c) & LAC_MASK) : \
92 			    ktab[((c) & LKC_MASK) + 1])
93 
94 /*  Mask lynxactioncode as a lynxkeycode.  */
95 #define LAC_TO_LKC0(a) ((a)|LKC_ISLAC)
96 
97 /*  Mask a lynxactioncode and an editactioncode as a lynxkeycode.  */
98 #define LACLEC_TO_LKC0(a,b) ((a)|((b)<<LAC_SHIFT)|LKC_ISLECLAC)
99 
100 /*  Convert lynxactioncode to a lynxkeycode, attempting reverse mapping.  */
101 #define LAC_TO_LKC(a) ((LYReverseKeymap(a)>=0)?LYReverseKeymap(a):LAC_TO_LKC0(a))
102 
103 /*  Simplify a lynxkeycode:
104     attempt reverse mapping if a single masked lynxactioncode, drop modifiers.  */
105 #define LKC_TO_C(c) ((c&LKC_ISLECLAC)? c : (c&LKC_ISLAC)? LAC_TO_LKC(c&LAC_MASK) : (c&LKC_MASK))
106 
107 #define LKC_HAS_ESC_MOD(c) (c >= 0 && !(c&LKC_ISLECLAC) && (c&LKC_MOD2))
108 
109 /* *  The defined LynxActionCodes  * */
110 
111 /* Variables for holding and passing around lynxactioncodes are generally of
112  * type int, the types LYKeymap_t and LYKeymapCodes are currently only used for
113  * the definitions.  That could change.  - kw
114  *
115  * The values in this enum are indexed against the command names in the
116  * 'revmap[]' array in LYKeymap.c
117  */
118     typedef enum {
119 	LYK_UNKNOWN = 0
120 	,LYK_COMMAND
121 	,LYK_1
122 	,LYK_2
123 	,LYK_3
124 	,LYK_4
125 	,LYK_5
126 	,LYK_6
127 	,LYK_7
128 	,LYK_8
129 	,LYK_9
130 	,LYK_SOURCE
131 	,LYK_RELOAD
132 	,LYK_QUIT
133 	,LYK_ABORT
134 	,LYK_NEXT_PAGE
135 	,LYK_PREV_PAGE
136 	,LYK_UP_TWO
137 	,LYK_DOWN_TWO
138 	,LYK_UP_HALF
139 	,LYK_DOWN_HALF
140 	,LYK_REFRESH
141 	,LYK_HOME
142 	,LYK_END
143 	,LYK_FIRST_LINK
144 	,LYK_LAST_LINK
145 	,LYK_PREV_LINK
146 	,LYK_NEXT_LINK
147 	,LYK_LPOS_PREV_LINK
148 	,LYK_LPOS_NEXT_LINK
149 	,LYK_FASTBACKW_LINK
150 	,LYK_FASTFORW_LINK
151 	,LYK_UP_LINK
152 	,LYK_DOWN_LINK
153 	,LYK_RIGHT_LINK
154 	,LYK_LEFT_LINK
155 	,LYK_HISTORY
156 	,LYK_PREV_DOC
157 	,LYK_NEXT_DOC
158 	,LYK_ACTIVATE
159 	,LYK_MOUSE_SUBMIT	/* mostly like LYK_ACTIVATE, for mouse use, don't map */
160 	,LYK_SUBMIT
161 	,LYK_RESET
162 	,LYK_GOTO
163 	,LYK_ECGOTO
164 	,LYK_HELP
165 	,LYK_DWIMHELP
166 	,LYK_INDEX
167 	,LYK_NOCACHE
168 	,LYK_INTERRUPT
169 	,LYK_MAIN_MENU
170 	,LYK_OPTIONS
171 	,LYK_INDEX_SEARCH
172 	,LYK_WHEREIS
173 	,LYK_PREV
174 	,LYK_NEXT
175 	,LYK_COMMENT
176 	,LYK_EDIT
177 	,LYK_INFO
178 	,LYK_PRINT
179 	,LYK_ADD_BOOKMARK
180 	,LYK_DEL_BOOKMARK
181 	,LYK_VIEW_BOOKMARK
182 	,LYK_VLINKS
183 	,LYK_SHELL
184 	,LYK_DOWNLOAD
185 	,LYK_TRACE_TOGGLE
186 	,LYK_TRACE_LOG
187 	,LYK_IMAGE_TOGGLE
188 	,LYK_INLINE_TOGGLE
189 	,LYK_HEAD
190 	,LYK_DO_NOTHING
191 	,LYK_TOGGLE_HELP
192 	,LYK_JUMP
193 	,LYK_EDITMAP
194 	,LYK_KEYMAP
195 	,LYK_LIST
196 	,LYK_TOOLBAR
197 	,LYK_HISTORICAL
198 	,LYK_MINIMAL
199 	,LYK_SOFT_DQUOTES
200 	,LYK_RAW_TOGGLE
201 	,LYK_COOKIE_JAR
202 	,LYK_F_LINK_NUM
203 	,LYK_CLEAR_AUTH
204 	,LYK_SWITCH_DTD
205 	,LYK_ELGOTO
206 	,LYK_CHANGE_LINK
207 	,LYK_DWIMEDIT
208 	,LYK_EDITTEXTAREA
209 	,LYK_GROWTEXTAREA
210 	,LYK_INSERTFILE
211 
212 #ifdef USE_ADDRLIST_PAGE
213 	,LYK_ADDRLIST
214 #else
215 #define LYK_ADDRLIST      LYK_ADD_BOOKMARK
216 #endif
217 
218 #ifdef USE_EXTERNALS
219 	,LYK_EXTERN_LINK
220 	,LYK_EXTERN_PAGE
221 #else
222 #define LYK_EXTERN_LINK   LYK_UNKNOWN
223 #define LYK_EXTERN_PAGE   LYK_UNKNOWN
224 #endif				/* !defined(USE_EXTERNALS) */
225 
226 #if defined(VMS) || defined(DIRED_SUPPORT)
227 	,LYK_DIRED_MENU
228 #else
229 #define LYK_DIRED_MENU    LYK_UNKNOWN
230 #endif				/* VMS || DIRED_SUPPORT */
231 
232 #ifdef DIRED_SUPPORT
233 	,LYK_CREATE
234 	,LYK_REMOVE
235 	,LYK_MODIFY
236 	,LYK_TAG_LINK
237 	,LYK_UPLOAD
238 	,LYK_INSTALL
239 #else
240 #define LYK_TAG_LINK      LYK_UNKNOWN
241 #endif				/* DIRED_SUPPORT */
242 
243 	,LYK_CHANGE_CENTER
244 
245 #ifdef KANJI_CODE_OVERRIDE
246 	,LYK_CHANGE_KCODE
247 #endif
248 
249 #ifdef SUPPORT_CHDIR
250 	,LYK_CHDIR
251 	,LYK_PWD
252 #endif
253 
254 #ifdef USE_CURSES_PADS
255 	,LYK_SHIFT_LEFT
256 	,LYK_SHIFT_RIGHT
257 	,LYK_LINEWRAP_TOGGLE
258 #else
259 #define LYK_SHIFT_LEFT      LYK_UNKNOWN
260 #define LYK_SHIFT_RIGHT     LYK_UNKNOWN
261 #define LYK_LINEWRAP_TOGGLE LYK_UNKNOWN
262 #endif
263 
264 #ifdef CAN_CUT_AND_PASTE
265 	,LYK_PASTE_URL
266 	,LYK_TO_CLIPBOARD
267 #else
268 #define LYK_PASTE_URL      LYK_UNKNOWN
269 #define LYK_TO_CLIPBOARD   LYK_UNKNOWN
270 #endif
271 
272 #ifdef EXP_NESTED_TABLES
273 	,LYK_NESTED_TABLES
274 #else
275 #define LYK_NESTED_TABLES  LYK_UNKNOWN
276 #endif
277 
278 #ifdef USE_CACHEJAR
279 	,LYK_CACHE_JAR
280 #else
281 #define LYK_CACHE_JAR LYK_UNKNOWN
282 #endif
283 
284 #ifdef USE_MAXSCREEN_TOGGLE
285 	,LYK_MAXSCREEN_TOGGLE
286 #else
287 #define LYK_MAXSCREEN_TOGGLE  LYK_UNKNOWN
288 #endif
289 
290     } LYKeymapCode;
291 
292 /*
293  * Symbol table for internal commands.
294  */
295     typedef struct {
296 	LYKeymapCode code;
297 	const char *name;
298 	const char *doc;
299     } Kcmd;
300 
301     extern Kcmd *LYKeycodeToKcmd(LYKeymapCode code);
302     extern Kcmd *LYStringToKcmd(const char *name);
303 
304 #ifdef __cplusplus
305 }
306 #endif
307 #endif				/* LYKEYMAP_H */
308