ui/ncurses: Move menu initialisation to cui code
authorJeremy Kerr <jk@ozlabs.org>
Thu, 24 Jul 2014 07:13:24 +0000 (15:13 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Mon, 28 Jul 2014 05:50:35 +0000 (13:50 +0800)
We'll want to re-initialise the petitboot main menu (when the language
is changed), which we can't do if the items are populated entirely from
the main() function.

This change moves the menu initilisation to the cui code, we we can
re-init when necessary.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
po/POTFILES.in
po/en.po
ui/ncurses/Makefile.am
ui/ncurses/generic-main-help.c [deleted file]
ui/ncurses/generic-main.c
ui/ncurses/nc-cui-help.c [new file with mode: 0644]
ui/ncurses/nc-cui.c
ui/ncurses/nc-cui.h
ui/ncurses/nc-menu.c
ui/ncurses/nc-menu.h

index ba9f977a56ae69d621206ddff56800a7149b0884..7754f8b9c06d305fb2cbcc62af5225565c8c2db5 100644 (file)
@@ -7,7 +7,7 @@ ui/ncurses/nc-helpscreen.c
 ui/ncurses/nc-menu.c
 ui/ncurses/nc-sysinfo.c
 ui/ncurses/nc-textscreen.c
-ui/ncurses/generic-main-help.c
+ui/ncurses/nc-cui-help.c
 ui/ncurses/nc-boot-editor-help.c
 ui/ncurses/nc-config-help.c
 ui/ncurses/nc-sysinfo-help.c
index 6df54ebc2b8a85215d1e9230ffa5dd6ae61b53bf..d55b155594c4c8cf86dd63f41d24cdd3406a6dac 100644 (file)
--- a/po/en.po
+++ b/po/en.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: petitboot 20140623-g89bd2ed2-dirty\n"
 "Report-Msgid-Bugs-To: Geoff Levand <geoff@infradead.org>\n"
-"POT-Creation-Date: 2014-07-28 13:45+0800\n"
+"POT-Creation-Date: 2014-07-28 13:48+0800\n"
 "PO-Revision-Date: 2014-06-24 13:56+0800\n"
 "Last-Translator: Jeremy Kerr <jk@ozlabs.org>\n"
 "Language-Team: English\n"
@@ -166,6 +166,24 @@ msgstr "SAFE MODE: select '%s' to continue"
 msgid "Rescan devices"
 msgstr "Rescan devices"
 
+msgid "Enter=accept, e=edit, n=new, x=exit, h=help"
+msgstr "Enter=accept, e=edit, n=new, x=exit, h=help"
+
+msgid "Welcome to Petitboot"
+msgstr "Welcome to Petitboot"
+
+msgid "System information"
+msgstr "System information"
+
+msgid "System configuration"
+msgstr "System configuration"
+
+msgid "Exit to shell"
+msgstr "Exit to shell"
+
+msgid "main menu"
+msgstr "main menu"
+
 #, c-format
 msgid "%s: alloc cui failed.\n"
 msgstr "%s: alloc cui failed.\n"
@@ -390,21 +408,3 @@ msgstr ""
 
 msgid "Usage"
 msgstr "Usage"
-
-msgid "Enter=accept, e=edit, n=new, x=exit, h=help"
-msgstr "Enter=accept, e=edit, n=new, x=exit, h=help"
-
-msgid "Welcome to Petitboot"
-msgstr "Welcome to Petitboot"
-
-msgid "System information"
-msgstr "System information"
-
-msgid "System configuration"
-msgstr "System configuration"
-
-msgid "Exit to shell"
-msgstr "Exit to shell"
-
-msgid "main menu"
-msgstr "main menu"
index be4c417d69e650e234b42c61ee507b6f14d34c91..39cf597eee2b36284af28ae48a7a713e036be092 100644 (file)
@@ -35,6 +35,7 @@ libpbnc_la_SOURCES = \
        nc-config-help.c \
        nc-cui.c \
        nc-cui.h \
+       nc-cui-help.c \
        nc-boot-editor.c \
        nc-boot-editor.h \
        nc-boot-editor-help.c \
@@ -59,7 +60,7 @@ sbin_PROGRAMS += petitboot-ps3-nc
 endif
 
 
-petitboot_nc_SOURCES = generic-main.c generic-main-help.c
+petitboot_nc_SOURCES = generic-main.c
 petitboot_nc_LDADD = $(common_libs)
 
 petitboot_ps3_nc_SOURCES = ps3-main.c
