Home | History | Annotate | Line # | Download | only in libcurses
keyname.c revision 1.5
      1 /*	$NetBSD: keyname.c,v 1.5 2007/10/25 20:32:40 jdc Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2003 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Julian Coleman.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *        This product includes software developed by the NetBSD
     21  *        Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 #include <sys/cdefs.h>
     40 #ifndef lint
     41 __RCSID("$NetBSD: keyname.c,v 1.5 2007/10/25 20:32:40 jdc Exp $");
     42 #endif				/* not lint */
     43 
     44 #include <stdlib.h>
     45 #include <string.h>
     46 
     47 #include "curses.h"
     48 #include "curses_private.h"
     49 
     50 #define KEYNAMEMAX (size_t) 14	/* "KEY_BACKSPACE\0" */
     51 static char name[KEYNAMEMAX + 1];
     52 
     53 /*
     54  * keyname --
     55  *	Return name of key or NULL;
     56  */
     57 char *
     58 keyname(int key)
     59 {
     60 /* We don't bother with the large keyname table if SMALL is defined. */
     61 #ifdef SMALL
     62 	strcpy(name, "-1\0");
     63 	return name;
     64 #else
     65 	if (key < 0) {
     66 		strcpy(name, "-1\0");
     67 		return name;
     68 	}
     69 
     70 	/* No name. */
     71 	if (key == 0x100) {
     72 		strcpy(name, "-1\0");
     73 		return name;
     74 	}
     75 
     76 	/* Control codes */
     77 	if (key < 0x20) {
     78 		name[0] = '^';
     79 		name[1] = (char) (key + 64);	/* Offset of '@' */
     80 		name[2] = '\0';
     81 		return name;
     82 	}
     83 
     84 	/* "Normal" keys */
     85 	if (key < 0x7F) {
     86 		name[0] = (char) key;
     87 		name[1] = '\0';
     88 		return name;
     89 	}
     90 
     91 	/* Delete key */
     92 	if (key == 0x7F) {
     93 		strcpy(name, "^?\0");
     94 		return name;
     95 	}
     96 
     97 	/* Meta + control codes */
     98 	if (key < 0x9F) {
     99 		strcpy(name, "M-^");
    100 		name[3] = (char) (key - 64);	/* Offset of '@' */
    101 		name[4] = '\0';
    102 		return name;
    103 	}
    104 
    105 	/* Meta + "normal" keys */
    106 	if (key < 0xFF) {
    107 		strcpy (name, "M-");
    108 		name[2] = (char) (key - 128);
    109 		name[3] = '\0';
    110 		return name;
    111 	}
    112 
    113 	/* Meta + delete key */
    114 	if (key == 0xFF) {
    115 		strcpy(name, "M-^?\0");
    116 		return name;
    117 	}
    118 
    119 	/* Key names.  Synchronise this with curses.h. */
    120 	if (key == 0x101) {
    121 		strncpy(name, "KEY_BREAK\0", KEYNAMEMAX);
    122 		return name;
    123 	}
    124 	if (key == 0x102) {
    125 		strncpy(name, "KEY_DOWN\0", KEYNAMEMAX);
    126 		return name;
    127 	}
    128 	if (key == 0x103) {
    129 		strncpy(name, "KEY_UP\0", KEYNAMEMAX);
    130 		return name;
    131 	}
    132 	if (key == 0x104) {
    133 		strncpy(name, "KEY_LEFT\0", KEYNAMEMAX);
    134 		return name;
    135 	}
    136 	if (key == 0x105) {
    137 		strncpy(name, "KEY_RIGHT\0", KEYNAMEMAX);
    138 		return name;
    139 	}
    140 	if (key == 0x106) {
    141 		strncpy(name, "KEY_HOME\0", KEYNAMEMAX);
    142 		return name;
    143 	}
    144 	if (key == 0x107) {
    145 		strncpy(name, "KEY_BACKSPACE\0", KEYNAMEMAX);
    146 		return name;
    147 	}
    148 	/* Function key block (64 keys). */
    149 	if (key < 0x148) {
    150 		int i;
    151 
    152 		strcpy(name, "KEY_F(");
    153 		i = snprintf(&name[6], (size_t) 3, "%d", key - 0x108);
    154 		name[6 + i] = ')';
    155 		name[7 + i] = '\0';
    156 		return name;
    157 	}
    158 	if (key == 0x148) {
    159 		strncpy(name, "KEY_DL\0", KEYNAMEMAX);
    160 		return name;
    161 	}
    162 	if (key == 0x149) {
    163 		strncpy(name, "KEY_IL\0", KEYNAMEMAX);
    164 		return name;
    165 	}
    166 	if (key == 0x14A) {
    167 		strncpy(name, "KEY_DC\0", KEYNAMEMAX);
    168 		return name;
    169 	}
    170 	if (key == 0x14B) {
    171 		strncpy(name, "KEY_IC\0", KEYNAMEMAX);
    172 		return name;
    173 	}
    174 	if (key == 0x14C) {
    175 		strncpy(name, "KEY_EIC\0", KEYNAMEMAX);
    176 		return name;
    177 	}
    178 	if (key == 0x14D) {
    179 		strncpy(name, "KEY_CLEAR\0", KEYNAMEMAX);
    180 		return name;
    181 	}
    182 	if (key == 0x14E) {
    183 		strncpy(name, "KEY_EOS\0", KEYNAMEMAX);
    184 		return name;
    185 	}
    186 	if (key == 0x14F) {
    187 		strncpy(name, "KEY_EOL\0", KEYNAMEMAX);
    188 		return name;
    189 	}
    190 	if (key == 0x150) {
    191 		strncpy(name, "KEY_SF\0", KEYNAMEMAX);
    192 		return name;
    193 	}
    194 	if (key == 0x151) {
    195 		strncpy(name, "KEY_SR\0", KEYNAMEMAX);
    196 		return name;
    197 	}
    198 	if (key == 0x152) {
    199 		strncpy(name, "KEY_NPAGE\0", KEYNAMEMAX);
    200 		return name;
    201 	}
    202 	if (key == 0x153) {
    203 		strncpy(name, "KEY_PPAGE\0", KEYNAMEMAX);
    204 		return name;
    205 	}
    206 	if (key == 0x154) {
    207 		strncpy(name, "KEY_STAB\0", KEYNAMEMAX);
    208 		return name;
    209 	}
    210 	if (key == 0x155) {
    211 		strncpy(name, "KEY_CTAB\0", KEYNAMEMAX);
    212 		return name;
    213 	}
    214 	if (key == 0x156) {
    215 		strncpy(name, "KEY_CATAB\0", KEYNAMEMAX);
    216 		return name;
    217 	}
    218 	if (key == 0x157) {
    219 		strncpy(name, "KEY_ENTER\0", KEYNAMEMAX);
    220 		return name;
    221 	}
    222 	if (key == 0x158) {
    223 		strncpy(name, "KEY_SRESET\0", KEYNAMEMAX);
    224 		return name;
    225 	}
    226 	if (key == 0x159) {
    227 		strncpy(name, "KEY_RESET\0", KEYNAMEMAX);
    228 		return name;
    229 	}
    230 	if (key == 0x15A) {
    231 		strncpy(name, "KEY_PRINT\0", KEYNAMEMAX);
    232 		return name;
    233 	}
    234 	if (key == 0x15B) {
    235 		strncpy(name, "KEY_LL\0", KEYNAMEMAX);
    236 		return name;
    237 	}
    238 	if (key == 0x15C) {
    239 		strncpy(name, "KEY_A1\0", KEYNAMEMAX);
    240 		return name;
    241 	}
    242 	if (key == 0x15D) {
    243 		strncpy(name, "KEY_A3\0", KEYNAMEMAX);
    244 		return name;
    245 	}
    246 	if (key == 0x15E) {
    247 		strncpy(name, "KEY_B2\0", KEYNAMEMAX);
    248 		return name;
    249 	}
    250 	if (key == 0x15F) {
    251 		strncpy(name, "KEY_C1\0", KEYNAMEMAX);
    252 		return name;
    253 	}
    254 	if (key == 0x160) {
    255 		strncpy(name, "KEY_C3\0", KEYNAMEMAX);
    256 		return name;
    257 	}
    258 	if (key == 0x161) {
    259 		strncpy(name, "KEY_BTAB\0", KEYNAMEMAX);
    260 		return name;
    261 	}
    262 	if (key == 0x162) {
    263 		strncpy(name, "KEY_BEG\0", KEYNAMEMAX);
    264 		return name;
    265 	}
    266 	if (key == 0x163) {
    267 		strncpy(name, "KEY_CANCEL\0", KEYNAMEMAX);
    268 		return name;
    269 	}
    270 	if (key == 0x164) {
    271 		strncpy(name, "KEY_CLOSE\0", KEYNAMEMAX);
    272 		return name;
    273 	}
    274 	if (key == 0x165) {
    275 		strncpy(name, "KEY_COMMAND\0", KEYNAMEMAX);
    276 		return name;
    277 	}
    278 	if (key == 0x166) {
    279 		strncpy(name, "KEY_COPY\0", KEYNAMEMAX);
    280 		return name;
    281 	}
    282 	if (key == 0x167) {
    283 		strncpy(name, "KEY_CREATE\0", KEYNAMEMAX);
    284 		return name;
    285 	}
    286 	if (key == 0x168) {
    287 		strncpy(name, "KEY_END\0", KEYNAMEMAX);
    288 		return name;
    289 	}
    290 	if (key == 0x169) {
    291 		strncpy(name, "KEY_EXIT\0", KEYNAMEMAX);
    292 		return name;
    293 	}
    294 	if (key == 0x16A) {
    295 		strncpy(name, "KEY_FIND\0", KEYNAMEMAX);
    296 		return name;
    297 	}
    298 	if (key == 0x16B) {
    299 		strncpy(name, "KEY_HELP\0", KEYNAMEMAX);
    300 		return name;
    301 	}
    302 	if (key == 0x16C) {
    303 		strncpy(name, "KEY_MARK\0", KEYNAMEMAX);
    304 		return name;
    305 	}
    306 	if (key == 0x16D) {
    307 		strncpy(name, "KEY_MESSAGE\0", KEYNAMEMAX);
    308 		return name;
    309 	}
    310 	if (key == 0x16E) {
    311 		strncpy(name, "KEY_MOVE\0", KEYNAMEMAX);
    312 		return name;
    313 	}
    314 	if (key == 0x16F) {
    315 		strncpy(name, "KEY_NEXT\0", KEYNAMEMAX);
    316 		return name;
    317 	}
    318 	if (key == 0x170) {
    319 		strncpy(name, "KEY_OPEN\0", KEYNAMEMAX);
    320 		return name;
    321 	}
    322 	if (key == 0x171) {
    323 		strncpy(name, "KEY_OPTIONS\0", KEYNAMEMAX);
    324 		return name;
    325 	}
    326 	if (key == 0x172) {
    327 		strncpy(name, "KEY_PREVIOUS\0", KEYNAMEMAX);
    328 		return name;
    329 	}
    330 	if (key == 0x173) {
    331 		strncpy(name, "KEY_REDO\0", KEYNAMEMAX);
    332 		return name;
    333 	}
    334 	if (key == 0x174) {
    335 		strncpy(name, "KEY_REFERENCE\0", KEYNAMEMAX);
    336 		return name;
    337 	}
    338 	if (key == 0x175) {
    339 		strncpy(name, "KEY_REFRESH\0", KEYNAMEMAX);
    340 		return name;
    341 	}
    342 	if (key == 0x176) {
    343 		strncpy(name, "KEY_REPLACE\0", KEYNAMEMAX);
    344 		return name;
    345 	}
    346 	if (key == 0x177) {
    347 		strncpy(name, "KEY_RESTART\0", KEYNAMEMAX);
    348 		return name;
    349 	}
    350 	if (key == 0x178) {
    351 		strncpy(name, "KEY_RESUME\0", KEYNAMEMAX);
    352 		return name;
    353 	}
    354 	if (key == 0x179) {
    355 		strncpy(name, "KEY_SAVE\0", KEYNAMEMAX);
    356 		return name;
    357 	}
    358 	if (key == 0x17A) {
    359 		strncpy(name, "KEY_SBEG\0", KEYNAMEMAX);
    360 		return name;
    361 	}
    362 	if (key == 0x17B) {
    363 		strncpy(name, "KEY_SCANCEL\0", KEYNAMEMAX);
    364 		return name;
    365 	}
    366 	if (key == 0x17C) {
    367 		strncpy(name, "KEY_SCOMMAND\0", KEYNAMEMAX);
    368 		return name;
    369 	}
    370 	if (key == 0x17D) {
    371 		strncpy(name, "KEY_SCOPY\0", KEYNAMEMAX);
    372 		return name;
    373 	}
    374 	if (key == 0x17E) {
    375 		strncpy(name, "KEY_SCREATE\0", KEYNAMEMAX);
    376 		return name;
    377 	}
    378 	if (key == 0x17F) {
    379 		strncpy(name, "KEY_SDC\0", KEYNAMEMAX);
    380 		return name;
    381 	}
    382 	if (key == 0x180) {
    383 		strncpy(name, "KEY_SDL\0", KEYNAMEMAX);
    384 		return name;
    385 	}
    386 	if (key == 0x181) {
    387 		strncpy(name, "KEY_SELECT\0", KEYNAMEMAX);
    388 		return name;
    389 	}
    390 	if (key == 0x182) {
    391 		strncpy(name, "KEY_SEND\0", KEYNAMEMAX);
    392 		return name;
    393 	}
    394 	if (key == 0x183) {
    395 		strncpy(name, "KEY_SEOL\0", KEYNAMEMAX);
    396 		return name;
    397 	}
    398 	if (key == 0x184) {
    399 		strncpy(name, "KEY_SEXIT\0", KEYNAMEMAX);
    400 		return name;
    401 	}
    402 	if (key == 0x185) {
    403 		strncpy(name, "KEY_SFIND\0", KEYNAMEMAX);
    404 		return name;
    405 	}
    406 	if (key == 0x186) {
    407 		strncpy(name, "KEY_SHELP\0", KEYNAMEMAX);
    408 		return name;
    409 	}
    410 	if (key == 0x187) {
    411 		strncpy(name, "KEY_SHOME\0", KEYNAMEMAX);
    412 		return name;
    413 	}
    414 	if (key == 0x188) {
    415 		strncpy(name, "KEY_SIC\0", KEYNAMEMAX);
    416 		return name;
    417 	}
    418 	if (key == 0x189) {
    419 		strncpy(name, "KEY_SLEFT\0", KEYNAMEMAX);
    420 		return name;
    421 	}
    422 	if (key == 0x18A) {
    423 		strncpy(name, "KEY_SMESSAGE\0", KEYNAMEMAX);
    424 		return name;
    425 	}
    426 	if (key == 0x18B) {
    427 		strncpy(name, "KEY_SMOVE\0", KEYNAMEMAX);
    428 		return name;
    429 	}
    430 	if (key == 0x18C) {
    431 		strncpy(name, "KEY_SNEXT\0", KEYNAMEMAX);
    432 		return name;
    433 	}
    434 	if (key == 0x18D) {
    435 		strncpy(name, "KEY_SOPTIONS\0", KEYNAMEMAX);
    436 		return name;
    437 	}
    438 	if (key == 0x18E) {
    439 		strncpy(name, "KEY_SPREVIOUS\0", KEYNAMEMAX);
    440 		return name;
    441 	}
    442 	if (key == 0x18F) {
    443 		strncpy(name, "KEY_SPRINT\0", KEYNAMEMAX);
    444 		return name;
    445 	}
    446 	if (key == 0x190) {
    447 		strncpy(name, "KEY_SREDO\0", KEYNAMEMAX);
    448 		return name;
    449 	}
    450 	if (key == 0x191) {
    451 		strncpy(name, "KEY_SREPLACE\0", KEYNAMEMAX);
    452 		return name;
    453 	}
    454 	if (key == 0x192) {
    455 		strncpy(name, "KEY_SRIGHT\0", KEYNAMEMAX);
    456 		return name;
    457 	}
    458 	if (key == 0x193) {
    459 		strncpy(name, "KEY_SRSUME\0", KEYNAMEMAX);
    460 		return name;
    461 	}
    462 	if (key == 0x194) {
    463 		strncpy(name, "KEY_SSAVE\0", KEYNAMEMAX);
    464 		return name;
    465 	}
    466 	if (key == 0x195) {
    467 		strncpy(name, "KEY_SSUSPEND\0", KEYNAMEMAX);
    468 		return name;
    469 	}
    470 	if (key == 0x196) {
    471 		strncpy(name, "KEY_SUNDO\0", KEYNAMEMAX);
    472 		return name;
    473 	}
    474 	if (key == 0x197) {
    475 		strncpy(name, "KEY_SUSPEND\0", KEYNAMEMAX);
    476 		return name;
    477 	}
    478 	if (key == 0x198) {
    479 		strncpy(name, "KEY_UNDO\0", KEYNAMEMAX);
    480 		return name;
    481 	}
    482 	if (key == 0x199) {
    483 		strncpy(name, "KEY_MOUSE\0", KEYNAMEMAX);
    484 		return name;
    485 	}
    486 	if (key == 0x200) {
    487 		strncpy(name, "KEY_RESIZE\0", KEYNAMEMAX);
    488 		return name;
    489 	}
    490 	/* No more names. */
    491 	strncpy(name, "UNKOWN KEY\0", KEYNAMEMAX);
    492 	return name;
    493 #endif
    494 }
    495 /*
    496  * key_name --
    497  *	Return name of key or NULL;
    498  */
    499 char *
    500 key_name(wchar_t key)
    501 {
    502 #ifndef HAVE_WCHAR
    503 	return NULL;
    504 #else
    505 	(void) keyname((int) key);
    506 
    507 	if (!strncmp(name, "M-", 2)) {
    508 		/* Remove the "M-" */
    509 		name[0] = name[2];
    510 		name[1] = '\0';
    511 	}
    512 	return name;
    513 #endif /* HAVE_WCHAR */
    514 }
    515 
    516