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