diff --git a/ui/ncurses/generic-main-help.c b/ui/ncurses/generic-main-help.c
deleted file mode 100644 (file)
index ac690c5..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#include "nc-helpscreen.h"
-
-struct help_text main_menu_help_text = define_help_text(
-"From the main menu screen, select a boot option. The options displayed are \
-available on the system and the network.\n\
-\n\
-To select a boot option, press Enter.\n\
-\n\
-To make changes to an existing option, type E (edit).\n\
-\n\
-To add a new boot option, type N (new).\n\
-\n\
-To display information about the system, including the MAC addresses of each \
-network interface, type I (information).\n\
-\n\
-To make changes to the system configuration, type C (configure).\n\
-\n\
-To close the Petitboot interface, type X (exit).\n"
-);
index f253469f18832da67ff44102c6d3f5fbfa2616aa..669053c52aeb4f31f56a05897e26973245fce46c 100644 (file)
@@ -40,8 +40,6 @@
 #include "ui/common/discover-client.h"
 #include "nc-cui.h"
 
-extern const struct help_text main_menu_help_text;
-
 static void print_version(void)
 {
        printf("petitboot-nc (" PACKAGE_NAME ") " PACKAGE_VERSION "\n");
@@ -150,113 +148,23 @@ static char *default_log_filename(void)
 
        return name;
 }
-/**
+
+struct cui *cui;
+
+/*
  * struct pb_cui - Main cui program instance.
  * @mm: Main menu.
  * @svm: Set video mode menu.
  */
 
-struct pb_cui {
-       struct pmenu *mm;
-       struct cui *cui;
-};
-
-static int pmenu_sysinfo(struct pmenu_item *item)
-{
-       cui_show_sysinfo(cui_from_item(item));
-       return 0;
-}
-
-static int pmenu_config(struct pmenu_item *item)
-{
-       cui_show_config(cui_from_item(item));
-       return 0;
-}
-
-static int pmenu_reinit(struct pmenu_item *item)
-{
-       cui_send_reinit(cui_from_item(item));
-       return 0;
-}
-
-/**
- * pb_mm_init - Setup the main menu instance.
- */
-
-static struct pmenu *pb_mm_init(struct pb_cui *pb_cui)
-{
-       int result;
-       struct pmenu *m;
-       struct pmenu_item *i;
-
-       m = pmenu_init(pb_cui->cui, 5, 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, h=help"));
-       m->scr.frame.status = talloc_strdup(m, _("Welcome to Petitboot"));
-
-       i = pmenu_item_create(m, " ");
-       item_opts_off(i->nci, O_SELECTABLE);
-       pmenu_item_insert(m, i, 0);
-
-       i = pmenu_item_create(m, _("System information"));
-       i->on_execute = pmenu_sysinfo;
-       pmenu_item_insert(m, i, 1);
-
-       i = pmenu_item_create(m, _("System configuration"));
-       i->on_execute = pmenu_config;
-       pmenu_item_insert(m, i, 2);
-
-       i = pmenu_item_create(m, _("Rescan devices"));
-       i->on_execute = pmenu_reinit;
-       pmenu_item_insert(m, i, 3);
-
-       i = pmenu_item_create(m, _("Exit to shell"));
-       i->on_execute = pmenu_exit_cb;
-       pmenu_item_insert(m, i, 4);
-
-       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 pb_cui pb;
-
 static void sig_handler(int signum)
 {
        DBGS("%d\n", signum);
 
        switch (signum) {
        case SIGWINCH:
-               if (pb.cui)
-                       cui_resize(pb.cui);
+               if (cui)
+                       cui_resize(cui);
                break;
        default:
                assert(0 && "unknown sig");
@@ -264,8 +172,8 @@ static void sig_handler(int signum)
        case SIGINT:
        case SIGHUP:
        case SIGTERM:
-               if (pb.cui)
-                       cui_abort(pb.cui);
+               if (cui)
+                       cui_abort(cui);
                break;
        }
 }
@@ -336,18 +244,13 @@ int main(int argc, char *argv[])
                return EXIT_FAILURE;
        }
 
-       pb.cui = cui_init(&pb, NULL, opts.start_daemon);
-
-       if (!pb.cui)
+       cui = cui_init(NULL, NULL, opts.start_daemon);
+       if (!cui)
                return EXIT_FAILURE;
 
-       pb.mm = pb_mm_init(&pb);
-
-       cui_result = cui_run(pb.cui, pb.mm, 0);
-
-       pmenu_delete(pb.mm);
+       cui_result = cui_run(cui);
 
-       talloc_free(pb.cui);
+       talloc_free(cui);
 
        pb_log("--- end ---\n");
 
diff --git a/ui/ncurses/nc-cui-help.c b/ui/ncurses/nc-cui-help.c
new file mode 100644 (file)
index 0000000..ac690c5
--- /dev/null
@@ -0,0 +1,20 @@
+
+#include "nc-helpscreen.h"
+
+struct help_text main_menu_help_text = define_help_text(
+"From the main menu screen, select a boot option. The options displayed are \
+available on the system and the network.\n\
+\n\
+To select a boot option, press Enter.\n\
+\n\
+To make changes to an existing option, type E (edit).\n\
+\n\
+To add a new boot option, type N (new).\n\
+\n\
+To display information about the system, including the MAC addresses of each \
+network interface, type I (information).\n\
+\n\
+To make changes to the system configuration, type C (configure).\n\
+\n\
+To close the Petitboot interface, type X (exit).\n"
+);
index 761edb39e905ee5d7c5e51601be734759239cafb..3c14f21bea32f55fc98d4cd433eba27fd6d0a66f 100644 (file)
@@ -40,6 +40,8 @@
 #include "nc-sysinfo.h"
 #include "nc-helpscreen.h"
 
+extern const struct help_text main_menu_help_text;
+
 static void cui_start(void)
 {
        initscr();                      /* Initialize ncurses. */
@@ -641,6 +643,92 @@ 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_reinit_execute(struct pmenu_item *item)
+{
+       cui_send_reinit(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, 5, 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, 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);
+
+       i = pmenu_item_create(m, _("Rescan devices"));
+       i->on_execute = menu_reinit_execute;
+       pmenu_item_insert(m, i, 3);
+
+       i = pmenu_item_create(m, _("Exit to shell"));
+       i->on_execute = pmenu_exit_cb;
+       pmenu_item_insert(m, i, 4);
+
+       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 +755,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 +810,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 +844,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);
 
index e9e4d38b320ce8063b8c881687a9ae69b38b74bb..417126f8d57b38d99b4b3772ac7fc7bc9f13c977 100644 (file)
@@ -71,7 +71,7 @@ struct cui *cui_init(void* platform_info,
                int (*js_map)(const struct js_event *e),
                int start_deamon);
 struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr);
-int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item);
+int cui_run(struct cui *cui);
 void cui_item_edit(struct pmenu_item *item);
 void cui_item_new(struct pmenu *menu);
 void cui_show_sysinfo(struct cui *cui);
