X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-cui.c;h=2fc779e4140044de6b954ab2ccdea6b82a0176e2;hp=3c14f21bea32f55fc98d4cd433eba27fd6d0a66f;hb=6bb1301835dbd6ff54e1becb5b684fedb0e4caaf;hpb=e596e8e66b014161116c207daa8d42cff849bfd2 diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 3c14f21..2fc779e 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -37,11 +37,16 @@ #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" +#include "nc-subset.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. */ @@ -65,6 +70,16 @@ static void cui_start(void) */ define_key("\x1b[Z", KEY_BTAB); + /* We'll define a few other keys too since they're commonly + * used for navigation but the escape character will cause + * Petitboot to exit if they're left undefined */ + define_key("\x1b\x5b\x35\x7e", KEY_PPAGE); + define_key("\x1b\x5b\x36\x7e", KEY_NPAGE); + define_key("\x1b\x4f\x48", KEY_HOME); + define_key("\x1b\x4f\x46", KEY_END); + define_key("OH", KEY_HOME); + define_key("OF", KEY_END); + while (getch() != ERR) /* flush stdin */ (void)0; } @@ -265,6 +280,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)); @@ -288,6 +329,29 @@ void cui_show_help(struct cui *cui, const char *title, cui_set_current(cui, help_screen_scr(cui->help_screen)); } +static void cui_subset_exit(struct cui *cui) +{ + cui_set_current(cui, subset_screen_return_scr(cui->subset_screen)); + talloc_free(cui->subset_screen); + cui->subset_screen = NULL; +} + +void cui_show_subset(struct cui *cui, const char *title, + void *arg) +{ + if (!cui->current) + return; + + if (cui->subset_screen) + return; + + cui->subset_screen = subset_screen_init(cui, cui->current, + title, arg, cui_subset_exit); + + if (cui->subset_screen) + cui_set_current(cui, subset_screen_scr(cui->subset_screen)); +} + /** * cui_set_current - Set the currently active screen and redraw it. */ @@ -619,11 +683,41 @@ 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); @@ -638,6 +732,11 @@ 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); @@ -655,12 +754,24 @@ static int menu_config_execute(struct pmenu_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. */ @@ -670,7 +781,7 @@ static struct pmenu *main_menu_init(struct cui *cui) struct pmenu *m; int result; - m = pmenu_init(cui, 5, cui_on_exit); + m = pmenu_init(cui, 7, cui_on_exit); if (!m) { pb_log("%s: failed\n", __func__); return NULL; @@ -682,7 +793,7 @@ static struct pmenu *main_menu_init(struct cui *cui) "Petitboot (" PACKAGE_VERSION ")"); m->scr.frame.rtitle = NULL; m->scr.frame.help = talloc_strdup(m, - _("Enter=accept, e=edit, n=new, x=exit, h=help")); + _("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 */ @@ -699,13 +810,22 @@ static struct pmenu *main_menu_init(struct cui *cui) 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, 3); + 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, 4); + pmenu_item_insert(m, i, 6); result = pmenu_setup(m);