diff options
author | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-07-29 16:48:57 -0400 |
---|---|---|
committer | Sam Ravnborg <sam@neptun.ravnborg.org> | 2006-09-30 05:19:20 -0400 |
commit | c8dc68ad0fbd934e78e913b8a8d7b45945db4930 (patch) | |
tree | 62169927ce5ca83e3f280e6bbe06053989462968 | |
parent | f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64 (diff) |
kconfig/lxdialog: support resize
In all dialogs now properly catch KEY_RESIZE and take proper action.
In mconf try to behave sensibly when a dialog routine returns
-ERRDISPLAYTOOSMALL.
The original check for a screnn size of 80x19 is kept for now.
It may make sense to remove it later, but thats anyway what
much text is adjusted for.
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
-rw-r--r-- | scripts/kconfig/lxdialog/checklist.c | 11 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/dialog.h | 8 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/inputbox.c | 20 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/menubox.c | 25 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/textbox.c | 140 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/util.c | 6 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/yesno.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 12 |
8 files changed, 161 insertions, 71 deletions
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index 39becb72444a..cf697080dddd 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c | |||
@@ -125,6 +125,12 @@ int dialog_checklist(const char *title, const char *prompt, int height, | |||
125 | } | 125 | } |
126 | } | 126 | } |
127 | 127 | ||
128 | do_resize: | ||
129 | if (getmaxy(stdscr) < (height + 6)) | ||
130 | return -ERRDISPLAYTOOSMALL; | ||
131 | if (getmaxx(stdscr) < (width + 6)) | ||
132 | return -ERRDISPLAYTOOSMALL; | ||
133 | |||
128 | max_choice = MIN(list_height, item_count()); | 134 | max_choice = MIN(list_height, item_count()); |
129 | 135 | ||
130 | /* center dialog box on screen */ | 136 | /* center dialog box on screen */ |
@@ -303,6 +309,11 @@ int dialog_checklist(const char *title, const char *prompt, int height, | |||
303 | case KEY_ESC: | 309 | case KEY_ESC: |
304 | key = on_key_esc(dialog); | 310 | key = on_key_esc(dialog); |
305 | break; | 311 | break; |
312 | case KEY_RESIZE: | ||
313 | delwin(list); | ||
314 | delwin(dialog); | ||
315 | on_key_resize(); | ||
316 | goto do_resize; | ||
306 | } | 317 | } |
307 | 318 | ||
308 | /* Now, update everything... */ | 319 | /* Now, update everything... */ |
diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index a7cfdecc2409..8dea47f9d3e4 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h | |||
@@ -86,6 +86,9 @@ | |||
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 | * Color definitions | 93 | * Color definitions |
91 | */ | 94 | */ |
@@ -181,6 +184,7 @@ int item_is_tag(char tag); | |||
181 | 184 | ||
182 | /* generic key handlers */ | 185 | /* generic key handlers */ |
183 | int on_key_esc(WINDOW *win); | 186 | int on_key_esc(WINDOW *win); |
187 | int on_key_resize(void); | ||
184 | 188 | ||
185 | void init_dialog(const char *backtitle); | 189 | void init_dialog(const char *backtitle); |
186 | void reset_dialog(void); | 190 | void reset_dialog(void); |
@@ -199,8 +203,8 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width); | |||
199 | int dialog_msgbox(const char *title, const char *prompt, int height, | 203 | int dialog_msgbox(const char *title, const char *prompt, int height, |
200 | int width, int pause); | 204 | int width, int pause); |
201 | int dialog_textbox(const char *title, const char *file, int height, int width); | 205 | int dialog_textbox(const char *title, const char *file, int height, int width); |
202 | int dialog_menu(const char *title, const char *prompt, int height, int width, | 206 | int dialog_menu(const char *title, const char *prompt, |
203 | int menu_height, const void *selected, int *s_scroll); | 207 | const void *selected, int *s_scroll); |
204 | int dialog_checklist(const char *title, const char *prompt, int height, | 208 | int dialog_checklist(const char *title, const char *prompt, int height, |
205 | int width, int list_height); | 209 | int width, int list_height); |
206 | extern char dialog_input_result[]; | 210 | extern char dialog_input_result[]; |
diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c index edb7975dbaa2..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 | |||
57 | do_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; |
@@ -86,11 +97,6 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width | |||
86 | wmove(dialog, box_y, box_x); | 97 | wmove(dialog, box_y, box_x); |
87 | wattrset(dialog, dlg.inputbox.atr); | 98 | wattrset(dialog, dlg.inputbox.atr); |
88 | 99 | ||
89 | if (!init) | ||
90 | instr[0] = '\0'; | ||
91 | else | ||
92 | strcpy(instr, init); | ||
93 | |||
94 | input_x = strlen(instr); | 100 | input_x = strlen(instr); |
95 | 101 | ||
96 | if (input_x >= box_width) { | 102 | if (input_x >= box_width) { |
@@ -220,6 +226,10 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width | |||
220 | case KEY_ESC: | 226 | case KEY_ESC: |
221 | key = on_key_esc(dialog); | 227 | key = on_key_esc(dialog); |
222 | break; | 228 | break; |
229 | case KEY_RESIZE: | ||
230 | delwin(dialog); | ||
231 | on_key_resize(); | ||
232 | goto do_resize; | ||
223 | } | 233 | } |
224 | } | 234 | } |
225 | 235 | ||
diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index d3305bad15c7..fcd95a985328 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c | |||
@@ -179,14 +179,25 @@ static void do_scroll(WINDOW *win, int *scroll, int n) | |||
179 | /* | 179 | /* |
180 | * Display a menu for choosing among a number of options | 180 | * Display a menu for choosing among a number of options |
181 | */ | 181 | */ |
182 | int dialog_menu(const char *title, const char *prompt, int height, int width, | 182 | int dialog_menu(const char *title, const char *prompt, |
183 | int menu_height, const void *selected, int *s_scroll) | 183 | const void *selected, int *s_scroll) |
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 | 190 | ||
191 | do_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 | |||
190 | max_choice = MIN(menu_height, item_count()); | 201 | max_choice = MIN(menu_height, item_count()); |
191 | 202 | ||
192 | /* center dialog box on screen */ | 203 | /* center dialog box on screen */ |
@@ -226,7 +237,10 @@ int dialog_menu(const char *title, const char *prompt, int height, int width, | |||
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 | dlg.menubox_border.atr, dlg.menubox.atr); | 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 | item_foreach() | 246 | item_foreach() |
@@ -407,6 +421,11 @@ int dialog_menu(const char *title, const char *prompt, int height, int width, | |||
407 | case KEY_ESC: | 421 | case KEY_ESC: |
408 | key = on_key_esc(menu); | 422 | key = on_key_esc(menu); |
409 | break; | 423 | break; |
424 | case KEY_RESIZE: | ||
425 | on_key_resize(); | ||
426 | delwin(menu); | ||
427 | delwin(dialog); | ||
428 | goto do_resize; | ||
410 | } | 429 | } |
411 | } | 430 | } |
412 | delwin(menu); | 431 | delwin(menu); |
diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c index a99e1f497d67..fabfc1ad789d 100644 --- a/scripts/kconfig/lxdialog/textbox.c +++ b/scripts/kconfig/lxdialog/textbox.c | |||
@@ -25,7 +25,7 @@ static void back_lines(int n); | |||
25 | static void print_page(WINDOW * win, int height, int width); | 25 | static void print_page(WINDOW * win, int height, int width); |
26 | static void print_line(WINDOW * win, int row, int width); | 26 | static void print_line(WINDOW * win, int row, int width); |
27 | static char *get_line(void); | 27 | static char *get_line(void); |
28 | static void print_position(WINDOW * win, int height, int width); | 28 | static void print_position(WINDOW * win); |
29 | 29 | ||
30 | static int hscroll; | 30 | static int hscroll; |
31 | static int begin_reached, end_reached, page_length; | 31 | static int begin_reached, end_reached, page_length; |
@@ -33,14 +33,28 @@ static const char *buf; | |||
33 | static const char *page; | 33 | static const char *page; |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * refresh window content | ||
37 | */ | ||
38 | static 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 | } | ||
46 | |||
47 | |||
48 | /* | ||
36 | * Display text from a file in a dialog box. | 49 | * Display text from a file in a dialog box. |
37 | */ | 50 | */ |
38 | int dialog_textbox(const char *title, const char *tbuf, int height, int width) | 51 | int dialog_textbox(const char *title, const char *tbuf, |
52 | int initial_height, int initial_width) | ||
39 | { | 53 | { |
40 | int i, x, y, cur_x, cur_y, key = 0; | 54 | int i, x, y, cur_x, cur_y, key = 0; |
41 | int texth, textw; | 55 | int height, width, boxh, boxw; |
42 | int passed_end; | 56 | int passed_end; |
43 | WINDOW *dialog, *text; | 57 | WINDOW *dialog, *box; |
44 | 58 | ||
45 | begin_reached = 1; | 59 | begin_reached = 1; |
46 | end_reached = 0; | 60 | end_reached = 0; |
@@ -49,6 +63,25 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
49 | buf = tbuf; | 63 | buf = tbuf; |
50 | page = buf; /* page is pointer to start of page to be displayed */ | 64 | page = buf; /* page is pointer to start of page to be displayed */ |
51 | 65 | ||
66 | do_resize: | ||
67 | getmaxyx(stdscr, height, width); | ||
68 | if (height < 8 || width < 8) | ||
69 | return -ERRDISPLAYTOOSMALL; | ||
70 | if (initial_height != 0) | ||
71 | height = initial_height; | ||
72 | else | ||
73 | if (height > 4) | ||
74 | height -= 4; | ||
75 | else | ||
76 | height = 0; | ||
77 | if (initial_width != 0) | ||
78 | width = initial_width; | ||
79 | else | ||
80 | if (width > 5) | ||
81 | width -= 5; | ||
82 | else | ||
83 | width = 0; | ||
84 | |||
52 | /* center dialog box on screen */ | 85 | /* center dialog box on screen */ |
53 | x = (COLS - width) / 2; | 86 | x = (COLS - width) / 2; |
54 | y = (LINES - height) / 2; | 87 | y = (LINES - height) / 2; |
@@ -58,14 +91,14 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
58 | dialog = newwin(height, width, y, x); | 91 | dialog = newwin(height, width, y, x); |
59 | keypad(dialog, TRUE); | 92 | keypad(dialog, TRUE); |
60 | 93 | ||
61 | /* Create window for text region, used for scrolling text */ | 94 | /* Create window for box region, used for scrolling text */ |
62 | texth = height - 4; | 95 | boxh = height - 4; |
63 | textw = width - 2; | 96 | boxw = width - 2; |
64 | text = subwin(dialog, texth, textw, y + 1, x + 1); | 97 | box = subwin(dialog, boxh, boxw, y + 1, x + 1); |
65 | wattrset(text, dlg.dialog.atr); | 98 | wattrset(box, dlg.dialog.atr); |
66 | wbkgdset(text, dlg.dialog.atr & A_COLOR); | 99 | wbkgdset(box, dlg.dialog.atr & A_COLOR); |
67 | 100 | ||
68 | keypad(text, TRUE); | 101 | keypad(box, TRUE); |
69 | 102 | ||
70 | /* register the new window, along with its borders */ | 103 | /* register the new window, along with its borders */ |
71 | draw_box(dialog, 0, 0, height, width, | 104 | draw_box(dialog, 0, 0, height, width, |
@@ -86,11 +119,8 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
86 | getyx(dialog, cur_y, cur_x); /* Save cursor position */ | 119 | getyx(dialog, cur_y, cur_x); /* Save cursor position */ |
87 | 120 | ||
88 | /* Print first page of text */ | 121 | /* Print first page of text */ |
89 | attr_clear(text, texth, textw, dlg.dialog.atr); | 122 | attr_clear(box, boxh, boxw, dlg.dialog.atr); |
90 | print_page(text, texth, textw); | 123 | refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x); |
91 | print_position(dialog, height, width); | ||
92 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ | ||
93 | wrefresh(dialog); | ||
94 | 124 | ||
95 | while ((key != KEY_ESC) && (key != '\n')) { | 125 | while ((key != KEY_ESC) && (key != '\n')) { |
96 | key = wgetch(dialog); | 126 | key = wgetch(dialog); |
@@ -99,7 +129,7 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
99 | case 'e': | 129 | case 'e': |
100 | case 'X': | 130 | case 'X': |
101 | case 'x': | 131 | case 'x': |
102 | delwin(text); | 132 | delwin(box); |
103 | delwin(dialog); | 133 | delwin(dialog); |
104 | return 0; | 134 | return 0; |
105 | case 'g': /* First page */ | 135 | case 'g': /* First page */ |
@@ -107,10 +137,8 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
107 | if (!begin_reached) { | 137 | if (!begin_reached) { |
108 | begin_reached = 1; | 138 | begin_reached = 1; |
109 | page = buf; | 139 | page = buf; |
110 | print_page(text, texth, textw); | 140 | refresh_text_box(dialog, box, boxh, boxw, |
111 | print_position(dialog, height, width); | 141 | cur_y, cur_x); |
112 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ | ||
113 | wrefresh(dialog); | ||
114 | } | 142 | } |
115 | break; | 143 | break; |
116 | case 'G': /* Last page */ | 144 | case 'G': /* Last page */ |
@@ -119,11 +147,9 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
119 | end_reached = 1; | 147 | end_reached = 1; |
120 | /* point to last char in buf */ | 148 | /* point to last char in buf */ |
121 | page = buf + strlen(buf); | 149 | page = buf + strlen(buf); |
122 | back_lines(texth); | 150 | back_lines(boxh); |
123 | print_page(text, texth, textw); | 151 | refresh_text_box(dialog, box, boxh, boxw, |
124 | print_position(dialog, height, width); | 152 | cur_y, cur_x); |
125 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ | ||
126 | wrefresh(dialog); | ||
127 | break; | 153 | break; |
128 | case 'K': /* Previous line */ | 154 | case 'K': /* Previous line */ |
129 | case 'k': | 155 | case 'k': |
@@ -138,16 +164,16 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
138 | * point to start of next page. This is done | 164 | * point to start of next page. This is done |
139 | * by calling get_line() in the following | 165 | * by calling get_line() in the following |
140 | * 'for' loop. */ | 166 | * 'for' loop. */ |
141 | scrollok(text, TRUE); | 167 | scrollok(box, TRUE); |
142 | wscrl(text, -1); /* Scroll text region down one line */ | 168 | wscrl(box, -1); /* Scroll box region down one line */ |
143 | scrollok(text, FALSE); | 169 | scrollok(box, FALSE); |
144 | page_length = 0; | 170 | page_length = 0; |
145 | passed_end = 0; | 171 | passed_end = 0; |
146 | for (i = 0; i < texth; i++) { | 172 | for (i = 0; i < boxh; i++) { |
147 | if (!i) { | 173 | if (!i) { |
148 | /* print first line of page */ | 174 | /* print first line of page */ |
149 | print_line(text, 0, textw); | 175 | print_line(box, 0, boxw); |
150 | wnoutrefresh(text); | 176 | wnoutrefresh(box); |
151 | } else | 177 | } else |
152 | /* Called to update 'end_reached' and 'page' */ | 178 | /* Called to update 'end_reached' and 'page' */ |
153 | get_line(); | 179 | get_line(); |
@@ -157,7 +183,7 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
157 | passed_end = 1; | 183 | passed_end = 1; |
158 | } | 184 | } |
159 | 185 | ||
160 | print_position(dialog, height, width); | 186 | print_position(dialog); |
161 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ | 187 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ |
162 | wrefresh(dialog); | 188 | wrefresh(dialog); |
163 | } | 189 | } |
@@ -167,23 +193,21 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
167 | case KEY_PPAGE: | 193 | case KEY_PPAGE: |
168 | if (begin_reached) | 194 | if (begin_reached) |
169 | break; | 195 | break; |
170 | back_lines(page_length + texth); | 196 | back_lines(page_length + boxh); |
171 | print_page(text, texth, textw); | 197 | refresh_text_box(dialog, box, boxh, boxw, |
172 | print_position(dialog, height, width); | 198 | cur_y, cur_x); |
173 | wmove(dialog, cur_y, cur_x); | ||
174 | wrefresh(dialog); | ||
175 | break; | 199 | break; |
176 | case 'J': /* Next line */ | 200 | case 'J': /* Next line */ |
177 | case 'j': | 201 | case 'j': |
178 | case KEY_DOWN: | 202 | case KEY_DOWN: |
179 | if (!end_reached) { | 203 | if (!end_reached) { |
180 | begin_reached = 0; | 204 | begin_reached = 0; |
181 | scrollok(text, TRUE); | 205 | scrollok(box, TRUE); |
182 | scroll(text); /* Scroll text region up one line */ | 206 | scroll(box); /* Scroll box region up one line */ |
183 | scrollok(text, FALSE); | 207 | scrollok(box, FALSE); |
184 | print_line(text, texth - 1, textw); | 208 | print_line(box, boxh - 1, boxw); |
185 | wnoutrefresh(text); | 209 | wnoutrefresh(box); |
186 | print_position(dialog, height, width); | 210 | print_position(dialog); |
187 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ | 211 | wmove(dialog, cur_y, cur_x); /* Restore cursor position */ |
188 | wrefresh(dialog); | 212 | wrefresh(dialog); |
189 | } | 213 | } |
@@ -194,10 +218,8 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
194 | break; | 218 | break; |
195 | 219 | ||
196 | begin_reached = 0; | 220 | begin_reached = 0; |
197 | print_page(text, texth, textw); | 221 | refresh_text_box(dialog, box, boxh, boxw, |
198 | print_position(dialog, height, width); | 222 | cur_y, cur_x); |
199 | wmove(dialog, cur_y, cur_x); | ||
200 | wrefresh(dialog); | ||
201 | break; | 223 | break; |
202 | case '0': /* Beginning of line */ | 224 | case '0': /* Beginning of line */ |
203 | case 'H': /* Scroll left */ | 225 | case 'H': /* Scroll left */ |
@@ -212,9 +234,8 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
212 | hscroll--; | 234 | hscroll--; |
213 | /* Reprint current page to scroll horizontally */ | 235 | /* Reprint current page to scroll horizontally */ |
214 | back_lines(page_length); | 236 | back_lines(page_length); |
215 | print_page(text, texth, textw); | 237 | refresh_text_box(dialog, box, boxh, boxw, |
216 | wmove(dialog, cur_y, cur_x); | 238 | cur_y, cur_x); |
217 | wrefresh(dialog); | ||
218 | break; | 239 | break; |
219 | case 'L': /* Scroll right */ | 240 | case 'L': /* Scroll right */ |
220 | case 'l': | 241 | case 'l': |
@@ -224,16 +245,21 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) | |||
224 | hscroll++; | 245 | hscroll++; |
225 | /* Reprint current page to scroll horizontally */ | 246 | /* Reprint current page to scroll horizontally */ |
226 | back_lines(page_length); | 247 | back_lines(page_length); |
227 | print_page(text, texth, textw); | 248 | refresh_text_box(dialog, box, boxh, boxw, |
228 | wmove(dialog, cur_y, cur_x); | 249 | cur_y, cur_x); |
229 | wrefresh(dialog); | ||
230 | break; | 250 | break; |
231 | case KEY_ESC: | 251 | case KEY_ESC: |
232 | key = on_key_esc(dialog); | 252 | key = on_key_esc(dialog); |
233 | 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; | ||
234 | } | 260 | } |
235 | } | 261 | } |
236 | delwin(text); | 262 | delwin(box); |
237 | delwin(dialog); | 263 | delwin(dialog); |
238 | return key; /* ESC pressed */ | 264 | return key; /* ESC pressed */ |
239 | } | 265 | } |
@@ -353,13 +379,13 @@ static char *get_line(void) | |||
353 | /* | 379 | /* |
354 | * Print current position | 380 | * Print current position |
355 | */ | 381 | */ |
356 | static void print_position(WINDOW * win, int height, int width) | 382 | static void print_position(WINDOW * win) |
357 | { | 383 | { |
358 | int percent; | 384 | int percent; |
359 | 385 | ||
360 | wattrset(win, dlg.position_indicator.atr); | 386 | wattrset(win, dlg.position_indicator.atr); |
361 | wbkgdset(win, dlg.position_indicator.atr & A_COLOR); | 387 | wbkgdset(win, dlg.position_indicator.atr & A_COLOR); |
362 | percent = (page - buf) * 100 / strlen(buf); | 388 | percent = (page - buf) * 100 / strlen(buf); |
363 | wmove(win, height - 3, width - 9); | 389 | wmove(win, getmaxy(win) - 3, getmaxx(win) - 9); |
364 | wprintw(win, "(%3d%%)", percent); | 390 | wprintw(win, "(%3d%%)", percent); |
365 | } | 391 | } |
diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index cb21dc4dd9fc..ebc781b493d7 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c | |||
@@ -509,6 +509,12 @@ int on_key_esc(WINDOW *win) | |||
509 | return -1; | 509 | return -1; |
510 | } | 510 | } |
511 | 511 | ||
512 | /* redraw screen in new size */ | ||
513 | int on_key_resize(void) | ||
514 | { | ||
515 | dialog_clear(); | ||
516 | return KEY_RESIZE; | ||
517 | } | ||
512 | 518 | ||
513 | struct dialog_list *item_cur; | 519 | struct dialog_list *item_cur; |
514 | struct dialog_list item_nil; | 520 | struct dialog_list item_nil; |
diff --git a/scripts/kconfig/lxdialog/yesno.c b/scripts/kconfig/lxdialog/yesno.c index 8364f9dd01c3..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 | ||
47 | do_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; |
@@ -96,6 +102,10 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width) | |||
96 | case KEY_ESC: | 102 | case KEY_ESC: |
97 | key = on_key_esc(dialog); | 103 | key = on_key_esc(dialog); |
98 | break; | 104 | break; |
105 | case KEY_RESIZE: | ||
106 | delwin(dialog); | ||
107 | on_key_resize(); | ||
108 | goto do_resize; | ||
99 | } | 109 | } |
100 | } | 110 | } |
101 | 111 | ||
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index ef75d6c3d3e5..f7abca434829 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
@@ -606,9 +606,8 @@ static void conf(struct menu *menu) | |||
606 | reset_dialog(); | 606 | reset_dialog(); |
607 | res = dialog_menu(prompt ? prompt : _("Main Menu"), | 607 | res = dialog_menu(prompt ? prompt : _("Main Menu"), |
608 | _(menu_instructions), | 608 | _(menu_instructions), |
609 | rows, cols, rows - 10, | ||
610 | active_menu, &s_scroll); | 609 | active_menu, &s_scroll); |
611 | if (res == 1 || res == KEY_ESC) | 610 | if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) |
612 | break; | 611 | break; |
613 | if (!item_activate_selected()) | 612 | if (!item_activate_selected()) |
614 | continue; | 613 | continue; |
@@ -617,7 +616,10 @@ static void conf(struct menu *menu) | |||
617 | 616 | ||
618 | submenu = item_data(); | 617 | submenu = item_data(); |
619 | active_menu = item_data(); | 618 | active_menu = item_data(); |
620 | sym = submenu->sym; | 619 | if (submenu) |
620 | sym = submenu->sym; | ||
621 | else | ||
622 | sym = NULL; | ||
621 | 623 | ||
622 | switch (res) { | 624 | switch (res) { |
623 | case 0: | 625 | case 0: |
@@ -683,7 +685,7 @@ static void conf(struct menu *menu) | |||
683 | static void show_textbox(const char *title, const char *text, int r, int c) | 685 | static void show_textbox(const char *title, const char *text, int r, int c) |
684 | { | 686 | { |
685 | reset_dialog(); | 687 | reset_dialog(); |
686 | dialog_textbox(title, text, r ? r : rows, c ? c : cols); | 688 | dialog_textbox(title, text, r, c); |
687 | } | 689 | } |
688 | 690 | ||
689 | static void show_helptext(const char *title, const char *text) | 691 | static void show_helptext(const char *title, const char *text) |
@@ -756,6 +758,8 @@ static void conf_choice(struct menu *menu) | |||
756 | break; | 758 | break; |
757 | case KEY_ESC: | 759 | case KEY_ESC: |
758 | return; | 760 | return; |
761 | case -ERRDISPLAYTOOSMALL: | ||
762 | return; | ||
759 | } | 763 | } |
760 | } | 764 | } |
761 | } | 765 | } |