diff options
author | jkh <jkh@FreeBSD.org> | 1996-04-08 10:28:07 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1996-04-08 10:28:07 +0000 |
commit | 377be651951dbf0018420123b5b800db6503d1f3 (patch) | |
tree | e8a617d14c9a297e0fec3f701bb0cab17a5f42fc /gnu/lib/libdialog | |
parent | 06a2488050e8b7fea31bf0b51975209edbd0d9c1 (diff) | |
download | FreeBSD-src-377be651951dbf0018420123b5b800db6503d1f3.zip FreeBSD-src-377be651951dbf0018420123b5b800db6503d1f3.tar.gz |
Save screen before calling any fire() callbacks - you never know what
they might do to the screen.
Diffstat (limited to 'gnu/lib/libdialog')
-rw-r--r-- | gnu/lib/libdialog/menubox.c | 742 |
1 files changed, 379 insertions, 363 deletions
diff --git a/gnu/lib/libdialog/menubox.c b/gnu/lib/libdialog/menubox.c index c213d08..6bbe132 100644 --- a/gnu/lib/libdialog/menubox.c +++ b/gnu/lib/libdialog/menubox.c @@ -39,364 +39,382 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, int item_no, void *it, unsigned char *result, int *ch, int *sc) { - int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0, - l, k, scroll = 0, max_choice, redraw_menu = FALSE; - char okButton, cancelButton; - WINDOW *dialog, *menu; - unsigned char **items; - dialogMenuItem *ditems; - - if (ch) /* restore menu item info */ - choice = *ch; - if (sc) - scroll = *sc; - - /* If item_no is a positive integer, use old item specification format */ - if (item_no >= 0) { - items = it; - ditems = NULL; - } - /* It's the new specification format - fake the rest of the code out */ - else { - item_no = abs(item_no); - ditems = it; - items = (unsigned char **)alloca((item_no * 2) * sizeof(unsigned char *)); - - /* Initializes status */ + int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0, + l, k, scroll = 0, max_choice, redraw_menu = FALSE; + char okButton, cancelButton; + WINDOW *dialog, *menu; + unsigned char **items; + dialogMenuItem *ditems; + + if (ch) /* restore menu item info */ + choice = *ch; + if (sc) + scroll = *sc; + + /* If item_no is a positive integer, use old item specification format */ + if (item_no >= 0) { + items = it; + ditems = NULL; + } + /* It's the new specification format - fake the rest of the code out */ + else { + item_no = abs(item_no); + ditems = it; + items = (unsigned char **)alloca((item_no * 2) * sizeof(unsigned char *)); + + /* Initializes status */ + for (i = 0; i < item_no; i++) { + items[i*2] = ditems[i].prompt; + items[i*2 + 1] = ditems[i].title; + } + } + max_choice = MIN(menu_height, item_no); + + tag_x = 0; + item_x = 0; + /* Find length of longest item in order to center menu */ for (i = 0; i < item_no; i++) { - items[i*2] = ditems[i].prompt; - items[i*2 + 1] = ditems[i].title; + l = strlen(items[i*2]); + for (j = 0; j < item_no; j++) { + k = strlen(items[j*2 + 1]); + tag_x = MAX(tag_x, l + k + 2); + } + item_x = MAX(item_x, l); } - } - max_choice = MIN(menu_height, item_no); - - tag_x = 0; - item_x = 0; - /* Find length of longest item in order to center menu */ - for (i = 0; i < item_no; i++) { - l = strlen(items[i*2]); - for (j = 0; j < item_no; j++) { - k = strlen(items[j*2 + 1]); - tag_x = MAX(tag_x, l + k + 2); + if (height < 0) + height = strheight(prompt)+menu_height+4+2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j); + width = MAX(width,tag_x+4)+4; } - item_x = MAX(item_x, l); - } - if (height < 0) - height = strheight(prompt)+menu_height+4+2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j); - width = MAX(width,tag_x+4)+4; - } - width = MAX(width,24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - + width = MAX(width,24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + #ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); #endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - return -1; - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); - - menu_width = width-6; - getyx(dialog, cur_y, cur_x); - box_y = cur_y + 1; - box_x = (width - menu_width)/2 - 1; - - /* create new window for the menu */ - menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); - if (menu == NULL) { - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height,menu_width,y+box_y+1,x+box_x+1); - return -1; - } - keypad(menu, TRUE); - - /* draw a box around the menu items */ - draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); - - tag_x = (menu_width - tag_x) / 2; - item_x = tag_x + item_x + 2; - - /* Print the menu */ - for (i = 0; i < max_choice; i++) - print_item(menu, items[(scroll+i)*2], items[(scroll+i)*2 + 1], i, i == choice, DREF(ditems, scroll + i)); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - - display_helpline(dialog, height-1, width); - - x = width/2-11; - y = height-2; - - if (ditems && result) { - cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); - okButton = toupper(ditems[OK_BUTTON].prompt[0]); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); - } - else { - cancelButton = 'C'; - print_button(dialog, "Cancel", y, x + 14, FALSE); - okButton = 'O'; - print_button(dialog, " OK ", y, x, TRUE); - } - - wrefresh(dialog); - - while (key != ESC) { - key = wgetch(dialog); - - /* Shortcut to OK? */ - if (toupper(key) == okButton) { - if (ditems && result && ditems[OK_BUTTON].fire) { - if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE) { - wrefresh(dialog); - continue; - } - else - delwin(dialog); - } - else { - delwin(dialog); - strcpy(result, items[(scroll+choice)*2]); - } - return 0; + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + return -1; } - /* Shortcut to cancel? */ - else if (toupper(key) == cancelButton) { - if (ditems && result && ditems[CANCEL_BUTTON].fire) { - if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE) { - wrefresh(dialog); - continue; - } - } - delwin(dialog); - return 1; + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); } - - /* Check if key pressed matches first character of any item tag in menu */ + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); + + menu_width = width-6; + getyx(dialog, cur_y, cur_x); + box_y = cur_y + 1; + box_x = (width - menu_width)/2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); + if (menu == NULL) { + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height,menu_width,y+box_y+1,x+box_x+1); + return -1; + } + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); + + tag_x = (menu_width - tag_x) / 2; + item_x = tag_x + item_x + 2; + + /* Print the menu */ for (i = 0; i < max_choice; i++) - if (key < 0x100 && toupper(key) == toupper(items[(scroll+i)*2][0])) - break; - - if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || - key == KEY_UP || key == KEY_DOWN || key == '-' || key == '+') { - if (key >= '1' && key <= MIN('9', '0'+max_choice)) - i = key - '1'; - else if (key == KEY_UP || key == '-') { - if (!choice) { - if (scroll) { - /* Scroll menu down */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current first item before scrolling down */ - print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, FALSE, DREF(ditems, scroll)); - scrollok(menu, TRUE); - wscrl(menu, -1); - scrollok(menu, FALSE); - } - scroll--; - print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, TRUE, DREF(ditems, scroll)); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice - 1; - } - else if (key == KEY_DOWN || key == '+') - if (choice == max_choice - 1) { - if (scroll+choice < item_no-1) { - /* Scroll menu up */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current last item before scrolling up */ - print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1], - max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1)); - scrollok(menu, TRUE); - scroll(menu); - scrollok(menu, FALSE); - } - scroll++; - print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1], - max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1)); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice + 1; - - if (i != choice) { - /* De-highlight current item */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, FALSE, - DREF(ditems, scroll + choice)); - - /* Highlight new item */ - choice = i; - print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, TRUE, - DREF(ditems, scroll + choice)); - wnoutrefresh(menu); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - } - continue; /* wait for another key press */ + print_item(menu, items[(scroll+i)*2], items[(scroll+i)*2 + 1], i, i == choice, DREF(ditems, scroll + i)); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + + display_helpline(dialog, height-1, width); + + x = width/2-11; + y = height-2; + + if (ditems && result) { + cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); + okButton = toupper(ditems[OK_BUTTON].prompt[0]); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); } - - /* save info about menu item position */ - if (ch) - *ch = choice; - if (sc) - *sc = scroll; - - switch (key) { - case KEY_PPAGE: - if (scroll > height-4) { /* can we go up? */ - scroll -= (height-4); - } else { - scroll = 0; + else { + cancelButton = 'C'; + print_button(dialog, "Cancel", y, x + 14, FALSE); + okButton = 'O'; + print_button(dialog, " OK ", y, x, TRUE); + } + + wrefresh(dialog); + + while (key != ESC) { + key = wgetch(dialog); + + /* Shortcut to OK? */ + if (toupper(key) == okButton) { + if (ditems && result && ditems[OK_BUTTON].fire) { + WINDOW *w; + int x; + + w = dupwin(newscr); + x = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); + touchwin(w); + wrefresh(w); + delwin(w); + if (x == DITEM_FAILURE) + continue; + else + delwin(dialog); + } + else { + delwin(dialog); + strcpy(result, items[(scroll+choice)*2]); + } + return 0; } - redraw_menu = TRUE; - break; - - case KEY_NPAGE: - if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ + /* Shortcut to cancel? */ + else if (toupper(key) == cancelButton) { + if (ditems && result && ditems[CANCEL_BUTTON].fire) { + WINDOW *w; + int x; + + w = dupwin(newscr); + x = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); + touchwin(w); + wrefresh(w); + delwin(w); + if (x == DITEM_FAILURE) + continue; + } + delwin(dialog); + return 1; + } + + /* Check if key pressed matches first character of any item tag in menu */ + for (i = 0; i < max_choice; i++) + if (key < 0x100 && toupper(key) == toupper(items[(scroll+i)*2][0])) + break; + + if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || + key == KEY_UP || key == KEY_DOWN || key == '-' || key == '+') { + if (key >= '1' && key <= MIN('9', '0'+max_choice)) + i = key - '1'; + else if (key == KEY_UP || key == '-') { + if (!choice) { + if (scroll) { + /* Scroll menu down */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current first item before scrolling down */ + print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, FALSE, DREF(ditems, scroll)); + scrollok(menu, TRUE); + wscrl(menu, -1); + scrollok(menu, FALSE); + } + scroll--; + print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, TRUE, DREF(ditems, scroll)); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice - 1; + } + else if (key == KEY_DOWN || key == '+') + if (choice == max_choice - 1) { + if (scroll+choice < item_no-1) { + /* Scroll menu up */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1], + max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1)); + scrollok(menu, TRUE); + scroll(menu); + scrollok(menu, FALSE); + } + scroll++; + print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1], + max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1)); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice + 1; + + if (i != choice) { + /* De-highlight current item */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, FALSE, + DREF(ditems, scroll + choice)); + + /* Highlight new item */ + choice = i; + print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, TRUE, + DREF(ditems, scroll + choice)); + wnoutrefresh(menu); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + + /* save info about menu item position */ + if (ch) + *ch = choice; + if (sc) + *sc = scroll; + + switch (key) { + case KEY_PPAGE: + if (scroll > height-4) { /* can we go up? */ + scroll -= (height-4); + } else { + scroll = 0; + } + redraw_menu = TRUE; + break; + + case KEY_NPAGE: + if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ + scroll = item_no - menu_height; + if (scroll < 0) scroll = 0; + } else { + scroll += menu_height; + } + redraw_menu = TRUE; + break; + + case KEY_HOME: + scroll = 0; + choice = 0; + redraw_menu = TRUE; + break; + + case KEY_END: scroll = item_no - menu_height; if (scroll < 0) scroll = 0; - } else { - scroll += menu_height; - } - redraw_menu = TRUE; - break; - - case KEY_HOME: - scroll = 0; - choice = 0; - redraw_menu = TRUE; - break; - - case KEY_END: - scroll = item_no - menu_height; - if (scroll < 0) scroll = 0; - choice = max_choice - 1; - redraw_menu = TRUE; + choice = max_choice - 1; + redraw_menu = TRUE; + break; + + case KEY_BTAB: + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = !button; + if (ditems && result) { + if (button) { + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + } + else { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + } + } + else { + if (button) { + print_button(dialog, " OK ", y, x, !button); + print_button(dialog, "Cancel", y, x + 14, button); + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + } + } + wrefresh(dialog); + break; + + case ' ': + case '\r': + case '\n': + if (!button) { + if (ditems && ditems[scroll + choice].fire) { + WINDOW *w; + int x; + + w = dupwin(newscr); + x = ditems[scroll + choice].fire(&ditems[scroll + choice]); + touchwin(w); + wrefresh(w); + delwin(w); + if (x == DITEM_FAILURE) + continue; + } + else if (result) + strcpy(result, items[(scroll+choice)*2]); + } + delwin(dialog); + return button; + + case ESC: + break; + + case KEY_F(1): + case '?': + display_helpfile(); break; - - case KEY_BTAB: - case TAB: - case KEY_LEFT: - case KEY_RIGHT: - button = !button; - if (ditems && result) { - if (button) { - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - } - else { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - } - } - else { - if (button) { - print_button(dialog, " OK ", y, x, !button); - print_button(dialog, "Cancel", y, x + 14, button); - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); } - } - wrefresh(dialog); - break; - - case ' ': - case '\r': - case '\n': - if (!button) { - if (ditems && ditems[scroll + choice].fire) { - if (ditems[scroll + choice].fire(&ditems[scroll + choice]) == DITEM_FAILURE) { + + if (redraw_menu) { + for (i = 0; i < max_choice; i++) { + print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, + DREF(ditems, scroll + i)); + } + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); wrefresh(dialog); - continue; - } - } - else if (result) - strcpy(result, items[(scroll+choice)*2]); - } - delwin(dialog); - return button; - - case ESC: - break; - - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - - if (redraw_menu) { - for (i = 0; i < max_choice; i++) { - print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, - DREF(ditems, scroll + i)); + redraw_menu = FALSE; } - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wrefresh(dialog); - redraw_menu = FALSE; } - } - - delwin(dialog); - return -1; /* ESC pressed */ + + delwin(dialog); + return -1; /* ESC pressed */ } /* End of dialog_menu() */ @@ -407,27 +425,25 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me) { - int i; - - /* Clear 'residue' of last item */ - wattrset(win, menubox_attr); - wmove(win, choice, 0); - for (i = 0; i < menu_width; i++) - waddch(win, ' '); - wmove(win, choice, tag_x); - wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); - waddch(win, tag[0]); - wattrset(win, selected ? tag_selected_attr : tag_attr); - waddstr(win, tag + 1); - wmove(win, choice, item_x); - wattrset(win, selected ? item_selected_attr : item_attr); - waddstr(win, item); - /* If have a selection handler for this, call it */ - if (me && me->selected) { - wrefresh(win); - me->selected(me, selected); - } + int i; + + /* Clear 'residue' of last item */ + wattrset(win, menubox_attr); + wmove(win, choice, 0); + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + wmove(win, choice, tag_x); + wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); + waddch(win, tag[0]); + wattrset(win, selected ? tag_selected_attr : tag_attr); + waddstr(win, tag + 1); + wmove(win, choice, item_x); + wattrset(win, selected ? item_selected_attr : item_attr); + waddstr(win, item); + /* If have a selection handler for this, call it */ + if (me && me->selected) { + wrefresh(win); + me->selected(me, selected); + } } /* End of print_item() */ - - |