75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
|
/* Copyright (c) 1988 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
#ident "@(#)curses:screen/newkey.c 1.4"
|
|
#include "curses_inc.h"
|
|
|
|
/*
|
|
* Set a new key or a new macro.
|
|
*
|
|
* rcvchars: the pattern identifying the key
|
|
* keyval: the value to return when the key is recognized
|
|
* macro: if this is not a function key but a macro,
|
|
* tgetch() will block on macros.
|
|
*/
|
|
|
|
int
|
|
newkey(char *rcvchars, int keyval, int macro)
|
|
{
|
|
register _KEY_MAP **keys, *key_info,
|
|
**prev_keys = cur_term->_keys;
|
|
short *numkeys = &cur_term->_ksz, len;
|
|
char *str;
|
|
|
|
if ((!rcvchars) || (*rcvchars == '\0') || (keyval < 0) ||
|
|
(((keys = (_KEY_MAP **) malloc(sizeof (_KEY_MAP *) * ((size_t)*numkeys + 1))) == NULL)))
|
|
{
|
|
goto bad;
|
|
}
|
|
|
|
len = (short) (strlen(rcvchars) + 1);
|
|
|
|
if ((key_info = (_KEY_MAP *) malloc(sizeof (_KEY_MAP) + (size_t) len)) == NULL)
|
|
{
|
|
free (keys);
|
|
bad :
|
|
term_errno = TERM_BAD_MALLOC;
|
|
#ifdef DEBUG
|
|
strcpy(term_parm_err, "newkey");
|
|
#endif /* DEBUG */
|
|
return (ERR);
|
|
}
|
|
|
|
if (macro)
|
|
{
|
|
(void) memcpy((char *) keys, (char *) prev_keys, ((size_t) *numkeys * sizeof (_KEY_MAP *)));
|
|
keys[*numkeys] = key_info;
|
|
}
|
|
else
|
|
{
|
|
short *first = &(cur_term->_first_macro);
|
|
|
|
(void) memcpy((char *) keys, (char *) prev_keys, ((size_t) *first * sizeof (_KEY_MAP *)));
|
|
(void) memcpy((char *) &(keys[*first + 1]), (char *) &(prev_keys[*first]), ((size_t) (*numkeys - *first) * sizeof (_KEY_MAP *)));
|
|
keys[(*first)++] = key_info;
|
|
cur_term->_lastmacro_ordered++;
|
|
}
|
|
if (prev_keys != NULL)
|
|
free(prev_keys);
|
|
cur_term->_keys = keys;
|
|
|
|
(*numkeys)++;
|
|
key_info->_sends = str = (char *) key_info + sizeof(_KEY_MAP);
|
|
(void) memcpy(str, rcvchars, (size_t) len);
|
|
key_info->_keyval = (short) keyval;
|
|
cur_term->funckeystarter[*str] |= (macro ? _MACRO : _KEY);
|
|
|
|
return (OK);
|
|
}
|