summaryrefslogtreecommitdiff
path: root/usr/src/lib/libcurses/screen/setkeymap.c
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libcurses/screen/setkeymap.c
downloadillumos-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.c290
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);
+}