summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/ncurses/Makefile.am3
-rw-r--r--ui/ncurses/generic-main.c121
-rw-r--r--ui/ncurses/nc-cui-help.c (renamed from ui/ncurses/generic-main-help.c)0
-rw-r--r--ui/ncurses/nc-cui.c98
-rw-r--r--ui/ncurses/nc-cui.h2
-rw-r--r--ui/ncurses/nc-menu.c34
-rw-r--r--ui/ncurses/nc-menu.h1
7 files changed, 124 insertions, 135 deletions
diff --git a/ui/ncurses/Makefile.am b/ui/ncurses/Makefile.am
index be4c417..39cf597 100644
--- a/ui/ncurses/Makefile.am
+++ b/ui/ncurses/Makefile.am
@@ -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.c b/ui/ncurses/generic-main.c
index f253469..669053c 100644
--- a/ui/ncurses/generic-main.c
+++ b/ui/ncurses/generic-main.c
@@ -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/generic-main-help.c b/ui/ncurses/nc-cui-help.c
index ac690c5..ac690c5 100644
--- a/ui/ncurses/generic-main-help.c
+++ b/ui/ncurses/nc-cui-help.c
diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c
index 761edb3..3c14f21 100644
--- a/ui/ncurses/nc-cui.c
+++ b/ui/ncurses/nc-cui.c
@@ -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);
diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h
index e9e4d38..417126f 100644
--- a/ui/ncurses/nc-cui.h
+++ b/ui/ncurses/nc-cui.h
@@ -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);
diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c
index 531ea2d..a77ea98 100644
--- a/ui/ncurses/nc-menu.c
+++ b/ui/ncurses/nc-menu.c
@@ -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);
-}
diff --git a/ui/ncurses/nc-menu.h b/ui/ncurses/nc-menu.h
index 2f66bbb..136bf66 100644
--- a/ui/ncurses/nc-menu.h
+++ b/ui/ncurses/nc-menu.h
@@ -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);
OpenPOWER on IntegriCloud