/****************************************************************************
- * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * Copyright (c) 1999-2009,2010 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
****************************************************************************/
#include <curses.priv.h>
+#include <tic.h> /* struct tinfo_fkeys */
-#include <term.h> /* keypad_xmit, keypad_local, meta_on, meta_off */
- /* cursor_visible,cursor_normal,cursor_invisible */
-#include <tic.h> /* struct tinfo_fkeys */
-
-MODULE_ID("$Id: init_keytry.c,v 1.3 2000/03/12 02:55:50 Todd.C.Miller Exp $")
+MODULE_ID("$Id: init_keytry.c,v 1.17 2010/04/24 22:29:56 tom Exp $")
/*
** _nc_init_keytry()
**
*/
+/*
+ * Internal entrypoints use SCREEN* parameter to obtain capabilities rather
+ * than cur_term.
+ */
+#undef CUR
+#define CUR SP_TERMTYPE
+
#if BROKEN_LINKER
#undef _nc_tinfo_fkeys
#endif
#endif*/
#if BROKEN_LINKER
-struct tinfo_fkeys *_nc_tinfo_fkeysf(void)
+const struct tinfo_fkeys *
+_nc_tinfo_fkeysf(void)
{
- return _nc_tinfo_fkeys;
+ return _nc_tinfo_fkeys;
}
#endif
-void _nc_init_keytry(void)
+NCURSES_EXPORT(void)
+_nc_init_keytry(SCREEN *sp)
{
- size_t n;
+ unsigned n;
- /* The SP->_keytry value is initialized in newterm(), where the SP
- * structure is created, because we can not tell where keypad() or
- * mouse_activate() (which will call keyok()) are first called.
- */
+ /* The sp->_keytry value is initialized in newterm(), where the sp
+ * structure is created, because we can not tell where keypad() or
+ * mouse_activate() (which will call keyok()) are first called.
+ */
- for (n = 0; _nc_tinfo_fkeys[n].code; n++)
- if (_nc_tinfo_fkeys[n].offset < STRCOUNT)
- _nc_add_to_try(&(SP->_keytry),
- CUR Strings[_nc_tinfo_fkeys[n].offset],
- _nc_tinfo_fkeys[n].code);
+ if (sp != 0) {
+ for (n = 0; _nc_tinfo_fkeys[n].code; n++) {
+ if (_nc_tinfo_fkeys[n].offset < STRCOUNT) {
+ (void) _nc_add_to_try(&(sp->_keytry),
+ CUR Strings[_nc_tinfo_fkeys[n].offset],
+ _nc_tinfo_fkeys[n].code);
+ }
+ }
+#if NCURSES_XNAMES
+ /*
+ * Add any of the extended strings to the tries if their name begins
+ * with 'k', i.e., they follow the convention of other terminfo key
+ * names.
+ */
+ {
+ TERMTYPE *tp = &(sp->_term->type);
+ for (n = STRCOUNT; n < NUM_STRINGS(tp); ++n) {
+ const char *name = ExtStrname(tp, (int) n, strnames);
+ char *value = tp->Strings[n];
+ if (name != 0
+ && *name == 'k'
+ && value != 0
+ && NCURSES_SP_NAME(key_defined) (NCURSES_SP_ARGx
+ value) == 0) {
+ (void) _nc_add_to_try(&(sp->_keytry),
+ value,
+ n - STRCOUNT + KEY_MAX);
+ }
+ }
+ }
+#endif
#ifdef TRACE
- _nc_trace_tries(SP->_keytry);
+ _nc_trace_tries(sp->_keytry);
#endif
+ }
}