diff options
author | Benjamin Poirier <bpoirier@suse.de> | 2012-08-23 14:55:05 -0400 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2012-09-27 18:08:14 +0200 |
commit | 1d1e2caebbf1f4f25ad473e90650cdc9291fdd22 (patch) | |
tree | b6dd5a253abef0e91389e2ea113b72bd4439f538 | |
parent | 537ddae75c0f41343928d39f308f3ca670f000a8 (diff) |
menuconfig: Extend dialog_textbox so that it can return to a scrolled position
We can now display other UI elements (menus) "on top" of a textbox and then
seemingly come back to it in the same state it was left.
Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
Signed-off-by: Michal Marek <mmarek@suse.cz>
-rw-r--r-- | scripts/kconfig/lxdialog/dialog.h | 2 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/textbox.c | 24 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 8 |
3 files changed, 28 insertions, 6 deletions
diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index 35ca0286d105..2a01cdfae5a8 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h @@ -211,7 +211,7 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width); int dialog_msgbox(const char *title, const char *prompt, int height, int width, int pause); int dialog_textbox(const char *title, const char *file, int height, int width, - int *keys); + int *keys, int *_vscroll, int *_hscroll); int dialog_menu(const char *title, const char *prompt, const void *selected, int *s_scroll); int dialog_checklist(const char *title, const char *prompt, int height, diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c index eb4ee92ad2b3..506a095c387c 100644 --- a/scripts/kconfig/lxdialog/textbox.c +++ b/scripts/kconfig/lxdialog/textbox.c @@ -51,7 +51,7 @@ static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw, * keys is a null-terminated array */ int dialog_textbox(const char *title, const char *tbuf, int initial_height, - int initial_width, int *keys) + int initial_width, int *keys, int *_vscroll, int *_hscroll) { int i, x, y, cur_x, cur_y, key = 0; int height, width, boxh, boxw; @@ -65,6 +65,15 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height, buf = tbuf; page = buf; /* page is pointer to start of page to be displayed */ + if (_vscroll && *_vscroll) { + begin_reached = 0; + + for (i = 0; i < *_vscroll; i++) + get_line(); + } + if (_hscroll) + hscroll = *_hscroll; + do_resize: getmaxyx(stdscr, height, width); if (height < 8 || width < 8) @@ -275,6 +284,19 @@ do_resize: } delwin(box); delwin(dialog); + if (_vscroll) { + const char *s; + + s = buf; + *_vscroll = 0; + back_lines(page_length); + while (s < page && (s = strchr(s, '\n'))) { + (*_vscroll)++; + s++; + } + } + if (_hscroll) + *_hscroll = hscroll; return key; } diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index e097efb9c3ef..b3a37c2b16ae 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -280,7 +280,7 @@ static void conf_string(struct menu *menu); static void conf_load(void); static void conf_save(void); static int show_textbox_ext(const char *title, const char *text, int r, int c, - int *keys); + int *keys, int *vscroll, int *hscroll); static void show_textbox(const char *title, const char *text, int r, int c); static void show_helptext(const char *title, const char *text); static void show_help(struct menu *menu); @@ -621,15 +621,15 @@ static void conf(struct menu *menu) } static int show_textbox_ext(const char *title, const char *text, int r, int c, - int *keys) + int *keys, int *vscroll, int *hscroll) { dialog_clear(); - return dialog_textbox(title, text, r, c, keys); + return dialog_textbox(title, text, r, c, keys, vscroll, hscroll); } static void show_textbox(const char *title, const char *text, int r, int c) { - show_textbox_ext(title, text, r, c, (int []) {0}); + show_textbox_ext(title, text, r, c, (int []) {0}, NULL, NULL); } static void show_helptext(const char *title, const char *text) |