updated the .TP cleanup for coherency in the key description pages.
[midnight-commander.git] / src / keyxdef.c
blobab377440d3ccfeaf170fc7014ad853fec96f3bbc
1 /* {{{ Copyright */
3 /* Additional keyboard support routines.
5 Copyright (C) 1998 the Free Software Foundation.
7 Written by: 1998, Gyorgy Tamasi
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 /* }}} */
26 * PURPOSE:
28 * We would like to support the direct ALT-?/META-? and some other 'extra'
29 * keyboard functionality provided by some terminals under some OSes (and
30 * not supported by the 'learn keys...' facility of 'mc'.
31 * (First target platform: QNX.)
33 * REMARK:
35 * Implementation strategy: we don't want to rely on a specific terminal
36 * information database management API (termcap,terminfo,SLang,...), so we
37 * try to define a superset of the possible key identifiers here.
40 #include <config.h>
42 #include "global.h"
43 #include "mouse.h" /* required before key.h */
44 #include "key.h"
45 #include "tty.h"
47 #if defined (__QNX__) && !defined (__QNXNTO__)
48 #define HAVE_QNX_KEYS
49 #endif
51 #ifdef HAVE_QNX_KEYS
53 /* select implementation: use QNX/term interface */
54 #define __USE_QNX_TI
56 /* implementation specific _TE() definition */
57 #ifdef __USE_QNX_TI
59 /* include QNX/term.h (not NCURSES/term.h!) */
60 #if __WATCOMC__ > 1000
61 #include <sys/term.h>
62 #else
63 #include <term.h>
64 #endif
65 #include <stdlib.h> /* getenv() */
67 /* fieldname -> index conversion */
68 #define __QTISX(_qtisn) \
69 (((int)(&((struct _strs*)0)->_qtisn))/sizeof(charoffset))
71 /* define the OS/implementation-specific __TK() format */
72 #define __TK(_tis,_tcs,_tisx,_qtisn) __QTISX(_qtisn)
74 #endif /* __USE_QNX_TI */
76 #endif /* HAVE_QNX_KEYS */
79 /* {{{ */
81 /* general key definitions:
83 * format:
85 * terminfo name,
86 * termcap name,
87 * index in the terminfo string table (ncurses),
88 * field name in the QNX terminfo strings struct
91 #define Key_backspace __TK("kbs", "kb", 55, _ky_backspace )
92 #define Key_catab __TK("ktbc", "ka", 56, _ky_catab )
93 #define Key_clear __TK("kclr", "kC", 57, _ky_clear )
94 #define Key_ctab __TK("kctab", "kt", 58, _ky_ctab )
95 #define Key_dc __TK("kdch1", "kD", 59, _ky_dc )
96 #define Key_dl __TK("kdl1", "kL", 60, _ky_dl )
97 #define Key_down __TK("kcud1", "kd", 61, _ky_down )
98 #define Key_eic __TK("krmir", "kM", 62, _ky_eic )
99 #define Key_eol __TK("kel", "kE", 63, _ky_eol )
100 #define Key_eos __TK("ked", "kS", 64, _ky_eos )
101 #define Key_f0 __TK("kf0", "k0", 65, _ky_f0 )
102 #define Key_f1 __TK("kf1", "k1", 66, _ky_f1 )
103 #define Key_f10 __TK("kf10", "k;", 67, _ky_f10 )
104 #define Key_f2 __TK("kf2", "k2", 68, _ky_f2 )
105 #define Key_f3 __TK("kf3", "k3", 69, _ky_f3 )
106 #define Key_f4 __TK("kf4", "k4", 70, _ky_f4 )
107 #define Key_f5 __TK("kf5", "k5", 71, _ky_f5 )
108 #define Key_f6 __TK("kf6", "k6", 72, _ky_f6 )
109 #define Key_f7 __TK("kf7", "k7", 73, _ky_f7 )
110 #define Key_f8 __TK("kf8", "k8", 74, _ky_f8 )
111 #define Key_f9 __TK("kf9", "k9", 75, _ky_f9 )
112 #define Key_home __TK("khome", "kh", 76, _ky_home )
113 #define Key_ic __TK("kich1", "kI", 77, _ky_ic )
114 #define Key_il __TK("kil1", "kA", 78, _ky_il )
115 #define Key_left __TK("kcub1", "kl", 79, _ky_left )
116 #define Key_ll __TK("kll", "kH", 80, _ky_ll )
117 #define Key_npage __TK("knp", "kN", 81, _ky_npage )
118 #define Key_ppage __TK("kpp", "kP", 82, _ky_ppage )
119 #define Key_right __TK("kcuf1", "kr", 83, _ky_right )
120 #define Key_sf __TK("kind", "kF", 84, _ky_sf )
121 #define Key_sr __TK("kri", "kR", 85, _ky_sr )
122 #define Key_stab __TK("khts", "kT", 86, _ky_stab )
123 #define Key_up __TK("kcuu1", "ku", 87, _ky_up )
124 #define Key_a1 __TK("ka1", "K1", 139, _ky_a1 )
125 #define Key_a3 __TK("ka3", "K3", 140, _ky_a3 )
126 #define Key_b2 __TK("kb2", "K2", 141, _ky_b2 )
127 #define Key_c1 __TK("kc1", "K4", 142, _ky_c1 )
128 #define Key_c3 __TK("kc3", "K5", 143, _ky_c3 )
129 #define Key_btab __TK("kcbt", "kB", 148, _ky_btab )
130 #define Key_beg __TK("kbeg", "@1", 158, _ky_beg )
131 #define Key_cancel __TK("kcan", "@2", 159, _ky_cancel )
132 #define Key_close __TK("kclo", "@3", 160, _ky_close )
133 #define Key_command __TK("kcmd", "@4", 161, _ky_command )
134 #define Key_copy __TK("kcpy", "@5", 162, _ky_copy )
135 #define Key_create __TK("kcrt", "@6", 163, _ky_create )
136 #define Key_end __TK("kend", "@7", 164, _ky_end )
137 #define Key_enter __TK("kent", "@8", 165, _ky_enter )
138 #define Key_exit __TK("kext", "@9", 166, _ky_exit )
139 #define Key_find __TK("kfnd", "@0", 167, _ky_find )
140 #define Key_help __TK("khlp", "%1", 168, _ky_help )
141 #define Key_mark __TK("kmrk", "%2", 169, _ky_mark )
142 #define Key_message __TK("kmsg", "%3", 170, _ky_message )
143 #define Key_move __TK("kmov", "%4", 171, _ky_move )
144 #define Key_next __TK("knxt", "%5", 172, _ky_next )
145 #define Key_open __TK("kopn", "%6", 173, _ky_open )
146 #define Key_options __TK("kopt", "%7", 174, _ky_options )
147 #define Key_previous __TK("kprv", "%8", 175, _ky_previous )
148 #define Key_print __TK("kprt", "%9", 176, _ky_print )
149 #define Key_redo __TK("krdo", "%0", 177, _ky_redo )
150 #define Key_reference __TK("kref", "&1", 178, _ky_reference )
151 #define Key_refresh __TK("krfr", "&2", 179, _ky_refresh )
152 #define Key_replace __TK("krpl", "&3", 180, _ky_replace )
153 #define Key_restart __TK("krst", "&4", 181, _ky_restart )
154 #define Key_resume __TK("kres", "&5", 182, _ky_resume )
155 #define Key_save __TK("ksav", "&6", 183, _ky_save )
156 #define Key_suspend __TK("kspd", "&7", 184, _ky_suspend )
157 #define Key_undo __TK("kund", "&8", 185, _ky_undo )
158 #define Key_sbeg __TK("kBEG", "&9", 186, _ky_sbeg )
159 #define Key_scancel __TK("kCAN", "&0", 187, _ky_scancel )
160 #define Key_scommand __TK("kCMD", "*1", 188, _ky_scommand )
161 #define Key_scopy __TK("kCPY", "*2", 189, _ky_scopy )
162 #define Key_screate __TK("kCRT", "*3", 190, _ky_screate )
163 #define Key_sdc __TK("kDC", "*4", 191, _ky_sdc )
164 #define Key_sdl __TK("kDL", "*5", 192, _ky_sdl )
165 #define Key_select __TK("kslt", "*6", 193, _ky_select )
166 #define Key_send __TK("kEND", "*7", 194, _ky_send )
167 #define Key_seol __TK("kEOL", "*8", 195, _ky_seol )
168 #define Key_sexit __TK("kEXT", "*9", 196, _ky_sexit )
169 #define Key_sfind __TK("kFND", "*0", 197, _ky_sfind )
170 #define Key_shelp __TK("kHLP", "#1", 198, _ky_shelp )
171 #define Key_shome __TK("kHOM", "#2", 199, _ky_shome )
172 #define Key_sic __TK("kIC", "#3", 200, _ky_sic )
173 #define Key_sleft __TK("kLFT", "#4", 201, _ky_sleft )
174 #define Key_smessage __TK("kMSG", "%a", 202, _ky_smessage )
175 #define Key_smove __TK("kMOV", "%b", 203, _ky_smove )
176 #define Key_snext __TK("kNXT", "%c", 204, _ky_snext )
177 #define Key_soptions __TK("kOPT", "%d", 205, _ky_soptions )
178 #define Key_sprevious __TK("kPRV", "%e", 206, _ky_sprevious )
179 #define Key_sprint __TK("kPRT", "%f", 207, _ky_sprint )
180 #define Key_sredo __TK("kRDO", "%g", 208, _ky_sredo )
181 #define Key_sreplace __TK("kRPL", "%h", 209, _ky_sreplace )
182 #define Key_sright __TK("kRIT", "%i", 210, _ky_sright )
183 #define Key_srsume __TK("kRES", "%j", 211, _ky_srsume )
184 #define Key_ssave __TK("kSAV", "!1", 212, _ky_ssave )
185 #define Key_ssuspend __TK("kSPD", "!2", 213, _ky_ssuspend )
186 #define Key_sundo __TK("kUND", "!3", 214, _ky_sundo )
187 #define Key_f11 __TK("kf11", "F1", 216, _ky_f11 )
188 #define Key_f12 __TK("kf12", "F2", 217, _ky_f12 )
189 #define Key_f13 __TK("kf13", "F3", 218, _ky_f13 )
190 #define Key_f14 __TK("kf14", "F4", 219, _ky_f14 )
191 #define Key_f15 __TK("kf15", "F5", 220, _ky_f15 )
192 #define Key_f16 __TK("kf16", "F6", 221, _ky_f16 )
193 #define Key_f17 __TK("kf17", "F7", 222, _ky_f17 )
194 #define Key_f18 __TK("kf18", "F8", 223, _ky_f18 )
195 #define Key_f19 __TK("kf19", "F9", 224, _ky_f19 )
196 #define Key_f20 __TK("kf20", "FA", 225, _ky_f20 )
197 #define Key_f21 __TK("kf21", "FB", 226, _ky_f21 )
198 #define Key_f22 __TK("kf22", "FC", 227, _ky_f22 )
199 #define Key_f23 __TK("kf23", "FD", 228, _ky_f23 )
200 #define Key_f24 __TK("kf24", "FE", 229, _ky_f24 )
201 #define Key_f25 __TK("kf25", "FF", 230, _ky_f25 )
202 #define Key_f26 __TK("kf26", "FG", 231, _ky_f26 )
203 #define Key_f27 __TK("kf27", "FH", 232, _ky_f27 )
204 #define Key_f28 __TK("kf28", "FI", 233, _ky_f28 )
205 #define Key_f29 __TK("kf29", "FJ", 234, _ky_f29 )
206 #define Key_f30 __TK("kf30", "FK", 235, _ky_f30 )
207 #define Key_f31 __TK("kf31", "FL", 236, _ky_f31 )
208 #define Key_f32 __TK("kf32", "FM", 237, _ky_f32 )
209 #define Key_f33 __TK("kf33", "FN", 238, _ky_f33 )
210 #define Key_f34 __TK("kf34", "FO", 239, _ky_f34 )
211 #define Key_f35 __TK("kf35", "FP", 240, _ky_f35 )
212 #define Key_f36 __TK("kf36", "FQ", 241, _ky_f36 )
213 #define Key_f37 __TK("kf37", "FR", 242, _ky_f37 )
214 #define Key_f38 __TK("kf38", "FS", 243, _ky_f38 )
215 #define Key_f39 __TK("kf39", "FT", 244, _ky_f39 )
216 #define Key_f40 __TK("kf40", "FU", 245, _ky_f40 )
217 #define Key_f41 __TK("kf41", "FV", 246, _ky_f41 )
218 #define Key_f42 __TK("kf42", "FW", 247, _ky_f42 )
219 #define Key_f43 __TK("kf43", "FX", 248, _ky_f43 )
220 #define Key_f44 __TK("kf44", "FY", 249, _ky_f44 )
221 #define Key_f45 __TK("kf45", "FZ", 250, _ky_f45 )
222 #define Key_f46 __TK("kf46", "Fa", 251, _ky_f46 )
223 #define Key_f47 __TK("kf47", "Fb", 252, _ky_f47 )
224 #define Key_f48 __TK("kf48", "Fc", 253, _ky_f48 )
225 #define Key_f49 __TK("kf49", "Fd", 254, _ky_f49 )
226 #define Key_f50 __TK("kf50", "Fe", 255, _ky_f50 )
227 #define Key_f51 __TK("kf51", "Ff", 256, _ky_f51 )
228 #define Key_f52 __TK("kf52", "Fg", 257, _ky_f52 )
229 #define Key_f53 __TK("kf53", "Fh", 258, _ky_f53 )
230 #define Key_f54 __TK("kf54", "Fi", 259, _ky_f54 )
231 #define Key_f55 __TK("kf55", "Fj", 260, _ky_f55 )
232 #define Key_f56 __TK("kf56", "Fk", 261, _ky_f56 )
233 #define Key_f57 __TK("kf57", "Fl", 262, _ky_f57 )
234 #define Key_f58 __TK("kf58", "Fm", 263, _ky_f58 )
235 #define Key_f59 __TK("kf59", "Fn", 264, _ky_f59 )
236 #define Key_f60 __TK("kf60", "Fo", 265, _ky_f60 )
237 #define Key_f61 __TK("kf61", "Fp", 266, _ky_f61 )
238 #define Key_f62 __TK("kf62", "Fq", 267, _ky_f62 )
239 #define Key_f63 __TK("kf63", "Fr", 268, _ky_f63 )
241 /* }}} */
243 #ifdef HAVE_QNX_KEYS
245 /* don't force pre-defining of base keys under QNX */
246 #define FORCE_BASE_KEY_DEFS 0
248 /* OS specific key aliases */
249 #define Key_alt_a Key_clear
250 #define Key_alt_b Key_stab
251 #define Key_alt_c Key_close
252 #define Key_alt_d Key_catab
253 #define Key_alt_e Key_message
254 #define Key_alt_f Key_find
255 #define Key_alt_g Key_refresh
256 #define Key_alt_h Key_help
257 #define Key_alt_i Key_move
258 #define Key_alt_j Key_restart
259 #define Key_alt_k Key_options
260 #define Key_alt_l Key_reference
261 #define Key_alt_m Key_mark
262 #define Key_alt_n Key_sbeg
263 #define Key_alt_o Key_open
264 #define Key_alt_p Key_resume
265 #define Key_alt_q Key_save
266 #define Key_alt_r Key_replace
267 #define Key_alt_s Key_scopy
268 #define Key_alt_t Key_screate
269 #define Key_alt_u Key_undo
270 #define Key_alt_v Key_sdl
271 #define Key_alt_w Key_sexit
272 #define Key_alt_x Key_sfind
273 #define Key_alt_y Key_shelp
274 #define Key_alt_z Key_soptions
276 #define Key_ctl_enter Key_enter
277 #define Key_ctl_tab Key_ctab
279 #define Key_alt_tab Key_ctl_tab /* map ALT-TAB to CTRL-TAB */
280 #define Key_alt_enter Key_ctl_enter /* map ALT-ENTER to CTRL-ENTER */
282 #ifdef __USE_QNX_TI
284 /* OS/implementation specific key-define struct */
285 typedef struct qnx_key_define_s {
286 int mc_code;
287 int str_idx;
288 } qnx_key_define_t;
290 /* define current xtra_key_define_t (enable OS/implementation) */
291 #define xtra_key_define_t qnx_key_define_t
293 #endif /* __USE_QNX_TI */
295 #endif /* HAVE_QNX_KEYS */
298 #ifdef xtra_key_define_t
300 #ifndef FORCE_BASE_KEY_DEFS
301 #define FORCE_BASE_KEY_DEFS 0
302 #endif
304 /* general key define table */
305 xtra_key_define_t xtra_key_defines[] = {
306 #if FORCE_BASE_KEY_DEFS
307 {KEY_BACKSPACE,Key_backspace},
308 {KEY_LEFT, Key_left },
309 {KEY_RIGHT, Key_right },
310 {KEY_UP, Key_up },
311 {KEY_DOWN, Key_down },
312 {KEY_NPAGE, Key_npage },
313 {KEY_PPAGE, Key_ppage },
314 {KEY_HOME, Key_home },
315 {KEY_END, Key_end },
316 {KEY_DC, Key_dc },
317 {KEY_IC, Key_ic },
318 {KEY_F(1), Key_f1 },
319 {KEY_F(2), Key_f2 },
320 {KEY_F(3), Key_f3 },
321 {KEY_F(4), Key_f4 },
322 {KEY_F(5), Key_f5 },
323 {KEY_F(6), Key_f6 },
324 {KEY_F(7), Key_f7 },
325 {KEY_F(8), Key_f8 },
326 {KEY_F(9), Key_f9 },
327 {KEY_F(10), Key_f10 },
328 {KEY_F(11), Key_f11 },
329 {KEY_F(12), Key_f12 },
330 {KEY_F(13), Key_f13 },
331 {KEY_F(14), Key_f14 },
332 {KEY_F(15), Key_f15 },
333 {KEY_F(16), Key_f16 },
334 {KEY_F(17), Key_f17 },
335 {KEY_F(18), Key_f18 },
336 {KEY_F(19), Key_f19 },
337 {KEY_F(20), Key_f20 },
338 #endif
339 {ALT('a'), Key_alt_a },
340 {ALT('b'), Key_alt_b },
341 {ALT('c'), Key_alt_c },
342 {ALT('d'), Key_alt_d },
343 {ALT('e'), Key_alt_e },
344 {ALT('f'), Key_alt_f },
345 {ALT('g'), Key_alt_g },
346 {ALT('h'), Key_alt_h },
347 {ALT('i'), Key_alt_i },
348 {ALT('j'), Key_alt_j },
349 {ALT('k'), Key_alt_k },
350 {ALT('l'), Key_alt_l },
351 {ALT('m'), Key_alt_m },
352 {ALT('n'), Key_alt_n },
353 {ALT('o'), Key_alt_o },
354 {ALT('p'), Key_alt_p },
355 {ALT('q'), Key_alt_q },
356 {ALT('r'), Key_alt_r },
357 {ALT('s'), Key_alt_s },
358 {ALT('t'), Key_alt_t },
359 {ALT('u'), Key_alt_u },
360 {ALT('v'), Key_alt_v },
361 {ALT('w'), Key_alt_w },
362 {ALT('x'), Key_alt_x },
363 {ALT('y'), Key_alt_y },
364 {ALT('z'), Key_alt_z },
366 {ALT('\n'), Key_alt_enter},
367 {ALT('\t'), Key_alt_tab }
370 #endif /* xtra_key_define_t */
373 #ifdef HAVE_QNX_KEYS
375 #ifdef __USE_QNX_TI
377 #define __CT (__cur_term)
378 #define __QTISOFFS(_qtisx) (((charoffset*)(&__CT->_strs))[_qtisx])
379 #define __QTISSTR(_qtisx) (&__CT->_strtab[0]+__QTISOFFS(_qtisx))
381 void load_qnx_key_defines (void)
383 static int _qnx_keys_defined = 0;
385 if (!_qnx_keys_defined) {
386 int idx, str_idx;
387 int term_setup_ok;
389 __setupterm(NULL, fileno(stdout), &term_setup_ok);
390 if (term_setup_ok != 1)
391 return;
393 for (idx = 0;
394 idx < sizeof(xtra_key_defines) / sizeof(xtra_key_defines[0]);
395 idx++) {
396 str_idx = xtra_key_defines[idx].str_idx;
397 if (__QTISOFFS(str_idx)) {
398 if (*__QTISSTR(str_idx)) {
399 define_sequence(
400 xtra_key_defines[idx].mc_code,
401 __QTISSTR(str_idx),
402 MCKEY_NOACTION);
406 _qnx_keys_defined = 1;
410 #endif /* __USE_QNX_TI */
412 #endif /* HAVE_QNX_KEYS */
415 /* called from key.c/init_key() */
416 void load_xtra_key_defines (void)
418 #ifdef HAVE_QNX_KEYS
419 load_qnx_key_defines();
420 #endif