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