static bool handle_input(DIALOG_CALLBACK * cb) { MY_OBJ *obj = (MY_OBJ *) cb; bool result; int status; char buf[MY_LEN]; if (dialog_state.pipe_input == 0) { status = -1; } else if ((status = read_data(buf, dialog_state.pipe_input)) > 0) { if (isMarker(buf)) { /* * Historically, next line should be percentage, but one of the * worse-written clones of 'dialog' assumes the number is missing. * (Gresham's Law applied to software). */ if ((status = read_data(buf, dialog_state.pipe_input)) > 0) { obj->prompt_buf[0] = '\0'; if (decode_percent(buf)) obj->percent = atoi(buf); else strcpy(obj->prompt_buf, buf); /* Rest is message text */ while ((status = read_data(buf, dialog_state.pipe_input)) > 0 && !isMarker(buf)) { if (strlen(obj->prompt_buf) + strlen(buf) < sizeof(obj->prompt_buf) - 1) { strcat(obj->prompt_buf, buf); } } if (obj->prompt != obj->prompt_buf) free(obj->prompt); obj->prompt = obj->prompt_buf; } } else if (decode_percent(buf)) { obj->percent = atoi(buf); } } else { if (feof(dialog_state.pipe_input) || (ferror(dialog_state.pipe_input) && errno != EINTR)) { delink(obj); dlg_remove_callback(cb); } } if (status > 0) { result = TRUE; repaint_text(obj); } else { result = FALSE; } return result; }
/* * Display a gauge, or progress meter. Starts at percent% and reads stdin. If * stdin is not XXX, then it is interpreted as a percentage, and the display is * updated accordingly. Otherwise the next line is the percentage, and * subsequent lines up to another XXX are used for the new prompt. Note that * the size of the window never changes, so the prompt can not get any larger * than the height and width specified. */ int dialog_gauge(const char *title, const char *prompt, int height, int width, int percent) { int i, x, y; char buf[MY_LEN]; char prompt_buf[MY_LEN]; WINDOW *dialog; auto_size(title, prompt, &height, &width, MIN_HIGH, MIN_WIDE); print_size(height, width); ctl_size(height, width); /* center dialog box on screen */ x = box_x_ordinate(width); y = box_y_ordinate(height); dialog = new_window(height, width, y, x); curs_set(0); do { (void) werase(dialog); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_title(dialog, title); wattrset(dialog, dialog_attr); print_autowrap(dialog, prompt, height, width - (2 * MARGIN)); draw_box(dialog, height - 4, 2 + MARGIN, 2 + MARGIN, width - 2 * (2 + MARGIN), dialog_attr, border_attr); (void) wmove(dialog, height - 3, 4); wattrset(dialog, title_attr); for (i = 0; i < (width - 2 * (3 + MARGIN)); i++) (void) waddch(dialog, ' '); wattrset(dialog, title_attr); (void) wmove(dialog, height - 3, (width / 2) - 2); (void) wprintw(dialog, "%3d%%", percent); x = (percent * (width - 2 * (3 + MARGIN))) / 100; wattrset(dialog, A_REVERSE); (void) wmove(dialog, height - 3, 4); for (i = 0; i < x; i++) (void) waddch(dialog, winch(dialog)); (void) wrefresh(dialog); if (read_data(buf, pipe_fp) == 0) break; if (isMarker(buf)) { /* * Historically, next line should be percentage, but one of the * worse-written clones of 'dialog' assumes the number is missing. * (Gresham's Law applied to software). */ if (read_data(buf, pipe_fp) == 0) break; prompt_buf[0] = '\0'; if (decode_percent(buf)) percent = atoi(buf); else strcpy(prompt_buf, buf); /* Rest is message text */ while (read_data(buf, pipe_fp) != 0 && !isMarker(buf)) { if (strlen(prompt_buf) + strlen(buf) < sizeof(prompt_buf) - 1) { strcat(prompt_buf, buf); } } prompt = prompt_buf; } else if (decode_percent(buf)) { percent = atoi(buf); } } while (1); curs_set(1); del_window(dialog); return (DLG_EXIT_OK); }