12a3e3873SBaptiste Daroussin /*
2*a96ef450SBaptiste Daroussin * $Id: rangebox.c,v 1.32 2020/11/22 23:25:09 tom Exp $
32a3e3873SBaptiste Daroussin *
42a3e3873SBaptiste Daroussin * rangebox.c -- implements the rangebox dialog
52a3e3873SBaptiste Daroussin *
6*a96ef450SBaptiste Daroussin * Copyright 2012-2019,2020 Thomas E. Dickey
72a3e3873SBaptiste Daroussin *
82a3e3873SBaptiste Daroussin * This program is free software; you can redistribute it and/or modify
92a3e3873SBaptiste Daroussin * it under the terms of the GNU Lesser General Public License, version 2.1
102a3e3873SBaptiste Daroussin * as published by the Free Software Foundation.
112a3e3873SBaptiste Daroussin *
122a3e3873SBaptiste Daroussin * This program is distributed in the hope that it will be useful, but
132a3e3873SBaptiste Daroussin * WITHOUT ANY WARRANTY; without even the implied warranty of
142a3e3873SBaptiste Daroussin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
152a3e3873SBaptiste Daroussin * Lesser General Public License for more details.
162a3e3873SBaptiste Daroussin *
172a3e3873SBaptiste Daroussin * You should have received a copy of the GNU Lesser General Public
182a3e3873SBaptiste Daroussin * License along with this program; if not, write to
192a3e3873SBaptiste Daroussin * Free Software Foundation, Inc.
202a3e3873SBaptiste Daroussin * 51 Franklin St., Fifth Floor
212a3e3873SBaptiste Daroussin * Boston, MA 02110, USA.
222a3e3873SBaptiste Daroussin */
232a3e3873SBaptiste Daroussin
24*a96ef450SBaptiste Daroussin #include <dlg_internals.h>
252a3e3873SBaptiste Daroussin #include <dlg_keys.h>
262a3e3873SBaptiste Daroussin
272a3e3873SBaptiste Daroussin #define ONE_HIGH 1
282a3e3873SBaptiste Daroussin
292a3e3873SBaptiste Daroussin #define MIN_HIGH (ONE_HIGH + 1 + (4 * MARGIN))
302a3e3873SBaptiste Daroussin #define MIN_WIDE (10 + 2 + (2 * MARGIN))
312a3e3873SBaptiste Daroussin
322a3e3873SBaptiste Daroussin typedef struct {
332a3e3873SBaptiste Daroussin /* window in which the value and slider are drawn */
342a3e3873SBaptiste Daroussin WINDOW *window;
352a3e3873SBaptiste Daroussin int min_value;
362a3e3873SBaptiste Daroussin int max_value;
372a3e3873SBaptiste Daroussin /* position and width of the numeric field */
382a3e3873SBaptiste Daroussin int value_x;
392a3e3873SBaptiste Daroussin int value_len;
402a3e3873SBaptiste Daroussin int value_col;
412a3e3873SBaptiste Daroussin /* position and width of the slider field */
422a3e3873SBaptiste Daroussin int slide_x;
432a3e3873SBaptiste Daroussin int slide_y;
442a3e3873SBaptiste Daroussin int slide_len;
452a3e3873SBaptiste Daroussin /* current value drawn */
462a3e3873SBaptiste Daroussin int current;
472a3e3873SBaptiste Daroussin /* value to add to make slider move by one cell */
482a3e3873SBaptiste Daroussin int slide_inc;
492a3e3873SBaptiste Daroussin } VALUE;
502a3e3873SBaptiste Daroussin
512a3e3873SBaptiste Daroussin static int
digits_of(int value)522a3e3873SBaptiste Daroussin digits_of(int value)
532a3e3873SBaptiste Daroussin {
542a3e3873SBaptiste Daroussin char temp[80];
552a3e3873SBaptiste Daroussin sprintf(temp, "%d", value);
562a3e3873SBaptiste Daroussin return (int) strlen(temp);
572a3e3873SBaptiste Daroussin }
582a3e3873SBaptiste Daroussin
592a3e3873SBaptiste Daroussin static int
digit_of(VALUE * data)602a3e3873SBaptiste Daroussin digit_of(VALUE * data)
612a3e3873SBaptiste Daroussin {
622a3e3873SBaptiste Daroussin int col = data->value_col;
632a3e3873SBaptiste Daroussin int result = 1;
642a3e3873SBaptiste Daroussin
652a3e3873SBaptiste Daroussin while (++col < data->value_len) {
662a3e3873SBaptiste Daroussin result *= 10;
672a3e3873SBaptiste Daroussin }
682a3e3873SBaptiste Daroussin return result;
692a3e3873SBaptiste Daroussin }
702a3e3873SBaptiste Daroussin
712a3e3873SBaptiste Daroussin static bool
set_digit(VALUE * data,int chr)722a3e3873SBaptiste Daroussin set_digit(VALUE * data, int chr)
732a3e3873SBaptiste Daroussin {
742a3e3873SBaptiste Daroussin bool result = FALSE;
752a3e3873SBaptiste Daroussin char buffer[80];
762a3e3873SBaptiste Daroussin long check;
772a3e3873SBaptiste Daroussin char *next = 0;
782a3e3873SBaptiste Daroussin
792a3e3873SBaptiste Daroussin sprintf(buffer, "%*d", data->value_len, data->current);
802a3e3873SBaptiste Daroussin buffer[data->value_col] = (char) chr;
812a3e3873SBaptiste Daroussin check = strtol(buffer, &next, 10);
822a3e3873SBaptiste Daroussin if (next == 0 || *next == '\0') {
832a3e3873SBaptiste Daroussin if ((check <= (long) data->max_value) &&
842a3e3873SBaptiste Daroussin (check >= (long) data->min_value)) {
852a3e3873SBaptiste Daroussin result = TRUE;
862a3e3873SBaptiste Daroussin data->current = (int) check;
872a3e3873SBaptiste Daroussin }
882a3e3873SBaptiste Daroussin }
892a3e3873SBaptiste Daroussin
902a3e3873SBaptiste Daroussin return result;
912a3e3873SBaptiste Daroussin }
922a3e3873SBaptiste Daroussin
932a3e3873SBaptiste Daroussin /*
942a3e3873SBaptiste Daroussin * This is similar to the gauge code, but differs in the way the number
952a3e3873SBaptiste Daroussin * is displayed, etc.
962a3e3873SBaptiste Daroussin */
972a3e3873SBaptiste Daroussin static void
draw_value(VALUE * data,int value)982a3e3873SBaptiste Daroussin draw_value(VALUE * data, int value)
992a3e3873SBaptiste Daroussin {
1002a3e3873SBaptiste Daroussin if (value != data->current) {
1012a3e3873SBaptiste Daroussin WINDOW *win = data->window;
1022a3e3873SBaptiste Daroussin int y, x;
1032a3e3873SBaptiste Daroussin int n;
1042a3e3873SBaptiste Daroussin int ranges = (data->max_value + 1 - data->min_value);
1052a3e3873SBaptiste Daroussin int offset = (value - data->min_value);
1062a3e3873SBaptiste Daroussin int scaled;
1072a3e3873SBaptiste Daroussin
1082a3e3873SBaptiste Daroussin getyx(win, y, x);
1092a3e3873SBaptiste Daroussin
1102a3e3873SBaptiste Daroussin if (ranges > data->slide_len) {
1112a3e3873SBaptiste Daroussin scaled = (offset + data->slide_inc) / data->slide_inc;
1122a3e3873SBaptiste Daroussin } else if (ranges < data->slide_len) {
1132a3e3873SBaptiste Daroussin scaled = (offset + 1) * data->slide_inc;
1142a3e3873SBaptiste Daroussin } else {
1152a3e3873SBaptiste Daroussin scaled = offset;
1162a3e3873SBaptiste Daroussin }
1172a3e3873SBaptiste Daroussin
118f4f33ea0SBaptiste Daroussin dlg_attrset(win, gauge_attr);
1192a3e3873SBaptiste Daroussin wmove(win, data->slide_y, data->slide_x);
1202a3e3873SBaptiste Daroussin for (n = 0; n < data->slide_len; ++n) {
1212a3e3873SBaptiste Daroussin (void) waddch(win, ' ');
1222a3e3873SBaptiste Daroussin }
1232a3e3873SBaptiste Daroussin wmove(win, data->slide_y, data->value_x);
1242a3e3873SBaptiste Daroussin wprintw(win, "%*d", data->value_len, value);
1252a3e3873SBaptiste Daroussin if ((gauge_attr & A_REVERSE) != 0) {
126f4f33ea0SBaptiste Daroussin dlg_attroff(win, A_REVERSE);
1272a3e3873SBaptiste Daroussin } else {
128f4f33ea0SBaptiste Daroussin dlg_attrset(win, A_REVERSE);
1292a3e3873SBaptiste Daroussin }
1302a3e3873SBaptiste Daroussin wmove(win, data->slide_y, data->slide_x);
1312a3e3873SBaptiste Daroussin for (n = 0; n < scaled; ++n) {
1322a3e3873SBaptiste Daroussin chtype ch2 = winch(win);
1332a3e3873SBaptiste Daroussin if (gauge_attr & A_REVERSE) {
1342a3e3873SBaptiste Daroussin ch2 &= ~A_REVERSE;
1352a3e3873SBaptiste Daroussin }
1362a3e3873SBaptiste Daroussin (void) waddch(win, ch2);
1372a3e3873SBaptiste Daroussin }
138f4f33ea0SBaptiste Daroussin dlg_attrset(win, dialog_attr);
1392a3e3873SBaptiste Daroussin
1402a3e3873SBaptiste Daroussin wmove(win, y, x);
1412a3e3873SBaptiste Daroussin data->current = value;
1422a3e3873SBaptiste Daroussin
143f4f33ea0SBaptiste Daroussin DLG_TRACE(("# drew %d offset %d scaled %d limit %d inc %d\n",
1442a3e3873SBaptiste Daroussin value,
1452a3e3873SBaptiste Daroussin offset,
1462a3e3873SBaptiste Daroussin scaled,
1472a3e3873SBaptiste Daroussin data->slide_len,
148f4f33ea0SBaptiste Daroussin data->slide_inc));
1492a3e3873SBaptiste Daroussin
1502a3e3873SBaptiste Daroussin dlg_trace_win(win);
1512a3e3873SBaptiste Daroussin }
1522a3e3873SBaptiste Daroussin }
1532a3e3873SBaptiste Daroussin
1542a3e3873SBaptiste Daroussin /*
1552a3e3873SBaptiste Daroussin * Allow the user to select from a range of values, e.g., using a slider.
1562a3e3873SBaptiste Daroussin */
1572a3e3873SBaptiste Daroussin int
dialog_rangebox(const char * title,const char * cprompt,int height,int width,int min_value,int max_value,int default_value)1582a3e3873SBaptiste Daroussin dialog_rangebox(const char *title,
1592a3e3873SBaptiste Daroussin const char *cprompt,
1602a3e3873SBaptiste Daroussin int height,
1612a3e3873SBaptiste Daroussin int width,
1622a3e3873SBaptiste Daroussin int min_value,
1632a3e3873SBaptiste Daroussin int max_value,
1642a3e3873SBaptiste Daroussin int default_value)
1652a3e3873SBaptiste Daroussin {
1662a3e3873SBaptiste Daroussin /* *INDENT-OFF* */
1672a3e3873SBaptiste Daroussin static DLG_KEYS_BINDING binding[] = {
1682a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_DELETE_RIGHT,KEY_DC ),
1692a3e3873SBaptiste Daroussin HELPKEY_BINDINGS,
1702a3e3873SBaptiste Daroussin ENTERKEY_BINDINGS,
171f4f33ea0SBaptiste Daroussin TOGGLEKEY_BINDINGS,
1722a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_NEXT, CHR_NEXT ),
1732a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
1742a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
1752a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_PREV, CHR_BACKSPACE ),
1762a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_PREV, CHR_PREVIOUS ),
1772a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ),
1782a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ),
1792a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_FIRST, KEY_HOME),
1802a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_LAST, KEY_END),
1812a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_LAST, KEY_LL ),
1822a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_NEXT, '+'),
1832a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_NEXT, KEY_DOWN),
1842a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_PREV, '-' ),
1852a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_ITEM_PREV, KEY_UP ),
1862a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_PAGE_NEXT, KEY_NEXT),
1872a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_PAGE_NEXT, KEY_NPAGE),
1882a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_PAGE_PREV, KEY_PPAGE ),
1892a3e3873SBaptiste Daroussin DLG_KEYS_DATA( DLGK_PAGE_PREV, KEY_PREVIOUS ),
1902a3e3873SBaptiste Daroussin END_KEYS_BINDING
1912a3e3873SBaptiste Daroussin };
1922a3e3873SBaptiste Daroussin /* *INDENT-ON* */
1932a3e3873SBaptiste Daroussin
1942a3e3873SBaptiste Daroussin #ifdef KEY_RESIZE
1952a3e3873SBaptiste Daroussin int old_height = height;
1962a3e3873SBaptiste Daroussin int old_width = width;
1972a3e3873SBaptiste Daroussin #endif
1982a3e3873SBaptiste Daroussin VALUE data;
199*a96ef450SBaptiste Daroussin int key, fkey;
2002a3e3873SBaptiste Daroussin int button;
2012a3e3873SBaptiste Daroussin int result = DLG_EXIT_UNKNOWN;
2022a3e3873SBaptiste Daroussin WINDOW *dialog;
2032a3e3873SBaptiste Daroussin int state = dlg_default_button();
2042a3e3873SBaptiste Daroussin const char **buttons = dlg_ok_labels();
205f4f33ea0SBaptiste Daroussin char *prompt;
2062a3e3873SBaptiste Daroussin char buffer[MAX_LEN];
2072a3e3873SBaptiste Daroussin int cur_value = default_value;
2082a3e3873SBaptiste Daroussin int usable;
2092a3e3873SBaptiste Daroussin int ranges;
2102a3e3873SBaptiste Daroussin int yorg, xorg;
2112a3e3873SBaptiste Daroussin
212f4f33ea0SBaptiste Daroussin DLG_TRACE(("# tailbox args:\n"));
213f4f33ea0SBaptiste Daroussin DLG_TRACE2S("title", title);
214f4f33ea0SBaptiste Daroussin DLG_TRACE2S("message", cprompt);
215f4f33ea0SBaptiste Daroussin DLG_TRACE2N("height", height);
216f4f33ea0SBaptiste Daroussin DLG_TRACE2N("width", width);
217f4f33ea0SBaptiste Daroussin DLG_TRACE2N("minval", min_value);
218f4f33ea0SBaptiste Daroussin DLG_TRACE2N("maxval", max_value);
219f4f33ea0SBaptiste Daroussin DLG_TRACE2N("default", default_value);
220f4f33ea0SBaptiste Daroussin
2212a3e3873SBaptiste Daroussin if (max_value < min_value)
2222a3e3873SBaptiste Daroussin max_value = min_value;
2232a3e3873SBaptiste Daroussin if (cur_value > max_value)
2242a3e3873SBaptiste Daroussin cur_value = max_value;
2252a3e3873SBaptiste Daroussin if (cur_value < min_value)
2262a3e3873SBaptiste Daroussin cur_value = min_value;
2272a3e3873SBaptiste Daroussin
2282a3e3873SBaptiste Daroussin dlg_does_output();
2292a3e3873SBaptiste Daroussin
2302a3e3873SBaptiste Daroussin #ifdef KEY_RESIZE
2312a3e3873SBaptiste Daroussin retry:
2322a3e3873SBaptiste Daroussin #endif
2332a3e3873SBaptiste Daroussin
234f4f33ea0SBaptiste Daroussin prompt = dlg_strclone(cprompt);
235*a96ef450SBaptiste Daroussin dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, MIN_WIDE);
236f4f33ea0SBaptiste Daroussin
2372a3e3873SBaptiste Daroussin dlg_button_layout(buttons, &width);
2382a3e3873SBaptiste Daroussin dlg_print_size(height, width);
2392a3e3873SBaptiste Daroussin dlg_ctl_size(height, width);
2402a3e3873SBaptiste Daroussin
2412a3e3873SBaptiste Daroussin dialog = dlg_new_window(height, width,
2422a3e3873SBaptiste Daroussin yorg = dlg_box_y_ordinate(height),
2432a3e3873SBaptiste Daroussin xorg = dlg_box_x_ordinate(width));
2442a3e3873SBaptiste Daroussin
2452a3e3873SBaptiste Daroussin data.window = dialog;
2462a3e3873SBaptiste Daroussin
2472a3e3873SBaptiste Daroussin data.min_value = min_value;
2482a3e3873SBaptiste Daroussin data.max_value = max_value;
2492a3e3873SBaptiste Daroussin
2502a3e3873SBaptiste Daroussin usable = (width - 2 - 4 * MARGIN);
2512a3e3873SBaptiste Daroussin ranges = max_value - min_value + 1;
2522a3e3873SBaptiste Daroussin
2532a3e3873SBaptiste Daroussin /*
2542a3e3873SBaptiste Daroussin * Center the number after allowing for its maximum number of digits.
2552a3e3873SBaptiste Daroussin */
2562a3e3873SBaptiste Daroussin data.value_len = digits_of(max_value);
2572a3e3873SBaptiste Daroussin if (digits_of(min_value) > data.value_len)
2582a3e3873SBaptiste Daroussin data.value_len = digits_of(min_value);
2592a3e3873SBaptiste Daroussin data.value_x = (usable - data.value_len) / 2 + MARGIN;
2602a3e3873SBaptiste Daroussin data.value_col = data.value_len - 1;
2612a3e3873SBaptiste Daroussin
2622a3e3873SBaptiste Daroussin /*
2632a3e3873SBaptiste Daroussin * The slider is scaled, to try to use the width of the dialog.
2642a3e3873SBaptiste Daroussin */
2652a3e3873SBaptiste Daroussin if (ranges > usable) {
2662a3e3873SBaptiste Daroussin data.slide_inc = (ranges + usable - 1) / usable;
2672a3e3873SBaptiste Daroussin data.slide_len = 1 + ranges / data.slide_inc;
2682a3e3873SBaptiste Daroussin } else if (ranges < usable) {
2692a3e3873SBaptiste Daroussin data.slide_inc = usable / ranges;
2702a3e3873SBaptiste Daroussin data.slide_len = ranges * data.slide_inc;
2712a3e3873SBaptiste Daroussin } else {
2722a3e3873SBaptiste Daroussin data.slide_inc = 1;
2732a3e3873SBaptiste Daroussin data.slide_len = usable;
2742a3e3873SBaptiste Daroussin }
2752a3e3873SBaptiste Daroussin data.slide_x = (usable - data.slide_len) / 2 + MARGIN + 2;
2762a3e3873SBaptiste Daroussin data.slide_y = height - 5;
2772a3e3873SBaptiste Daroussin
2782a3e3873SBaptiste Daroussin data.current = cur_value - 1;
2792a3e3873SBaptiste Daroussin
2802a3e3873SBaptiste Daroussin dlg_register_window(dialog, "rangebox", binding);
2812a3e3873SBaptiste Daroussin dlg_register_buttons(dialog, "rangebox", buttons);
2822a3e3873SBaptiste Daroussin
2832a3e3873SBaptiste Daroussin dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr);
2842a3e3873SBaptiste Daroussin dlg_mouse_setbase(xorg, yorg);
2852a3e3873SBaptiste Daroussin dlg_mouse_mkregion(data.slide_y - 1, data.slide_x - 1, 3, usable + 2, 'i');
2862a3e3873SBaptiste Daroussin dlg_draw_box2(dialog,
2872a3e3873SBaptiste Daroussin height - 6, data.slide_x - MARGIN,
2882a3e3873SBaptiste Daroussin 2 + MARGIN, data.slide_len + 2 * MARGIN,
2892a3e3873SBaptiste Daroussin dialog_attr,
2902a3e3873SBaptiste Daroussin border_attr,
2912a3e3873SBaptiste Daroussin border2_attr);
2922a3e3873SBaptiste Daroussin dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
2932a3e3873SBaptiste Daroussin dlg_draw_title(dialog, title);
2942a3e3873SBaptiste Daroussin dlg_draw_helpline(dialog, FALSE);
2952a3e3873SBaptiste Daroussin
296f4f33ea0SBaptiste Daroussin dlg_attrset(dialog, dialog_attr);
2972a3e3873SBaptiste Daroussin dlg_print_autowrap(dialog, prompt, height, width);
2982a3e3873SBaptiste Daroussin
2992a3e3873SBaptiste Daroussin dlg_trace_win(dialog);
300*a96ef450SBaptiste Daroussin
3012a3e3873SBaptiste Daroussin while (result == DLG_EXIT_UNKNOWN) {
302*a96ef450SBaptiste Daroussin int key2;
303*a96ef450SBaptiste Daroussin
3042a3e3873SBaptiste Daroussin draw_value(&data, cur_value);
3052a3e3873SBaptiste Daroussin button = (state < 0) ? 0 : state;
3062a3e3873SBaptiste Daroussin dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
3072a3e3873SBaptiste Daroussin if (state < 0) {
3082a3e3873SBaptiste Daroussin data.value_col = data.value_len + state;
3092a3e3873SBaptiste Daroussin wmove(dialog, data.slide_y, data.value_x + data.value_col);
3102a3e3873SBaptiste Daroussin }
3112a3e3873SBaptiste Daroussin
3122a3e3873SBaptiste Daroussin key = dlg_mouse_wgetch(dialog, &fkey);
313*a96ef450SBaptiste Daroussin if (dlg_result_key(key, fkey, &result)) {
314*a96ef450SBaptiste Daroussin if (!dlg_button_key(result, &button, &key, &fkey))
3152a3e3873SBaptiste Daroussin break;
316*a96ef450SBaptiste Daroussin }
3172a3e3873SBaptiste Daroussin
3182a3e3873SBaptiste Daroussin if ((key2 = dlg_char_to_button(key, buttons)) >= 0) {
3192a3e3873SBaptiste Daroussin result = key2;
3202a3e3873SBaptiste Daroussin } else {
3212a3e3873SBaptiste Daroussin /* handle function-keys */
3222a3e3873SBaptiste Daroussin if (fkey) {
3232a3e3873SBaptiste Daroussin switch (key) {
324f4f33ea0SBaptiste Daroussin case DLGK_TOGGLE:
3252a3e3873SBaptiste Daroussin case DLGK_ENTER:
326*a96ef450SBaptiste Daroussin result = dlg_enter_buttoncode(button);
327*a96ef450SBaptiste Daroussin break;
328*a96ef450SBaptiste Daroussin case DLGK_LEAVE:
3292a3e3873SBaptiste Daroussin result = dlg_ok_buttoncode(button);
3302a3e3873SBaptiste Daroussin break;
3312a3e3873SBaptiste Daroussin case DLGK_FIELD_PREV:
3322a3e3873SBaptiste Daroussin if (state < 0 && state > -data.value_len) {
3332a3e3873SBaptiste Daroussin --state;
3342a3e3873SBaptiste Daroussin } else {
3352a3e3873SBaptiste Daroussin state = dlg_prev_ok_buttonindex(state, -data.value_len);
3362a3e3873SBaptiste Daroussin }
3372a3e3873SBaptiste Daroussin break;
3382a3e3873SBaptiste Daroussin case DLGK_FIELD_NEXT:
3392a3e3873SBaptiste Daroussin if (state < 0) {
3402a3e3873SBaptiste Daroussin ++state;
3412a3e3873SBaptiste Daroussin } else {
3422a3e3873SBaptiste Daroussin state = dlg_next_ok_buttonindex(state, -data.value_len);
3432a3e3873SBaptiste Daroussin }
3442a3e3873SBaptiste Daroussin break;
3452a3e3873SBaptiste Daroussin case DLGK_ITEM_FIRST:
3462a3e3873SBaptiste Daroussin cur_value = min_value;
3472a3e3873SBaptiste Daroussin break;
3482a3e3873SBaptiste Daroussin case DLGK_ITEM_LAST:
3492a3e3873SBaptiste Daroussin cur_value = max_value;
3502a3e3873SBaptiste Daroussin break;
3512a3e3873SBaptiste Daroussin case DLGK_ITEM_PREV:
3522a3e3873SBaptiste Daroussin if (state < 0) {
3532a3e3873SBaptiste Daroussin cur_value -= digit_of(&data);
3542a3e3873SBaptiste Daroussin } else {
3552a3e3873SBaptiste Daroussin cur_value -= 1;
3562a3e3873SBaptiste Daroussin }
3572a3e3873SBaptiste Daroussin if (cur_value < min_value)
3582a3e3873SBaptiste Daroussin cur_value = min_value;
3592a3e3873SBaptiste Daroussin break;
3602a3e3873SBaptiste Daroussin case DLGK_ITEM_NEXT:
3612a3e3873SBaptiste Daroussin if (state < 0) {
3622a3e3873SBaptiste Daroussin cur_value += digit_of(&data);
3632a3e3873SBaptiste Daroussin } else {
3642a3e3873SBaptiste Daroussin cur_value += 1;
3652a3e3873SBaptiste Daroussin }
3662a3e3873SBaptiste Daroussin if (cur_value > max_value)
3672a3e3873SBaptiste Daroussin cur_value = max_value;
3682a3e3873SBaptiste Daroussin break;
3692a3e3873SBaptiste Daroussin case DLGK_PAGE_PREV:
3702a3e3873SBaptiste Daroussin cur_value -= data.slide_inc;
3712a3e3873SBaptiste Daroussin if (cur_value < min_value)
3722a3e3873SBaptiste Daroussin cur_value = min_value;
3732a3e3873SBaptiste Daroussin break;
3742a3e3873SBaptiste Daroussin case DLGK_PAGE_NEXT:
3752a3e3873SBaptiste Daroussin cur_value += data.slide_inc;
3762a3e3873SBaptiste Daroussin if (cur_value > max_value)
3772a3e3873SBaptiste Daroussin cur_value = max_value;
3782a3e3873SBaptiste Daroussin break;
3792a3e3873SBaptiste Daroussin #ifdef KEY_RESIZE
3802a3e3873SBaptiste Daroussin case KEY_RESIZE:
381f4f33ea0SBaptiste Daroussin dlg_will_resize(dialog);
3822a3e3873SBaptiste Daroussin /* reset data */
3832a3e3873SBaptiste Daroussin height = old_height;
3842a3e3873SBaptiste Daroussin width = old_width;
3852a3e3873SBaptiste Daroussin /* repaint */
386f4f33ea0SBaptiste Daroussin free(prompt);
387*a96ef450SBaptiste Daroussin _dlg_resize_cleanup(dialog);
3882a3e3873SBaptiste Daroussin goto retry;
3892a3e3873SBaptiste Daroussin #endif
3902a3e3873SBaptiste Daroussin case DLGK_MOUSE('i'):
3912a3e3873SBaptiste Daroussin state = -data.value_len;
3922a3e3873SBaptiste Daroussin break;
3932a3e3873SBaptiste Daroussin default:
3942a3e3873SBaptiste Daroussin if (is_DLGK_MOUSE(key)) {
3952a3e3873SBaptiste Daroussin result = dlg_ok_buttoncode(key - M_EVENT);
3962a3e3873SBaptiste Daroussin if (result < 0)
3972a3e3873SBaptiste Daroussin result = DLG_EXIT_OK;
3982a3e3873SBaptiste Daroussin }
3992a3e3873SBaptiste Daroussin break;
4002a3e3873SBaptiste Daroussin }
4012a3e3873SBaptiste Daroussin } else if (isdigit(key) && state < 0) {
4022a3e3873SBaptiste Daroussin if (set_digit(&data, key)) {
4032a3e3873SBaptiste Daroussin cur_value = data.current;
4042a3e3873SBaptiste Daroussin data.current--;
4052a3e3873SBaptiste Daroussin }
4062a3e3873SBaptiste Daroussin } else {
4072a3e3873SBaptiste Daroussin beep();
4082a3e3873SBaptiste Daroussin }
4092a3e3873SBaptiste Daroussin }
4102a3e3873SBaptiste Daroussin }
4112a3e3873SBaptiste Daroussin
4122a3e3873SBaptiste Daroussin sprintf(buffer, "%d", cur_value);
4132a3e3873SBaptiste Daroussin dlg_add_result(buffer);
414*a96ef450SBaptiste Daroussin AddLastKey();
4152a3e3873SBaptiste Daroussin
4162a3e3873SBaptiste Daroussin dlg_del_window(dialog);
4172a3e3873SBaptiste Daroussin dlg_mouse_free_regions();
4182a3e3873SBaptiste Daroussin free(prompt);
4192a3e3873SBaptiste Daroussin
4202a3e3873SBaptiste Daroussin return result;
4212a3e3873SBaptiste Daroussin }
422