diff options
author | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-07-28 00:10:27 +0400 |
---|---|---|
committer | Sam Ravnborg <sam@neptun.ravnborg.org> | 2006-09-30 13:19:19 +0400 |
commit | 2982de6993e6d9944f2215d7cb9b558b465a0c99 (patch) | |
tree | 3b4765905e7c53e2a03ed599692d2636623e22a5 /scripts/kconfig/lxdialog/checklist.c | |
parent | 350b5b76384e77bcc58217f00455fdbec5cac594 (diff) | |
download | linux-2982de6993e6d9944f2215d7cb9b558b465a0c99.tar.xz |
kconfig/menuconfig: lxdialog is now built-in
lxdialog was previously called as an external program causing screen
to flicker when used. With this patch lxdialog is now built-in.
It is loosly based om previous work by: Petr Baudis <pasky@ucw.cz>
Following is a list of changes:
o Moved build of dialog routings to kconfig Makefile
o menubox + checklist uses a new item list to hold all menu items
o in util.c implmented helper function to deal with item list
o menubox now uses parameters to save scroll state (avoids temp file)
o textbox now get text to be displayed as parameter and not a file
o make sure to properly delete subwin's before main windows
o killed unused files: lxdialog.c msgbox.c
o modified return value for ESC to match direct calling
o in a few places the code has been adjusted to 80 char wide
o in textbox a small refactoring was made to make code remotely readable
o in mconf removed all unused stuff (functions/variables)
Following is a list of know short comings:
a) pressing ESC twice will be interpreted as two ESC presses
b) resize does not work. menuconfig needs to be restarted to be adjusted
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/kconfig/lxdialog/checklist.c')
-rw-r--r-- | scripts/kconfig/lxdialog/checklist.c | 136 |
1 files changed, 55 insertions, 81 deletions
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index b90e888a2bc0..282511020bcb 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c @@ -28,8 +28,7 @@ static int list_width, check_x, item_x; /* * Print list item */ -static void print_item(WINDOW * win, const char *item, int status, int choice, - int selected) +static void print_item(WINDOW * win, int choice, int selected) { int i; @@ -42,12 +41,12 @@ static void print_item(WINDOW * win, const char *item, int status, int choice, wmove(win, choice, check_x); wattrset(win, selected ? dlg.check_selected.atr : dlg.check.atr); - wprintw(win, "(%c)", status ? 'X' : ' '); + wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' '); wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr); - mvwaddch(win, choice, item_x, item[0]); + mvwaddch(win, choice, item_x, item_str()[0]); wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); - waddstr(win, (char *)item + 1); + waddstr(win, (char *)item_str() + 1); if (selected) { wmove(win, choice, check_x + 1); wrefresh(win); @@ -110,32 +109,23 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected) * in the style of radiolist (only one option turned on at a time). */ int dialog_checklist(const char *title, const char *prompt, int height, - int width, int list_height, int item_no, - const char *const *items) + int width, int list_height) { int i, x, y, box_x, box_y; - int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice; WINDOW *dialog, *list; - /* Allocate space for storing item on/off status */ - if ((status = malloc(sizeof(int) * item_no)) == NULL) { - endwin(); - fprintf(stderr, - "\nCan't allocate memory in dialog_checklist().\n"); - exit(-1); - } - - /* Initializes status */ - for (i = 0; i < item_no; i++) { - status[i] = !strcasecmp(items[i * 3 + 2], "on"); - if ((!choice && status[i]) - || !strcasecmp(items[i * 3 + 2], "selected")) - choice = i + 1; + /* which item to highlight */ + item_foreach() { + if (item_is_tag('X')) + choice = item_n(); + if (item_is_selected()) { + choice = item_n(); + break; + } } - if (choice) - choice--; - max_choice = MIN(list_height, item_no); + max_choice = MIN(list_height, item_count()); /* center dialog box on screen */ x = (COLS - width) / 2; @@ -176,8 +166,8 @@ int dialog_checklist(const char *title, const char *prompt, int height, /* Find length of longest item in order to center checklist */ check_x = 0; - for (i = 0; i < item_no; i++) - check_x = MAX(check_x, +strlen(items[i * 3 + 1]) + 4); + item_foreach() + check_x = MAX(check_x, strlen(item_str()) + 4); check_x = (list_width - check_x) / 2; item_x = check_x + 4; @@ -189,14 +179,11 @@ int dialog_checklist(const char *title, const char *prompt, int height, /* Print the list */ for (i = 0; i < max_choice; i++) { - if (i != choice) - print_item(list, items[(scroll + i) * 3 + 1], - status[i + scroll], i, 0); + item_set(scroll + i); + print_item(list, i, i == choice); } - print_item(list, items[(scroll + choice) * 3 + 1], - status[choice + scroll], choice, 1); - print_arrows(dialog, choice, item_no, scroll, + print_arrows(dialog, choice, item_count(), scroll, box_y, box_x + check_x + 5, list_height); print_buttons(dialog, height, width, 0); @@ -208,10 +195,11 @@ int dialog_checklist(const char *title, const char *prompt, int height, while (key != ESC) { key = wgetch(dialog); - for (i = 0; i < max_choice; i++) - if (toupper(key) == - toupper(items[(scroll + i) * 3 + 1][0])) + for (i = 0; i < max_choice; i++) { + item_set(i + scroll); + if (toupper(key) == toupper(item_str()[0])) break; + } if (i < max_choice || key == KEY_UP || key == KEY_DOWN || key == '+' || key == '-') { @@ -222,15 +210,16 @@ int dialog_checklist(const char *title, const char *prompt, int height, /* Scroll list down */ if (list_height > 1) { /* De-highlight current first item */ - print_item(list, items[scroll * 3 + 1], - status[scroll], 0, FALSE); + item_set(scroll); + print_item(list, 0, FALSE); scrollok(list, TRUE); wscrl(list, -1); scrollok(list, FALSE); } scroll--; - print_item(list, items[scroll * 3 + 1], status[scroll], 0, TRUE); - print_arrows(dialog, choice, item_no, + item_set(scroll); + print_item(list, 0, TRUE); + print_arrows(dialog, choice, item_count(), scroll, box_y, box_x + check_x + 5, list_height); wnoutrefresh(dialog); @@ -241,23 +230,24 @@ int dialog_checklist(const char *title, const char *prompt, int height, i = choice - 1; } else if (key == KEY_DOWN || key == '+') { if (choice == max_choice - 1) { - if (scroll + choice >= item_no - 1) + if (scroll + choice >= item_count() - 1) continue; /* Scroll list up */ if (list_height > 1) { /* De-highlight current last item before scrolling up */ - print_item(list, items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], - max_choice - 1, FALSE); + item_set(scroll + max_choice - 1); + print_item(list, + max_choice - 1, + FALSE); scrollok(list, TRUE); wscrl(list, 1); scrollok(list, FALSE); } scroll++; - print_item(list, items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], max_choice - 1, TRUE); + item_set(scroll + max_choice - 1); + print_item(list, max_choice - 1, TRUE); - print_arrows(dialog, choice, item_no, + print_arrows(dialog, choice, item_count(), scroll, box_y, box_x + check_x + 5, list_height); wnoutrefresh(dialog); @@ -269,12 +259,12 @@ int dialog_checklist(const char *title, const char *prompt, int height, } if (i != choice) { /* De-highlight current item */ - print_item(list, items[(scroll + choice) * 3 + 1], - status[scroll + choice], choice, FALSE); + item_set(scroll + choice); + print_item(list, choice, FALSE); /* Highlight new item */ choice = i; - print_item(list, items[(scroll + choice) * 3 + 1], - status[scroll + choice], choice, TRUE); + item_set(scroll + choice); + print_item(list, choice, TRUE); wnoutrefresh(dialog); wrefresh(list); } @@ -284,10 +274,19 @@ int dialog_checklist(const char *title, const char *prompt, int height, case 'H': case 'h': case '?': - fprintf(stderr, "%s", items[(scroll + choice) * 3]); + button = 1; + /* fall-through */ + case 'S': + case 's': + case ' ': + case '\n': + item_foreach() + item_set_selected(0); + item_set(scroll + choice); + item_set_selected(1); + delwin(list); delwin(dialog); - free(status); - return 1; + return button; case TAB: case KEY_LEFT: case KEY_RIGHT: @@ -297,30 +296,6 @@ int dialog_checklist(const char *title, const char *prompt, int height, print_buttons(dialog, height, width, button); wrefresh(dialog); break; - case 'S': - case 's': - case ' ': - case '\n': - if (!button) { - if (!status[scroll + choice]) { - for (i = 0; i < item_no; i++) - status[i] = 0; - status[scroll + choice] = 1; - for (i = 0; i < max_choice; i++) - print_item(list, items[(scroll + i) * 3 + 1], - status[scroll + i], i, i == choice); - } - wnoutrefresh(dialog); - wrefresh(list); - - for (i = 0; i < item_no; i++) - if (status[i]) - fprintf(stderr, "%s", items[i * 3]); - } else - fprintf(stderr, "%s", items[(scroll + choice) * 3]); - delwin(dialog); - free(status); - return button; case 'X': case 'x': key = ESC; @@ -331,8 +306,7 @@ int dialog_checklist(const char *title, const char *prompt, int height, /* Now, update everything... */ doupdate(); } - + delwin(list); delwin(dialog); - free(status); - return -1; /* ESC pressed */ + return 255; /* ESC pressed */ } |