]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-cui.c
ui/ncurses: Receive config messages
[petitboot] / ui / ncurses / nc-cui.c
index e02c6a66b2a19669a9d6de229a18ee348a2069ed..6aa2a2869cf0b971c9e41fd6684cf4ba1f5838c5 100644 (file)
 #include "process/process.h"
 #include "ui/common/discover-client.h"
 #include "nc-cui.h"
+#include "nc-sysinfo.h"
 
 static struct cui_opt_data *cod_from_item(struct pmenu_item *item)
 {
        return item->data;
 }
 
+static void cui_start(void)
+{
+       initscr();                      /* Initialize ncurses. */
+       cbreak();                       /* Disable line buffering. */
+       noecho();                       /* Disable getch() echo. */
+       keypad(stdscr, TRUE);           /* Enable num keypad keys. */
+       nonl();                         /* Disable new-line translation. */
+       intrflush(stdscr, FALSE);       /* Disable interrupt flush. */
+       curs_set(0);                    /* Make cursor invisible */
+       nodelay(stdscr, TRUE);          /* Enable non-blocking getch() */
+
+       /* We may be operating with an incorrect $TERM type; in this case
+        * the keymappings will be slightly broken. We want at least
+        * backspace to work though, so we'll define both DEL and ^H to
+        * map to backspace */
+       define_key("\x7f", KEY_BACKSPACE);
+       define_key("\x08", KEY_BACKSPACE);
+
+       while (getch() != ERR)          /* flush stdin */
+               (void)0;
+}
+
+static void cui_atexit(void)
+{
+       clear();
+       refresh();
+       endwin();
+}
+
 /**
  * cui_abort - Signal the main cui program loop to exit.
  *
@@ -172,7 +202,7 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor,
 
                /* Re-attach the items array. */
                set_menu_items(menu->ncm, menu->items);
-               menu->scr.post(&menu->scr);
+               nc_scr_post(&menu->scr);
        } else {
                cod = item->data;
        }
@@ -207,6 +237,20 @@ void cui_item_new(struct pmenu *menu)
        cui_set_current(cui, &boot_editor->scr);
 }
 
+static void cui_sysinfo_exit(struct cui *cui)
+{
+       cui_set_current(cui, &cui->main->scr);
+       talloc_free(cui->sysinfo_screen);
+       cui->sysinfo_screen = NULL;
+}
+
+void cui_show_sysinfo(struct cui *cui)
+{
+       cui->sysinfo_screen = sysinfo_screen_init(cui, cui->sysinfo,
+                       cui_sysinfo_exit);
+       cui_set_current(cui, sysinfo_screen_scr(cui->sysinfo_screen));
+}
+
 /**
  * cui_set_current - Set the currently active screen and redraw it.
  */
@@ -220,10 +264,11 @@ struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr)
        assert(cui->current != scr);
 
        old = cui->current;
-       old->unpost(old);
+       nc_scr_unpost(old);
 
        cui->current = scr;
-       cui->current->post(cui->current);
+
+       nc_scr_post(cui->current);
 
        return old;
 }
@@ -336,7 +381,7 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
        selected = current_item(cui->main->ncm);
 
        if (cui->current == &cui->main->scr)
-               cui->current->unpost(cui->current);
+               nc_scr_unpost(cui->current);
 
        /* This disconnects items array from menu. */
 
@@ -392,7 +437,7 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
        set_current_item(cui->main->ncm, selected);
 
        if (cui->current == &cui->main->scr)
-               cui->current->post(cui->current);
+               nc_scr_post(cui->current);
 
        return 0;
 }
@@ -413,7 +458,7 @@ static void cui_device_remove(struct device *dev, void *arg)
        pb_log("%s: %p %s\n", __func__, dev, dev->id);
 
        if (cui->current == &cui->main->scr)
-               cui->current->unpost(cui->current);
+               nc_scr_unpost(cui->current);
 
        /* This disconnects items array from menu. */
 
@@ -443,7 +488,7 @@ static void cui_device_remove(struct device *dev, void *arg)
        }
 
        if (cui->current == &cui->main->scr)
-               cui->current->post(cui->current);
+               nc_scr_post(cui->current);
 }
 
 static void cui_update_status(struct boot_status *status, void *arg)
@@ -469,22 +514,35 @@ static void cui_update_mm_title(struct cui *cui)
                                " %s", cui->sysinfo->identifier);
 
        if (cui->current == &cui->main->scr)
-               cui->current->post(cui->current);
+               nc_scr_post(cui->current);
 }
 
 static void cui_update_sysinfo(struct system_info *sysinfo, void *arg)
 {
        struct cui *cui = cui_from_arg(arg);
        cui->sysinfo = talloc_steal(cui, sysinfo);
+
+       /* if we're currently displaying the system info screen, inform it
+        * of the updated information. */
+       if (cui->sysinfo_screen)
+               sysinfo_screen_update(cui->sysinfo_screen, sysinfo);
+
        cui_update_mm_title(cui);
 }
 
+static void cui_update_config(struct config *config, void *arg)
+{
+       struct cui *cui = cui_from_arg(arg);
+       cui->config = talloc_steal(cui, config);
+}
+
 static struct discover_client_ops cui_client_ops = {
        .device_add = NULL,
        .boot_option_add = cui_boot_option_add,
        .device_remove = cui_device_remove,
        .update_status = cui_update_status,
        .update_sysinfo = cui_update_sysinfo,
+       .update_config = cui_update_config,
 };
 
 /**
@@ -558,8 +616,8 @@ retry_start:
                goto fail_client_init;
        }
 
-       atexit(nc_atexit);
-       nc_start();
+       atexit(cui_atexit);
+       cui_start();
 
        waiter_register_io(cui->waitset, STDIN_FILENO, WAIT_IN,
                        cui_process_key, cui);
@@ -599,7 +657,7 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item)
        cui->current = &cui->main->scr;
        cui->default_item = default_item;
 
-       cui->current->post(cui->current);
+       nc_scr_post(cui->current);
 
        while (1) {
                int result = waiter_poll(cui->waitset);
@@ -618,7 +676,7 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item)
                }
        }
 
-       nc_atexit();
+       cui_atexit();
 
        return cui->abort ? 0 : -1;
 }