[PATCH] ui/ncurses: Properly set focus when updating subset

Samuel Mendoza-Jonas sam at mendozajonas.com
Wed Jul 13 16:51:20 AEST 2016


When a subset widget is made empty focus is switched to the first
visible field. It should actually be set to the first visible and active
field, otherwise we can try to focus an un-selectable label.

While we're here, also properly set the visibility for the autoboot
enable/disable widget.

Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
---
 ui/ncurses/nc-config.c  | 1 +
 ui/ncurses/nc-widgets.c | 8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c
index 24aac2b..10d7eb6 100644
--- a/ui/ncurses/nc-config.c
+++ b/ui/ncurses/nc-config.c
@@ -411,6 +411,7 @@ static void config_screen_layout_widgets(struct config_screen *screen)
 	widget_move(wl, y, screen->label_x);
 
 	wf = widget_select_base(screen->widgets.autoboot_f);
+	widget_set_visible(wf, true);
 	widget_move(wf, y, screen->field_x);
 	y += widget_height(wf);
 
diff --git a/ui/ncurses/nc-widgets.c b/ui/ncurses/nc-widgets.c
index 50909ab..8f8816e 100644
--- a/ui/ncurses/nc-widgets.c
+++ b/ui/ncurses/nc-widgets.c
@@ -466,6 +466,7 @@ static void subset_delete_active(struct nc_widget_subset *subset, int idx)
 	struct nc_widget *widget;
 	size_t rem;
 	int i, val;
+	uint32_t opts;
 
 	/* Shift field focus to nearest active option or next visible field */
 	if (subset->n_active > 1) {
@@ -477,8 +478,11 @@ static void subset_delete_active(struct nc_widget_subset *subset, int idx)
 	} else {
 		for (i = 0; i < set->n_fields; i++)
 			if (field_visible(set->fields[i])) {
-				set->cur_field = set->fields[i];
-				break;
+				opts = field_opts(set->fields[i]);
+				if ((opts & O_ACTIVE) == O_ACTIVE) {
+					set->cur_field = set->fields[i];
+					break;
+				}
 			}
 	}
 
-- 
2.9.0



More information about the Petitboot mailing list