1/*
2 *  $Id: dlg_keys.h,v 1.39 2020/11/22 23:19:24 tom Exp $
3 *
4 *  dlg_keys.h -- runtime binding support for dialog
5 *
6 *  Copyright 2005-2019,2020 Thomas E.  Dickey
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU Lesser General Public License, version 2.1
10 *  as published by the Free Software Foundation.
11 *
12 *  This program is distributed in the hope that it will be useful, but
13 *  WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 *  Lesser General Public License for more details.
16 *
17 *  You should have received a copy of the GNU Lesser General Public
18 *  License along with this program; if not, write to
19 *	Free Software Foundation, Inc.
20 *	51 Franklin St., Fifth Floor
21 *	Boston, MA 02110, USA.
22 */
23
24#ifndef DLG_KEYS_H_included
25#define DLG_KEYS_H_included 1
26/* *INDENT-OFF* */
27
28#include <dialog.h>
29
30#ifdef USE_WIDE_CURSES
31#include <wctype.h>
32#define dlg_toupper(ch) towupper((wint_t)ch)
33#define dlg_isupper(ch) iswupper((wint_t)ch)
34#else
35#define dlg_toupper(ch) (((ch) > 0 && (ch) <= 255) ? toupper(ch) : (ch))
36#define dlg_isupper(ch) (isalpha(ch) && isupper(ch))
37#endif
38
39#ifdef __cplusplus
40extern "C" {
41#endif
42
43typedef struct {
44    int is_function_key;
45    int	curses_key;
46    int dialog_key;
47} DLG_KEYS_BINDING;
48
49#define DLG_KEYS_DATA(dialog, curses)  { (curses) >= KEY_MIN, curses, dialog }
50
51#define END_KEYS_BINDING { -1, 0, 0 }
52
53/*
54 * Define dialog's internal function-keys past the range used by curses.
55 */
56typedef enum {
57    DLGK_MIN = KEY_MAX + 1,
58    /* predefined buttons */
59    DLGK_OK,
60    DLGK_CANCEL,
61    DLGK_EXTRA,
62    DLGK_HELP,
63    DLGK_ESC,
64    /* moving from screen to screen (pages) */
65    DLGK_PAGE_FIRST,
66    DLGK_PAGE_LAST,
67    DLGK_PAGE_NEXT,
68    DLGK_PAGE_PREV,
69    /* moving within a list */
70    DLGK_ITEM_FIRST,
71    DLGK_ITEM_LAST,
72    DLGK_ITEM_NEXT,
73    DLGK_ITEM_PREV,
74    /* moving from field to field (or buttons) */
75    DLGK_FIELD_FIRST,
76    DLGK_FIELD_LAST,
77    DLGK_FIELD_NEXT,
78    DLGK_FIELD_PREV,
79    /* moving from form-field to form-field (or buttons) */
80    DLGK_FORM_FIRST,
81    DLGK_FORM_LAST,
82    DLGK_FORM_NEXT,
83    DLGK_FORM_PREV,
84    /* moving within a grid */
85    DLGK_GRID_UP,
86    DLGK_GRID_DOWN,
87    DLGK_GRID_LEFT,
88    DLGK_GRID_RIGHT,
89    /* delete */
90    DLGK_DELETE_LEFT,
91    DLGK_DELETE_RIGHT,
92    DLGK_DELETE_ALL,
93    /* special */
94    DLGK_ENTER,
95    DLGK_BEGIN,
96    DLGK_FINAL,
97    DLGK_SELECT,
98    DLGK_HELPFILE,
99    DLGK_TRACE,
100    DLGK_TOGGLE,
101    DLGK_LEAVE
102} DLG_KEYS_ENUM;
103
104#define is_DLGK_MOUSE(code)	((code) >= M_EVENT)
105#define DLGK_MOUSE(code)	((code) + M_EVENT)
106
107#define HELPKEY_BINDINGS \
108	DLG_KEYS_DATA( DLGK_HELPFILE,	   CHR_HELP ), \
109	DLG_KEYS_DATA( DLGK_HELPFILE,	   KEY_F(1) ), \
110	DLG_KEYS_DATA( DLGK_HELPFILE,	   KEY_HELP )
111
112#define ENTERKEY_BINDINGS \
113	DLG_KEYS_DATA( DLGK_ENTER,	   '\n' ), \
114	DLG_KEYS_DATA( DLGK_ENTER,	   '\r' ), \
115	DLG_KEYS_DATA( DLGK_ENTER,	   KEY_ENTER ), \
116	DLG_KEYS_DATA( DLGK_LEAVE,	   CHR_LEAVE )
117
118/* ^U == 21 */
119#define INPUTSTR_BINDINGS \
120	DLG_KEYS_DATA( DLGK_BEGIN,	   KEY_HOME ), \
121	DLG_KEYS_DATA( DLGK_DELETE_ALL,    CHR_KILL ), \
122	DLG_KEYS_DATA( DLGK_DELETE_LEFT,   CHR_BACKSPACE ), \
123	DLG_KEYS_DATA( DLGK_DELETE_LEFT,   KEY_BACKSPACE ), \
124	DLG_KEYS_DATA( DLGK_DELETE_RIGHT,  CHR_DELETE ), \
125	DLG_KEYS_DATA( DLGK_DELETE_RIGHT,  KEY_DC ), \
126	DLG_KEYS_DATA( DLGK_FINAL,	   KEY_END ), \
127	DLG_KEYS_DATA( DLGK_GRID_LEFT,	   KEY_LEFT ), \
128	DLG_KEYS_DATA( DLGK_GRID_RIGHT,	   KEY_RIGHT )
129
130#define SCROLL_FKEY_BINDINGS \
131	DLG_KEYS_DATA( DLGK_GRID_DOWN,	KEY_DOWN ), \
132	DLG_KEYS_DATA( DLGK_GRID_UP,	KEY_UP ), \
133	DLG_KEYS_DATA( DLGK_PAGE_FIRST,	KEY_HOME ), \
134	DLG_KEYS_DATA( DLGK_PAGE_LAST,	KEY_END ), \
135	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	KEY_NPAGE ), \
136	DLG_KEYS_DATA( DLGK_PAGE_PREV,	KEY_PPAGE )
137
138#define SCROLLKEY_BINDINGS \
139	SCROLL_FKEY_BINDINGS, \
140	DLG_KEYS_DATA( DLGK_GRID_DOWN,	'J' ), \
141	DLG_KEYS_DATA( DLGK_GRID_DOWN,	'j' ), \
142	DLG_KEYS_DATA( DLGK_GRID_UP,	'K' ), \
143	DLG_KEYS_DATA( DLGK_GRID_UP,	'k' ), \
144	DLG_KEYS_DATA( DLGK_PAGE_FIRST,	'g' ), \
145	DLG_KEYS_DATA( DLGK_PAGE_LAST,	'G' ), \
146	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	'F' ), \
147	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	'f' ), \
148	DLG_KEYS_DATA( DLGK_PAGE_PREV,	'B' ), \
149	DLG_KEYS_DATA( DLGK_PAGE_PREV,	'b' )
150
151#define TRAVERSE_BINDINGS \
152	DLG_KEYS_DATA( DLGK_ENTER,	CHR_SPACE ), \
153	DLG_KEYS_DATA( DLGK_FIELD_NEXT,	KEY_DOWN ), \
154	DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ), \
155	DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ), \
156	DLG_KEYS_DATA( DLGK_FIELD_PREV,	KEY_UP ), \
157	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ), \
158	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT )
159
160#define TOGGLEKEY_BINDINGS \
161	DLG_KEYS_DATA( DLGK_TOGGLE,	CHR_SPACE )
162
163extern int dlg_button_key(int /*exit_code*/, int * /*button*/, int * /*dialog_key*/, int * /*fkey*/);
164extern int dlg_lookup_key(WINDOW * /*win*/, int /*curses_key*/, int * /*dialog_key*/);
165extern int dlg_ok_button_key(int /*exit_code*/, int * /*button*/, int * /*dialog_key*/, int * /*fkey*/);
166extern int dlg_result_key(int /*dialog_key*/, int /*fkey*/, int * /*resultp*/);
167extern void dlg_register_buttons(WINDOW * /*win*/, const char * /*name*/, const char ** /*buttons*/);
168extern void dlg_register_window(WINDOW * /*win*/, const char * /*name*/, DLG_KEYS_BINDING * /*binding*/);
169extern void dlg_unregister_window(WINDOW * /*win*/);
170
171#ifdef HAVE_RC_FILE
172extern int dlg_parse_bindkey(char * /*params*/);
173extern void dlg_dump_keys(FILE * /*fp*/);
174extern void dlg_dump_window_keys(FILE * /*fp*/, WINDOW * /*win*/);
175#endif
176
177#ifdef __cplusplus
178}
179#endif
180/* *INDENT-ON* */
181
182#endif /* DLG_KEYS_H_included */
183