xref: /freebsd/contrib/dialog/progressbox.c (revision a96ef4501919d7ac08e94e98dc34b0bdd744802b)
14c8945a0SNathan Whitehorn /*
2*a96ef450SBaptiste Daroussin  *  $Id: progressbox.c,v 1.54 2020/11/22 15:48:27 tom Exp $
34c8945a0SNathan Whitehorn  *
44c8945a0SNathan Whitehorn  *  progressbox.c -- implements the progress box
54c8945a0SNathan Whitehorn  *
6*a96ef450SBaptiste Daroussin  *  Copyright 2006-2019,2020	Thomas E. Dickey
74c8945a0SNathan Whitehorn  *  Copyright 2005		Valery Reznic
84c8945a0SNathan Whitehorn  *
94c8945a0SNathan Whitehorn  *  This program is free software; you can redistribute it and/or modify
10*a96ef450SBaptiste Daroussin  *  it under the terms of the GNU Lesser General Public License, version 2.1
11*a96ef450SBaptiste Daroussin  *  as published by the Free Software Foundation.
124c8945a0SNathan Whitehorn  *
134c8945a0SNathan Whitehorn  *  This program is distributed in the hope that it will be useful, but
144c8945a0SNathan Whitehorn  *  WITHOUT ANY WARRANTY; without even the implied warranty of
154c8945a0SNathan Whitehorn  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
164c8945a0SNathan Whitehorn  *  Lesser General Public License for more details.
174c8945a0SNathan Whitehorn  *
184c8945a0SNathan Whitehorn  *  You should have received a copy of the GNU Lesser General Public
194c8945a0SNathan Whitehorn  *  License along with this program; if not, write to
204c8945a0SNathan Whitehorn  *	Free Software Foundation, Inc.
214c8945a0SNathan Whitehorn  *	51 Franklin St., Fifth Floor
224c8945a0SNathan Whitehorn  *	Boston, MA 02110, USA.
234c8945a0SNathan Whitehorn  */
244c8945a0SNathan Whitehorn 
254c8945a0SNathan Whitehorn #include <dialog.h>
264c8945a0SNathan Whitehorn #include <dlg_keys.h>
274c8945a0SNathan Whitehorn 
28f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
29f4f33ea0SBaptiste Daroussin #include <errno.h>
30f4f33ea0SBaptiste Daroussin #endif
31f4f33ea0SBaptiste Daroussin 
324c8945a0SNathan Whitehorn #define MIN_HIGH (4)
334c8945a0SNathan Whitehorn #define MIN_WIDE (10 + 2 * (2 + MARGIN))
344c8945a0SNathan Whitehorn 
35f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
36f4f33ea0SBaptiste Daroussin typedef struct _wrote {
37f4f33ea0SBaptiste Daroussin     struct _wrote *link;
38f4f33ea0SBaptiste Daroussin     char *text;
39f4f33ea0SBaptiste Daroussin } WROTE;
40f4f33ea0SBaptiste Daroussin #endif
41f4f33ea0SBaptiste Daroussin 
424c8945a0SNathan Whitehorn typedef struct {
434c8945a0SNathan Whitehorn     DIALOG_CALLBACK obj;
444c8945a0SNathan Whitehorn     WINDOW *text;
45f4f33ea0SBaptiste Daroussin     char *prompt;
46f4f33ea0SBaptiste Daroussin     int high, wide;
47f4f33ea0SBaptiste Daroussin     int old_high, old_wide;
484c8945a0SNathan Whitehorn     char line[MAX_LEN + 1];
494c8945a0SNathan Whitehorn     int is_eof;
50f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
51f4f33ea0SBaptiste Daroussin     WROTE *wrote;
52f4f33ea0SBaptiste Daroussin #endif
534c8945a0SNathan Whitehorn } MY_OBJ;
544c8945a0SNathan Whitehorn 
55f4f33ea0SBaptiste Daroussin static void
free_obj(MY_OBJ * obj)56f4f33ea0SBaptiste Daroussin free_obj(MY_OBJ * obj)
57f4f33ea0SBaptiste Daroussin {
58f4f33ea0SBaptiste Daroussin     dlg_del_window(obj->obj.win);
59f4f33ea0SBaptiste Daroussin     free(obj->prompt);
60f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
61f4f33ea0SBaptiste Daroussin     while (obj->wrote) {
62f4f33ea0SBaptiste Daroussin 	WROTE *wrote = obj->wrote;
63f4f33ea0SBaptiste Daroussin 	obj->wrote = wrote->link;
64f4f33ea0SBaptiste Daroussin 	free(wrote->text);
65f4f33ea0SBaptiste Daroussin 	free(wrote);
66f4f33ea0SBaptiste Daroussin     }
67f4f33ea0SBaptiste Daroussin #endif
68f4f33ea0SBaptiste Daroussin     free(obj);
69f4f33ea0SBaptiste Daroussin }
70f4f33ea0SBaptiste Daroussin 
71*a96ef450SBaptiste Daroussin #ifdef KEY_RESIZE
72f4f33ea0SBaptiste Daroussin static void
restart_obj(MY_OBJ * obj)73f4f33ea0SBaptiste Daroussin restart_obj(MY_OBJ * obj)
74f4f33ea0SBaptiste Daroussin {
75f4f33ea0SBaptiste Daroussin     free(obj->prompt);
76f4f33ea0SBaptiste Daroussin     obj->high = obj->old_high;
77f4f33ea0SBaptiste Daroussin     obj->wide = obj->old_wide;
78f4f33ea0SBaptiste Daroussin     dlg_clear();
79f4f33ea0SBaptiste Daroussin     dlg_del_window(obj->obj.win);
80f4f33ea0SBaptiste Daroussin }
81*a96ef450SBaptiste Daroussin #endif
82f4f33ea0SBaptiste Daroussin 
83f4f33ea0SBaptiste Daroussin static void
start_obj(MY_OBJ * obj,const char * title,const char * cprompt)84f4f33ea0SBaptiste Daroussin start_obj(MY_OBJ * obj, const char *title, const char *cprompt)
85f4f33ea0SBaptiste Daroussin {
86f4f33ea0SBaptiste Daroussin     int y, x, thigh;
87f4f33ea0SBaptiste Daroussin 
88f4f33ea0SBaptiste Daroussin     obj->prompt = dlg_strclone(cprompt);
89f4f33ea0SBaptiste Daroussin     dlg_tab_correct_str(obj->prompt);
90f4f33ea0SBaptiste Daroussin     dlg_auto_size(title, obj->prompt, &obj->high, &obj->wide, MIN_HIGH, MIN_WIDE);
91f4f33ea0SBaptiste Daroussin 
92f4f33ea0SBaptiste Daroussin     dlg_print_size(obj->high, obj->wide);
93f4f33ea0SBaptiste Daroussin     dlg_ctl_size(obj->high, obj->wide);
94f4f33ea0SBaptiste Daroussin 
95f4f33ea0SBaptiste Daroussin     x = dlg_box_x_ordinate(obj->wide);
96f4f33ea0SBaptiste Daroussin     y = dlg_box_y_ordinate(obj->high);
97f4f33ea0SBaptiste Daroussin     thigh = obj->high - (2 * MARGIN);
98f4f33ea0SBaptiste Daroussin 
99f4f33ea0SBaptiste Daroussin     obj->obj.win = dlg_new_window(obj->high, obj->wide, y, x);
100f4f33ea0SBaptiste Daroussin 
101f4f33ea0SBaptiste Daroussin     dlg_draw_box2(obj->obj.win,
102f4f33ea0SBaptiste Daroussin 		  0, 0,
103f4f33ea0SBaptiste Daroussin 		  obj->high, obj->wide,
104f4f33ea0SBaptiste Daroussin 		  dialog_attr,
105f4f33ea0SBaptiste Daroussin 		  border_attr,
106f4f33ea0SBaptiste Daroussin 		  border2_attr);
107f4f33ea0SBaptiste Daroussin     dlg_draw_title(obj->obj.win, title);
108f4f33ea0SBaptiste Daroussin     dlg_draw_helpline(obj->obj.win, FALSE);
109f4f33ea0SBaptiste Daroussin 
110f4f33ea0SBaptiste Daroussin     if (obj->prompt[0] != '\0') {
111*a96ef450SBaptiste Daroussin 	int i;
112f4f33ea0SBaptiste Daroussin 	int y2, x2;
113f4f33ea0SBaptiste Daroussin 
114f4f33ea0SBaptiste Daroussin 	dlg_attrset(obj->obj.win, dialog_attr);
115f4f33ea0SBaptiste Daroussin 	dlg_print_autowrap(obj->obj.win, obj->prompt, obj->high, obj->wide);
116f4f33ea0SBaptiste Daroussin 	getyx(obj->obj.win, y2, x2);
117f4f33ea0SBaptiste Daroussin 	(void) x2;
118f4f33ea0SBaptiste Daroussin 	++y2;
119f4f33ea0SBaptiste Daroussin 	wmove(obj->obj.win, y2, MARGIN);
120f4f33ea0SBaptiste Daroussin 	for (i = 0; i < getmaxx(obj->obj.win) - 2 * MARGIN; i++)
121f4f33ea0SBaptiste Daroussin 	    (void) waddch(obj->obj.win, dlg_boxchar(ACS_HLINE));
122f4f33ea0SBaptiste Daroussin 	y += y2;
123f4f33ea0SBaptiste Daroussin 	thigh -= y2;
124f4f33ea0SBaptiste Daroussin     }
125f4f33ea0SBaptiste Daroussin 
126f4f33ea0SBaptiste Daroussin     /* Create window for text region, used for scrolling text */
127f4f33ea0SBaptiste Daroussin     obj->text = dlg_sub_window(obj->obj.win,
128f4f33ea0SBaptiste Daroussin 			       thigh,
129f4f33ea0SBaptiste Daroussin 			       obj->wide - (2 * MARGIN),
130f4f33ea0SBaptiste Daroussin 			       y + MARGIN,
131f4f33ea0SBaptiste Daroussin 			       x + MARGIN);
132f4f33ea0SBaptiste Daroussin 
133f4f33ea0SBaptiste Daroussin     (void) wrefresh(obj->obj.win);
134f4f33ea0SBaptiste Daroussin 
135f4f33ea0SBaptiste Daroussin     (void) wmove(obj->obj.win, getmaxy(obj->text), (MARGIN + 1));
136f4f33ea0SBaptiste Daroussin     (void) wnoutrefresh(obj->obj.win);
137f4f33ea0SBaptiste Daroussin 
138f4f33ea0SBaptiste Daroussin     dlg_attr_clear(obj->text, getmaxy(obj->text), getmaxx(obj->text), dialog_attr);
139f4f33ea0SBaptiste Daroussin }
140f4f33ea0SBaptiste Daroussin 
1414c8945a0SNathan Whitehorn /*
1424c8945a0SNathan Whitehorn  * Return current line of text.
1434c8945a0SNathan Whitehorn  */
1444c8945a0SNathan Whitehorn static char *
get_line(MY_OBJ * obj,int * restart)145f4f33ea0SBaptiste Daroussin get_line(MY_OBJ * obj, int *restart)
1464c8945a0SNathan Whitehorn {
1474c8945a0SNathan Whitehorn     FILE *fp = obj->obj.input;
1484c8945a0SNathan Whitehorn     int col = 0;
149*a96ef450SBaptiste Daroussin     int j, tmpint;
150f4f33ea0SBaptiste Daroussin     char *result = obj->line;
1514c8945a0SNathan Whitehorn 
152f4f33ea0SBaptiste Daroussin     *restart = 0;
1532a3e3873SBaptiste Daroussin     for (;;) {
154*a96ef450SBaptiste Daroussin 	int ch = getc(fp);
155f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
156f4f33ea0SBaptiste Daroussin 	/* SIGWINCH may have interrupted this - try to ignore if resizable */
157f4f33ea0SBaptiste Daroussin 	if (ferror(fp)) {
158f4f33ea0SBaptiste Daroussin 	    switch (errno) {
159f4f33ea0SBaptiste Daroussin 	    case EINTR:
160f4f33ea0SBaptiste Daroussin 		clearerr(fp);
161f4f33ea0SBaptiste Daroussin 		continue;
162f4f33ea0SBaptiste Daroussin 	    default:
1634c8945a0SNathan Whitehorn 		break;
1644c8945a0SNathan Whitehorn 	    }
1654c8945a0SNathan Whitehorn 	}
166f4f33ea0SBaptiste Daroussin #endif
167f4f33ea0SBaptiste Daroussin 	if (feof(fp) || ferror(fp)) {
168f4f33ea0SBaptiste Daroussin 	    obj->is_eof = 1;
169f4f33ea0SBaptiste Daroussin 	    if (!col) {
170f4f33ea0SBaptiste Daroussin 		result = NULL;
171f4f33ea0SBaptiste Daroussin 	    }
172f4f33ea0SBaptiste Daroussin 	    break;
173f4f33ea0SBaptiste Daroussin 	}
1744c8945a0SNathan Whitehorn 	if (ch == '\n')
1754c8945a0SNathan Whitehorn 	    break;
1764c8945a0SNathan Whitehorn 	if (ch == '\r')
1774c8945a0SNathan Whitehorn 	    break;
1782a3e3873SBaptiste Daroussin 	if (col >= MAX_LEN)
1792a3e3873SBaptiste Daroussin 	    continue;
1804c8945a0SNathan Whitehorn 	if ((ch == TAB) && (dialog_vars.tab_correct)) {
1814c8945a0SNathan Whitehorn 	    tmpint = dialog_state.tab_len
1824c8945a0SNathan Whitehorn 		- (col % dialog_state.tab_len);
1834c8945a0SNathan Whitehorn 	    for (j = 0; j < tmpint; j++) {
1842a3e3873SBaptiste Daroussin 		if (col < MAX_LEN) {
1854c8945a0SNathan Whitehorn 		    obj->line[col] = ' ';
1864c8945a0SNathan Whitehorn 		    ++col;
1872a3e3873SBaptiste Daroussin 		} else {
1882a3e3873SBaptiste Daroussin 		    break;
1892a3e3873SBaptiste Daroussin 		}
1904c8945a0SNathan Whitehorn 	    }
1914c8945a0SNathan Whitehorn 	} else {
1924c8945a0SNathan Whitehorn 	    obj->line[col] = (char) ch;
1934c8945a0SNathan Whitehorn 	    ++col;
1944c8945a0SNathan Whitehorn 	}
1954c8945a0SNathan Whitehorn     }
1964c8945a0SNathan Whitehorn 
1974c8945a0SNathan Whitehorn     obj->line[col] = '\0';
1984c8945a0SNathan Whitehorn 
199f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
200f4f33ea0SBaptiste Daroussin     if (result != NULL) {
201f4f33ea0SBaptiste Daroussin 	WINDOW *win = obj->text;
202f4f33ea0SBaptiste Daroussin 	WROTE *wrote = dlg_calloc(WROTE, 1);
203f4f33ea0SBaptiste Daroussin 
204f4f33ea0SBaptiste Daroussin 	if (wrote != 0) {
205f4f33ea0SBaptiste Daroussin 	    wrote->text = dlg_strclone(obj->line);
206f4f33ea0SBaptiste Daroussin 	    wrote->link = obj->wrote;
207f4f33ea0SBaptiste Daroussin 	    obj->wrote = wrote;
208f4f33ea0SBaptiste Daroussin 	}
209f4f33ea0SBaptiste Daroussin 
210f4f33ea0SBaptiste Daroussin 	nodelay(win, TRUE);
211*a96ef450SBaptiste Daroussin 	if (wgetch(win) == KEY_RESIZE) {
212f4f33ea0SBaptiste Daroussin 	    *restart = 1;
213f4f33ea0SBaptiste Daroussin 	}
214f4f33ea0SBaptiste Daroussin 	nodelay(win, FALSE);
215f4f33ea0SBaptiste Daroussin     }
216f4f33ea0SBaptiste Daroussin #endif
217f4f33ea0SBaptiste Daroussin     return result;
2184c8945a0SNathan Whitehorn }
2194c8945a0SNathan Whitehorn 
2204c8945a0SNathan Whitehorn /*
2214c8945a0SNathan Whitehorn  * Print a new line of text.
2224c8945a0SNathan Whitehorn  */
2234c8945a0SNathan Whitehorn static void
print_line(MY_OBJ * obj,const char * line,int row)224f4f33ea0SBaptiste Daroussin print_line(MY_OBJ * obj, const char *line, int row)
2254c8945a0SNathan Whitehorn {
226f4f33ea0SBaptiste Daroussin     int width = obj->wide - (2 * MARGIN);
227f4f33ea0SBaptiste Daroussin     int limit = MIN((int) strlen(line), width - 2);
2284c8945a0SNathan Whitehorn 
229f4f33ea0SBaptiste Daroussin     (void) wmove(obj->text, row, 0);	/* move cursor to correct line */
230f4f33ea0SBaptiste Daroussin     wprintw(obj->text, " %.*s", limit, line);
231*a96ef450SBaptiste Daroussin     while (++limit < width) {
232*a96ef450SBaptiste Daroussin 	waddch(obj->text, ' ');
233*a96ef450SBaptiste Daroussin     }
234f4f33ea0SBaptiste Daroussin }
2354c8945a0SNathan Whitehorn 
236f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
237f4f33ea0SBaptiste Daroussin static int
wrote_size(MY_OBJ * obj,int want)238f4f33ea0SBaptiste Daroussin wrote_size(MY_OBJ * obj, int want)
239f4f33ea0SBaptiste Daroussin {
240f4f33ea0SBaptiste Daroussin     int result = 0;
241f4f33ea0SBaptiste Daroussin     WROTE *wrote = obj->wrote;
242f4f33ea0SBaptiste Daroussin     while (wrote != NULL && want > 0) {
243f4f33ea0SBaptiste Daroussin 	wrote = wrote->link;
244f4f33ea0SBaptiste Daroussin 	want--;
245f4f33ea0SBaptiste Daroussin 	result++;
246f4f33ea0SBaptiste Daroussin     }
247f4f33ea0SBaptiste Daroussin     return result;
248f4f33ea0SBaptiste Daroussin }
249f4f33ea0SBaptiste Daroussin 
250f4f33ea0SBaptiste Daroussin static const char *
wrote_data(MY_OBJ * obj,int want)251f4f33ea0SBaptiste Daroussin wrote_data(MY_OBJ * obj, int want)
252f4f33ea0SBaptiste Daroussin {
253f4f33ea0SBaptiste Daroussin     const char *result = NULL;
254f4f33ea0SBaptiste Daroussin     WROTE *wrote = obj->wrote;
255f4f33ea0SBaptiste Daroussin     while (wrote != NULL && want > 0) {
256f4f33ea0SBaptiste Daroussin 	result = wrote->text;
257f4f33ea0SBaptiste Daroussin 	wrote = wrote->link;
258f4f33ea0SBaptiste Daroussin 	want--;
259f4f33ea0SBaptiste Daroussin     }
260f4f33ea0SBaptiste Daroussin     return result;
2614c8945a0SNathan Whitehorn }
2624c8945a0SNathan Whitehorn 
2637a1c0d96SNathan Whitehorn static int
reprint_lines(MY_OBJ * obj,int buttons)264f4f33ea0SBaptiste Daroussin reprint_lines(MY_OBJ * obj, int buttons)
265f4f33ea0SBaptiste Daroussin {
266f4f33ea0SBaptiste Daroussin     int want = getmaxy(obj->text) - (buttons ? 2 : 0);
267f4f33ea0SBaptiste Daroussin     int have = wrote_size(obj, want);
268f4f33ea0SBaptiste Daroussin     int n;
269f4f33ea0SBaptiste Daroussin     for (n = 0; n < have; ++n) {
270f4f33ea0SBaptiste Daroussin 	print_line(obj, wrote_data(obj, have - n), n);
271f4f33ea0SBaptiste Daroussin     }
272f4f33ea0SBaptiste Daroussin     (void) wrefresh(obj->text);
273f4f33ea0SBaptiste Daroussin     return have;
274f4f33ea0SBaptiste Daroussin }
275f4f33ea0SBaptiste Daroussin #endif
276f4f33ea0SBaptiste Daroussin 
277f4f33ea0SBaptiste Daroussin static int
pause_for_ok(MY_OBJ * obj,const char * title,const char * cprompt)278f4f33ea0SBaptiste Daroussin pause_for_ok(MY_OBJ * obj, const char *title, const char *cprompt)
2797a1c0d96SNathan Whitehorn {
2807a1c0d96SNathan Whitehorn     /* *INDENT-OFF* */
2817a1c0d96SNathan Whitehorn     static DLG_KEYS_BINDING binding[] = {
282682c9e0fSNathan Whitehorn 	HELPKEY_BINDINGS,
2837a1c0d96SNathan Whitehorn 	ENTERKEY_BINDINGS,
2842a3e3873SBaptiste Daroussin 	TRAVERSE_BINDINGS,
2857a1c0d96SNathan Whitehorn 	END_KEYS_BINDING
2867a1c0d96SNathan Whitehorn     };
2877a1c0d96SNathan Whitehorn     /* *INDENT-ON* */
2887a1c0d96SNathan Whitehorn 
2892a3e3873SBaptiste Daroussin     int button;
290*a96ef450SBaptiste Daroussin     int key, fkey;
2917a1c0d96SNathan Whitehorn     int result = DLG_EXIT_UNKNOWN;
2927a1c0d96SNathan Whitehorn     const char **buttons = dlg_ok_label();
293f4f33ea0SBaptiste Daroussin     bool save_nocancel = dialog_vars.nocancel;
2942a3e3873SBaptiste Daroussin     bool redraw = TRUE;
2952a3e3873SBaptiste Daroussin 
296*a96ef450SBaptiste Daroussin     (void) title;
297*a96ef450SBaptiste Daroussin     (void) cprompt;
298*a96ef450SBaptiste Daroussin 
2992a3e3873SBaptiste Daroussin     dialog_vars.nocancel = TRUE;
3002a3e3873SBaptiste Daroussin     button = dlg_default_button();
3017a1c0d96SNathan Whitehorn 
302f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
303f4f33ea0SBaptiste Daroussin   restart:
304f4f33ea0SBaptiste Daroussin #endif
3057a1c0d96SNathan Whitehorn 
306f4f33ea0SBaptiste Daroussin     dlg_register_window(obj->obj.win, "progressbox", binding);
307f4f33ea0SBaptiste Daroussin     dlg_register_buttons(obj->obj.win, "progressbox", buttons);
308f4f33ea0SBaptiste Daroussin 
309f4f33ea0SBaptiste Daroussin     dlg_draw_bottom_box2(obj->obj.win, border_attr, border2_attr, dialog_attr);
3107a1c0d96SNathan Whitehorn 
3117a1c0d96SNathan Whitehorn     while (result == DLG_EXIT_UNKNOWN) {
312*a96ef450SBaptiste Daroussin 	int check;
313*a96ef450SBaptiste Daroussin 
3142a3e3873SBaptiste Daroussin 	if (redraw) {
3152a3e3873SBaptiste Daroussin 	    redraw = FALSE;
3162a3e3873SBaptiste Daroussin 	    if (button < 0)
3172a3e3873SBaptiste Daroussin 		button = 0;
318f4f33ea0SBaptiste Daroussin 	    dlg_draw_buttons(obj->obj.win,
319f4f33ea0SBaptiste Daroussin 			     obj->high - 2, 0,
3202a3e3873SBaptiste Daroussin 			     buttons, button,
321f4f33ea0SBaptiste Daroussin 			     FALSE, obj->wide);
3222a3e3873SBaptiste Daroussin 	}
3232a3e3873SBaptiste Daroussin 
324f4f33ea0SBaptiste Daroussin 	key = dlg_mouse_wgetch(obj->obj.win, &fkey);
325*a96ef450SBaptiste Daroussin 	if (dlg_result_key(key, fkey, &result)) {
326*a96ef450SBaptiste Daroussin 	    if (!dlg_button_key(result, &button, &key, &fkey))
3277a1c0d96SNathan Whitehorn 		break;
328*a96ef450SBaptiste Daroussin 	}
3297a1c0d96SNathan Whitehorn 
3307a1c0d96SNathan Whitehorn 	if (!fkey && (check = dlg_char_to_button(key, buttons)) >= 0) {
3312a3e3873SBaptiste Daroussin 	    result = dlg_ok_buttoncode(check);
3327a1c0d96SNathan Whitehorn 	    break;
3337a1c0d96SNathan Whitehorn 	}
3347a1c0d96SNathan Whitehorn 
3357a1c0d96SNathan Whitehorn 	if (fkey) {
3367a1c0d96SNathan Whitehorn 	    switch (key) {
3372a3e3873SBaptiste Daroussin 	    case DLGK_FIELD_NEXT:
3382a3e3873SBaptiste Daroussin 		button = dlg_next_button(buttons, button);
3392a3e3873SBaptiste Daroussin 		redraw = TRUE;
3402a3e3873SBaptiste Daroussin 		break;
3412a3e3873SBaptiste Daroussin 	    case DLGK_FIELD_PREV:
3422a3e3873SBaptiste Daroussin 		button = dlg_prev_button(buttons, button);
3432a3e3873SBaptiste Daroussin 		redraw = TRUE;
3442a3e3873SBaptiste Daroussin 		break;
3457a1c0d96SNathan Whitehorn 	    case DLGK_ENTER:
3462a3e3873SBaptiste Daroussin 		result = dlg_ok_buttoncode(button);
3477a1c0d96SNathan Whitehorn 		break;
348f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
349f4f33ea0SBaptiste Daroussin 	    case KEY_RESIZE:
350f4f33ea0SBaptiste Daroussin 		dlg_will_resize(obj->obj.win);
351f4f33ea0SBaptiste Daroussin 		restart_obj(obj);
352f4f33ea0SBaptiste Daroussin 		start_obj(obj, title, cprompt);
353f4f33ea0SBaptiste Daroussin 		reprint_lines(obj, TRUE);
354f4f33ea0SBaptiste Daroussin 		redraw = TRUE;
355f4f33ea0SBaptiste Daroussin 		goto restart;
356f4f33ea0SBaptiste Daroussin #endif
3577a1c0d96SNathan Whitehorn 	    default:
3582a3e3873SBaptiste Daroussin 		if (is_DLGK_MOUSE(key)) {
3592a3e3873SBaptiste Daroussin 		    result = dlg_ok_buttoncode(key - M_EVENT);
3602a3e3873SBaptiste Daroussin 		    if (result < 0)
3612a3e3873SBaptiste Daroussin 			result = DLG_EXIT_OK;
3622a3e3873SBaptiste Daroussin 		} else {
3637a1c0d96SNathan Whitehorn 		    beep();
3642a3e3873SBaptiste Daroussin 		}
3657a1c0d96SNathan Whitehorn 		break;
3667a1c0d96SNathan Whitehorn 	    }
3672a3e3873SBaptiste Daroussin 
368*a96ef450SBaptiste Daroussin 	} else if (key > 0) {
3697a1c0d96SNathan Whitehorn 	    beep();
3707a1c0d96SNathan Whitehorn 	}
3717a1c0d96SNathan Whitehorn     }
372*a96ef450SBaptiste Daroussin     dlg_add_last_key(-1);
373*a96ef450SBaptiste Daroussin 
374f4f33ea0SBaptiste Daroussin     dlg_mouse_free_regions();
375f4f33ea0SBaptiste Daroussin     dlg_unregister_window(obj->obj.win);
3762a3e3873SBaptiste Daroussin 
3772a3e3873SBaptiste Daroussin     dialog_vars.nocancel = save_nocancel;
3787a1c0d96SNathan Whitehorn     return result;
3797a1c0d96SNathan Whitehorn }
3807a1c0d96SNathan Whitehorn 
3814c8945a0SNathan Whitehorn int
dlg_progressbox(const char * title,const char * cprompt,int height,int width,int pauseopt,FILE * fp)3827a1c0d96SNathan Whitehorn dlg_progressbox(const char *title,
3837a1c0d96SNathan Whitehorn 		const char *cprompt,
3847a1c0d96SNathan Whitehorn 		int height,
3857a1c0d96SNathan Whitehorn 		int width,
3867a1c0d96SNathan Whitehorn 		int pauseopt,
3877a1c0d96SNathan Whitehorn 		FILE *fp)
3884c8945a0SNathan Whitehorn {
3894c8945a0SNathan Whitehorn     int i;
3904c8945a0SNathan Whitehorn     MY_OBJ *obj;
391f4f33ea0SBaptiste Daroussin     int again = 0;
392f4f33ea0SBaptiste Daroussin     int toprow = 0;
3937a1c0d96SNathan Whitehorn     int result;
3944c8945a0SNathan Whitehorn 
395f4f33ea0SBaptiste Daroussin     DLG_TRACE(("# progressbox args:\n"));
396f4f33ea0SBaptiste Daroussin     DLG_TRACE2S("title", title);
397f4f33ea0SBaptiste Daroussin     DLG_TRACE2S("message", cprompt);
398f4f33ea0SBaptiste Daroussin     DLG_TRACE2N("height", height);
399f4f33ea0SBaptiste Daroussin     DLG_TRACE2N("width", width);
400f4f33ea0SBaptiste Daroussin     DLG_TRACE2N("pause", pauseopt);
401f4f33ea0SBaptiste Daroussin     DLG_TRACE2N("fp", fp ? fileno(fp) : -1);
4024c8945a0SNathan Whitehorn 
4034c8945a0SNathan Whitehorn     obj = dlg_calloc(MY_OBJ, 1);
4047a1c0d96SNathan Whitehorn     assert_ptr(obj, "dlg_progressbox");
4057a1c0d96SNathan Whitehorn     obj->obj.input = fp;
4064c8945a0SNathan Whitehorn 
407f4f33ea0SBaptiste Daroussin     obj->high = height;
408f4f33ea0SBaptiste Daroussin     obj->wide = width;
409f4f33ea0SBaptiste Daroussin 
410f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
411f4f33ea0SBaptiste Daroussin     obj->old_high = height;
412f4f33ea0SBaptiste Daroussin     obj->old_wide = width;
413f4f33ea0SBaptiste Daroussin 
414f4f33ea0SBaptiste Daroussin     curs_set(0);
415f4f33ea0SBaptiste Daroussin   restart:
416f4f33ea0SBaptiste Daroussin #endif
417f4f33ea0SBaptiste Daroussin 
418f4f33ea0SBaptiste Daroussin     start_obj(obj, title, cprompt);
419f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
420f4f33ea0SBaptiste Daroussin     if (again) {
421f4f33ea0SBaptiste Daroussin 	toprow = reprint_lines(obj, FALSE);
4224c8945a0SNathan Whitehorn     }
423f4f33ea0SBaptiste Daroussin #endif
424f4f33ea0SBaptiste Daroussin 
425f4f33ea0SBaptiste Daroussin     for (i = toprow; get_line(obj, &again); i++) {
426f4f33ea0SBaptiste Daroussin #ifdef KEY_RESIZE
427f4f33ea0SBaptiste Daroussin 	if (again) {
428f4f33ea0SBaptiste Daroussin 	    dlg_will_resize(obj->obj.win);
429f4f33ea0SBaptiste Daroussin 	    restart_obj(obj);
430f4f33ea0SBaptiste Daroussin 	    goto restart;
431f4f33ea0SBaptiste Daroussin 	}
432f4f33ea0SBaptiste Daroussin #endif
433f4f33ea0SBaptiste Daroussin 	if (i < getmaxy(obj->text)) {
434f4f33ea0SBaptiste Daroussin 	    print_line(obj, obj->line, i);
435f4f33ea0SBaptiste Daroussin 	} else {
436f4f33ea0SBaptiste Daroussin 	    scrollok(obj->text, TRUE);
437f4f33ea0SBaptiste Daroussin 	    scroll(obj->text);
438f4f33ea0SBaptiste Daroussin 	    scrollok(obj->text, FALSE);
439f4f33ea0SBaptiste Daroussin 	    print_line(obj, obj->line, getmaxy(obj->text) - 1);
440f4f33ea0SBaptiste Daroussin 	}
441f4f33ea0SBaptiste Daroussin 	(void) wrefresh(obj->text);
4424c8945a0SNathan Whitehorn 	if (obj->is_eof)
4434c8945a0SNathan Whitehorn 	    break;
4444c8945a0SNathan Whitehorn     }
4457a1c0d96SNathan Whitehorn 
446f4f33ea0SBaptiste Daroussin     dlg_trace_win(obj->obj.win);
447f4f33ea0SBaptiste Daroussin     curs_set(1);
448f4f33ea0SBaptiste Daroussin 
4497a1c0d96SNathan Whitehorn     if (pauseopt) {
450f4f33ea0SBaptiste Daroussin 	int need = 1 + MARGIN;
451f4f33ea0SBaptiste Daroussin 	int base = getmaxy(obj->text) - need;
452f4f33ea0SBaptiste Daroussin 	if (i >= base) {
453f4f33ea0SBaptiste Daroussin 	    i -= base;
454f4f33ea0SBaptiste Daroussin 	    if (i > need)
455f4f33ea0SBaptiste Daroussin 		i = need;
456f4f33ea0SBaptiste Daroussin 	    if (i > 0) {
457f4f33ea0SBaptiste Daroussin 		scrollok(obj->text, TRUE);
458f4f33ea0SBaptiste Daroussin 	    }
459f4f33ea0SBaptiste Daroussin 	    wscrl(obj->text, i);
460f4f33ea0SBaptiste Daroussin 	}
461f4f33ea0SBaptiste Daroussin 	(void) wrefresh(obj->text);
462f4f33ea0SBaptiste Daroussin 	result = pause_for_ok(obj, title, cprompt);
4637a1c0d96SNathan Whitehorn     } else {
464f4f33ea0SBaptiste Daroussin 	wrefresh(obj->obj.win);
4657a1c0d96SNathan Whitehorn 	result = DLG_EXIT_OK;
4667a1c0d96SNathan Whitehorn     }
4677a1c0d96SNathan Whitehorn 
468f4f33ea0SBaptiste Daroussin     free_obj(obj);
4694c8945a0SNathan Whitehorn 
4702a3e3873SBaptiste Daroussin     return result;
4714c8945a0SNathan Whitehorn }
4727a1c0d96SNathan Whitehorn 
4737a1c0d96SNathan Whitehorn /*
4747a1c0d96SNathan Whitehorn  * Display text from a stdin in a scrolling window.
4757a1c0d96SNathan Whitehorn  */
4767a1c0d96SNathan Whitehorn int
dialog_progressbox(const char * title,const char * cprompt,int height,int width)4777a1c0d96SNathan Whitehorn dialog_progressbox(const char *title, const char *cprompt, int height, int width)
4787a1c0d96SNathan Whitehorn {
4797a1c0d96SNathan Whitehorn     int result;
4807a1c0d96SNathan Whitehorn     result = dlg_progressbox(title,
4817a1c0d96SNathan Whitehorn 			     cprompt,
4827a1c0d96SNathan Whitehorn 			     height,
4837a1c0d96SNathan Whitehorn 			     width,
4847a1c0d96SNathan Whitehorn 			     FALSE,
4857a1c0d96SNathan Whitehorn 			     dialog_state.pipe_input);
4867a1c0d96SNathan Whitehorn     dialog_state.pipe_input = 0;
4877a1c0d96SNathan Whitehorn     return result;
4887a1c0d96SNathan Whitehorn }
489