X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-lang.c;h=91d86e10866d6ec362883bcade8a2995db6ed5cc;hp=3d86659cd44e9897cf9100de60b715fee6da85eb;hb=HEAD;hpb=f84a33d3b924b3fff999826e4bf86d64067728b2 diff --git a/ui/ncurses/nc-lang.c b/ui/ncurses/nc-lang.c index 3d86659..91d86e1 100644 --- a/ui/ncurses/nc-lang.c +++ b/ui/ncurses/nc-lang.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -28,11 +29,12 @@ #include #include +#include "ui/common/discover-client.h" #include "nc-cui.h" #include "nc-lang.h" #include "nc-widgets.h" -#define N_FIELDS 5 +#define N_FIELDS 7 static struct lang { const char *name; @@ -69,6 +71,9 @@ struct lang_screen { struct nc_widget_select *lang_f; struct nc_widget_label *lang_l; + struct nc_widget_label *save_l; + struct nc_widget_checkbox *save_cb; + struct nc_widget_label *safe_mode; struct nc_widget_button *ok_b; struct nc_widget_button *cancel_b; @@ -114,12 +119,55 @@ static void lang_screen_process_key(struct nc_scr *scr, int key) if (screen->exit) { screen->on_exit(screen->cui); - - } else if (handled) { + } else if (handled && (screen->cui->current == scr)) { pad_refresh(screen); } } +static const char *lang_get_lang_name(struct lang_screen *screen) +{ + struct lang *lang; + int idx; + + idx = widget_select_get_value(screen->widgets.lang_f); + + /* Option -1 ("Unknown") can only be populated from the current + * language, so there's no change here */ + if (idx == -1) + return NULL; + + lang = &languages[idx]; + + return lang->name; +} + +static int lang_process_form(struct lang_screen *screen) +{ + struct config *config; + const char *lang; + int rc; + + config = config_copy(screen, screen->cui->config); + + lang = lang_get_lang_name(screen); + + if (!lang || (config->lang && !strcmp(lang, config->lang))) + return 0; + + config->lang = talloc_strdup(screen, lang); + + config->safe_mode = false; + rc = cui_send_config(screen->cui, config); + talloc_free(config); + + if (rc) + pb_log("cui_send_config failed!\n"); + else + pb_debug("config sent!\n"); + + return 0; +} + static void lang_screen_resize(struct nc_scr *scr) { struct lang_screen *screen = lang_screen_from_scr(scr); @@ -129,6 +177,10 @@ static void lang_screen_resize(struct nc_scr *scr) static int lang_screen_post(struct nc_scr *scr) { struct lang_screen *screen = lang_screen_from_scr(scr); + + if (screen->exit) + screen->on_exit(screen->cui); + widgetset_post(screen->widgetset); nc_scr_frame_draw(scr); wrefresh(screen->scr.main_ncw); @@ -148,49 +200,39 @@ struct nc_scr *lang_screen_scr(struct lang_screen *screen) return &screen->scr; } -static int lang_process_form(struct lang_screen *screen) +static void lang_screen_update_cb(struct nc_scr *scr) { - struct config *config; - struct lang *lang; - int idx, rc; - - config = config_copy(screen, screen->cui->config); - - idx = widget_select_get_value(screen->widgets.lang_f); - - /* Option -1 ("Unknown") can only be populated from the current - * language, so there's no change here */ - if (idx == -1) - return 0; - - lang = &languages[idx]; - - if (config->lang && !strcmp(lang->name, config->lang)) - return 0; - - config->lang = talloc_strdup(screen, lang->name); - - config->safe_mode = false; - rc = cui_send_config(screen->cui, config); - talloc_free(config); - - if (rc) - pb_log("cui_send_config failed!\n"); - else - pb_debug("config sent!\n"); + struct lang_screen *screen = lang_screen_from_scr(scr); - return 0; + if (!lang_process_form(screen)) + screen->exit = true; } static void ok_click(void *arg) { struct lang_screen *screen = arg; - if (lang_process_form(screen)) - /* errors are written to the status line, so we'll need - * to refresh */ - wrefresh(screen->scr.main_ncw); - else + const char *lang; + + if (!widget_checkbox_get_value(screen->widgets.save_cb)) { + /* Just update the client display */ + lang = lang_get_lang_name(screen); + if (lang) + cui_update_language(screen->cui, lang); screen->exit = true; + return; + } + + if (discover_client_authenticated(screen->cui->client)) { + if (lang_process_form(screen)) + /* errors are written to the status line, so we'll need + * to refresh */ + wrefresh(screen->scr.main_ncw); + else + screen->exit = true; + } else { + cui_show_auth(screen->cui, screen->scr.main_ncw, false, + lang_screen_update_cb); + } } static void cancel_click(void *arg) @@ -220,6 +262,10 @@ static void lang_screen_layout_widgets(struct lang_screen *screen) y += 1; + y += layout_pair(screen, y, screen->widgets.save_l, + widget_checkbox_base(screen->widgets.save_cb)); + y += 1; + if (screen->cui->config->safe_mode) { widget_move(widget_label_base(screen->widgets.safe_mode), y, screen->field_x); @@ -265,8 +311,14 @@ static void lang_screen_setup_widgets(struct lang_screen *screen, len = wcstombs(NULL, lang->label, 0); assert(len >= 0); - label = talloc_array(screen, char, len + 1); - wcstombs(label, lang->label, len + 1); + if (len < 0) { + label = talloc_asprintf(screen, + "Unable to display text in this locale (%s)\n", + setlocale(LC_ALL, NULL)); + } else { + label = talloc_array(screen, char, len + 1); + wcstombs(label, lang->label, len + 1); + } selected = config->lang && !strcmp(lang->name, config->lang); found |= selected; @@ -282,6 +334,10 @@ static void lang_screen_setup_widgets(struct lang_screen *screen, label, true); } + screen->widgets.save_l = widget_new_label(set, 0, 0, + _("Save changes?")); + screen->widgets.save_cb = widget_new_checkbox(set, 0, 0, false); + if (config->safe_mode) screen->widgets.safe_mode = widget_new_label(set, 0, 0, _("Selecting 'OK' will exit safe mode")); @@ -318,7 +374,7 @@ static void lang_screen_draw(struct lang_screen *screen, bool repost = false; int height; - height = ARRAY_SIZE(languages) + 4; + height = ARRAY_SIZE(languages) + N_FIELDS + 4; if (!screen->pad || getmaxy(screen->pad) < height) { if (screen->pad) delwin(screen->pad); @@ -384,7 +440,7 @@ struct lang_screen *lang_screen_init(struct cui *cui, _("Petitboot Language Selection")); screen->scr.frame.rtitle = NULL; screen->scr.frame.help = talloc_strdup(screen, - _("tab=next, shift+tab=previous, x=exit, h=help")); + _("tab=next, shift+tab=previous, x=exit")); nc_scr_frame_draw(&screen->scr); scrollok(screen->scr.sub_ncw, true);