summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorSam Mendoza-Jonas <sam@mendozajonas.com>2016-03-11 16:11:31 +1100
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-03-23 08:59:53 +1100
commitaae41a6e324cb37c7af93ae8726110ff82728fa6 (patch)
tree4906ae1a7e3f364d6e71a7d9002a3b86ce89171c /ui
parentd8c292e7e39f038374d2a6aecf6383f91a236ebc (diff)
downloadtalos-petitboot-aae41a6e324cb37c7af93ae8726110ff82728fa6.tar.gz
talos-petitboot-aae41a6e324cb37c7af93ae8726110ff82728fa6.zip
ui/ncurses: Re-add autoboot selection to config screen
The new boot order interface removed the autoboot enable/disable buttons. However this means the only way to disable autoboot is to remove all options from the boot order list, or know that you can manually set the `auto-boot?` flag in nvram. This re-introduces an autoboot enable/disable widget so that autoboot can be disabled without losing an existing boot order. The translated strings for "Autoboot" are salvaged from earlier use, and two new untranslated strings are introduced. Signed-off-by: Sam Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'ui')
-rw-r--r--ui/ncurses/nc-config.c82
1 files changed, 63 insertions, 19 deletions
diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c
index e7451bb..c0df762 100644
--- a/ui/ncurses/nc-config.c
+++ b/ui/ncurses/nc-config.c
@@ -33,7 +33,7 @@
#include "nc-config.h"
#include "nc-widgets.h"
-#define N_FIELDS 37
+#define N_FIELDS 39
extern struct help_text config_help_text;
@@ -69,6 +69,8 @@ struct config_screen {
bool ipmi_override;
struct {
+ struct nc_widget_label *autoboot_l;
+ struct nc_widget_select *autoboot_f;
struct nc_widget_label *boot_order_l;
struct nc_widget_subset *boot_order_f;
struct nc_widget_label *boot_empty_l;
@@ -191,11 +193,11 @@ static int screen_process_form(struct config_screen *screen)
const struct system_info *sysinfo = screen->cui->sysinfo;
enum net_conf_type net_conf_type;
struct interface_config *iface;
+ bool allow_write, autoboot;
char *str, *end;
struct config *config;
int i, n_boot_opts, rc, idx;
unsigned int *order;
- bool allow_write;
char mac[20];
config = config_copy(screen, screen->cui->config);
@@ -206,7 +208,8 @@ static int screen_process_form(struct config_screen *screen)
n_boot_opts = widget_subset_get_order(config, &order,
screen->widgets.boot_order_f);
- config->autoboot_enabled = n_boot_opts > 0;
+ autoboot = widget_select_get_value(screen->widgets.autoboot_f);
+ config->autoboot_enabled = autoboot || (autoboot && n_boot_opts);
config->n_autoboot_opts = n_boot_opts;
config->autoboot_opts = talloc_array(config, struct autoboot_option,
@@ -387,41 +390,59 @@ static void config_screen_layout_widgets(struct config_screen *screen)
help_x = screen->field_x + 2 +
widget_width(widget_textbox_base(screen->widgets.dns_f));
- wl = widget_label_base(screen->widgets.boot_order_l);
+ wl = widget_label_base(screen->widgets.autoboot_l);
widget_set_visible(wl, true);
widget_move(wl, y, screen->label_x);
+ wf = widget_select_base(screen->widgets.autoboot_f);
+ widget_move(wf, y, screen->field_x);
+ y += widget_height(wf);
+
+ show = screen->autoboot_enabled;
+
+ if (show)
+ y += 1;
+
+ wl = widget_label_base(screen->widgets.boot_order_l);
+ widget_set_visible(wl, show);
+ widget_move(wl, y, screen->label_x);
+
wf = widget_subset_base(screen->widgets.boot_order_f);
widget_move(wf, y, screen->field_x);
wl = widget_label_base(screen->widgets.boot_empty_l);
widget_move(wl, y, screen->field_x);
if (widget_subset_height(screen->widgets.boot_order_f)) {
- widget_set_visible(wf, true);
widget_set_visible(wl, false);
- y += widget_height(wf);
+ widget_set_visible(wf, show);
+ y += show ? widget_height(wf) : 0;
} else {
- widget_set_visible(wl, true);
+ widget_set_visible(wl, show);
widget_set_visible(wf, false);
- y += 1;
+ y += show ? 1 : 0;
}
- y += 1;
-
- widget_move(widget_button_base(screen->widgets.boot_add_b),
- y++, screen->field_x);
- widget_move(widget_button_base(screen->widgets.boot_any_b),
- y++, screen->field_x);
- widget_move(widget_button_base(screen->widgets.boot_none_b),
- y, screen->field_x);
+ if (show) {
+ y += 1;
+ widget_move(widget_button_base(screen->widgets.boot_add_b),
+ y++, screen->field_x);
+ widget_move(widget_button_base(screen->widgets.boot_any_b),
+ y++, screen->field_x);
+ widget_move(widget_button_base(screen->widgets.boot_none_b),
+ y, screen->field_x);
+ }
wf = widget_button_base(screen->widgets.boot_add_b);
- if (widget_subset_n_inactive(screen->widgets.boot_order_f))
+ if (widget_subset_n_inactive(screen->widgets.boot_order_f) && show)
widget_set_visible(wf, true);
else
widget_set_visible(wf, false);
- y += 2;
+ if (show)
+ y += 2;
+
+ widget_set_visible(widget_button_base(screen->widgets.boot_any_b), show);
+ widget_set_visible(widget_button_base(screen->widgets.boot_none_b), show);
wf = widget_textbox_base(screen->widgets.timeout_f);
wl = widget_label_base(screen->widgets.timeout_l);
@@ -584,6 +605,15 @@ static void config_screen_boot_order_change(void *arg, int value)
widgetset_post(screen->widgetset);
}
+static void config_screen_autoboot_change(void *arg, int value)
+{
+ struct config_screen *screen = arg;
+ screen->autoboot_enabled = !!value;
+ widgetset_unpost(screen->widgetset);
+ config_screen_layout_widgets(screen);
+ widgetset_post(screen->widgetset);
+}
+
static void config_screen_add_device(void *arg)
{
struct config_screen *screen = arg;
@@ -722,6 +752,21 @@ static void config_screen_setup_widgets(struct config_screen *screen,
type = screen->net_conf_type;
ifcfg = first_active_interface(config);
+ screen->autoboot_enabled = config->autoboot_enabled;
+
+ screen->widgets.autoboot_l = widget_new_label(set, 0, 0,
+ _("Autoboot:"));
+ screen->widgets.autoboot_f = widget_new_select(set, 0, 0,
+ COLS - screen->field_x - 1);
+
+ widget_select_add_option(screen->widgets.autoboot_f, 0, _("Disabled"),
+ !screen->autoboot_enabled);
+ widget_select_add_option(screen->widgets.autoboot_f, 1, _("Enabled"),
+ screen->autoboot_enabled);
+
+ widget_select_on_change(screen->widgets.autoboot_f,
+ config_screen_autoboot_change, screen);
+
add_len = max(min_len, strncols(_("Add Device")));
clear_len = max(min_len, strncols(_("Clear")));
any_len = max(min_len, strncols(_("Clear & Boot Any")));
@@ -783,7 +828,6 @@ static void config_screen_setup_widgets(struct config_screen *screen,
widget_subset_add_option(screen->widgets.boot_order_f, label);
}
- screen->autoboot_enabled = config->n_autoboot_opts;
for (i = 0; i < config->n_autoboot_opts; i++) {
struct autoboot_option *opt = &config->autoboot_opts[i];
int idx;
OpenPOWER on IntegriCloud