X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-cui.c;h=3f1e0a265176c0377315448d6398a074ea6ae88f;hp=cd7952f860545e90cdf1245035b0b7b69868a57a;hb=bcb8d5ce5b43c1866b4520a1e8c4bd75ea141c58;hpb=4e30f260106ac5f7007e213db1d1e54298393290 diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index cd7952f..3f1e0a2 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -37,9 +37,15 @@ #include "nc-cui.h" #include "nc-boot-editor.h" #include "nc-config.h" +#include "nc-add-url.h" #include "nc-sysinfo.h" +#include "nc-lang.h" #include "nc-helpscreen.h" +extern const struct help_text main_menu_help_text; + +static struct pmenu *main_menu_init(struct cui *cui); + static void cui_start(void) { initscr(); /* Initialize ncurses. */ @@ -263,6 +269,32 @@ void cui_show_config(struct cui *cui) cui_set_current(cui, config_screen_scr(cui->config_screen)); } +static void cui_lang_exit(struct cui *cui) +{ + cui_set_current(cui, &cui->main->scr); + talloc_free(cui->lang_screen); + cui->lang_screen = NULL; +} + +void cui_show_lang(struct cui *cui) +{ + cui->lang_screen = lang_screen_init(cui, cui->config, cui_lang_exit); + cui_set_current(cui, lang_screen_scr(cui->lang_screen)); +} + +static void cui_add_url_exit(struct cui *cui) +{ + cui_set_current(cui, &cui->main->scr); + talloc_free(cui->add_url_screen); + cui->add_url_screen = NULL; +} + +void cui_show_add_url(struct cui *cui) +{ + cui->add_url_screen = add_url_screen_init(cui, cui_add_url_exit); + cui_set_current(cui, add_url_screen_scr(cui->add_url_screen)); +} + static void cui_help_exit(struct cui *cui) { cui_set_current(cui, help_screen_return_scr(cui->help_screen)); @@ -617,18 +649,48 @@ static void cui_update_sysinfo(struct system_info *sysinfo, void *arg) cui_update_mm_title(cui); } +static void cui_update_language(struct cui *cui, char *lang) +{ + bool repost_menu; + char *cur_lang; + + cur_lang = setlocale(LC_ALL, NULL); + if (cur_lang && !strcmp(cur_lang, lang)) + return; + + setlocale(LC_ALL, lang); + + /* we'll need to update the menu: drop all items and repopulate */ + repost_menu = cui->current == &cui->main->scr; + if (repost_menu) + nc_scr_unpost(cui->current); + + talloc_free(cui->main); + cui->main = main_menu_init(cui); + + if (repost_menu) { + cui->current = &cui->main->scr; + nc_scr_post(cui->current); + } + + discover_client_enumerate(cui->client); +} + static void cui_update_config(struct config *config, void *arg) { struct cui *cui = cui_from_arg(arg); cui->config = talloc_steal(cui, config); + if (config->lang) + cui_update_language(cui, config->lang); + if (cui->config_screen) config_screen_update(cui->config_screen, config, cui->sysinfo); if (config->safe_mode) nc_scr_status_printf(cui->current, - "SAFE MODE: select '%s' to continue", - "Rescan devices"); + _("SAFE MODE: select '%s' to continue"), + _("Rescan devices")); } int cui_send_config(struct cui *cui, struct config *config) @@ -636,11 +698,123 @@ int cui_send_config(struct cui *cui, struct config *config) return discover_client_send_config(cui->client, config); } +int cui_send_url(struct cui *cui, char * url) +{ + return discover_client_send_url(cui->client, url); +} + void cui_send_reinit(struct cui *cui) { discover_client_send_reinit(cui->client); } +static int menu_sysinfo_execute(struct pmenu_item *item) +{ + cui_show_sysinfo(cui_from_item(item)); + return 0; +} + +static int menu_config_execute(struct pmenu_item *item) +{ + cui_show_config(cui_from_item(item)); + return 0; +} + +static int menu_lang_execute(struct pmenu_item *item) +{ + cui_show_lang(cui_from_item(item)); + return 0; +} + +static int menu_reinit_execute(struct pmenu_item *item) +{ + cui_send_reinit(cui_from_item(item)); + return 0; +} + +static int menu_add_url_execute(struct pmenu_item *item) +{ + cui_show_add_url(cui_from_item(item)); + return 0; +} + +/** + * pb_mm_init - Setup the main menu instance. + */ +static struct pmenu *main_menu_init(struct cui *cui) +{ + struct pmenu_item *i; + struct pmenu *m; + int result; + + m = pmenu_init(cui, 7, cui_on_exit); + if (!m) { + pb_log("%s: failed\n", __func__); + return NULL; + } + + m->on_new = cui_item_new; + + m->scr.frame.ltitle = talloc_asprintf(m, + "Petitboot (" PACKAGE_VERSION ")"); + m->scr.frame.rtitle = NULL; + m->scr.frame.help = talloc_strdup(m, + _("Enter=accept, e=edit, n=new, x=exit, l=language, h=help")); + m->scr.frame.status = talloc_strdup(m, _("Welcome to Petitboot")); + + /* add a separator */ + i = pmenu_item_create(m, " "); + item_opts_off(i->nci, O_SELECTABLE); + pmenu_item_insert(m, i, 0); + + /* add system items */ + i = pmenu_item_create(m, _("System information")); + i->on_execute = menu_sysinfo_execute; + pmenu_item_insert(m, i, 1); + + i = pmenu_item_create(m, _("System configuration")); + i->on_execute = menu_config_execute; + pmenu_item_insert(m, i, 2); + + /* this label isn't translated, so we don't want a gettext() here */ + i = pmenu_item_create(m, "Language"); + i->on_execute = menu_lang_execute; + pmenu_item_insert(m, i, 3); + + i = pmenu_item_create(m, _("Rescan devices")); + i->on_execute = menu_reinit_execute; + pmenu_item_insert(m, i, 4); + + i = pmenu_item_create(m, _("Retrieve config from URL")); + i->on_execute = menu_add_url_execute; + pmenu_item_insert(m, i, 5); + + i = pmenu_item_create(m, _("Exit to shell")); + i->on_execute = pmenu_exit_cb; + pmenu_item_insert(m, i, 6); + + result = pmenu_setup(m); + + if (result) { + pb_log("%s:%d: pmenu_setup failed: %s\n", __func__, __LINE__, + strerror(errno)); + goto fail_setup; + } + + m->help_title = _("main menu"); + m->help_text = &main_menu_help_text; + + menu_opts_off(m->ncm, O_SHOWDESC); + set_menu_mark(m->ncm, " *"); + set_current_item(m->ncm, i->nci); + + return m; + +fail_setup: + talloc_free(m); + return NULL; +} + static struct discover_client_ops cui_client_ops = { .device_add = NULL, .boot_option_add = cui_boot_option_add, @@ -667,7 +841,6 @@ struct cui *cui_init(void* platform_info, unsigned int i; cui = talloc_zero(NULL, struct cui); - if (!cui) { pb_log("%s: alloc cui failed.\n", __func__); fprintf(stderr, _("%s: alloc cui failed.\n"), __func__); @@ -723,6 +896,10 @@ retry_start: talloc_steal(cui, cui->client); cui_start(); + cui->main = main_menu_init(cui); + if (!cui->main) + goto fail_client_init; + waiter_register_io(cui->waitset, STDIN_FILENO, WAIT_IN, cui_process_key, cui); @@ -753,13 +930,12 @@ fail_alloc: * Returns 0 on success (return to shell), -1 on error (should restart). */ -int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item) +int cui_run(struct cui *cui) { assert(main); - cui->main = main; cui->current = &cui->main->scr; - cui->default_item = default_item; + cui->default_item = 0; nc_scr_post(cui->current);