X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-config.c;h=64d0619b66c66703dc64c9d08c9b50e07dfc3903;hp=6b29a660d43a4b6afd6b04cc0a576e0931a8fbe8;hb=8c60755607cbade935b1f763dffbf9ee1c38f97a;hpb=b49d86901dcdf0a6ddddba7c90d67b62c4acf2f8 diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c index 6b29a66..64d0619 100644 --- a/ui/ncurses/nc-config.c +++ b/ui/ncurses/nc-config.c @@ -32,7 +32,9 @@ #include "nc-config.h" #include "nc-widgets.h" -#define N_FIELDS 23 +#define N_FIELDS 24 + +extern const char *config_help_text; enum net_conf_type { NET_CONF_TYPE_DHCP_ALL, @@ -47,6 +49,7 @@ struct config_screen { WINDOW *pad; bool exit; + bool show_help; void (*on_exit)(struct cui *); int scroll_y; @@ -83,6 +86,7 @@ struct config_screen { struct nc_widget_label *dns_help_l; struct nc_widget_button *ok_b; + struct nc_widget_button *help_b; struct nc_widget_button *cancel_b; } widgets; }; @@ -114,10 +118,30 @@ static void config_screen_process_key(struct nc_scr *scr, int key) bool handled; handled = widgetset_process_key(screen->widgetset, key); - if (screen->exit) + + if (!handled) { + switch (key) { + case 'x': + case 27: /* esc */ + screen->exit = true; + break; + case 'h': + screen->show_help = true; + break; + } + } + + if (screen->exit) { screen->on_exit(screen->cui); - else if (handled) + + } else if (screen->show_help) { + screen->show_help = false; + cui_show_help(screen->cui, "System Configuration", + config_help_text); + + } else if (handled) { pad_refresh(screen); + } } static void config_screen_resize(struct nc_scr *scr) @@ -131,6 +155,8 @@ static int config_screen_post(struct nc_scr *scr) struct config_screen *screen = config_screen_from_scr(scr); widgetset_post(screen->widgetset); nc_scr_frame_draw(scr); + redrawwin(scr->main_ncw); + wrefresh(screen->scr.main_ncw); pad_refresh(screen); return 0; } @@ -150,13 +176,13 @@ struct nc_scr *config_screen_scr(struct config_screen *screen) static int screen_process_form(struct config_screen *screen) { const struct system_info *sysinfo = screen->cui->sysinfo; - struct config *config = talloc_zero(screen, struct config); enum net_conf_type net_conf_type; struct interface_config *iface; + struct config *config; char *str, *end; int rc; - config_set_defaults(config); + config = config_copy(screen, screen->cui->config); config->autoboot_enabled = widget_checkbox_get_value(screen->widgets.autoboot_f); @@ -212,6 +238,7 @@ static int screen_process_form(struct config_screen *screen) screen->scr.frame.status = "No IP / mask values are set"; nc_scr_frame_draw(&screen->scr); + talloc_free(config); return -1; } @@ -266,6 +293,12 @@ static void ok_click(void *arg) screen->exit = true; } +static void help_click(void *arg) +{ + struct config_screen *screen = arg; + screen->show_help = true; +} + static void cancel_click(void *arg) { struct config_screen *screen = arg; @@ -385,8 +418,10 @@ static void config_screen_layout_widgets(struct config_screen *screen, widget_move(widget_button_base(screen->widgets.ok_b), y, screen->field_x); - widget_move(widget_button_base(screen->widgets.cancel_b), + widget_move(widget_button_base(screen->widgets.help_b), y, screen->field_x + 10); + widget_move(widget_button_base(screen->widgets.cancel_b), + y, screen->field_x + 20); } static void config_screen_network_change(void *arg, int value) @@ -555,6 +590,8 @@ static void config_screen_setup_widgets(struct config_screen *screen, screen->widgets.ok_b = widget_new_button(set, 0, 0, 6, "OK", ok_click, screen); + screen->widgets.help_b = widget_new_button(set, 0, 0, 6, "Help", + help_click, screen); screen->widgets.cancel_b = widget_new_button(set, 0, 0, 6, "Cancel", cancel_click, screen); } @@ -579,8 +616,7 @@ static void config_screen_widget_focus(struct nc_widget *widget, void *arg) pad_refresh(screen); } - -void config_screen_update(struct config_screen *screen, +static void config_screen_draw(struct config_screen *screen, const struct config *config, const struct system_info *sysinfo) { @@ -625,7 +661,13 @@ void config_screen_update(struct config_screen *screen, if (repost) widgetset_post(screen->widgetset); +} +void config_screen_update(struct config_screen *screen, + const struct config *config, + const struct system_info *sysinfo) +{ + config_screen_draw(screen, config, sysinfo); pad_refresh(screen); } @@ -660,14 +702,12 @@ struct config_screen *config_screen_init(struct cui *cui, "Petitboot System Configuration"); screen->scr.frame.rtitle = NULL; screen->scr.frame.help = talloc_strdup(screen, - "tab=next, shift+tab=previous"); + "tab=next, shift+tab=previous, x=exit, h=help"); nc_scr_frame_draw(&screen->scr); scrollok(screen->scr.sub_ncw, true); - config_screen_update(screen, config, sysinfo); - - wrefresh(screen->scr.main_ncw); + config_screen_draw(screen, config, sysinfo); return screen; }