index 531ea2d9e90bd69855305ec6bbedaf2be00c61b4..a77ea98ec87af303b99de9ae5959309e47cea049 100644 (file)
@@ -492,6 +492,19 @@ int pmenu_remove(struct pmenu *menu, struct pmenu_item *item)
        return 0;
 }
 
+static int pmenu_destructor(void *ptr)
+{
+       struct pmenu *menu = ptr;
+       assert(menu->scr.sig == pb_pmenu_sig);
+       menu->scr.sig = pb_removed_sig;
+
+       unpost_menu(menu->ncm);
+       free_menu(menu->ncm);
+       delwin(menu->scr.sub_ncw);
+       delwin(menu->scr.main_ncw);
+       return 0;
+}
+
 /**
  * pmenu_init - Allocate and initialize a new menu instance.
  *
@@ -504,14 +517,13 @@ struct pmenu *pmenu_init(void *ui_ctx, unsigned int item_count,
        void (*on_exit)(struct pmenu *))
 {
        struct pmenu *menu = talloc_zero(ui_ctx, struct pmenu);
-
        if (!menu)
                return NULL;
 
-       /* note items array has a null terminator */
+       talloc_set_destructor(menu, pmenu_destructor);
 
+       /* note items array has a null terminator */
        menu->items = talloc_zero_array(menu, ITEM *, item_count + 1);
-
        if (!menu->items) {
                talloc_free(menu);
                return NULL;
@@ -555,19 +567,3 @@ int pmenu_setup(struct pmenu *menu)
        return 0;
 }
 
-/**
- * pmenu_delete - Delete a menu instance.
- *
- */
-
-void pmenu_delete(struct pmenu *menu)
-{
-       assert(menu->scr.sig == pb_pmenu_sig);
-       menu->scr.sig = pb_removed_sig;
-
-       unpost_menu(menu->ncm);
-       free_menu(menu->ncm);
-       delwin(menu->scr.sub_ncw);
-       delwin(menu->scr.main_ncw);
-       talloc_free(menu);
-}
index 2f66bbb2030b603a9a7f1e8c21bb9becee3b5852..136bf666886020c4cec5e4c6351b97213a58df70 100644 (file)
@@ -97,7 +97,6 @@ struct pmenu {
 struct pmenu *pmenu_init(void *ui_ctx, unsigned int item_count,
        void (*on_exit)(struct pmenu *));
 int pmenu_setup(struct pmenu *menu);
-void pmenu_delete(struct pmenu *menu);
 unsigned int pmenu_grow(struct pmenu *menu, unsigned int count);
 int pmenu_remove(struct pmenu *menu, struct pmenu_item *item);
 struct pmenu_item *pmenu_find_selected(struct pmenu *menu);