diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libcurses/screen/setkeymap.c | |
download | illumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libcurses/screen/setkeymap.c')
-rw-r--r-- | usr/src/lib/libcurses/screen/setkeymap.c | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/usr/src/lib/libcurses/screen/setkeymap.c b/usr/src/lib/libcurses/screen/setkeymap.c new file mode 100644 index 0000000000..8d337244f9 --- /dev/null +++ b/usr/src/lib/libcurses/screen/setkeymap.c @@ -0,0 +1,290 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 1997 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1988 AT&T */ +/* All Rights Reserved */ + +/* + * University Copyright- Copyright (c) 1982, 1986, 1988 + * The Regents of the University of California + * All Rights Reserved + * + * University Acknowledgment- Portions of this document are derived from + * software developed by the University of California, Berkeley, and its + * contributors. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/*LINTLIBRARY*/ + +#include <sys/types.h> +#include <stdlib.h> +#include <string.h> +#include "curses_inc.h" + +static short keycodes[] = { + KEY_BACKSPACE, + KEY_CATAB, + KEY_CLEAR, + KEY_CTAB, + KEY_DC, + KEY_DL, + KEY_DOWN, + KEY_EIC, + KEY_EOL, + KEY_EOS, + KEY_F(0), + KEY_F(1), + KEY_F(10), + KEY_F(2), + KEY_F(3), + KEY_F(4), + KEY_F(5), + KEY_F(6), + KEY_F(7), + KEY_F(8), + KEY_F(9), + KEY_HOME, + KEY_IC, + KEY_IL, + KEY_LEFT, + KEY_LL, + KEY_NPAGE, + KEY_PPAGE, + KEY_RIGHT, + KEY_SF, + KEY_SR, + KEY_STAB, + KEY_UP, + KEY_A1, + KEY_A3, + KEY_B2, + KEY_C1, + KEY_C3, + KEY_BTAB, + KEY_BEG, + KEY_CANCEL, + KEY_CLOSE, + KEY_COMMAND, + KEY_COPY, + KEY_CREATE, + KEY_END, + KEY_ENTER, + KEY_EXIT, + KEY_FIND, + KEY_HELP, + KEY_MARK, + KEY_MESSAGE, + KEY_MOVE, + KEY_NEXT, + KEY_OPEN, + KEY_OPTIONS, + KEY_PREVIOUS, + KEY_PRINT, + KEY_REDO, + KEY_REFERENCE, + KEY_REFRESH, + KEY_REPLACE, + KEY_RESTART, + KEY_RESUME, + KEY_SAVE, + KEY_SUSPEND, + KEY_UNDO, + KEY_SBEG, + KEY_SCANCEL, + KEY_SCOMMAND, + KEY_SCOPY, + KEY_SCREATE, + KEY_SDC, + KEY_SDL, + KEY_SELECT, + KEY_SEND, + KEY_SEOL, + KEY_SEXIT, + KEY_SFIND, + KEY_SHELP, + KEY_SHOME, + KEY_SIC, + KEY_SLEFT, + KEY_SMESSAGE, + KEY_SMOVE, + KEY_SNEXT, + KEY_SOPTIONS, + KEY_SPREVIOUS, + KEY_SPRINT, + KEY_SREDO, + KEY_SREPLACE, + KEY_SRIGHT, + KEY_SRSUME, + KEY_SSAVE, + KEY_SSUSPEND, + KEY_SUNDO, + KEY_MOUSE + }; + +static _KEY_MAP *p; +static bool *funckey; +static short *codeptr; + +static void +_laddone(char *txt) +{ + p->_sends = (txt); + p->_keyval = *codeptr; + funckey[(unsigned char)(txt)[0]] |= _KEY; + p++; +} + +/* Map text into num, updating the map structure p. */ + +static void +_keyfunc(char **keyptr, char **lastkey) +{ + for (; keyptr <= lastkey; keyptr++, codeptr++) + if (*keyptr) { + p->_sends = (*keyptr); + p->_keyval = *codeptr; + funckey[(unsigned char)(*keyptr)[0]] |= _KEY; + p++; + } +} + +/* Map text into num, updating the map structure p. */ + +static void +_keyfunc2(char **keyptr, char **lastkey) +{ + short code_value = KEY_F(11); + + for (; *keyptr && keyptr <= lastkey; keyptr++, code_value++) { + p->_sends = *keyptr; + p->_keyval = (short) code_value; + funckey[(unsigned char)*keyptr[0]] |= _KEY; + p++; + } +} + +int +setkeymap(void) +{ + _KEY_MAP keymap[((sizeof (keycodes) / sizeof (short)) + + ((KEY_F(63) - KEY_F(11)) + 1))], **key_ptrs; + short numkeys; + int numbytes, key_size = cur_term->_ksz; + + if (cur_term->internal_keys != NULL) + return (ERR); + p = keymap; + codeptr = keycodes; + funckey = cur_term->funckeystarter; + + /* If backspace key sends \b, don't map it. */ + if (key_backspace && strcmp(key_backspace, "\b")) + _laddone(key_backspace); + codeptr++; + + _keyfunc(&key_catab, &key_dl); + + /* If down arrow key sends \n, don't map it. */ + if (key_down && strcmp(key_down, "\n")) + _laddone(key_down); + codeptr++; + + _keyfunc(&key_eic, &key_il); + + /* If left arrow key sends \b, don't map it. */ + if (key_left && strcmp(key_left, "\b")) + _laddone(key_left); + codeptr++; + + _keyfunc(&key_ll, &key_up); + _keyfunc(&key_a1, &key_c3); + _keyfunc(&key_btab, &key_btab); + _keyfunc(&key_beg, &key_sundo); + _keyfunc2(&key_f11, &key_f63); + _keyfunc(&key_mouse, &key_mouse); + + /* + * malloc returns the address of a list of pointers to + * (_KEY_MAP *) structures + */ + + if ((key_ptrs = (_KEY_MAP **) + /* LINTED */ + malloc((key_size + (numkeys = (short)(p - keymap))) * + sizeof (_KEY_MAP *))) == NULL) { + goto out; + } + + /* + * Number of bytes needed is the number of structures times their size + * malloc room for our array of _KEY_MAP structures + */ + + if ((p = (_KEY_MAP *) malloc((unsigned) + /* LINTED */ + (numbytes = (int)(sizeof (_KEY_MAP) * numkeys)))) == NULL) { + /* Can't do it, free list of pointers, indicate */ + /* error upon return. */ + free((char *) key_ptrs); +out: + term_errno = TERM_BAD_MALLOC; +#ifdef DEBUG + strcpy(term_parm_err, "setkeymap"); + termerr(); +#endif /* DEBUG */ + return (ERR); + } + + if (key_size != 0) { + (void) memcpy((char *) &(key_ptrs[numkeys]), + (char *) cur_term->_keys, (key_size * + sizeof (_KEY_MAP *))); + free(cur_term->_keys); + } + (void) memcpy((char *) (cur_term->internal_keys = p), + (char *) keymap, numbytes); + cur_term->_keys = key_ptrs; + cur_term->_ksz += numkeys; + /* + * Reset _lastkey_ordered to -1 since we put the keys read in + * from terminfo at the beginning of the keys table. + */ + cur_term->_lastkey_ordered = -1; + cur_term->_lastmacro_ordered += numkeys; + cur_term->_first_macro += numkeys; + + /* Initialize our pointers to the structures */ + while (numkeys--) + *key_ptrs++ = p++; +#ifdef DEBUG + if (outf) + fprintf(outf, "return key structure %x, ending at %x\n", + keymap, p); +#endif /* DEBUG */ + return (OK); +} |