aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kbuild/modules.txt9
-rw-r--r--scripts/Makefile.modpost11
-rw-r--r--scripts/kconfig/Makefile31
-rw-r--r--scripts/kconfig/confdata.c2
-rw-r--r--scripts/kconfig/lxdialog/Makefile21
-rw-r--r--scripts/kconfig/lxdialog/checklist.c183
-rw-r--r--scripts/kconfig/lxdialog/colors.h154
-rw-r--r--scripts/kconfig/lxdialog/dialog.h144
-rw-r--r--scripts/kconfig/lxdialog/inputbox.c48
-rw-r--r--scripts/kconfig/lxdialog/lxdialog.c204
-rw-r--r--scripts/kconfig/lxdialog/menubox.c166
-rw-r--r--scripts/kconfig/lxdialog/msgbox.c71
-rw-r--r--scripts/kconfig/lxdialog/textbox.c416
-rw-r--r--scripts/kconfig/lxdialog/util.c502
-rw-r--r--scripts/kconfig/lxdialog/yesno.c26
-rw-r--r--scripts/kconfig/mconf.c511
16 files changed, 1053 insertions, 1446 deletions
diff --git a/Documentation/kbuild/modules.txt b/Documentation/kbuild/modules.txt
index 2e7702e94a78..769ee05ee4d1 100644
--- a/Documentation/kbuild/modules.txt
+++ b/Documentation/kbuild/modules.txt
@@ -43,7 +43,7 @@ are not planned to be included in the kernel tree.
43What is covered within this file is mainly information to authors 43What is covered within this file is mainly information to authors
44of modules. The author of an external module should supply 44of modules. The author of an external module should supply
45a makefile that hides most of the complexity, so one only has to type 45a makefile that hides most of the complexity, so one only has to type
46'make' to build the module. A complete example will be present in 46'make' to build the module. A complete example will be presented in
47chapter 4, "Creating a kbuild file for an external module". 47chapter 4, "Creating a kbuild file for an external module".
48 48
49 49
@@ -61,6 +61,7 @@ when building an external module.
61 make -C <path-to-kernel> M=`pwd` 61 make -C <path-to-kernel> M=`pwd`
62 62
63 For the running kernel use: 63 For the running kernel use:
64
64 make -C /lib/modules/`uname -r`/build M=`pwd` 65 make -C /lib/modules/`uname -r`/build M=`pwd`
65 66
66 For the above command to succeed, the kernel must have been 67 For the above command to succeed, the kernel must have been
@@ -130,10 +131,10 @@ when building an external module.
130 131
131 To make sure the kernel contains the information required to 132 To make sure the kernel contains the information required to
132 build external modules the target 'modules_prepare' must be used. 133 build external modules the target 'modules_prepare' must be used.
133 'module_prepare' exists solely as a simple way to prepare 134 'modules_prepare' exists solely as a simple way to prepare
134 a kernel source tree for building external modules. 135 a kernel source tree for building external modules.
135 Note: modules_prepare will not build Module.symvers even if 136 Note: modules_prepare will not build Module.symvers even if
136 CONFIG_MODULEVERSIONING is set. Therefore a full kernel build 137 CONFIG_MODVERSIONS is set. Therefore a full kernel build
137 needs to be executed to make module versioning work. 138 needs to be executed to make module versioning work.
138 139
139--- 2.5 Building separate files for a module 140--- 2.5 Building separate files for a module
@@ -450,7 +451,7 @@ kernel refuses to load the module.
450 451
451Module.symvers contains a list of all exported symbols from a kernel build. 452Module.symvers contains a list of all exported symbols from a kernel build.
452 453
453--- 7.1 Symbols fron the kernel (vmlinux + modules) 454--- 7.1 Symbols from the kernel (vmlinux + modules)
454 455
455 During a kernel build, a file named Module.symvers will be generated. 456 During a kernel build, a file named Module.symvers will be generated.
456 Module.symvers contains all exported symbols from the kernel and 457 Module.symvers contains all exported symbols from the kernel and
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 4b2721ca97da..6c5469b1473b 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -32,6 +32,10 @@
32# Step 4 is solely used to allow module versioning in external modules, 32# Step 4 is solely used to allow module versioning in external modules,
33# where the CRC of each module is retrieved from the Module.symers file. 33# where the CRC of each module is retrieved from the Module.symers file.
34 34
35# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
36# symbols in the final module linking stage
37# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
38# This is solely usefull to speed up test compiles
35PHONY := _modpost 39PHONY := _modpost
36_modpost: __modpost 40_modpost: __modpost
37 41
@@ -46,7 +50,8 @@ modulesymfile := $(KBUILD_EXTMOD)/Module.symvers
46__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) 50__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
47modules := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o))) 51modules := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))
48 52
49_modpost: $(modules) 53# Stop after building .o files if NOFINAL is set. Makes compile tests quicker
54_modpost: $(if $(KBUILD_MODPOST_NOFINAL), $(modules:.ko:.o),$(modules))
50 55
51 56
52# Step 2), invoke modpost 57# Step 2), invoke modpost
@@ -58,7 +63,7 @@ quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
58 $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ 63 $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
59 $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ 64 $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \
60 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ 65 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
61 $(if $(KBUILD_EXTMOD),-w) \ 66 $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
62 $(wildcard vmlinux) $(filter-out FORCE,$^) 67 $(wildcard vmlinux) $(filter-out FORCE,$^)
63 68
64PHONY += __modpost 69PHONY += __modpost
@@ -92,7 +97,7 @@ targets += $(modules:.ko=.mod.o)
92 97
93# Step 6), final link of the modules 98# Step 6), final link of the modules
94quiet_cmd_ld_ko_o = LD [M] $@ 99quiet_cmd_ld_ko_o = LD [M] $@
95 cmd_ld_ko_o = $(LD) $(LDFLAGS) $(LDFLAGS_MODULE) -o $@ \ 100 cmd_ld_ko_o = $(LD) $(LDFLAGS) $(LDFLAGS_MODULE) -o $@ \
96 $(filter-out FORCE,$^) 101 $(filter-out FORCE,$^)
97 102
98$(modules): %.ko :%.o %.mod.o FORCE 103$(modules): %.ko :%.o %.mod.o FORCE
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index a90d3cc76bfa..7e7e147875bf 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -11,7 +11,6 @@ gconfig: $(obj)/gconf
11 $< arch/$(ARCH)/Kconfig 11 $< arch/$(ARCH)/Kconfig
12 12
13menuconfig: $(obj)/mconf 13menuconfig: $(obj)/mconf
14 $(Q)$(MAKE) $(build)=scripts/kconfig/lxdialog
15 $< arch/$(ARCH)/Kconfig 14 $< arch/$(ARCH)/Kconfig
16 15
17config: $(obj)/conf 16config: $(obj)/conf
@@ -81,6 +80,23 @@ help:
81 @echo ' allyesconfig - New config where all options are accepted with yes' 80 @echo ' allyesconfig - New config where all options are accepted with yes'
82 @echo ' allnoconfig - New config where all options are answered with no' 81 @echo ' allnoconfig - New config where all options are answered with no'
83 82
83# lxdialog stuff
84check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
85
86# Use reursively expanded variables so we do not call gcc unless
87# we really need to do so. (Do not call gcc as part of make mrproper)
88HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
89HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
90
91HOST_EXTRACFLAGS += -DLOCALE
92
93PHONY += $(obj)/dochecklxdialog
94$(obj)/dochecklxdialog:
95 $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES)
96
97always := dochecklxdialog
98
99
84# =========================================================================== 100# ===========================================================================
85# Shared Makefile for the various kconfig executables: 101# Shared Makefile for the various kconfig executables:
86# conf: Used for defconfig, oldconfig and related targets 102# conf: Used for defconfig, oldconfig and related targets
@@ -92,11 +108,19 @@ help:
92# Based on GTK which needs to be installed to compile it 108# Based on GTK which needs to be installed to compile it
93# object files used by all kconfig flavours 109# object files used by all kconfig flavours
94 110
95hostprogs-y := conf mconf qconf gconf kxgettext 111lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
112lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
113
96conf-objs := conf.o zconf.tab.o 114conf-objs := conf.o zconf.tab.o
97mconf-objs := mconf.o zconf.tab.o 115mconf-objs := mconf.o zconf.tab.o $(lxdialog)
98kxgettext-objs := kxgettext.o zconf.tab.o 116kxgettext-objs := kxgettext.o zconf.tab.o
99 117
118hostprogs-y := conf qconf gconf kxgettext
119
120ifeq ($(MAKECMDGOALS),menuconfig)
121 hostprogs-y += mconf
122endif
123
100ifeq ($(MAKECMDGOALS),xconfig) 124ifeq ($(MAKECMDGOALS),xconfig)
101 qconf-target := 1 125 qconf-target := 1
102endif 126endif
@@ -116,7 +140,6 @@ endif
116 140
117clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \ 141clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
118 .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c 142 .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
119subdir- += lxdialog
120 143
121# Needed for systems without gettext 144# Needed for systems without gettext
122KBUILD_HAVE_NLS := $(shell \ 145KBUILD_HAVE_NLS := $(shell \
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 69f96b398c22..66b15ef02931 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -517,7 +517,7 @@ int conf_write(const char *name)
517 fclose(out); 517 fclose(out);
518 518
519 if (*tmpname) { 519 if (*tmpname) {
520 strcat(dirname, name ? name : conf_get_configname()); 520 strcat(dirname, basename);
521 strcat(dirname, ".old"); 521 strcat(dirname, ".old");
522 rename(newname, dirname); 522 rename(newname, dirname);
523 if (rename(tmpname, newname)) 523 if (rename(tmpname, newname))
diff --git a/scripts/kconfig/lxdialog/Makefile b/scripts/kconfig/lxdialog/Makefile
deleted file mode 100644
index a8b026326247..000000000000
--- a/scripts/kconfig/lxdialog/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
1# Makefile to build lxdialog package
2#
3
4check-lxdialog := $(srctree)/$(src)/check-lxdialog.sh
5
6# Use reursively expanded variables so we do not call gcc unless
7# we really need to do so. (Do not call gcc as part of make mrproper)
8HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
9HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
10
11HOST_EXTRACFLAGS += -DLOCALE
12
13PHONY += dochecklxdialog
14$(obj)/dochecklxdialog:
15 $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES)
16
17hostprogs-y := lxdialog
18always := $(hostprogs-y) dochecklxdialog
19
20lxdialog-objs := checklist.o menubox.o textbox.o yesno.o inputbox.o \
21 util.o lxdialog.o msgbox.o
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c
index 79886413b6d5..cf697080dddd 100644
--- a/scripts/kconfig/lxdialog/checklist.c
+++ b/scripts/kconfig/lxdialog/checklist.c
@@ -28,25 +28,25 @@ static int list_width, check_x, item_x;
28/* 28/*
29 * Print list item 29 * Print list item
30 */ 30 */
31static void print_item(WINDOW * win, const char *item, int status, int choice, 31static void print_item(WINDOW * win, int choice, int selected)
32 int selected)
33{ 32{
34 int i; 33 int i;
35 34
36 /* Clear 'residue' of last item */ 35 /* Clear 'residue' of last item */
37 wattrset(win, menubox_attr); 36 wattrset(win, dlg.menubox.atr);
38 wmove(win, choice, 0); 37 wmove(win, choice, 0);
39 for (i = 0; i < list_width; i++) 38 for (i = 0; i < list_width; i++)
40 waddch(win, ' '); 39 waddch(win, ' ');
41 40
42 wmove(win, choice, check_x); 41 wmove(win, choice, check_x);
43 wattrset(win, selected ? check_selected_attr : check_attr); 42 wattrset(win, selected ? dlg.check_selected.atr
44 wprintw(win, "(%c)", status ? 'X' : ' '); 43 : dlg.check.atr);
45 44 wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
46 wattrset(win, selected ? tag_selected_attr : tag_attr); 45
47 mvwaddch(win, choice, item_x, item[0]); 46 wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
48 wattrset(win, selected ? item_selected_attr : item_attr); 47 mvwaddch(win, choice, item_x, item_str()[0]);
49 waddstr(win, (char *)item + 1); 48 wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
49 waddstr(win, (char *)item_str() + 1);
50 if (selected) { 50 if (selected) {
51 wmove(win, choice, check_x + 1); 51 wmove(win, choice, check_x + 1);
52 wrefresh(win); 52 wrefresh(win);
@@ -62,11 +62,11 @@ static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
62 wmove(win, y, x); 62 wmove(win, y, x);
63 63
64 if (scroll > 0) { 64 if (scroll > 0) {
65 wattrset(win, uarrow_attr); 65 wattrset(win, dlg.uarrow.atr);
66 waddch(win, ACS_UARROW); 66 waddch(win, ACS_UARROW);
67 waddstr(win, "(-)"); 67 waddstr(win, "(-)");
68 } else { 68 } else {
69 wattrset(win, menubox_attr); 69 wattrset(win, dlg.menubox.atr);
70 waddch(win, ACS_HLINE); 70 waddch(win, ACS_HLINE);
71 waddch(win, ACS_HLINE); 71 waddch(win, ACS_HLINE);
72 waddch(win, ACS_HLINE); 72 waddch(win, ACS_HLINE);
@@ -77,11 +77,11 @@ static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
77 wmove(win, y, x); 77 wmove(win, y, x);
78 78
79 if ((height < item_no) && (scroll + choice < item_no - 1)) { 79 if ((height < item_no) && (scroll + choice < item_no - 1)) {
80 wattrset(win, darrow_attr); 80 wattrset(win, dlg.darrow.atr);
81 waddch(win, ACS_DARROW); 81 waddch(win, ACS_DARROW);
82 waddstr(win, "(+)"); 82 waddstr(win, "(+)");
83 } else { 83 } else {
84 wattrset(win, menubox_border_attr); 84 wattrset(win, dlg.menubox_border.atr);
85 waddch(win, ACS_HLINE); 85 waddch(win, ACS_HLINE);
86 waddch(win, ACS_HLINE); 86 waddch(win, ACS_HLINE);
87 waddch(win, ACS_HLINE); 87 waddch(win, ACS_HLINE);
@@ -109,32 +109,29 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
109 * in the style of radiolist (only one option turned on at a time). 109 * in the style of radiolist (only one option turned on at a time).
110 */ 110 */
111int dialog_checklist(const char *title, const char *prompt, int height, 111int dialog_checklist(const char *title, const char *prompt, int height,
112 int width, int list_height, int item_no, 112 int width, int list_height)
113 const char *const *items)
114{ 113{
115 int i, x, y, box_x, box_y; 114 int i, x, y, box_x, box_y;
116 int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; 115 int key = 0, button = 0, choice = 0, scroll = 0, max_choice;
117 WINDOW *dialog, *list; 116 WINDOW *dialog, *list;
118 117
119 /* Allocate space for storing item on/off status */ 118 /* which item to highlight */
120 if ((status = malloc(sizeof(int) * item_no)) == NULL) { 119 item_foreach() {
121 endwin(); 120 if (item_is_tag('X'))
122 fprintf(stderr, 121 choice = item_n();
123 "\nCan't allocate memory in dialog_checklist().\n"); 122 if (item_is_selected()) {
124 exit(-1); 123 choice = item_n();
124 break;
125 }
125 } 126 }
126 127
127 /* Initializes status */ 128do_resize:
128 for (i = 0; i < item_no; i++) { 129 if (getmaxy(stdscr) < (height + 6))
129 status[i] = !strcasecmp(items[i * 3 + 2], "on"); 130 return -ERRDISPLAYTOOSMALL;
130 if ((!choice && status[i]) 131 if (getmaxx(stdscr) < (width + 6))
131 || !strcasecmp(items[i * 3 + 2], "selected")) 132 return -ERRDISPLAYTOOSMALL;
132 choice = i + 1;
133 }
134 if (choice)
135 choice--;
136 133
137 max_choice = MIN(list_height, item_no); 134 max_choice = MIN(list_height, item_count());
138 135
139 /* center dialog box on screen */ 136 /* center dialog box on screen */
140 x = (COLS - width) / 2; 137 x = (COLS - width) / 2;
@@ -145,17 +142,18 @@ int dialog_checklist(const char *title, const char *prompt, int height,
145 dialog = newwin(height, width, y, x); 142 dialog = newwin(height, width, y, x);
146 keypad(dialog, TRUE); 143 keypad(dialog, TRUE);
147 144
148 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 145 draw_box(dialog, 0, 0, height, width,
149 wattrset(dialog, border_attr); 146 dlg.dialog.atr, dlg.border.atr);
147 wattrset(dialog, dlg.border.atr);
150 mvwaddch(dialog, height - 3, 0, ACS_LTEE); 148 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
151 for (i = 0; i < width - 2; i++) 149 for (i = 0; i < width - 2; i++)
152 waddch(dialog, ACS_HLINE); 150 waddch(dialog, ACS_HLINE);
153 wattrset(dialog, dialog_attr); 151 wattrset(dialog, dlg.dialog.atr);
154 waddch(dialog, ACS_RTEE); 152 waddch(dialog, ACS_RTEE);
155 153
156 print_title(dialog, title, width); 154 print_title(dialog, title, width);
157 155
158 wattrset(dialog, dialog_attr); 156 wattrset(dialog, dlg.dialog.atr);
159 print_autowrap(dialog, prompt, width - 2, 1, 3); 157 print_autowrap(dialog, prompt, width - 2, 1, 3);
160 158
161 list_width = width - 6; 159 list_width = width - 6;
@@ -170,12 +168,12 @@ int dialog_checklist(const char *title, const char *prompt, int height,
170 168
171 /* draw a box around the list items */ 169 /* draw a box around the list items */
172 draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, 170 draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
173 menubox_border_attr, menubox_attr); 171 dlg.menubox_border.atr, dlg.menubox.atr);
174 172
175 /* Find length of longest item in order to center checklist */ 173 /* Find length of longest item in order to center checklist */
176 check_x = 0; 174 check_x = 0;
177 for (i = 0; i < item_no; i++) 175 item_foreach()
178 check_x = MAX(check_x, +strlen(items[i * 3 + 1]) + 4); 176 check_x = MAX(check_x, strlen(item_str()) + 4);
179 177
180 check_x = (list_width - check_x) / 2; 178 check_x = (list_width - check_x) / 2;
181 item_x = check_x + 4; 179 item_x = check_x + 4;
@@ -187,14 +185,11 @@ int dialog_checklist(const char *title, const char *prompt, int height,
187 185
188 /* Print the list */ 186 /* Print the list */
189 for (i = 0; i < max_choice; i++) { 187 for (i = 0; i < max_choice; i++) {
190 if (i != choice) 188 item_set(scroll + i);
191 print_item(list, items[(scroll + i) * 3 + 1], 189 print_item(list, i, i == choice);
192 status[i + scroll], i, 0);
193 } 190 }
194 print_item(list, items[(scroll + choice) * 3 + 1],
195 status[choice + scroll], choice, 1);
196 191
197 print_arrows(dialog, choice, item_no, scroll, 192 print_arrows(dialog, choice, item_count(), scroll,
198 box_y, box_x + check_x + 5, list_height); 193 box_y, box_x + check_x + 5, list_height);
199 194
200 print_buttons(dialog, height, width, 0); 195 print_buttons(dialog, height, width, 0);
@@ -203,13 +198,14 @@ int dialog_checklist(const char *title, const char *prompt, int height,
203 wnoutrefresh(list); 198 wnoutrefresh(list);
204 doupdate(); 199 doupdate();
205 200
206 while (key != ESC) { 201 while (key != KEY_ESC) {
207 key = wgetch(dialog); 202 key = wgetch(dialog);
208 203
209 for (i = 0; i < max_choice; i++) 204 for (i = 0; i < max_choice; i++) {
210 if (toupper(key) == 205 item_set(i + scroll);
211 toupper(items[(scroll + i) * 3 + 1][0])) 206 if (toupper(key) == toupper(item_str()[0]))
212 break; 207 break;
208 }
213 209
214 if (i < max_choice || key == KEY_UP || key == KEY_DOWN || 210 if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
215 key == '+' || key == '-') { 211 key == '+' || key == '-') {
@@ -220,15 +216,16 @@ int dialog_checklist(const char *title, const char *prompt, int height,
220 /* Scroll list down */ 216 /* Scroll list down */
221 if (list_height > 1) { 217 if (list_height > 1) {
222 /* De-highlight current first item */ 218 /* De-highlight current first item */
223 print_item(list, items[scroll * 3 + 1], 219 item_set(scroll);
224 status[scroll], 0, FALSE); 220 print_item(list, 0, FALSE);
225 scrollok(list, TRUE); 221 scrollok(list, TRUE);
226 wscrl(list, -1); 222 wscrl(list, -1);
227 scrollok(list, FALSE); 223 scrollok(list, FALSE);
228 } 224 }
229 scroll--; 225 scroll--;
230 print_item(list, items[scroll * 3 + 1], status[scroll], 0, TRUE); 226 item_set(scroll);
231 print_arrows(dialog, choice, item_no, 227 print_item(list, 0, TRUE);
228 print_arrows(dialog, choice, item_count(),
232 scroll, box_y, box_x + check_x + 5, list_height); 229 scroll, box_y, box_x + check_x + 5, list_height);
233 230
234 wnoutrefresh(dialog); 231 wnoutrefresh(dialog);
@@ -239,23 +236,24 @@ int dialog_checklist(const char *title, const char *prompt, int height,
239 i = choice - 1; 236 i = choice - 1;
240 } else if (key == KEY_DOWN || key == '+') { 237 } else if (key == KEY_DOWN || key == '+') {
241 if (choice == max_choice - 1) { 238 if (choice == max_choice - 1) {
242 if (scroll + choice >= item_no - 1) 239 if (scroll + choice >= item_count() - 1)
243 continue; 240 continue;
244 /* Scroll list up */ 241 /* Scroll list up */
245 if (list_height > 1) { 242 if (list_height > 1) {
246 /* De-highlight current last item before scrolling up */ 243 /* De-highlight current last item before scrolling up */
247 print_item(list, items[(scroll + max_choice - 1) * 3 + 1], 244 item_set(scroll + max_choice - 1);
248 status[scroll + max_choice - 1], 245 print_item(list,
249 max_choice - 1, FALSE); 246 max_choice - 1,
247 FALSE);
250 scrollok(list, TRUE); 248 scrollok(list, TRUE);
251 wscrl(list, 1); 249 wscrl(list, 1);
252 scrollok(list, FALSE); 250 scrollok(list, FALSE);
253 } 251 }
254 scroll++; 252 scroll++;
255 print_item(list, items[(scroll + max_choice - 1) * 3 + 1], 253 item_set(scroll + max_choice - 1);
256 status[scroll + max_choice - 1], max_choice - 1, TRUE); 254 print_item(list, max_choice - 1, TRUE);
257 255
258 print_arrows(dialog, choice, item_no, 256 print_arrows(dialog, choice, item_count(),
259 scroll, box_y, box_x + check_x + 5, list_height); 257 scroll, box_y, box_x + check_x + 5, list_height);
260 258
261 wnoutrefresh(dialog); 259 wnoutrefresh(dialog);
@@ -267,12 +265,12 @@ int dialog_checklist(const char *title, const char *prompt, int height,
267 } 265 }
268 if (i != choice) { 266 if (i != choice) {
269 /* De-highlight current item */ 267 /* De-highlight current item */
270 print_item(list, items[(scroll + choice) * 3 + 1], 268 item_set(scroll + choice);
271 status[scroll + choice], choice, FALSE); 269 print_item(list, choice, FALSE);
272 /* Highlight new item */ 270 /* Highlight new item */
273 choice = i; 271 choice = i;
274 print_item(list, items[(scroll + choice) * 3 + 1], 272 item_set(scroll + choice);
275 status[scroll + choice], choice, TRUE); 273 print_item(list, choice, TRUE);
276 wnoutrefresh(dialog); 274 wnoutrefresh(dialog);
277 wrefresh(list); 275 wrefresh(list);
278 } 276 }
@@ -282,10 +280,19 @@ int dialog_checklist(const char *title, const char *prompt, int height,
282 case 'H': 280 case 'H':
283 case 'h': 281 case 'h':
284 case '?': 282 case '?':
285 fprintf(stderr, "%s", items[(scroll + choice) * 3]); 283 button = 1;
284 /* fall-through */
285 case 'S':
286 case 's':
287 case ' ':
288 case '\n':
289 item_foreach()
290 item_set_selected(0);
291 item_set(scroll + choice);
292 item_set_selected(1);
293 delwin(list);
286 delwin(dialog); 294 delwin(dialog);
287 free(status); 295 return button;
288 return 1;
289 case TAB: 296 case TAB:
290 case KEY_LEFT: 297 case KEY_LEFT:
291 case KEY_RIGHT: 298 case KEY_RIGHT:
@@ -295,42 +302,24 @@ int dialog_checklist(const char *title, const char *prompt, int height,
295 print_buttons(dialog, height, width, button); 302 print_buttons(dialog, height, width, button);
296 wrefresh(dialog); 303 wrefresh(dialog);
297 break; 304 break;
298 case 'S':
299 case 's':
300 case ' ':
301 case '\n':
302 if (!button) {
303 if (!status[scroll + choice]) {
304 for (i = 0; i < item_no; i++)
305 status[i] = 0;
306 status[scroll + choice] = 1;
307 for (i = 0; i < max_choice; i++)
308 print_item(list, items[(scroll + i) * 3 + 1],
309 status[scroll + i], i, i == choice);
310 }
311 wnoutrefresh(dialog);
312 wrefresh(list);
313
314 for (i = 0; i < item_no; i++)
315 if (status[i])
316 fprintf(stderr, "%s", items[i * 3]);
317 } else
318 fprintf(stderr, "%s", items[(scroll + choice) * 3]);
319 delwin(dialog);
320 free(status);
321 return button;
322 case 'X': 305 case 'X':
323 case 'x': 306 case 'x':
324 key = ESC; 307 key = KEY_ESC;
325 case ESC: 308 break;
309 case KEY_ESC:
310 key = on_key_esc(dialog);
326 break; 311 break;
312 case KEY_RESIZE:
313 delwin(list);
314 delwin(dialog);
315 on_key_resize();
316 goto do_resize;
327 } 317 }
328 318
329 /* Now, update everything... */ 319 /* Now, update everything... */
330 doupdate(); 320 doupdate();
331 } 321 }
332 322 delwin(list);
333 delwin(dialog); 323 delwin(dialog);
334 free(status); 324 return key; /* ESC pressed */
335 return -1; /* ESC pressed */
336} 325}
diff --git a/scripts/kconfig/lxdialog/colors.h b/scripts/kconfig/lxdialog/colors.h
deleted file mode 100644
index db071df12bbb..000000000000
--- a/scripts/kconfig/lxdialog/colors.h
+++ /dev/null
@@ -1,154 +0,0 @@
1/*
2 * colors.h -- color attribute definitions
3 *
4 * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21/*
22 * Default color definitions
23 *
24 * *_FG = foreground
25 * *_BG = background
26 * *_HL = highlight?
27 */
28#define SCREEN_FG COLOR_CYAN
29#define SCREEN_BG COLOR_BLUE
30#define SCREEN_HL TRUE
31
32#define SHADOW_FG COLOR_BLACK
33#define SHADOW_BG COLOR_BLACK
34#define SHADOW_HL TRUE
35
36#define DIALOG_FG COLOR_BLACK
37#define DIALOG_BG COLOR_WHITE
38#define DIALOG_HL FALSE
39
40#define TITLE_FG COLOR_YELLOW
41#define TITLE_BG COLOR_WHITE
42#define TITLE_HL TRUE
43
44#define BORDER_FG COLOR_WHITE
45#define BORDER_BG COLOR_WHITE
46#define BORDER_HL TRUE
47
48#define BUTTON_ACTIVE_FG COLOR_WHITE
49#define BUTTON_ACTIVE_BG COLOR_BLUE
50#define BUTTON_ACTIVE_HL TRUE
51
52#define BUTTON_INACTIVE_FG COLOR_BLACK
53#define BUTTON_INACTIVE_BG COLOR_WHITE
54#define BUTTON_INACTIVE_HL FALSE
55
56#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
57#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
58#define BUTTON_KEY_ACTIVE_HL TRUE
59
60#define BUTTON_KEY_INACTIVE_FG COLOR_RED
61#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
62#define BUTTON_KEY_INACTIVE_HL FALSE
63
64#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
65#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
66#define BUTTON_LABEL_ACTIVE_HL TRUE
67
68#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
69#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
70#define BUTTON_LABEL_INACTIVE_HL TRUE
71
72#define INPUTBOX_FG COLOR_BLACK
73#define INPUTBOX_BG COLOR_WHITE
74#define INPUTBOX_HL FALSE
75
76#define INPUTBOX_BORDER_FG COLOR_BLACK
77#define INPUTBOX_BORDER_BG COLOR_WHITE
78#define INPUTBOX_BORDER_HL FALSE
79
80#define SEARCHBOX_FG COLOR_BLACK
81#define SEARCHBOX_BG COLOR_WHITE
82#define SEARCHBOX_HL FALSE
83
84#define SEARCHBOX_TITLE_FG COLOR_YELLOW
85#define SEARCHBOX_TITLE_BG COLOR_WHITE
86#define SEARCHBOX_TITLE_HL TRUE
87
88#define SEARCHBOX_BORDER_FG COLOR_WHITE
89#define SEARCHBOX_BORDER_BG COLOR_WHITE
90#define SEARCHBOX_BORDER_HL TRUE
91
92#define POSITION_INDICATOR_FG COLOR_YELLOW
93#define POSITION_INDICATOR_BG COLOR_WHITE
94#define POSITION_INDICATOR_HL TRUE
95
96#define MENUBOX_FG COLOR_BLACK
97#define MENUBOX_BG COLOR_WHITE
98#define MENUBOX_HL FALSE
99
100#define MENUBOX_BORDER_FG COLOR_WHITE
101#define MENUBOX_BORDER_BG COLOR_WHITE
102#define MENUBOX_BORDER_HL TRUE
103
104#define ITEM_FG COLOR_BLACK
105#define ITEM_BG COLOR_WHITE
106#define ITEM_HL FALSE
107
108#define ITEM_SELECTED_FG COLOR_WHITE
109#define ITEM_SELECTED_BG COLOR_BLUE
110#define ITEM_SELECTED_HL TRUE
111
112#define TAG_FG COLOR_YELLOW
113#define TAG_BG COLOR_WHITE
114#define TAG_HL TRUE
115
116#define TAG_SELECTED_FG COLOR_YELLOW
117#define TAG_SELECTED_BG COLOR_BLUE
118#define TAG_SELECTED_HL TRUE
119
120#define TAG_KEY_FG COLOR_YELLOW
121#define TAG_KEY_BG COLOR_WHITE
122#define TAG_KEY_HL TRUE
123
124#define TAG_KEY_SELECTED_FG COLOR_YELLOW
125#define TAG_KEY_SELECTED_BG COLOR_BLUE
126#define TAG_KEY_SELECTED_HL TRUE
127
128#define CHECK_FG COLOR_BLACK
129#define CHECK_BG COLOR_WHITE
130#define CHECK_HL FALSE
131
132#define CHECK_SELECTED_FG COLOR_WHITE
133#define CHECK_SELECTED_BG COLOR_BLUE
134#define CHECK_SELECTED_HL TRUE
135
136#define UARROW_FG COLOR_GREEN
137#define UARROW_BG COLOR_WHITE
138#define UARROW_HL TRUE
139
140#define DARROW_FG COLOR_GREEN
141#define DARROW_BG COLOR_WHITE
142#define DARROW_HL TRUE
143
144/* End of default color definitions */
145
146#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
147#define COLOR_NAME_LEN 10
148#define COLOR_COUNT 8
149
150/*
151 * Global variables
152 */
153
154extern int color_table[][3];
diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h
index af3cf716e215..8dea47f9d3e4 100644
--- a/scripts/kconfig/lxdialog/dialog.h
+++ b/scripts/kconfig/lxdialog/dialog.h
@@ -48,7 +48,7 @@
48 48
49#define TR(params) _tracef params 49#define TR(params) _tracef params
50 50
51#define ESC 27 51#define KEY_ESC 27
52#define TAB 9 52#define TAB 9
53#define MAX_LEN 2048 53#define MAX_LEN 2048
54#define BUF_SIZE (10*1024) 54#define BUF_SIZE (10*1024)
@@ -86,63 +86,111 @@
86#define ACS_DARROW 'v' 86#define ACS_DARROW 'v'
87#endif 87#endif
88 88
89/* error return codes */
90#define ERRDISPLAYTOOSMALL (KEY_MAX + 1)
91
89/* 92/*
90 * Attribute names 93 * Color definitions
91 */ 94 */
92#define screen_attr attributes[0] 95struct dialog_color {
93#define shadow_attr attributes[1] 96 chtype atr; /* Color attribute */
94#define dialog_attr attributes[2] 97 int fg; /* foreground */
95#define title_attr attributes[3] 98 int bg; /* background */
96#define border_attr attributes[4] 99 int hl; /* highlight this item */
97#define button_active_attr attributes[5] 100};
98#define button_inactive_attr attributes[6] 101
99#define button_key_active_attr attributes[7] 102struct dialog_info {
100#define button_key_inactive_attr attributes[8] 103 const char *backtitle;
101#define button_label_active_attr attributes[9] 104 struct dialog_color screen;
102#define button_label_inactive_attr attributes[10] 105 struct dialog_color shadow;
103#define inputbox_attr attributes[11] 106 struct dialog_color dialog;
104#define inputbox_border_attr attributes[12] 107 struct dialog_color title;
105#define searchbox_attr attributes[13] 108 struct dialog_color border;
106#define searchbox_title_attr attributes[14] 109 struct dialog_color button_active;
107#define searchbox_border_attr attributes[15] 110 struct dialog_color button_inactive;
108#define position_indicator_attr attributes[16] 111 struct dialog_color button_key_active;
109#define menubox_attr attributes[17] 112 struct dialog_color button_key_inactive;
110#define menubox_border_attr attributes[18] 113 struct dialog_color button_label_active;
111#define item_attr attributes[19] 114 struct dialog_color button_label_inactive;
112#define item_selected_attr attributes[20] 115 struct dialog_color inputbox;
113#define tag_attr attributes[21] 116 struct dialog_color inputbox_border;
114#define tag_selected_attr attributes[22] 117 struct dialog_color searchbox;
115#define tag_key_attr attributes[23] 118 struct dialog_color searchbox_title;
116#define tag_key_selected_attr attributes[24] 119 struct dialog_color searchbox_border;
117#define check_attr attributes[25] 120 struct dialog_color position_indicator;
118#define check_selected_attr attributes[26] 121 struct dialog_color menubox;
119#define uarrow_attr attributes[27] 122 struct dialog_color menubox_border;
120#define darrow_attr attributes[28] 123 struct dialog_color item;
121 124 struct dialog_color item_selected;
122/* number of attributes */ 125 struct dialog_color tag;
123#define ATTRIBUTE_COUNT 29 126 struct dialog_color tag_selected;
127 struct dialog_color tag_key;
128 struct dialog_color tag_key_selected;
129 struct dialog_color check;
130 struct dialog_color check_selected;
131 struct dialog_color uarrow;
132 struct dialog_color darrow;
133};
124 134
125/* 135/*
126 * Global variables 136 * Global variables
127 */ 137 */
128extern bool use_colors; 138extern struct dialog_info dlg;
129extern bool use_shadow; 139extern char dialog_input_result[];
130
131extern chtype attributes[];
132
133extern const char *backtitle;
134 140
135/* 141/*
136 * Function prototypes 142 * Function prototypes
137 */ 143 */
138extern void create_rc(const char *filename);
139extern int parse_rc(void);
140 144
141void init_dialog(void); 145/* item list as used by checklist and menubox */
146void item_reset(void);
147void item_make(const char *fmt, ...);
148void item_add_str(const char *fmt, ...);
149void item_set_tag(char tag);
150void item_set_data(void *p);
151void item_set_selected(int val);
152int item_activate_selected(void);
153void *item_data(void);
154char item_tag(void);
155
156/* item list manipulation for lxdialog use */
157#define MAXITEMSTR 200
158struct dialog_item {
159 char str[MAXITEMSTR]; /* promtp displayed */
160 char tag;
161 void *data; /* pointer to menu item - used by menubox+checklist */
162 int selected; /* Set to 1 by dialog_*() function if selected. */
163};
164
165/* list of lialog_items */
166struct dialog_list {
167 struct dialog_item node;
168 struct dialog_list *next;
169};
170
171extern struct dialog_list *item_cur;
172extern struct dialog_list item_nil;
173extern struct dialog_list *item_head;
174
175int item_count(void);
176void item_set(int n);
177int item_n(void);
178const char *item_str(void);
179int item_is_selected(void);
180int item_is_tag(char tag);
181#define item_foreach() \
182 for (item_cur = item_head ? item_head: item_cur; \
183 item_cur && (item_cur != &item_nil); item_cur = item_cur->next)
184
185/* generic key handlers */
186int on_key_esc(WINDOW *win);
187int on_key_resize(void);
188
189void init_dialog(const char *backtitle);
190void reset_dialog(void);
142void end_dialog(void); 191void end_dialog(void);
143void attr_clear(WINDOW * win, int height, int width, chtype attr); 192void attr_clear(WINDOW * win, int height, int width, chtype attr);
144void dialog_clear(void); 193void dialog_clear(void);
145void color_setup(void);
146void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); 194void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
147void print_button(WINDOW * win, const char *label, int y, int x, int selected); 195void print_button(WINDOW * win, const char *label, int y, int x, int selected);
148void print_title(WINDOW *dialog, const char *title, int width); 196void print_title(WINDOW *dialog, const char *title, int width);
@@ -155,12 +203,10 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width);
155int dialog_msgbox(const char *title, const char *prompt, int height, 203int dialog_msgbox(const char *title, const char *prompt, int height,
156 int width, int pause); 204 int width, int pause);
157int dialog_textbox(const char *title, const char *file, int height, int width); 205int dialog_textbox(const char *title, const char *file, int height, int width);
158int dialog_menu(const char *title, const char *prompt, int height, int width, 206int dialog_menu(const char *title, const char *prompt,
159 int menu_height, const char *choice, int item_no, 207 const void *selected, int *s_scroll);
160 const char *const *items);
161int dialog_checklist(const char *title, const char *prompt, int height, 208int dialog_checklist(const char *title, const char *prompt, int height,
162 int width, int list_height, int item_no, 209 int width, int list_height);
163 const char *const *items);
164extern char dialog_input_result[]; 210extern char dialog_input_result[];
165int dialog_inputbox(const char *title, const char *prompt, int height, 211int dialog_inputbox(const char *title, const char *prompt, int height,
166 int width, const char *init); 212 int width, const char *init);
diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c
index 779503726b0a..05e72066b359 100644
--- a/scripts/kconfig/lxdialog/inputbox.c
+++ b/scripts/kconfig/lxdialog/inputbox.c
@@ -49,6 +49,17 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
49 char *instr = dialog_input_result; 49 char *instr = dialog_input_result;
50 WINDOW *dialog; 50 WINDOW *dialog;
51 51
52 if (!init)
53 instr[0] = '\0';
54 else
55 strcpy(instr, init);
56
57do_resize:
58 if (getmaxy(stdscr) <= (height - 2))
59 return -ERRDISPLAYTOOSMALL;
60 if (getmaxx(stdscr) <= (width - 2))
61 return -ERRDISPLAYTOOSMALL;
62
52 /* center dialog box on screen */ 63 /* center dialog box on screen */
53 x = (COLS - width) / 2; 64 x = (COLS - width) / 2;
54 y = (LINES - height) / 2; 65 y = (LINES - height) / 2;
@@ -58,17 +69,18 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
58 dialog = newwin(height, width, y, x); 69 dialog = newwin(height, width, y, x);
59 keypad(dialog, TRUE); 70 keypad(dialog, TRUE);
60 71
61 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 72 draw_box(dialog, 0, 0, height, width,
62 wattrset(dialog, border_attr); 73 dlg.dialog.atr, dlg.border.atr);
74 wattrset(dialog, dlg.border.atr);
63 mvwaddch(dialog, height - 3, 0, ACS_LTEE); 75 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
64 for (i = 0; i < width - 2; i++) 76 for (i = 0; i < width - 2; i++)
65 waddch(dialog, ACS_HLINE); 77 waddch(dialog, ACS_HLINE);
66 wattrset(dialog, dialog_attr); 78 wattrset(dialog, dlg.dialog.atr);
67 waddch(dialog, ACS_RTEE); 79 waddch(dialog, ACS_RTEE);
68 80
69 print_title(dialog, title, width); 81 print_title(dialog, title, width);
70 82
71 wattrset(dialog, dialog_attr); 83 wattrset(dialog, dlg.dialog.atr);
72 print_autowrap(dialog, prompt, width - 2, 1, 3); 84 print_autowrap(dialog, prompt, width - 2, 1, 3);
73 85
74 /* Draw the input field box */ 86 /* Draw the input field box */
@@ -76,18 +88,14 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
76 getyx(dialog, y, x); 88 getyx(dialog, y, x);
77 box_y = y + 2; 89 box_y = y + 2;
78 box_x = (width - box_width) / 2; 90 box_x = (width - box_width) / 2;
79 draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr); 91 draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
92 dlg.border.atr, dlg.dialog.atr);
80 93
81 print_buttons(dialog, height, width, 0); 94 print_buttons(dialog, height, width, 0);
82 95
83 /* Set up the initial value */ 96 /* Set up the initial value */
84 wmove(dialog, box_y, box_x); 97 wmove(dialog, box_y, box_x);
85 wattrset(dialog, inputbox_attr); 98 wattrset(dialog, dlg.inputbox.atr);
86
87 if (!init)
88 instr[0] = '\0';
89 else
90 strcpy(instr, init);
91 99
92 input_x = strlen(instr); 100 input_x = strlen(instr);
93 101
@@ -104,7 +112,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
104 112
105 wrefresh(dialog); 113 wrefresh(dialog);
106 114
107 while (key != ESC) { 115 while (key != KEY_ESC) {
108 key = wgetch(dialog); 116 key = wgetch(dialog);
109 117
110 if (button == -1) { /* Input box selected */ 118 if (button == -1) { /* Input box selected */
@@ -120,7 +128,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
120 case KEY_BACKSPACE: 128 case KEY_BACKSPACE:
121 case 127: 129 case 127:
122 if (input_x || scroll) { 130 if (input_x || scroll) {
123 wattrset(dialog, inputbox_attr); 131 wattrset(dialog, dlg.inputbox.atr);
124 if (!input_x) { 132 if (!input_x) {
125 scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); 133 scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
126 wmove(dialog, box_y, box_x); 134 wmove(dialog, box_y, box_x);
@@ -140,7 +148,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
140 default: 148 default:
141 if (key < 0x100 && isprint(key)) { 149 if (key < 0x100 && isprint(key)) {
142 if (scroll + input_x < MAX_LEN) { 150 if (scroll + input_x < MAX_LEN) {
143 wattrset(dialog, inputbox_attr); 151 wattrset(dialog, dlg.inputbox.atr);
144 instr[scroll + input_x] = key; 152 instr[scroll + input_x] = key;
145 instr[scroll + input_x + 1] = '\0'; 153 instr[scroll + input_x + 1] = '\0';
146 if (input_x == box_width - 1) { 154 if (input_x == box_width - 1) {
@@ -213,12 +221,18 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
213 return (button == -1 ? 0 : button); 221 return (button == -1 ? 0 : button);
214 case 'X': 222 case 'X':
215 case 'x': 223 case 'x':
216 key = ESC; 224 key = KEY_ESC;
217 case ESC: 225 break;
226 case KEY_ESC:
227 key = on_key_esc(dialog);
218 break; 228 break;
229 case KEY_RESIZE:
230 delwin(dialog);
231 on_key_resize();
232 goto do_resize;
219 } 233 }
220 } 234 }
221 235
222 delwin(dialog); 236 delwin(dialog);
223 return -1; /* ESC pressed */ 237 return KEY_ESC; /* ESC pressed */
224} 238}
diff --git a/scripts/kconfig/lxdialog/lxdialog.c b/scripts/kconfig/lxdialog/lxdialog.c
deleted file mode 100644
index 79f6c5fb5cef..000000000000
--- a/scripts/kconfig/lxdialog/lxdialog.c
+++ /dev/null
@@ -1,204 +0,0 @@
1/*
2 * dialog - Display simple dialog boxes from shell scripts
3 *
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "dialog.h"
23
24static void Usage(const char *name);
25
26typedef int (jumperFn) (const char *title, int argc, const char *const *argv);
27
28struct Mode {
29 char *name;
30 int argmin, argmax, argmod;
31 jumperFn *jumper;
32};
33
34jumperFn j_menu, j_radiolist, j_yesno, j_textbox, j_inputbox;
35jumperFn j_msgbox, j_infobox;
36
37static struct Mode modes[] = {
38 {"--menu", 9, 0, 3, j_menu},
39 {"--radiolist", 9, 0, 3, j_radiolist},
40 {"--yesno", 5, 5, 1, j_yesno},
41 {"--textbox", 5, 5, 1, j_textbox},
42 {"--inputbox", 5, 6, 1, j_inputbox},
43 {"--msgbox", 5, 5, 1, j_msgbox},
44 {"--infobox", 5, 5, 1, j_infobox},
45 {NULL, 0, 0, 0, NULL}
46};
47
48static struct Mode *modePtr;
49
50#ifdef LOCALE
51#include <locale.h>
52#endif
53
54int main(int argc, const char *const *argv)
55{
56 int offset = 0, opt_clear = 0, end_common_opts = 0, retval;
57 const char *title = NULL;
58
59#ifdef LOCALE
60 (void)setlocale(LC_ALL, "");
61#endif
62
63#ifdef TRACE
64 trace(TRACE_CALLS | TRACE_UPDATE);
65#endif
66 if (argc < 2) {
67 Usage(argv[0]);
68 exit(-1);
69 }
70
71 while (offset < argc - 1 && !end_common_opts) { /* Common options */
72 if (!strcmp(argv[offset + 1], "--title")) {
73 if (argc - offset < 3 || title != NULL) {
74 Usage(argv[0]);
75 exit(-1);
76 } else {
77 title = argv[offset + 2];
78 offset += 2;
79 }
80 } else if (!strcmp(argv[offset + 1], "--backtitle")) {
81 if (backtitle != NULL) {
82 Usage(argv[0]);
83 exit(-1);
84 } else {
85 backtitle = argv[offset + 2];
86 offset += 2;
87 }
88 } else if (!strcmp(argv[offset + 1], "--clear")) {
89 if (opt_clear) { /* Hey, "--clear" can't appear twice! */
90 Usage(argv[0]);
91 exit(-1);
92 } else if (argc == 2) { /* we only want to clear the screen */
93 init_dialog();
94 refresh(); /* init_dialog() will clear the screen for us */
95 end_dialog();
96 return 0;
97 } else {
98 opt_clear = 1;
99 offset++;
100 }
101 } else /* no more common options */
102 end_common_opts = 1;
103 }
104
105 if (argc - 1 == offset) { /* no more options */
106 Usage(argv[0]);
107 exit(-1);
108 }
109 /* use a table to look for the requested mode, to avoid code duplication */
110
111 for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */
112 if (!strcmp(argv[offset + 1], modePtr->name))
113 break;
114
115 if (!modePtr->name)
116 Usage(argv[0]);
117 if (argc - offset < modePtr->argmin)
118 Usage(argv[0]);
119 if (modePtr->argmax && argc - offset > modePtr->argmax)
120 Usage(argv[0]);
121
122 init_dialog();
123 retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
124
125 if (opt_clear) { /* clear screen before exit */
126 attr_clear(stdscr, LINES, COLS, screen_attr);
127 refresh();
128 }
129 end_dialog();
130
131 exit(retval);
132}
133
134/*
135 * Print program usage
136 */
137static void Usage(const char *name)
138{
139 fprintf(stderr, "\
140\ndialog, by Savio Lam (lam836@cs.cuhk.hk).\
141\n patched by Stuart Herbert (S.Herbert@shef.ac.uk)\
142\n modified/gutted for use as a Linux kernel config tool by \
143\n William Roadcap (roadcapw@cfw.com)\
144\n\
145\n* Display dialog boxes from shell scripts *\
146\n\
147\nUsage: %s --clear\
148\n %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\
149\n\
150\nBox options:\
151\n\
152\n --menu <text> <height> <width> <menu height> <tag1> <item1>...\
153\n --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
154\n --textbox <file> <height> <width>\
155\n --inputbox <text> <height> <width> [<init>]\
156\n --yesno <text> <height> <width>\
157\n", name, name);
158 exit(-1);
159}
160
161/*
162 * These are the program jumpers
163 */
164
165int j_menu(const char *t, int ac, const char *const *av)
166{
167 return dialog_menu(t, av[2], atoi(av[3]), atoi(av[4]),
168 atoi(av[5]), av[6], (ac - 6) / 2, av + 7);
169}
170
171int j_radiolist(const char *t, int ac, const char *const *av)
172{
173 return dialog_checklist(t, av[2], atoi(av[3]), atoi(av[4]),
174 atoi(av[5]), (ac - 6) / 3, av + 6);
175}
176
177int j_textbox(const char *t, int ac, const char *const *av)
178{
179 return dialog_textbox(t, av[2], atoi(av[3]), atoi(av[4]));
180}
181
182int j_yesno(const char *t, int ac, const char *const *av)
183{
184 return dialog_yesno(t, av[2], atoi(av[3]), atoi(av[4]));
185}
186
187int j_inputbox(const char *t, int ac, const char *const *av)
188{
189 int ret = dialog_inputbox(t, av[2], atoi(av[3]), atoi(av[4]),
190 ac == 6 ? av[5] : (char *)NULL);
191 if (ret == 0)
192 fprintf(stderr, dialog_input_result);
193 return ret;
194}
195
196int j_msgbox(const char *t, int ac, const char *const *av)
197{
198 return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 1);
199}
200
201int j_infobox(const char *t, int ac, const char *const *av)
202{
203 return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 0);
204}
diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
index bf8052f4fd4a..0d83159d9012 100644
--- a/scripts/kconfig/lxdialog/menubox.c
+++ b/scripts/kconfig/lxdialog/menubox.c
@@ -63,19 +63,19 @@ static int menu_width, item_x;
63/* 63/*
64 * Print menu item 64 * Print menu item
65 */ 65 */
66static void do_print_item(WINDOW * win, const char *item, int choice, 66static void do_print_item(WINDOW * win, const char *item, int line_y,
67 int selected, int hotkey) 67 int selected, int hotkey)
68{ 68{
69 int j; 69 int j;
70 char *menu_item = malloc(menu_width + 1); 70 char *menu_item = malloc(menu_width + 1);
71 71
72 strncpy(menu_item, item, menu_width - item_x); 72 strncpy(menu_item, item, menu_width - item_x);
73 menu_item[menu_width] = 0; 73 menu_item[menu_width - item_x] = '\0';
74 j = first_alpha(menu_item, "YyNnMmHh"); 74 j = first_alpha(menu_item, "YyNnMmHh");
75 75
76 /* Clear 'residue' of last item */ 76 /* Clear 'residue' of last item */
77 wattrset(win, menubox_attr); 77 wattrset(win, dlg.menubox.atr);
78 wmove(win, choice, 0); 78 wmove(win, line_y, 0);
79#if OLD_NCURSES 79#if OLD_NCURSES
80 { 80 {
81 int i; 81 int i;
@@ -85,23 +85,24 @@ static void do_print_item(WINDOW * win, const char *item, int choice,
85#else 85#else
86 wclrtoeol(win); 86 wclrtoeol(win);
87#endif 87#endif
88 wattrset(win, selected ? item_selected_attr : item_attr); 88 wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
89 mvwaddstr(win, choice, item_x, menu_item); 89 mvwaddstr(win, line_y, item_x, menu_item);
90 if (hotkey) { 90 if (hotkey) {
91 wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); 91 wattrset(win, selected ? dlg.tag_key_selected.atr
92 mvwaddch(win, choice, item_x + j, menu_item[j]); 92 : dlg.tag_key.atr);
93 mvwaddch(win, line_y, item_x + j, menu_item[j]);
93 } 94 }
94 if (selected) { 95 if (selected) {
95 wmove(win, choice, item_x + 1); 96 wmove(win, line_y, item_x + 1);
96 } 97 }
97 free(menu_item); 98 free(menu_item);
98 wrefresh(win); 99 wrefresh(win);
99} 100}
100 101
101#define print_item(index, choice, selected) \ 102#define print_item(index, choice, selected) \
102do {\ 103do { \
103 int hotkey = (items[(index) * 2][0] != ':'); \ 104 item_set(index); \
104 do_print_item(menu, items[(index) * 2 + 1], choice, selected, hotkey); \ 105 do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \
105} while (0) 106} while (0)
106 107
107/* 108/*
@@ -117,11 +118,11 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
117 wmove(win, y, x); 118 wmove(win, y, x);
118 119
119 if (scroll > 0) { 120 if (scroll > 0) {
120 wattrset(win, uarrow_attr); 121 wattrset(win, dlg.uarrow.atr);
121 waddch(win, ACS_UARROW); 122 waddch(win, ACS_UARROW);
122 waddstr(win, "(-)"); 123 waddstr(win, "(-)");
123 } else { 124 } else {
124 wattrset(win, menubox_attr); 125 wattrset(win, dlg.menubox.atr);
125 waddch(win, ACS_HLINE); 126 waddch(win, ACS_HLINE);
126 waddch(win, ACS_HLINE); 127 waddch(win, ACS_HLINE);
127 waddch(win, ACS_HLINE); 128 waddch(win, ACS_HLINE);
@@ -133,11 +134,11 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
133 wrefresh(win); 134 wrefresh(win);
134 135
135 if ((height < item_no) && (scroll + height < item_no)) { 136 if ((height < item_no) && (scroll + height < item_no)) {
136 wattrset(win, darrow_attr); 137 wattrset(win, dlg.darrow.atr);
137 waddch(win, ACS_DARROW); 138 waddch(win, ACS_DARROW);
138 waddstr(win, "(+)"); 139 waddstr(win, "(+)");
139 } else { 140 } else {
140 wattrset(win, menubox_border_attr); 141 wattrset(win, dlg.menubox_border.atr);
141 waddch(win, ACS_HLINE); 142 waddch(win, ACS_HLINE);
142 waddch(win, ACS_HLINE); 143 waddch(win, ACS_HLINE);
143 waddch(win, ACS_HLINE); 144 waddch(win, ACS_HLINE);
@@ -178,17 +179,26 @@ static void do_scroll(WINDOW *win, int *scroll, int n)
178/* 179/*
179 * Display a menu for choosing among a number of options 180 * Display a menu for choosing among a number of options
180 */ 181 */
181int dialog_menu(const char *title, const char *prompt, int height, int width, 182int dialog_menu(const char *title, const char *prompt,
182 int menu_height, const char *current, int item_no, 183 const void *selected, int *s_scroll)
183 const char *const *items)
184{ 184{
185 int i, j, x, y, box_x, box_y; 185 int i, j, x, y, box_x, box_y;
186 int height, width, menu_height;
186 int key = 0, button = 0, scroll = 0, choice = 0; 187 int key = 0, button = 0, scroll = 0, choice = 0;
187 int first_item = 0, max_choice; 188 int first_item = 0, max_choice;
188 WINDOW *dialog, *menu; 189 WINDOW *dialog, *menu;
189 FILE *f;
190 190
191 max_choice = MIN(menu_height, item_no); 191do_resize:
192 height = getmaxy(stdscr);
193 width = getmaxx(stdscr);
194 if (height < 15 || width < 65)
195 return -ERRDISPLAYTOOSMALL;
196
197 height -= 4;
198 width -= 5;
199 menu_height = height - 10;
200
201 max_choice = MIN(menu_height, item_count());
192 202
193 /* center dialog box on screen */ 203 /* center dialog box on screen */
194 x = (COLS - width) / 2; 204 x = (COLS - width) / 2;
@@ -199,18 +209,19 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
199 dialog = newwin(height, width, y, x); 209 dialog = newwin(height, width, y, x);
200 keypad(dialog, TRUE); 210 keypad(dialog, TRUE);
201 211
202 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 212 draw_box(dialog, 0, 0, height, width,
203 wattrset(dialog, border_attr); 213 dlg.dialog.atr, dlg.border.atr);
214 wattrset(dialog, dlg.border.atr);
204 mvwaddch(dialog, height - 3, 0, ACS_LTEE); 215 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
205 for (i = 0; i < width - 2; i++) 216 for (i = 0; i < width - 2; i++)
206 waddch(dialog, ACS_HLINE); 217 waddch(dialog, ACS_HLINE);
207 wattrset(dialog, dialog_attr); 218 wattrset(dialog, dlg.dialog.atr);
208 wbkgdset(dialog, dialog_attr & A_COLOR); 219 wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
209 waddch(dialog, ACS_RTEE); 220 waddch(dialog, ACS_RTEE);
210 221
211 print_title(dialog, title, width); 222 print_title(dialog, title, width);
212 223
213 wattrset(dialog, dialog_attr); 224 wattrset(dialog, dlg.dialog.atr);
214 print_autowrap(dialog, prompt, width - 2, 1, 3); 225 print_autowrap(dialog, prompt, width - 2, 1, 3);
215 226
216 menu_width = width - 6; 227 menu_width = width - 6;
@@ -224,33 +235,29 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
224 235
225 /* draw a box around the menu items */ 236 /* draw a box around the menu items */
226 draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2, 237 draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
227 menubox_border_attr, menubox_attr); 238 dlg.menubox_border.atr, dlg.menubox.atr);
228 239
229 item_x = (menu_width - 70) / 2; 240 if (menu_width >= 80)
241 item_x = (menu_width - 70) / 2;
242 else
243 item_x = 4;
230 244
231 /* Set choice to default item */ 245 /* Set choice to default item */
232 for (i = 0; i < item_no; i++) 246 item_foreach()
233 if (strcmp(current, items[i * 2]) == 0) 247 if (selected && (selected == item_data()))
234 choice = i; 248 choice = item_n();
235 249 /* get the saved scroll info */
236 /* get the scroll info from the temp file */ 250 scroll = *s_scroll;
237 if ((f = fopen("lxdialog.scrltmp", "r")) != NULL) { 251 if ((scroll <= choice) && (scroll + max_choice > choice) &&
238 if ((fscanf(f, "%d\n", &scroll) == 1) && (scroll <= choice) && 252 (scroll >= 0) && (scroll + max_choice <= item_count())) {
239 (scroll + max_choice > choice) && (scroll >= 0) && 253 first_item = scroll;
240 (scroll + max_choice <= item_no)) { 254 choice = choice - scroll;
241 first_item = scroll; 255 } else {
242 choice = choice - scroll; 256 scroll = 0;
243 fclose(f);
244 } else {
245 scroll = 0;
246 remove("lxdialog.scrltmp");
247 fclose(f);
248 f = NULL;
249 }
250 } 257 }
251 if ((choice >= max_choice) || (f == NULL && choice >= max_choice / 2)) { 258 if ((choice >= max_choice)) {
252 if (choice >= item_no - max_choice / 2) 259 if (choice >= item_count() - max_choice / 2)
253 scroll = first_item = item_no - max_choice; 260 scroll = first_item = item_count() - max_choice;
254 else 261 else
255 scroll = first_item = choice - max_choice / 2; 262 scroll = first_item = choice - max_choice / 2;
256 choice = choice - scroll; 263 choice = choice - scroll;
@@ -263,14 +270,14 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
263 270
264 wnoutrefresh(menu); 271 wnoutrefresh(menu);
265 272
266 print_arrows(dialog, item_no, scroll, 273 print_arrows(dialog, item_count(), scroll,
267 box_y, box_x + item_x + 1, menu_height); 274 box_y, box_x + item_x + 1, menu_height);
268 275
269 print_buttons(dialog, height, width, 0); 276 print_buttons(dialog, height, width, 0);
270 wmove(menu, choice, item_x + 1); 277 wmove(menu, choice, item_x + 1);
271 wrefresh(menu); 278 wrefresh(menu);
272 279
273 while (key != ESC) { 280 while (key != KEY_ESC) {
274 key = wgetch(menu); 281 key = wgetch(menu);
275 282
276 if (key < 256 && isalpha(key)) 283 if (key < 256 && isalpha(key))
@@ -280,14 +287,16 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
280 i = max_choice; 287 i = max_choice;
281 else { 288 else {
282 for (i = choice + 1; i < max_choice; i++) { 289 for (i = choice + 1; i < max_choice; i++) {
283 j = first_alpha(items[(scroll + i) * 2 + 1], "YyNnMmHh"); 290 item_set(scroll + i);
284 if (key == tolower(items[(scroll + i) * 2 + 1][j])) 291 j = first_alpha(item_str(), "YyNnMmHh");
292 if (key == tolower(item_str()[j]))
285 break; 293 break;
286 } 294 }
287 if (i == max_choice) 295 if (i == max_choice)
288 for (i = 0; i < max_choice; i++) { 296 for (i = 0; i < max_choice; i++) {
289 j = first_alpha(items [(scroll + i) * 2 + 1], "YyNnMmHh"); 297 item_set(scroll + i);
290 if (key == tolower(items[(scroll + i) * 2 + 1][j])) 298 j = first_alpha(item_str(), "YyNnMmHh");
299 if (key == tolower(item_str()[j]))
291 break; 300 break;
292 } 301 }
293 } 302 }
@@ -312,7 +321,7 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
312 print_item(scroll+choice, choice, FALSE); 321 print_item(scroll+choice, choice, FALSE);
313 322
314 if ((choice > max_choice - 3) && 323 if ((choice > max_choice - 3) &&
315 (scroll + max_choice < item_no)) { 324 (scroll + max_choice < item_count())) {
316 /* Scroll menu up */ 325 /* Scroll menu up */
317 do_scroll(menu, &scroll, 1); 326 do_scroll(menu, &scroll, 1);
318 327
@@ -335,7 +344,7 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
335 344
336 } else if (key == KEY_NPAGE) { 345 } else if (key == KEY_NPAGE) {
337 for (i = 0; (i < max_choice); i++) { 346 for (i = 0; (i < max_choice); i++) {
338 if (scroll + max_choice < item_no) { 347 if (scroll + max_choice < item_count()) {
339 do_scroll(menu, &scroll, 1); 348 do_scroll(menu, &scroll, 1);
340 print_item(scroll+max_choice-1, 349 print_item(scroll+max_choice-1,
341 max_choice - 1, FALSE); 350 max_choice - 1, FALSE);
@@ -349,7 +358,7 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
349 358
350 print_item(scroll + choice, choice, TRUE); 359 print_item(scroll + choice, choice, TRUE);
351 360
352 print_arrows(dialog, item_no, scroll, 361 print_arrows(dialog, item_count(), scroll,
353 box_y, box_x + item_x + 1, menu_height); 362 box_y, box_x + item_x + 1, menu_height);
354 363
355 wnoutrefresh(dialog); 364 wnoutrefresh(dialog);
@@ -375,12 +384,11 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
375 case 'm': 384 case 'm':
376 case '/': 385 case '/':
377 /* save scroll info */ 386 /* save scroll info */
378 if ((f = fopen("lxdialog.scrltmp", "w")) != NULL) { 387 *s_scroll = scroll;
379 fprintf(f, "%d\n", scroll); 388 delwin(menu);
380 fclose(f);
381 }
382 delwin(dialog); 389 delwin(dialog);
383 fprintf(stderr, "%s\n", items[(scroll + choice) * 2]); 390 item_set(scroll + choice);
391 item_set_selected(1);
384 switch (key) { 392 switch (key) {
385 case 's': 393 case 's':
386 return 3; 394 return 3;
@@ -400,27 +408,27 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
400 case '?': 408 case '?':
401 button = 2; 409 button = 2;
402 case '\n': 410 case '\n':
411 *s_scroll = scroll;
412 delwin(menu);
403 delwin(dialog); 413 delwin(dialog);
404 if (button == 2) 414 item_set(scroll + choice);
405 fprintf(stderr, "%s \"%s\"\n", 415 item_set_selected(1);
406 items[(scroll + choice) * 2],
407 items[(scroll + choice) * 2 + 1] +
408 first_alpha(items [(scroll + choice) * 2 + 1], ""));
409 else
410 fprintf(stderr, "%s\n",
411 items[(scroll + choice) * 2]);
412
413 remove("lxdialog.scrltmp");
414 return button; 416 return button;
415 case 'e': 417 case 'e':
416 case 'x': 418 case 'x':
417 key = ESC; 419 key = KEY_ESC;
418 case ESC: 420 break;
421 case KEY_ESC:
422 key = on_key_esc(menu);
419 break; 423 break;
424 case KEY_RESIZE:
425 on_key_resize();
426 delwin(menu);
427 delwin(dialog);
428 goto do_resize;
420 } 429 }
421 } 430 }
422 431 delwin(menu);
423 delwin(dialog); 432 delwin(dialog);
424 remove("lxdialog.scrltmp"); 433 return key; /* ESC pressed */
425 return -1; /* ESC pressed */
426} 434}
diff --git a/scripts/kconfig/lxdialog/msgbox.c b/scripts/kconfig/lxdialog/msgbox.c
deleted file mode 100644
index 7323f5471f69..000000000000
--- a/scripts/kconfig/lxdialog/msgbox.c
+++ /dev/null
@@ -1,71 +0,0 @@
1/*
2 * msgbox.c -- implements the message box and info box
3 *
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "dialog.h"
23
24/*
25 * Display a message box. Program will pause and display an "OK" button
26 * if the parameter 'pause' is non-zero.
27 */
28int dialog_msgbox(const char *title, const char *prompt, int height, int width,
29 int pause)
30{
31 int i, x, y, key = 0;
32 WINDOW *dialog;
33
34 /* center dialog box on screen */
35 x = (COLS - width) / 2;
36 y = (LINES - height) / 2;
37
38 draw_shadow(stdscr, y, x, height, width);
39
40 dialog = newwin(height, width, y, x);
41 keypad(dialog, TRUE);
42
43 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
44
45 print_title(dialog, title, width);
46
47 wattrset(dialog, dialog_attr);
48 print_autowrap(dialog, prompt, width - 2, 1, 2);
49
50 if (pause) {
51 wattrset(dialog, border_attr);
52 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
53 for (i = 0; i < width - 2; i++)
54 waddch(dialog, ACS_HLINE);
55 wattrset(dialog, dialog_attr);
56 waddch(dialog, ACS_RTEE);
57
58 print_button(dialog, " Ok ", height - 2, width / 2 - 4, TRUE);
59
60 wrefresh(dialog);
61 while (key != ESC && key != '\n' && key != ' ' &&
62 key != 'O' && key != 'o' && key != 'X' && key != 'x')
63 key = wgetch(dialog);
64 } else {
65 key = '\n';
66 wrefresh(dialog);
67 }
68
69 delwin(dialog);
70 return key == ESC ? -1 : 0;
71}
diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c
index 77848bb8e07f..fabfc1ad789d 100644
--- a/scripts/kconfig/lxdialog/textbox.c
+++ b/scripts/kconfig/lxdialog/textbox.c
@@ -25,56 +25,62 @@ static void back_lines(int n);
25static void print_page(WINDOW * win, int height, int width); 25static void print_page(WINDOW * win, int height, int width);
26static void print_line(WINDOW * win, int row, int width); 26static void print_line(WINDOW * win, int row, int width);
27static char *get_line(void); 27static char *get_line(void);
28static void print_position(WINDOW * win, int height, int width); 28static void print_position(WINDOW * win);
29
30static int hscroll;
31static int begin_reached, end_reached, page_length;
32static const char *buf;
33static const char *page;
34
35/*
36 * refresh window content
37 */
38static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
39 int cur_y, int cur_x)
40{
41 print_page(box, boxh, boxw);
42 print_position(dialog);
43 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
44 wrefresh(dialog);
45}
29 46
30static int hscroll, fd, file_size, bytes_read;
31static int begin_reached = 1, end_reached, page_length;
32static char *buf, *page;
33 47
34/* 48/*
35 * Display text from a file in a dialog box. 49 * Display text from a file in a dialog box.
36 */ 50 */
37int dialog_textbox(const char *title, const char *file, int height, int width) 51int dialog_textbox(const char *title, const char *tbuf,
52 int initial_height, int initial_width)
38{ 53{
39 int i, x, y, cur_x, cur_y, fpos, key = 0; 54 int i, x, y, cur_x, cur_y, key = 0;
55 int height, width, boxh, boxw;
40 int passed_end; 56 int passed_end;
41 char search_term[MAX_LEN + 1]; 57 WINDOW *dialog, *box;
42 WINDOW *dialog, *text;
43
44 search_term[0] = '\0'; /* no search term entered yet */
45 58
46 /* Open input file for reading */ 59 begin_reached = 1;
47 if ((fd = open(file, O_RDONLY)) == -1) { 60 end_reached = 0;
48 endwin(); 61 page_length = 0;
49 fprintf(stderr, "\nCan't open input file in dialog_textbox().\n"); 62 hscroll = 0;
50 exit(-1); 63 buf = tbuf;
51 } 64 page = buf; /* page is pointer to start of page to be displayed */
52 /* Get file size. Actually, 'file_size' is the real file size - 1, 65
53 since it's only the last byte offset from the beginning */ 66do_resize:
54 if ((file_size = lseek(fd, 0, SEEK_END)) == -1) { 67 getmaxyx(stdscr, height, width);
55 endwin(); 68 if (height < 8 || width < 8)
56 fprintf(stderr, "\nError getting file size in dialog_textbox().\n"); 69 return -ERRDISPLAYTOOSMALL;
57 exit(-1); 70 if (initial_height != 0)
58 } 71 height = initial_height;
59 /* Restore file pointer to beginning of file after getting file size */ 72 else
60 if (lseek(fd, 0, SEEK_SET) == -1) { 73 if (height > 4)
61 endwin(); 74 height -= 4;
62 fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); 75 else
63 exit(-1); 76 height = 0;
64 } 77 if (initial_width != 0)
65 /* Allocate space for read buffer */ 78 width = initial_width;
66 if ((buf = malloc(BUF_SIZE + 1)) == NULL) { 79 else
67 endwin(); 80 if (width > 5)
68 fprintf(stderr, "\nCan't allocate memory in dialog_textbox().\n"); 81 width -= 5;
69 exit(-1); 82 else
70 } 83 width = 0;
71 if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
72 endwin();
73 fprintf(stderr, "\nError reading file in dialog_textbox().\n");
74 exit(-1);
75 }
76 buf[bytes_read] = '\0'; /* mark end of valid data */
77 page = buf; /* page is pointer to start of page to be displayed */
78 84
79 /* center dialog box on screen */ 85 /* center dialog box on screen */
80 x = (COLS - width) / 2; 86 x = (COLS - width) / 2;
@@ -85,22 +91,25 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
85 dialog = newwin(height, width, y, x); 91 dialog = newwin(height, width, y, x);
86 keypad(dialog, TRUE); 92 keypad(dialog, TRUE);
87 93
88 /* Create window for text region, used for scrolling text */ 94 /* Create window for box region, used for scrolling text */
89 text = subwin(dialog, height - 4, width - 2, y + 1, x + 1); 95 boxh = height - 4;
90 wattrset(text, dialog_attr); 96 boxw = width - 2;
91 wbkgdset(text, dialog_attr & A_COLOR); 97 box = subwin(dialog, boxh, boxw, y + 1, x + 1);
98 wattrset(box, dlg.dialog.atr);
99 wbkgdset(box, dlg.dialog.atr & A_COLOR);
92 100
93 keypad(text, TRUE); 101 keypad(box, TRUE);
94 102
95 /* register the new window, along with its borders */ 103 /* register the new window, along with its borders */
96 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 104 draw_box(dialog, 0, 0, height, width,
105 dlg.dialog.atr, dlg.border.atr);
97 106
98 wattrset(dialog, border_attr); 107 wattrset(dialog, dlg.border.atr);
99 mvwaddch(dialog, height - 3, 0, ACS_LTEE); 108 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
100 for (i = 0; i < width - 2; i++) 109 for (i = 0; i < width - 2; i++)
101 waddch(dialog, ACS_HLINE); 110 waddch(dialog, ACS_HLINE);
102 wattrset(dialog, dialog_attr); 111 wattrset(dialog, dlg.dialog.atr);
103 wbkgdset(dialog, dialog_attr & A_COLOR); 112 wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
104 waddch(dialog, ACS_RTEE); 113 waddch(dialog, ACS_RTEE);
105 114
106 print_title(dialog, title, width); 115 print_title(dialog, title, width);
@@ -110,85 +119,37 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
110 getyx(dialog, cur_y, cur_x); /* Save cursor position */ 119 getyx(dialog, cur_y, cur_x); /* Save cursor position */
111 120
112 /* Print first page of text */ 121 /* Print first page of text */
113 attr_clear(text, height - 4, width - 2, dialog_attr); 122 attr_clear(box, boxh, boxw, dlg.dialog.atr);
114 print_page(text, height - 4, width - 2); 123 refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
115 print_position(dialog, height, width);
116 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
117 wrefresh(dialog);
118 124
119 while ((key != ESC) && (key != '\n')) { 125 while ((key != KEY_ESC) && (key != '\n')) {
120 key = wgetch(dialog); 126 key = wgetch(dialog);
121 switch (key) { 127 switch (key) {
122 case 'E': /* Exit */ 128 case 'E': /* Exit */
123 case 'e': 129 case 'e':
124 case 'X': 130 case 'X':
125 case 'x': 131 case 'x':
132 delwin(box);
126 delwin(dialog); 133 delwin(dialog);
127 free(buf);
128 close(fd);
129 return 0; 134 return 0;
130 case 'g': /* First page */ 135 case 'g': /* First page */
131 case KEY_HOME: 136 case KEY_HOME:
132 if (!begin_reached) { 137 if (!begin_reached) {
133 begin_reached = 1; 138 begin_reached = 1;
134 /* First page not in buffer? */
135 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
136 endwin();
137 fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
138 exit(-1);
139 }
140 if (fpos > bytes_read) { /* Yes, we have to read it in */
141 if (lseek(fd, 0, SEEK_SET) == -1) {
142 endwin();
143 fprintf(stderr, "\nError moving file pointer in "
144 "dialog_textbox().\n");
145 exit(-1);
146 }
147 if ((bytes_read =
148 read(fd, buf, BUF_SIZE)) == -1) {
149 endwin();
150 fprintf(stderr, "\nError reading file in dialog_textbox().\n");
151 exit(-1);
152 }
153 buf[bytes_read] = '\0';
154 }
155 page = buf; 139 page = buf;
156 print_page(text, height - 4, width - 2); 140 refresh_text_box(dialog, box, boxh, boxw,
157 print_position(dialog, height, width); 141 cur_y, cur_x);
158 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
159 wrefresh(dialog);
160 } 142 }
161 break; 143 break;
162 case 'G': /* Last page */ 144 case 'G': /* Last page */
163 case KEY_END: 145 case KEY_END:
164 146
165 end_reached = 1; 147 end_reached = 1;
166 /* Last page not in buffer? */ 148 /* point to last char in buf */
167 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { 149 page = buf + strlen(buf);
168 endwin(); 150 back_lines(boxh);
169 fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); 151 refresh_text_box(dialog, box, boxh, boxw,
170 exit(-1); 152 cur_y, cur_x);
171 }
172 if (fpos < file_size) { /* Yes, we have to read it in */
173 if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) {
174 endwin();
175 fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
176 exit(-1);
177 }
178 if ((bytes_read =
179 read(fd, buf, BUF_SIZE)) == -1) {
180 endwin();
181 fprintf(stderr, "\nError reading file in dialog_textbox().\n");
182 exit(-1);
183 }
184 buf[bytes_read] = '\0';
185 }
186 page = buf + bytes_read;
187 back_lines(height - 4);
188 print_page(text, height - 4, width - 2);
189 print_position(dialog, height, width);
190 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
191 wrefresh(dialog);
192 break; 153 break;
193 case 'K': /* Previous line */ 154 case 'K': /* Previous line */
194 case 'k': 155 case 'k':
@@ -196,21 +157,23 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
196 if (!begin_reached) { 157 if (!begin_reached) {
197 back_lines(page_length + 1); 158 back_lines(page_length + 1);
198 159
199 /* We don't call print_page() here but use scrolling to ensure 160 /* We don't call print_page() here but use
200 faster screen update. However, 'end_reached' and 161 * scrolling to ensure faster screen update.
201 'page_length' should still be updated, and 'page' should 162 * However, 'end_reached' and 'page_length'
202 point to start of next page. This is done by calling 163 * should still be updated, and 'page' should
203 get_line() in the following 'for' loop. */ 164 * point to start of next page. This is done
204 scrollok(text, TRUE); 165 * by calling get_line() in the following
205 wscrl(text, -1); /* Scroll text region down one line */ 166 * 'for' loop. */
206 scrollok(text, FALSE); 167 scrollok(box, TRUE);
168 wscrl(box, -1); /* Scroll box region down one line */
169 scrollok(box, FALSE);
207 page_length = 0; 170 page_length = 0;
208 passed_end = 0; 171 passed_end = 0;
209 for (i = 0; i < height - 4; i++) { 172 for (i = 0; i < boxh; i++) {
210 if (!i) { 173 if (!i) {
211 /* print first line of page */ 174 /* print first line of page */
212 print_line(text, 0, width - 2); 175 print_line(box, 0, boxw);
213 wnoutrefresh(text); 176 wnoutrefresh(box);
214 } else 177 } else
215 /* Called to update 'end_reached' and 'page' */ 178 /* Called to update 'end_reached' and 'page' */
216 get_line(); 179 get_line();
@@ -220,7 +183,7 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
220 passed_end = 1; 183 passed_end = 1;
221 } 184 }
222 185
223 print_position(dialog, height, width); 186 print_position(dialog);
224 wmove(dialog, cur_y, cur_x); /* Restore cursor position */ 187 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
225 wrefresh(dialog); 188 wrefresh(dialog);
226 } 189 }
@@ -230,23 +193,21 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
230 case KEY_PPAGE: 193 case KEY_PPAGE:
231 if (begin_reached) 194 if (begin_reached)
232 break; 195 break;
233 back_lines(page_length + height - 4); 196 back_lines(page_length + boxh);
234 print_page(text, height - 4, width - 2); 197 refresh_text_box(dialog, box, boxh, boxw,
235 print_position(dialog, height, width); 198 cur_y, cur_x);
236 wmove(dialog, cur_y, cur_x);
237 wrefresh(dialog);
238 break; 199 break;
239 case 'J': /* Next line */ 200 case 'J': /* Next line */
240 case 'j': 201 case 'j':
241 case KEY_DOWN: 202 case KEY_DOWN:
242 if (!end_reached) { 203 if (!end_reached) {
243 begin_reached = 0; 204 begin_reached = 0;
244 scrollok(text, TRUE); 205 scrollok(box, TRUE);
245 scroll(text); /* Scroll text region up one line */ 206 scroll(box); /* Scroll box region up one line */
246 scrollok(text, FALSE); 207 scrollok(box, FALSE);
247 print_line(text, height - 5, width - 2); 208 print_line(box, boxh - 1, boxw);
248 wnoutrefresh(text); 209 wnoutrefresh(box);
249 print_position(dialog, height, width); 210 print_position(dialog);
250 wmove(dialog, cur_y, cur_x); /* Restore cursor position */ 211 wmove(dialog, cur_y, cur_x); /* Restore cursor position */
251 wrefresh(dialog); 212 wrefresh(dialog);
252 } 213 }
@@ -257,10 +218,8 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
257 break; 218 break;
258 219
259 begin_reached = 0; 220 begin_reached = 0;
260 print_page(text, height - 4, width - 2); 221 refresh_text_box(dialog, box, boxh, boxw,
261 print_position(dialog, height, width); 222 cur_y, cur_x);
262 wmove(dialog, cur_y, cur_x);
263 wrefresh(dialog);
264 break; 223 break;
265 case '0': /* Beginning of line */ 224 case '0': /* Beginning of line */
266 case 'H': /* Scroll left */ 225 case 'H': /* Scroll left */
@@ -275,9 +234,8 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
275 hscroll--; 234 hscroll--;
276 /* Reprint current page to scroll horizontally */ 235 /* Reprint current page to scroll horizontally */
277 back_lines(page_length); 236 back_lines(page_length);
278 print_page(text, height - 4, width - 2); 237 refresh_text_box(dialog, box, boxh, boxw,
279 wmove(dialog, cur_y, cur_x); 238 cur_y, cur_x);
280 wrefresh(dialog);
281 break; 239 break;
282 case 'L': /* Scroll right */ 240 case 'L': /* Scroll right */
283 case 'l': 241 case 'l':
@@ -287,131 +245,56 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
287 hscroll++; 245 hscroll++;
288 /* Reprint current page to scroll horizontally */ 246 /* Reprint current page to scroll horizontally */
289 back_lines(page_length); 247 back_lines(page_length);
290 print_page(text, height - 4, width - 2); 248 refresh_text_box(dialog, box, boxh, boxw,
291 wmove(dialog, cur_y, cur_x); 249 cur_y, cur_x);
292 wrefresh(dialog);
293 break; 250 break;
294 case ESC: 251 case KEY_ESC:
252 key = on_key_esc(dialog);
295 break; 253 break;
254 case KEY_RESIZE:
255 back_lines(height);
256 delwin(box);
257 delwin(dialog);
258 on_key_resize();
259 goto do_resize;
296 } 260 }
297 } 261 }
298 262 delwin(box);
299 delwin(dialog); 263 delwin(dialog);
300 free(buf); 264 return key; /* ESC pressed */
301 close(fd);
302 return -1; /* ESC pressed */
303} 265}
304 266
305/* 267/*
306 * Go back 'n' lines in text file. Called by dialog_textbox(). 268 * Go back 'n' lines in text. Called by dialog_textbox().
307 * 'page' will be updated to point to the desired line in 'buf'. 269 * 'page' will be updated to point to the desired line in 'buf'.
308 */ 270 */
309static void back_lines(int n) 271static void back_lines(int n)
310{ 272{
311 int i, fpos; 273 int i;
312 274
313 begin_reached = 0; 275 begin_reached = 0;
314 /* We have to distinguish between end_reached and !end_reached 276 /* Go back 'n' lines */
315 since at end of file, the line is not ended by a '\n'. 277 for (i = 0; i < n; i++) {
316 The code inside 'if' basically does a '--page' to move one 278 if (*page == '\0') {
317 character backward so as to skip '\n' of the previous line */ 279 if (end_reached) {
318 if (!end_reached) { 280 end_reached = 0;
319 /* Either beginning of buffer or beginning of file reached? */ 281 continue;
320 if (page == buf) {
321 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
322 endwin();
323 fprintf(stderr, "\nError moving file pointer in "
324 "back_lines().\n");
325 exit(-1);
326 }
327 if (fpos > bytes_read) { /* Not beginning of file yet */
328 /* We've reached beginning of buffer, but not beginning of
329 file yet, so read previous part of file into buffer.
330 Note that we only move backward for BUF_SIZE/2 bytes,
331 but not BUF_SIZE bytes to avoid re-reading again in
332 print_page() later */
333 /* Really possible to move backward BUF_SIZE/2 bytes? */
334 if (fpos < BUF_SIZE / 2 + bytes_read) {
335 /* No, move less then */
336 if (lseek(fd, 0, SEEK_SET) == -1) {
337 endwin();
338 fprintf(stderr, "\nError moving file pointer in "
339 "back_lines().\n");
340 exit(-1);
341 }
342 page = buf + fpos - bytes_read;
343 } else { /* Move backward BUF_SIZE/2 bytes */
344 if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) == -1) {
345 endwin();
346 fprintf(stderr, "\nError moving file pointer "
347 "in back_lines().\n");
348 exit(-1);
349 }
350 page = buf + BUF_SIZE / 2;
351 }
352 if ((bytes_read =
353 read(fd, buf, BUF_SIZE)) == -1) {
354 endwin();
355 fprintf(stderr, "\nError reading file in back_lines().\n");
356 exit(-1);
357 }
358 buf[bytes_read] = '\0';
359 } else { /* Beginning of file reached */
360 begin_reached = 1;
361 return;
362 } 282 }
363 } 283 }
364 if (*(--page) != '\n') { /* '--page' here */ 284 if (page == buf) {
365 /* Something's wrong... */ 285 begin_reached = 1;
366 endwin(); 286 return;
367 fprintf(stderr, "\nInternal error in back_lines().\n");
368 exit(-1);
369 } 287 }
370 } 288 page--;
371 /* Go back 'n' lines */
372 for (i = 0; i < n; i++)
373 do { 289 do {
374 if (page == buf) { 290 if (page == buf) {
375 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { 291 begin_reached = 1;
376 endwin(); 292 return;
377 fprintf(stderr, "\nError moving file pointer in back_lines().\n");
378 exit(-1);
379 }
380 if (fpos > bytes_read) {
381 /* Really possible to move backward BUF_SIZE/2 bytes? */
382 if (fpos < BUF_SIZE / 2 + bytes_read) {
383 /* No, move less then */
384 if (lseek(fd, 0, SEEK_SET) == -1) {
385 endwin();
386 fprintf(stderr, "\nError moving file pointer "
387 "in back_lines().\n");
388 exit(-1);
389 }
390 page = buf + fpos - bytes_read;
391 } else { /* Move backward BUF_SIZE/2 bytes */
392 if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) == -1) {
393 endwin();
394 fprintf(stderr, "\nError moving file pointer"
395 " in back_lines().\n");
396 exit(-1);
397 }
398 page = buf + BUF_SIZE / 2;
399 }
400 if ((bytes_read =
401 read(fd, buf, BUF_SIZE)) == -1) {
402 endwin();
403 fprintf(stderr, "\nError reading file in "
404 "back_lines().\n");
405 exit(-1);
406 }
407 buf[bytes_read] = '\0';
408 } else { /* Beginning of file reached */
409 begin_reached = 1;
410 return;
411 }
412 } 293 }
413 } while (*(--page) != '\n'); 294 page--;
414 page++; 295 } while (*page != '\n');
296 page++;
297 }
415} 298}
416 299
417/* 300/*
@@ -466,33 +349,14 @@ static void print_line(WINDOW * win, int row, int width)
466 */ 349 */
467static char *get_line(void) 350static char *get_line(void)
468{ 351{
469 int i = 0, fpos; 352 int i = 0;
470 static char line[MAX_LEN + 1]; 353 static char line[MAX_LEN + 1];
471 354
472 end_reached = 0; 355 end_reached = 0;
473 while (*page != '\n') { 356 while (*page != '\n') {
474 if (*page == '\0') { 357 if (*page == '\0') {
475 /* Either end of file or end of buffer reached */ 358 if (!end_reached) {
476 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { 359 end_reached = 1;
477 endwin();
478 fprintf(stderr, "\nError moving file pointer in "
479 "get_line().\n");
480 exit(-1);
481 }
482 if (fpos < file_size) { /* Not end of file yet */
483 /* We've reached end of buffer, but not end of file yet,
484 so read next part of file into buffer */
485 if ((bytes_read =
486 read(fd, buf, BUF_SIZE)) == -1) {
487 endwin();
488 fprintf(stderr, "\nError reading file in get_line().\n");
489 exit(-1);
490 }
491 buf[bytes_read] = '\0';
492 page = buf;
493 } else {
494 if (!end_reached)
495 end_reached = 1;
496 break; 360 break;
497 } 361 }
498 } else if (i < MAX_LEN) 362 } else if (i < MAX_LEN)
@@ -515,19 +379,13 @@ static char *get_line(void)
515/* 379/*
516 * Print current position 380 * Print current position
517 */ 381 */
518static void print_position(WINDOW * win, int height, int width) 382static void print_position(WINDOW * win)
519{ 383{
520 int fpos, percent; 384 int percent;
521 385
522 if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { 386 wattrset(win, dlg.position_indicator.atr);
523 endwin(); 387 wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
524 fprintf(stderr, "\nError moving file pointer in print_position().\n"); 388 percent = (page - buf) * 100 / strlen(buf);
525 exit(-1); 389 wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
526 }
527 wattrset(win, position_indicator_attr);
528 wbkgdset(win, position_indicator_attr & A_COLOR);
529 percent = !file_size ?
530 100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
531 wmove(win, height - 3, width - 9);
532 wprintw(win, "(%3d%%)", percent); 390 wprintw(win, "(%3d%%)", percent);
533} 391}
diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c
index f82cebb9ff06..ebc781b493d7 100644
--- a/scripts/kconfig/lxdialog/util.c
+++ b/scripts/kconfig/lxdialog/util.c
@@ -21,85 +21,217 @@
21 21
22#include "dialog.h" 22#include "dialog.h"
23 23
24/* use colors by default? */ 24struct dialog_info dlg;
25bool use_colors = 1;
26 25
27const char *backtitle = NULL; 26static void set_mono_theme(void)
27{
28 dlg.screen.atr = A_NORMAL;
29 dlg.shadow.atr = A_NORMAL;
30 dlg.dialog.atr = A_NORMAL;
31 dlg.title.atr = A_BOLD;
32 dlg.border.atr = A_NORMAL;
33 dlg.button_active.atr = A_REVERSE;
34 dlg.button_inactive.atr = A_DIM;
35 dlg.button_key_active.atr = A_REVERSE;
36 dlg.button_key_inactive.atr = A_BOLD;
37 dlg.button_label_active.atr = A_REVERSE;
38 dlg.button_label_inactive.atr = A_NORMAL;
39 dlg.inputbox.atr = A_NORMAL;
40 dlg.inputbox_border.atr = A_NORMAL;
41 dlg.searchbox.atr = A_NORMAL;
42 dlg.searchbox_title.atr = A_BOLD;
43 dlg.searchbox_border.atr = A_NORMAL;
44 dlg.position_indicator.atr = A_BOLD;
45 dlg.menubox.atr = A_NORMAL;
46 dlg.menubox_border.atr = A_NORMAL;
47 dlg.item.atr = A_NORMAL;
48 dlg.item_selected.atr = A_REVERSE;
49 dlg.tag.atr = A_BOLD;
50 dlg.tag_selected.atr = A_REVERSE;
51 dlg.tag_key.atr = A_BOLD;
52 dlg.tag_key_selected.atr = A_REVERSE;
53 dlg.check.atr = A_BOLD;
54 dlg.check_selected.atr = A_REVERSE;
55 dlg.uarrow.atr = A_BOLD;
56 dlg.darrow.atr = A_BOLD;
57}
58
59#define DLG_COLOR(dialog, f, b, h) \
60do { \
61 dlg.dialog.fg = (f); \
62 dlg.dialog.bg = (b); \
63 dlg.dialog.hl = (h); \
64} while (0)
65
66static void set_classic_theme(void)
67{
68 DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true);
69 DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true);
70 DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false);
71 DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true);
72 DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true);
73 DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true);
74 DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false);
75 DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true);
76 DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false);
77 DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true);
78 DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true);
79 DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false);
80 DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false);
81 DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false);
82 DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true);
83 DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true);
84 DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true);
85 DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false);
86 DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true);
87 DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false);
88 DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true);
89 DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true);
90 DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true);
91 DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true);
92 DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true);
93 DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false);
94 DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true);
95 DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true);
96 DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true);
97}
98
99static void set_blackbg_theme(void)
100{
101 DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true);
102 DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false);
103 DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false);
104 DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false);
105 DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true);
106
107 DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false);
108 DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false);
109 DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true);
110 DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false);
111 DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false);
112 DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true);
113
114 DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false);
115 DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false);
116
117 DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false);
118 DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true);
119 DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true);
120
121 DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false);
122
123 DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false);
124 DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true);
125
126 DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false);
127 DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false);
128
129 DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false);
130 DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true);
131 DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false);
132 DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true);
133
134 DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false);
135 DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true);
136
137 DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false);
138 DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false);
139}
140
141static void set_bluetitle_theme(void)
142{
143 set_classic_theme();
144 DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true);
145 DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true);
146 DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true);
147 DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true);
148 DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true);
149 DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true);
150 DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true);
151
152}
28 153
29/* 154/*
30 * Attribute values, default is for mono display 155 * Select color theme
31 */ 156 */
32chtype attributes[] = { 157static int set_theme(const char *theme)
33 A_NORMAL, /* screen_attr */ 158{
34 A_NORMAL, /* shadow_attr */ 159 int use_color = 1;
35 A_NORMAL, /* dialog_attr */ 160 if (!theme)
36 A_BOLD, /* title_attr */ 161 set_bluetitle_theme();
37 A_NORMAL, /* border_attr */ 162 else if (strcmp(theme, "classic") == 0)
38 A_REVERSE, /* button_active_attr */ 163 set_classic_theme();
39 A_DIM, /* button_inactive_attr */ 164 else if (strcmp(theme, "bluetitle") == 0)
40 A_REVERSE, /* button_key_active_attr */ 165 set_bluetitle_theme();
41 A_BOLD, /* button_key_inactive_attr */ 166 else if (strcmp(theme, "blackbg") == 0)
42 A_REVERSE, /* button_label_active_attr */ 167 set_blackbg_theme();
43 A_NORMAL, /* button_label_inactive_attr */ 168 else if (strcmp(theme, "mono") == 0)
44 A_NORMAL, /* inputbox_attr */ 169 use_color = 0;
45 A_NORMAL, /* inputbox_border_attr */ 170
46 A_NORMAL, /* searchbox_attr */ 171 return use_color;
47 A_BOLD, /* searchbox_title_attr */ 172}
48 A_NORMAL, /* searchbox_border_attr */ 173
49 A_BOLD, /* position_indicator_attr */ 174static void init_one_color(struct dialog_color *color)
50 A_NORMAL, /* menubox_attr */ 175{
51 A_NORMAL, /* menubox_border_attr */ 176 static int pair = 0;
52 A_NORMAL, /* item_attr */ 177
53 A_REVERSE, /* item_selected_attr */ 178 pair++;
54 A_BOLD, /* tag_attr */ 179 init_pair(pair, color->fg, color->bg);
55 A_REVERSE, /* tag_selected_attr */ 180 if (color->hl)
56 A_BOLD, /* tag_key_attr */ 181 color->atr = A_BOLD | COLOR_PAIR(pair);
57 A_REVERSE, /* tag_key_selected_attr */ 182 else
58 A_BOLD, /* check_attr */ 183 color->atr = COLOR_PAIR(pair);
59 A_REVERSE, /* check_selected_attr */ 184}
60 A_BOLD, /* uarrow_attr */ 185
61 A_BOLD /* darrow_attr */ 186static void init_dialog_colors(void)
62}; 187{
63 188 init_one_color(&dlg.screen);
64#include "colors.h" 189 init_one_color(&dlg.shadow);
190 init_one_color(&dlg.dialog);
191 init_one_color(&dlg.title);
192 init_one_color(&dlg.border);
193 init_one_color(&dlg.button_active);
194 init_one_color(&dlg.button_inactive);
195 init_one_color(&dlg.button_key_active);
196 init_one_color(&dlg.button_key_inactive);
197 init_one_color(&dlg.button_label_active);
198 init_one_color(&dlg.button_label_inactive);
199 init_one_color(&dlg.inputbox);
200 init_one_color(&dlg.inputbox_border);
201 init_one_color(&dlg.searchbox);
202 init_one_color(&dlg.searchbox_title);
203 init_one_color(&dlg.searchbox_border);
204 init_one_color(&dlg.position_indicator);
205 init_one_color(&dlg.menubox);
206 init_one_color(&dlg.menubox_border);
207 init_one_color(&dlg.item);
208 init_one_color(&dlg.item_selected);
209 init_one_color(&dlg.tag);
210 init_one_color(&dlg.tag_selected);
211 init_one_color(&dlg.tag_key);
212 init_one_color(&dlg.tag_key_selected);
213 init_one_color(&dlg.check);
214 init_one_color(&dlg.check_selected);
215 init_one_color(&dlg.uarrow);
216 init_one_color(&dlg.darrow);
217}
65 218
66/* 219/*
67 * Table of color values 220 * Setup for color display
68 */ 221 */
69int color_table[][3] = { 222static void color_setup(const char *theme)
70 {SCREEN_FG, SCREEN_BG, SCREEN_HL}, 223{
71 {SHADOW_FG, SHADOW_BG, SHADOW_HL}, 224 if (set_theme(theme)) {
72 {DIALOG_FG, DIALOG_BG, DIALOG_HL}, 225 if (has_colors()) { /* Terminal supports color? */
73 {TITLE_FG, TITLE_BG, TITLE_HL}, 226 start_color();
74 {BORDER_FG, BORDER_BG, BORDER_HL}, 227 init_dialog_colors();
75 {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL}, 228 }
76 {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL}, 229 }
77 {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL}, 230 else
78 {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, 231 {
79 BUTTON_KEY_INACTIVE_HL}, 232 set_mono_theme();
80 {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, 233 }
81 BUTTON_LABEL_ACTIVE_HL}, 234}
82 {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
83 BUTTON_LABEL_INACTIVE_HL},
84 {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
85 {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
86 {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
87 {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
88 {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
89 {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
90 {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
91 {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
92 {ITEM_FG, ITEM_BG, ITEM_HL},
93 {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
94 {TAG_FG, TAG_BG, TAG_HL},
95 {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
96 {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
97 {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
98 {CHECK_FG, CHECK_BG, CHECK_HL},
99 {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
100 {UARROW_FG, UARROW_BG, UARROW_HL},
101 {DARROW_FG, DARROW_BG, DARROW_HL},
102}; /* color_table */
103 235
104/* 236/*
105 * Set window to attribute 'attr' 237 * Set window to attribute 'attr'
@@ -119,13 +251,13 @@ void attr_clear(WINDOW * win, int height, int width, chtype attr)
119 251
120void dialog_clear(void) 252void dialog_clear(void)
121{ 253{
122 attr_clear(stdscr, LINES, COLS, screen_attr); 254 attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
123 /* Display background title if it exists ... - SLH */ 255 /* Display background title if it exists ... - SLH */
124 if (backtitle != NULL) { 256 if (dlg.backtitle != NULL) {
125 int i; 257 int i;
126 258
127 wattrset(stdscr, screen_attr); 259 wattrset(stdscr, dlg.screen.atr);
128 mvwaddstr(stdscr, 0, 1, (char *)backtitle); 260 mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
129 wmove(stdscr, 1, 1); 261 wmove(stdscr, 1, 1);
130 for (i = 1; i < COLS - 1; i++) 262 for (i = 1; i < COLS - 1; i++)
131 waddch(stdscr, ACS_HLINE); 263 waddch(stdscr, ACS_HLINE);
@@ -136,40 +268,22 @@ void dialog_clear(void)
136/* 268/*
137 * Do some initialization for dialog 269 * Do some initialization for dialog
138 */ 270 */
139void init_dialog(void) 271void init_dialog(const char *backtitle)
272{
273 dlg.backtitle = backtitle;
274 color_setup(getenv("MENUCONFIG_COLOR"));
275}
276
277void reset_dialog(void)
140{ 278{
141 initscr(); /* Init curses */ 279 initscr(); /* Init curses */
142 keypad(stdscr, TRUE); 280 keypad(stdscr, TRUE);
143 cbreak(); 281 cbreak();
144 noecho(); 282 noecho();
145
146 if (use_colors) /* Set up colors */
147 color_setup();
148
149 dialog_clear(); 283 dialog_clear();
150} 284}
151 285
152/* 286/*
153 * Setup for color display
154 */
155void color_setup(void)
156{
157 int i;
158
159 if (has_colors()) { /* Terminal supports color? */
160 start_color();
161
162 /* Initialize color pairs */
163 for (i = 0; i < ATTRIBUTE_COUNT; i++)
164 init_pair(i + 1, color_table[i][0], color_table[i][1]);
165
166 /* Setup color attributes */
167 for (i = 0; i < ATTRIBUTE_COUNT; i++)
168 attributes[i] = C_ATTR(color_table[i][2], i + 1);
169 }
170}
171
172/*
173 * End using dialog functions. 287 * End using dialog functions.
174 */ 288 */
175void end_dialog(void) 289void end_dialog(void)
@@ -184,7 +298,7 @@ void print_title(WINDOW *dialog, const char *title, int width)
184{ 298{
185 if (title) { 299 if (title) {
186 int tlen = MIN(width - 2, strlen(title)); 300 int tlen = MIN(width - 2, strlen(title));
187 wattrset(dialog, title_attr); 301 wattrset(dialog, dlg.title.atr);
188 mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); 302 mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
189 mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); 303 mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
190 waddch(dialog, ' '); 304 waddch(dialog, ' ');
@@ -264,21 +378,23 @@ void print_button(WINDOW * win, const char *label, int y, int x, int selected)
264 int i, temp; 378 int i, temp;
265 379
266 wmove(win, y, x); 380 wmove(win, y, x);
267 wattrset(win, selected ? button_active_attr : button_inactive_attr); 381 wattrset(win, selected ? dlg.button_active.atr
382 : dlg.button_inactive.atr);
268 waddstr(win, "<"); 383 waddstr(win, "<");
269 temp = strspn(label, " "); 384 temp = strspn(label, " ");
270 label += temp; 385 label += temp;
271 wattrset(win, selected ? button_label_active_attr 386 wattrset(win, selected ? dlg.button_label_active.atr
272 : button_label_inactive_attr); 387 : dlg.button_label_inactive.atr);
273 for (i = 0; i < temp; i++) 388 for (i = 0; i < temp; i++)
274 waddch(win, ' '); 389 waddch(win, ' ');
275 wattrset(win, selected ? button_key_active_attr 390 wattrset(win, selected ? dlg.button_key_active.atr
276 : button_key_inactive_attr); 391 : dlg.button_key_inactive.atr);
277 waddch(win, label[0]); 392 waddch(win, label[0]);
278 wattrset(win, selected ? button_label_active_attr 393 wattrset(win, selected ? dlg.button_label_active.atr
279 : button_label_inactive_attr); 394 : dlg.button_label_inactive.atr);
280 waddstr(win, (char *)label + 1); 395 waddstr(win, (char *)label + 1);
281 wattrset(win, selected ? button_active_attr : button_inactive_attr); 396 wattrset(win, selected ? dlg.button_active.atr
397 : dlg.button_inactive.atr);
282 waddstr(win, ">"); 398 waddstr(win, ">");
283 wmove(win, y, x + temp + 1); 399 wmove(win, y, x + temp + 1);
284} 400}
@@ -326,7 +442,7 @@ void draw_shadow(WINDOW * win, int y, int x, int height, int width)
326 int i; 442 int i;
327 443
328 if (has_colors()) { /* Whether terminal supports color? */ 444 if (has_colors()) { /* Whether terminal supports color? */
329 wattrset(win, shadow_attr); 445 wattrset(win, dlg.shadow.atr);
330 wmove(win, y + height, x + 2); 446 wmove(win, y + height, x + 2);
331 for (i = 0; i < width; i++) 447 for (i = 0; i < width; i++)
332 waddch(win, winch(win) & A_CHARTEXT); 448 waddch(win, winch(win) & A_CHARTEXT);
@@ -360,3 +476,167 @@ int first_alpha(const char *string, const char *exempt)
360 476
361 return 0; 477 return 0;
362} 478}
479
480/*
481 * ncurses uses ESC to detect escaped char sequences. This resutl in
482 * a small timeout before ESC is actually delivered to the application.
483 * lxdialog suggest <ESC> <ESC> which is correctly translated to two
484 * times esc. But then we need to ignore the second esc to avoid stepping
485 * out one menu too much. Filter away all escaped key sequences since
486 * keypad(FALSE) turn off ncurses support for escape sequences - and thats
487 * needed to make notimeout() do as expected.
488 */
489int on_key_esc(WINDOW *win)
490{
491 int key;
492 int key2;
493 int key3;
494
495 nodelay(win, TRUE);
496 keypad(win, FALSE);
497 key = wgetch(win);
498 key2 = wgetch(win);
499 do {
500 key3 = wgetch(win);
501 } while (key3 != ERR);
502 nodelay(win, FALSE);
503 keypad(win, TRUE);
504 if (key == KEY_ESC && key2 == ERR)
505 return KEY_ESC;
506 else if (key != ERR && key != KEY_ESC && key2 == ERR)
507 ungetch(key);
508
509 return -1;
510}
511
512/* redraw screen in new size */
513int on_key_resize(void)
514{
515 dialog_clear();
516 return KEY_RESIZE;
517}
518
519struct dialog_list *item_cur;
520struct dialog_list item_nil;
521struct dialog_list *item_head;
522
523void item_reset(void)
524{
525 struct dialog_list *p, *next;
526
527 for (p = item_head; p; p = next) {
528 next = p->next;
529 free(p);
530 }
531 item_head = NULL;
532 item_cur = &item_nil;
533}
534
535void item_make(const char *fmt, ...)
536{
537 va_list ap;
538 struct dialog_list *p = malloc(sizeof(*p));
539
540 if (item_head)
541 item_cur->next = p;
542 else
543 item_head = p;
544 item_cur = p;
545 memset(p, 0, sizeof(*p));
546
547 va_start(ap, fmt);
548 vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
549 va_end(ap);
550}
551
552void item_add_str(const char *fmt, ...)
553{
554 va_list ap;
555 size_t avail;
556
557 avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
558
559 va_start(ap, fmt);
560 vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
561 avail, fmt, ap);
562 item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
563 va_end(ap);
564}
565
566void item_set_tag(char tag)
567{
568 item_cur->node.tag = tag;
569}
570void item_set_data(void *ptr)
571{
572 item_cur->node.data = ptr;
573}
574
575void item_set_selected(int val)
576{
577 item_cur->node.selected = val;
578}
579
580int item_activate_selected(void)
581{
582 item_foreach()
583 if (item_is_selected())
584 return 1;
585 return 0;
586}
587
588void *item_data(void)
589{
590 return item_cur->node.data;
591}
592
593char item_tag(void)
594{
595 return item_cur->node.tag;
596}
597
598int item_count(void)
599{
600 int n = 0;
601 struct dialog_list *p;
602
603 for (p = item_head; p; p = p->next)
604 n++;
605 return n;
606}
607
608void item_set(int n)
609{
610 int i = 0;
611 item_foreach()
612 if (i++ == n)
613 return;
614}
615
616int item_n(void)
617{
618 int n = 0;
619 struct dialog_list *p;
620
621 for (p = item_head; p; p = p->next) {
622 if (p == item_cur)
623 return n;
624 n++;
625 }
626 return 0;
627}
628
629const char *item_str(void)
630{
631 return item_cur->node.str;
632}
633
634int item_is_selected(void)
635{
636 return (item_cur->node.selected != 0);
637}
638
639int item_is_tag(char tag)
640{
641 return (item_cur->node.tag == tag);
642}
diff --git a/scripts/kconfig/lxdialog/yesno.c b/scripts/kconfig/lxdialog/yesno.c
index cb2568aae3ed..ee0a04e3e012 100644
--- a/scripts/kconfig/lxdialog/yesno.c
+++ b/scripts/kconfig/lxdialog/yesno.c
@@ -44,6 +44,12 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width)
44 int i, x, y, key = 0, button = 0; 44 int i, x, y, key = 0, button = 0;
45 WINDOW *dialog; 45 WINDOW *dialog;
46 46
47do_resize:
48 if (getmaxy(stdscr) < (height + 4))
49 return -ERRDISPLAYTOOSMALL;
50 if (getmaxx(stdscr) < (width + 4))
51 return -ERRDISPLAYTOOSMALL;
52
47 /* center dialog box on screen */ 53 /* center dialog box on screen */
48 x = (COLS - width) / 2; 54 x = (COLS - width) / 2;
49 y = (LINES - height) / 2; 55 y = (LINES - height) / 2;
@@ -53,22 +59,23 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width)
53 dialog = newwin(height, width, y, x); 59 dialog = newwin(height, width, y, x);
54 keypad(dialog, TRUE); 60 keypad(dialog, TRUE);
55 61
56 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 62 draw_box(dialog, 0, 0, height, width,
57 wattrset(dialog, border_attr); 63 dlg.dialog.atr, dlg.border.atr);
64 wattrset(dialog, dlg.border.atr);
58 mvwaddch(dialog, height - 3, 0, ACS_LTEE); 65 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
59 for (i = 0; i < width - 2; i++) 66 for (i = 0; i < width - 2; i++)
60 waddch(dialog, ACS_HLINE); 67 waddch(dialog, ACS_HLINE);
61 wattrset(dialog, dialog_attr); 68 wattrset(dialog, dlg.dialog.atr);
62 waddch(dialog, ACS_RTEE); 69 waddch(dialog, ACS_RTEE);
63 70
64 print_title(dialog, title, width); 71 print_title(dialog, title, width);
65 72
66 wattrset(dialog, dialog_attr); 73 wattrset(dialog, dlg.dialog.atr);
67 print_autowrap(dialog, prompt, width - 2, 1, 3); 74 print_autowrap(dialog, prompt, width - 2, 1, 3);
68 75
69 print_buttons(dialog, height, width, 0); 76 print_buttons(dialog, height, width, 0);
70 77
71 while (key != ESC) { 78 while (key != KEY_ESC) {
72 key = wgetch(dialog); 79 key = wgetch(dialog);
73 switch (key) { 80 switch (key) {
74 case 'Y': 81 case 'Y':
@@ -92,11 +99,16 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width)
92 case '\n': 99 case '\n':
93 delwin(dialog); 100 delwin(dialog);
94 return button; 101 return button;
95 case ESC: 102 case KEY_ESC:
103 key = on_key_esc(dialog);
96 break; 104 break;
105 case KEY_RESIZE:
106 delwin(dialog);
107 on_key_resize();
108 goto do_resize;
97 } 109 }
98 } 110 }
99 111
100 delwin(dialog); 112 delwin(dialog);
101 return -1; /* ESC pressed */ 113 return key; /* ESC pressed */
102} 114}
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 7f973195e79a..08a4c7af93ea 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -24,6 +24,7 @@
24 24
25#define LKC_DIRECT_LINK 25#define LKC_DIRECT_LINK
26#include "lkc.h" 26#include "lkc.h"
27#include "lxdialog/dialog.h"
27 28
28static char menu_backtitle[128]; 29static char menu_backtitle[128];
29static const char mconf_readme[] = N_( 30static const char mconf_readme[] = N_(
@@ -159,7 +160,21 @@ static const char mconf_readme[] = N_(
159"\n" 160"\n"
160"Note that this mode can eventually be a little more CPU expensive\n" 161"Note that this mode can eventually be a little more CPU expensive\n"
161"(especially with a larger number of unrolled categories) than the\n" 162"(especially with a larger number of unrolled categories) than the\n"
162"default mode.\n"), 163"default mode.\n"
164"\n"
165"Different color themes available\n"
166"--------------------------------\n"
167"It is possible to select different color themes using the variable\n"
168"MENUCONFIG_COLOR. To select a theme use:\n"
169"\n"
170"make MENUCONFIG_COLOR=<theme> menuconfig\n"
171"\n"
172"Available themes are\n"
173" mono => selects colors suitable for monochrome displays\n"
174" blackbg => selects a color scheme with black background\n"
175" classic => theme with blue background. The classic look\n"
176" bluetitle => a LCD friendly version of classic. (default)\n"
177"\n"),
163menu_instructions[] = N_( 178menu_instructions[] = N_(
164 "Arrow keys navigate the menu. " 179 "Arrow keys navigate the menu. "
165 "<Enter> selects submenus --->. " 180 "<Enter> selects submenus --->. "
@@ -256,16 +271,12 @@ search_help[] = N_(
256 " USB$ => find all CONFIG_ symbols ending with USB\n" 271 " USB$ => find all CONFIG_ symbols ending with USB\n"
257 "\n"); 272 "\n");
258 273
259static char buf[4096], *bufptr = buf;
260static char input_buf[4096];
261static char filename[PATH_MAX+1] = ".config"; 274static char filename[PATH_MAX+1] = ".config";
262static char *args[1024], **argptr = args;
263static int indent; 275static int indent;
264static struct termios ios_org; 276static struct termios ios_org;
265static int rows = 0, cols = 0; 277static int rows = 0, cols = 0;
266static struct menu *current_menu; 278static struct menu *current_menu;
267static int child_count; 279static int child_count;
268static int do_resize;
269static int single_menu_mode; 280static int single_menu_mode;
270 281
271static void conf(struct menu *menu); 282static void conf(struct menu *menu);
@@ -276,12 +287,6 @@ static void conf_save(void);
276static void show_textbox(const char *title, const char *text, int r, int c); 287static void show_textbox(const char *title, const char *text, int r, int c);
277static void show_helptext(const char *title, const char *text); 288static void show_helptext(const char *title, const char *text);
278static void show_help(struct menu *menu); 289static void show_help(struct menu *menu);
279static void show_file(const char *filename, const char *title, int r, int c);
280
281static void cprint_init(void);
282static int cprint1(const char *fmt, ...);
283static void cprint_done(void);
284static int cprint(const char *fmt, ...);
285 290
286static void init_wsize(void) 291static void init_wsize(void)
287{ 292{
@@ -318,54 +323,6 @@ static void init_wsize(void)
318 cols -= 5; 323 cols -= 5;
319} 324}
320 325
321static void cprint_init(void)
322{
323 bufptr = buf;
324 argptr = args;
325 memset(args, 0, sizeof(args));
326 indent = 0;
327 child_count = 0;
328 cprint("./scripts/kconfig/lxdialog/lxdialog");
329 cprint("--backtitle");
330 cprint(menu_backtitle);
331}
332
333static int cprint1(const char *fmt, ...)
334{
335 va_list ap;
336 int res;
337
338 if (!*argptr)
339 *argptr = bufptr;
340 va_start(ap, fmt);
341 res = vsprintf(bufptr, fmt, ap);
342 va_end(ap);
343 bufptr += res;
344
345 return res;
346}
347
348static void cprint_done(void)
349{
350 *bufptr++ = 0;
351 argptr++;
352}
353
354static int cprint(const char *fmt, ...)
355{
356 va_list ap;
357 int res;
358
359 *argptr++ = bufptr;
360 va_start(ap, fmt);
361 res = vsprintf(bufptr, fmt, ap);
362 va_end(ap);
363 bufptr += res;
364 *bufptr++ = 0;
365
366 return res;
367}
368
369static void get_prompt_str(struct gstr *r, struct property *prop) 326static void get_prompt_str(struct gstr *r, struct property *prop)
370{ 327{
371 int i, j; 328 int i, j;
@@ -438,108 +395,17 @@ static struct gstr get_relations_str(struct symbol **sym_arr)
438 return res; 395 return res;
439} 396}
440 397
441pid_t pid;
442
443static void winch_handler(int sig)
444{
445 if (!do_resize) {
446 kill(pid, SIGINT);
447 do_resize = 1;
448 }
449}
450
451static int exec_conf(void)
452{
453 int pipefd[2], stat, size;
454 struct sigaction sa;
455 sigset_t sset, osset;
456
457 sigemptyset(&sset);
458 sigaddset(&sset, SIGINT);
459 sigprocmask(SIG_BLOCK, &sset, &osset);
460
461 signal(SIGINT, SIG_DFL);
462
463 sa.sa_handler = winch_handler;
464 sigemptyset(&sa.sa_mask);
465 sa.sa_flags = SA_RESTART;
466 sigaction(SIGWINCH, &sa, NULL);
467
468 *argptr++ = NULL;
469
470 pipe(pipefd);
471 pid = fork();
472 if (pid == 0) {
473 sigprocmask(SIG_SETMASK, &osset, NULL);
474 dup2(pipefd[1], 2);
475 close(pipefd[0]);
476 close(pipefd[1]);
477 execv(args[0], args);
478 _exit(EXIT_FAILURE);
479 }
480
481 close(pipefd[1]);
482 bufptr = input_buf;
483 while (1) {
484 size = input_buf + sizeof(input_buf) - bufptr;
485 size = read(pipefd[0], bufptr, size);
486 if (size <= 0) {
487 if (size < 0) {
488 if (errno == EINTR || errno == EAGAIN)
489 continue;
490 perror("read");
491 }
492 break;
493 }
494 bufptr += size;
495 }
496 *bufptr++ = 0;
497 close(pipefd[0]);
498 waitpid(pid, &stat, 0);
499
500 if (do_resize) {
501 init_wsize();
502 do_resize = 0;
503 sigprocmask(SIG_SETMASK, &osset, NULL);
504 return -1;
505 }
506 if (WIFSIGNALED(stat)) {
507 printf("\finterrupted(%d)\n", WTERMSIG(stat));
508 exit(1);
509 }
510#if 0
511 printf("\fexit state: %d\nexit data: '%s'\n", WEXITSTATUS(stat), input_buf);
512 sleep(1);
513#endif
514 sigpending(&sset);
515 if (sigismember(&sset, SIGINT)) {
516 printf("\finterrupted\n");
517 exit(1);
518 }
519 sigprocmask(SIG_SETMASK, &osset, NULL);
520
521 return WEXITSTATUS(stat);
522}
523
524static void search_conf(void) 398static void search_conf(void)
525{ 399{
526 struct symbol **sym_arr; 400 struct symbol **sym_arr;
527 int stat;
528 struct gstr res; 401 struct gstr res;
529 402 int dres;
530again: 403again:
531 cprint_init(); 404 dialog_clear();
532 cprint("--title"); 405 dres = dialog_inputbox(_("Search Configuration Parameter"),
533 cprint(_("Search Configuration Parameter")); 406 _("Enter CONFIG_ (sub)string to search for (omit CONFIG_)"),
534 cprint("--inputbox"); 407 10, 75, "");
535 cprint(_("Enter CONFIG_ (sub)string to search for (omit CONFIG_)")); 408 switch (dres) {
536 cprint("10");
537 cprint("75");
538 cprint("");
539 stat = exec_conf();
540 if (stat < 0)
541 goto again;
542 switch (stat) {
543 case 0: 409 case 0:
544 break; 410 break;
545 case 1: 411 case 1:
@@ -549,7 +415,7 @@ again:
549 return; 415 return;
550 } 416 }
551 417
552 sym_arr = sym_re_search(input_buf); 418 sym_arr = sym_re_search(dialog_input_result);
553 res = get_relations_str(sym_arr); 419 res = get_relations_str(sym_arr);
554 free(sym_arr); 420 free(sym_arr);
555 show_textbox(_("Search Results"), str_get(&res), 0, 0); 421 show_textbox(_("Search Results"), str_get(&res), 0, 0);
@@ -576,24 +442,24 @@ static void build_conf(struct menu *menu)
576 switch (prop->type) { 442 switch (prop->type) {
577 case P_MENU: 443 case P_MENU:
578 child_count++; 444 child_count++;
579 cprint("m%p", menu);
580
581 if (single_menu_mode) { 445 if (single_menu_mode) {
582 cprint1("%s%*c%s", 446 item_make("%s%*c%s",
583 menu->data ? "-->" : "++>", 447 menu->data ? "-->" : "++>",
584 indent + 1, ' ', prompt); 448 indent + 1, ' ', prompt);
585 } else 449 } else
586 cprint1(" %*c%s --->", indent + 1, ' ', prompt); 450 item_make(" %*c%s --->", indent + 1, ' ', prompt);
587 451
588 cprint_done(); 452 item_set_tag('m');
453 item_set_data(menu);
589 if (single_menu_mode && menu->data) 454 if (single_menu_mode && menu->data)
590 goto conf_childs; 455 goto conf_childs;
591 return; 456 return;
592 default: 457 default:
593 if (prompt) { 458 if (prompt) {
594 child_count++; 459 child_count++;
595 cprint(":%p", menu); 460 item_make("---%*c%s", indent + 1, ' ', prompt);
596 cprint("---%*c%s", indent + 1, ' ', prompt); 461 item_set_tag(':');
462 item_set_data(menu);
597 } 463 }
598 } 464 }
599 } else 465 } else
@@ -614,10 +480,9 @@ static void build_conf(struct menu *menu)
614 480
615 val = sym_get_tristate_value(sym); 481 val = sym_get_tristate_value(sym);
616 if (sym_is_changable(sym)) { 482 if (sym_is_changable(sym)) {
617 cprint("t%p", menu);
618 switch (type) { 483 switch (type) {
619 case S_BOOLEAN: 484 case S_BOOLEAN:
620 cprint1("[%c]", val == no ? ' ' : '*'); 485 item_make("[%c]", val == no ? ' ' : '*');
621 break; 486 break;
622 case S_TRISTATE: 487 case S_TRISTATE:
623 switch (val) { 488 switch (val) {
@@ -625,84 +490,87 @@ static void build_conf(struct menu *menu)
625 case mod: ch = 'M'; break; 490 case mod: ch = 'M'; break;
626 default: ch = ' '; break; 491 default: ch = ' '; break;
627 } 492 }
628 cprint1("<%c>", ch); 493 item_make("<%c>", ch);
629 break; 494 break;
630 } 495 }
496 item_set_tag('t');
497 item_set_data(menu);
631 } else { 498 } else {
632 cprint("%c%p", def_menu ? 't' : ':', menu); 499 item_make(" ");
633 cprint1(" "); 500 item_set_tag(def_menu ? 't' : ':');
501 item_set_data(menu);
634 } 502 }
635 503
636 cprint1("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); 504 item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
637 if (val == yes) { 505 if (val == yes) {
638 if (def_menu) { 506 if (def_menu) {
639 cprint1(" (%s)", menu_get_prompt(def_menu)); 507 item_add_str(" (%s)", menu_get_prompt(def_menu));
640 cprint1(" --->"); 508 item_add_str(" --->");
641 cprint_done();
642 if (def_menu->list) { 509 if (def_menu->list) {
643 indent += 2; 510 indent += 2;
644 build_conf(def_menu); 511 build_conf(def_menu);
645 indent -= 2; 512 indent -= 2;
646 } 513 }
647 } else 514 }
648 cprint_done();
649 return; 515 return;
650 } 516 }
651 cprint_done();
652 } else { 517 } else {
653 if (menu == current_menu) { 518 if (menu == current_menu) {
654 cprint(":%p", menu); 519 item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
655 cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu)); 520 item_set_tag(':');
521 item_set_data(menu);
656 goto conf_childs; 522 goto conf_childs;
657 } 523 }
658 child_count++; 524 child_count++;
659 val = sym_get_tristate_value(sym); 525 val = sym_get_tristate_value(sym);
660 if (sym_is_choice_value(sym) && val == yes) { 526 if (sym_is_choice_value(sym) && val == yes) {
661 cprint(":%p", menu); 527 item_make(" ");
662 cprint1(" "); 528 item_set_tag(':');
529 item_set_data(menu);
663 } else { 530 } else {
664 switch (type) { 531 switch (type) {
665 case S_BOOLEAN: 532 case S_BOOLEAN:
666 cprint("t%p", menu);
667 if (sym_is_changable(sym)) 533 if (sym_is_changable(sym))
668 cprint1("[%c]", val == no ? ' ' : '*'); 534 item_make("[%c]", val == no ? ' ' : '*');
669 else 535 else
670 cprint1("---"); 536 item_make("---");
537 item_set_tag('t');
538 item_set_data(menu);
671 break; 539 break;
672 case S_TRISTATE: 540 case S_TRISTATE:
673 cprint("t%p", menu);
674 switch (val) { 541 switch (val) {
675 case yes: ch = '*'; break; 542 case yes: ch = '*'; break;
676 case mod: ch = 'M'; break; 543 case mod: ch = 'M'; break;
677 default: ch = ' '; break; 544 default: ch = ' '; break;
678 } 545 }
679 if (sym_is_changable(sym)) 546 if (sym_is_changable(sym))
680 cprint1("<%c>", ch); 547 item_make("<%c>", ch);
681 else 548 else
682 cprint1("---"); 549 item_make("---");
550 item_set_tag('t');
551 item_set_data(menu);
683 break; 552 break;
684 default: 553 default:
685 cprint("s%p", menu); 554 tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
686 tmp = cprint1("(%s)", sym_get_string_value(sym)); 555 item_make("(%s)", sym_get_string_value(sym));
687 tmp = indent - tmp + 4; 556 tmp = indent - tmp + 4;
688 if (tmp < 0) 557 if (tmp < 0)
689 tmp = 0; 558 tmp = 0;
690 cprint1("%*c%s%s", tmp, ' ', menu_get_prompt(menu), 559 item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
691 (sym_has_value(sym) || !sym_is_changable(sym)) ? 560 (sym_has_value(sym) || !sym_is_changable(sym)) ?
692 "" : " (NEW)"); 561 "" : " (NEW)");
693 cprint_done(); 562 item_set_tag('s');
563 item_set_data(menu);
694 goto conf_childs; 564 goto conf_childs;
695 } 565 }
696 } 566 }
697 cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), 567 item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
698 (sym_has_value(sym) || !sym_is_changable(sym)) ? 568 (sym_has_value(sym) || !sym_is_changable(sym)) ?
699 "" : " (NEW)"); 569 "" : " (NEW)");
700 if (menu->prompt->type == P_MENU) { 570 if (menu->prompt->type == P_MENU) {
701 cprint1(" --->"); 571 item_add_str(" --->");
702 cprint_done();
703 return; 572 return;
704 } 573 }
705 cprint_done();
706 } 574 }
707 575
708conf_childs: 576conf_childs:
@@ -717,59 +585,45 @@ static void conf(struct menu *menu)
717 struct menu *submenu; 585 struct menu *submenu;
718 const char *prompt = menu_get_prompt(menu); 586 const char *prompt = menu_get_prompt(menu);
719 struct symbol *sym; 587 struct symbol *sym;
720 char active_entry[40]; 588 struct menu *active_menu = NULL;
721 int stat, type, i; 589 int res;
590 int s_scroll = 0;
722 591
723 unlink("lxdialog.scrltmp");
724 active_entry[0] = 0;
725 while (1) { 592 while (1) {
726 cprint_init(); 593 item_reset();
727 cprint("--title");
728 cprint("%s", prompt ? prompt : _("Main Menu"));
729 cprint("--menu");
730 cprint(_(menu_instructions));
731 cprint("%d", rows);
732 cprint("%d", cols);
733 cprint("%d", rows - 10);
734 cprint("%s", active_entry);
735 current_menu = menu; 594 current_menu = menu;
736 build_conf(menu); 595 build_conf(menu);
737 if (!child_count) 596 if (!child_count)
738 break; 597 break;
739 if (menu == &rootmenu) { 598 if (menu == &rootmenu) {
740 cprint(":"); 599 item_make("--- ");
741 cprint("--- "); 600 item_set_tag(':');
742 cprint("L"); 601 item_make(_(" Load an Alternate Configuration File"));
743 cprint(_(" Load an Alternate Configuration File")); 602 item_set_tag('L');
744 cprint("S"); 603 item_make(_(" Save an Alternate Configuration File"));
745 cprint(_(" Save Configuration to an Alternate File")); 604 item_set_tag('S');
746 } 605 }
747 stat = exec_conf(); 606 dialog_clear();
748 if (stat < 0) 607 res = dialog_menu(prompt ? prompt : _("Main Menu"),
749 continue; 608 _(menu_instructions),
750 609 active_menu, &s_scroll);
751 if (stat == 1 || stat == 255) 610 if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
752 break; 611 break;
753 612 if (!item_activate_selected())
754 type = input_buf[0]; 613 continue;
755 if (!type) 614 if (!item_tag())
756 continue; 615 continue;
757 616
758 for (i = 0; input_buf[i] && !isspace(input_buf[i]); i++) 617 submenu = item_data();
759 ; 618 active_menu = item_data();
760 if (i >= sizeof(active_entry)) 619 if (submenu)
761 i = sizeof(active_entry) - 1;
762 input_buf[i] = 0;
763 strcpy(active_entry, input_buf);
764
765 sym = NULL;
766 submenu = NULL;
767 if (sscanf(input_buf + 1, "%p", &submenu) == 1)
768 sym = submenu->sym; 620 sym = submenu->sym;
621 else
622 sym = NULL;
769 623
770 switch (stat) { 624 switch (res) {
771 case 0: 625 case 0:
772 switch (type) { 626 switch (item_tag()) {
773 case 'm': 627 case 'm':
774 if (single_menu_mode) 628 if (single_menu_mode)
775 submenu->data = (void *) (long) !submenu->data; 629 submenu->data = (void *) (long) !submenu->data;
@@ -800,7 +654,7 @@ static void conf(struct menu *menu)
800 show_helptext("README", _(mconf_readme)); 654 show_helptext("README", _(mconf_readme));
801 break; 655 break;
802 case 3: 656 case 3:
803 if (type == 't') { 657 if (item_is_tag('t')) {
804 if (sym_set_tristate_value(sym, yes)) 658 if (sym_set_tristate_value(sym, yes))
805 break; 659 break;
806 if (sym_set_tristate_value(sym, mod)) 660 if (sym_set_tristate_value(sym, mod))
@@ -808,17 +662,17 @@ static void conf(struct menu *menu)
808 } 662 }
809 break; 663 break;
810 case 4: 664 case 4:
811 if (type == 't') 665 if (item_is_tag('t'))
812 sym_set_tristate_value(sym, no); 666 sym_set_tristate_value(sym, no);
813 break; 667 break;
814 case 5: 668 case 5:
815 if (type == 't') 669 if (item_is_tag('t'))
816 sym_set_tristate_value(sym, mod); 670 sym_set_tristate_value(sym, mod);
817 break; 671 break;
818 case 6: 672 case 6:
819 if (type == 't') 673 if (item_is_tag('t'))
820 sym_toggle_tristate_value(sym); 674 sym_toggle_tristate_value(sym);
821 else if (type == 'm') 675 else if (item_is_tag('m'))
822 conf(submenu); 676 conf(submenu);
823 break; 677 break;
824 case 7: 678 case 7:
@@ -830,13 +684,8 @@ static void conf(struct menu *menu)
830 684
831static void show_textbox(const char *title, const char *text, int r, int c) 685static void show_textbox(const char *title, const char *text, int r, int c)
832{ 686{
833 int fd; 687 dialog_clear();
834 688 dialog_textbox(title, text, r, c);
835 fd = creat(".help.tmp", 0777);
836 write(fd, text, strlen(text));
837 close(fd);
838 show_file(".help.tmp", title, r, c);
839 unlink(".help.tmp");
840} 689}
841 690
842static void show_helptext(const char *title, const char *text) 691static void show_helptext(const char *title, const char *text)
@@ -864,68 +713,52 @@ static void show_help(struct menu *menu)
864 str_free(&help); 713 str_free(&help);
865} 714}
866 715
867static void show_file(const char *filename, const char *title, int r, int c)
868{
869 do {
870 cprint_init();
871 if (title) {
872 cprint("--title");
873 cprint("%s", title);
874 }
875 cprint("--textbox");
876 cprint("%s", filename);
877 cprint("%d", r ? r : rows);
878 cprint("%d", c ? c : cols);
879 } while (exec_conf() < 0);
880}
881
882static void conf_choice(struct menu *menu) 716static void conf_choice(struct menu *menu)
883{ 717{
884 const char *prompt = menu_get_prompt(menu); 718 const char *prompt = menu_get_prompt(menu);
885 struct menu *child; 719 struct menu *child;
886 struct symbol *active; 720 struct symbol *active;
887 int stat;
888 721
889 active = sym_get_choice_value(menu->sym); 722 active = sym_get_choice_value(menu->sym);
890 while (1) { 723 while (1) {
891 cprint_init(); 724 int res;
892 cprint("--title"); 725 int selected;
893 cprint("%s", prompt ? prompt : _("Main Menu")); 726 item_reset();
894 cprint("--radiolist");
895 cprint(_(radiolist_instructions));
896 cprint("15");
897 cprint("70");
898 cprint("6");
899 727
900 current_menu = menu; 728 current_menu = menu;
901 for (child = menu->list; child; child = child->next) { 729 for (child = menu->list; child; child = child->next) {
902 if (!menu_is_visible(child)) 730 if (!menu_is_visible(child))
903 continue; 731 continue;
904 cprint("%p", child); 732 item_make("%s", menu_get_prompt(child));
905 cprint("%s", menu_get_prompt(child)); 733 item_set_data(child);
734 if (child->sym == active)
735 item_set_selected(1);
906 if (child->sym == sym_get_choice_value(menu->sym)) 736 if (child->sym == sym_get_choice_value(menu->sym))
907 cprint("ON"); 737 item_set_tag('X');
908 else if (child->sym == active)
909 cprint("SELECTED");
910 else
911 cprint("OFF");
912 } 738 }
913 739 dialog_clear();
914 stat = exec_conf(); 740 res = dialog_checklist(prompt ? prompt : _("Main Menu"),
915 switch (stat) { 741 _(radiolist_instructions),
742 15, 70, 6);
743 selected = item_activate_selected();
744 switch (res) {
916 case 0: 745 case 0:
917 if (sscanf(input_buf, "%p", &child) != 1) 746 if (selected) {
918 break; 747 child = item_data();
919 sym_set_tristate_value(child->sym, yes); 748 sym_set_tristate_value(child->sym, yes);
749 }
920 return; 750 return;
921 case 1: 751 case 1:
922 if (sscanf(input_buf, "%p", &child) == 1) { 752 if (selected) {
753 child = item_data();
923 show_help(child); 754 show_help(child);
924 active = child->sym; 755 active = child->sym;
925 } else 756 } else
926 show_help(menu); 757 show_help(menu);
927 break; 758 break;
928 case 255: 759 case KEY_ESC:
760 return;
761 case -ERRDISPLAYTOOSMALL:
929 return; 762 return;
930 } 763 }
931 } 764 }
@@ -934,40 +767,38 @@ static void conf_choice(struct menu *menu)
934static void conf_string(struct menu *menu) 767static void conf_string(struct menu *menu)
935{ 768{
936 const char *prompt = menu_get_prompt(menu); 769 const char *prompt = menu_get_prompt(menu);
937 int stat;
938 770
939 while (1) { 771 while (1) {
940 cprint_init(); 772 int res;
941 cprint("--title"); 773 char *heading;
942 cprint("%s", prompt ? prompt : _("Main Menu")); 774
943 cprint("--inputbox");
944 switch (sym_get_type(menu->sym)) { 775 switch (sym_get_type(menu->sym)) {
945 case S_INT: 776 case S_INT:
946 cprint(_(inputbox_instructions_int)); 777 heading = _(inputbox_instructions_int);
947 break; 778 break;
948 case S_HEX: 779 case S_HEX:
949 cprint(_(inputbox_instructions_hex)); 780 heading = _(inputbox_instructions_hex);
950 break; 781 break;
951 case S_STRING: 782 case S_STRING:
952 cprint(_(inputbox_instructions_string)); 783 heading = _(inputbox_instructions_string);
953 break; 784 break;
954 default: 785 default:
955 /* panic? */; 786 heading = "Internal mconf error!";
956 } 787 }
957 cprint("10"); 788 dialog_clear();
958 cprint("75"); 789 res = dialog_inputbox(prompt ? prompt : _("Main Menu"),
959 cprint("%s", sym_get_string_value(menu->sym)); 790 heading, 10, 75,
960 stat = exec_conf(); 791 sym_get_string_value(menu->sym));
961 switch (stat) { 792 switch (res) {
962 case 0: 793 case 0:
963 if (sym_set_string_value(menu->sym, input_buf)) 794 if (sym_set_string_value(menu->sym, dialog_input_result))
964 return; 795 return;
965 show_textbox(NULL, _("You have made an invalid entry."), 5, 43); 796 show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
966 break; 797 break;
967 case 1: 798 case 1:
968 show_help(menu); 799 show_help(menu);
969 break; 800 break;
970 case 255: 801 case KEY_ESC:
971 return; 802 return;
972 } 803 }
973 } 804 }
@@ -975,28 +806,24 @@ static void conf_string(struct menu *menu)
975 806
976static void conf_load(void) 807static void conf_load(void)
977{ 808{
978 int stat;
979 809
980 while (1) { 810 while (1) {
981 cprint_init(); 811 int res;
982 cprint("--inputbox"); 812 dialog_clear();
983 cprint(load_config_text); 813 res = dialog_inputbox(NULL, load_config_text,
984 cprint("11"); 814 11, 55, filename);
985 cprint("55"); 815 switch(res) {
986 cprint("%s", filename);
987 stat = exec_conf();
988 switch(stat) {
989 case 0: 816 case 0:
990 if (!input_buf[0]) 817 if (!dialog_input_result[0])
991 return; 818 return;
992 if (!conf_read(input_buf)) 819 if (!conf_read(dialog_input_result))
993 return; 820 return;
994 show_textbox(NULL, _("File does not exist!"), 5, 38); 821 show_textbox(NULL, _("File does not exist!"), 5, 38);
995 break; 822 break;
996 case 1: 823 case 1:
997 show_helptext(_("Load Alternate Configuration"), load_config_help); 824 show_helptext(_("Load Alternate Configuration"), load_config_help);
998 break; 825 break;
999 case 255: 826 case KEY_ESC:
1000 return; 827 return;
1001 } 828 }
1002 } 829 }
@@ -1004,28 +831,23 @@ static void conf_load(void)
1004 831
1005static void conf_save(void) 832static void conf_save(void)
1006{ 833{
1007 int stat;
1008
1009 while (1) { 834 while (1) {
1010 cprint_init(); 835 int res;
1011 cprint("--inputbox"); 836 dialog_clear();
1012 cprint(save_config_text); 837 res = dialog_inputbox(NULL, save_config_text,
1013 cprint("11"); 838 11, 55, filename);
1014 cprint("55"); 839 switch(res) {
1015 cprint("%s", filename);
1016 stat = exec_conf();
1017 switch(stat) {
1018 case 0: 840 case 0:
1019 if (!input_buf[0]) 841 if (!dialog_input_result[0])
1020 return; 842 return;
1021 if (!conf_write(input_buf)) 843 if (!conf_write(dialog_input_result))
1022 return; 844 return;
1023 show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60); 845 show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
1024 break; 846 break;
1025 case 1: 847 case 1:
1026 show_helptext(_("Save Alternate Configuration"), save_config_help); 848 show_helptext(_("Save Alternate Configuration"), save_config_help);
1027 break; 849 break;
1028 case 255: 850 case KEY_ESC:
1029 return; 851 return;
1030 } 852 }
1031 } 853 }
@@ -1034,15 +856,13 @@ static void conf_save(void)
1034static void conf_cleanup(void) 856static void conf_cleanup(void)
1035{ 857{
1036 tcsetattr(1, TCSAFLUSH, &ios_org); 858 tcsetattr(1, TCSAFLUSH, &ios_org);
1037 unlink(".help.tmp");
1038 unlink("lxdialog.scrltmp");
1039} 859}
1040 860
1041int main(int ac, char **av) 861int main(int ac, char **av)
1042{ 862{
1043 struct symbol *sym; 863 struct symbol *sym;
1044 char *mode; 864 char *mode;
1045 int stat; 865 int res;
1046 866
1047 setlocale(LC_ALL, ""); 867 setlocale(LC_ALL, "");
1048 bindtextdomain(PACKAGE, LOCALEDIR); 868 bindtextdomain(PACKAGE, LOCALEDIR);
@@ -1065,18 +885,19 @@ int main(int ac, char **av)
1065 tcgetattr(1, &ios_org); 885 tcgetattr(1, &ios_org);
1066 atexit(conf_cleanup); 886 atexit(conf_cleanup);
1067 init_wsize(); 887 init_wsize();
1068 conf(&rootmenu); 888 reset_dialog();
1069 889 init_dialog(menu_backtitle);
1070 do { 890 do {
1071 cprint_init(); 891 conf(&rootmenu);
1072 cprint("--yesno"); 892 dialog_clear();
1073 cprint(_("Do you wish to save your new kernel configuration?")); 893 res = dialog_yesno(NULL,
1074 cprint("5"); 894 _("Do you wish to save your "
1075 cprint("60"); 895 "new kernel configuration?\n"
1076 stat = exec_conf(); 896 "<ESC><ESC> to continue."),
1077 } while (stat < 0); 897 6, 60);
1078 898 } while (res == KEY_ESC);
1079 if (stat == 0) { 899 end_dialog();
900 if (res == 0) {
1080 if (conf_write(NULL)) { 901 if (conf_write(NULL)) {
1081 fprintf(stderr, _("\n\n" 902 fprintf(stderr, _("\n\n"
1082 "Error during writing of the kernel configuration.\n" 903 "Error during writing of the kernel configuration.\n"