root/lib/tty/keyxdef.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. load_qnx_key_defines
  2. load_xtra_key_defines

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

/* [previous][next][first][last][top][bottom][index][help]  */