From 1d1e2caebbf1f4f25ad473e90650cdc9291fdd22 Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Thu, 23 Aug 2012 14:55:05 -0400 Subject: 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 Signed-off-by: Michal Marek --- scripts/kconfig/lxdialog/dialog.h | 2 +- scripts/kconfig/lxdialog/textbox.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'scripts/kconfig/lxdialog') 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; } -- cgit v1.2.3