]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-cui.c
lib/waiter: Add timeout waiters
[petitboot] / ui / ncurses / nc-cui.c
index f1656370310fc969a201d2848ea196db4e750a2e..ef3fd23b8474711a65d1b78d77845d1cf22c7acb 100644 (file)
@@ -60,35 +60,6 @@ void cui_resize(struct cui *cui)
        cui->resize = 1;
 }
 
-/**
- * cui_make_item_name - Format the menu item name srting.
- *
- * Returns a talloc string.
- */
-
-static char *cui_make_item_name(struct pmenu_item *i, struct cui_opt_data *cod)
-{
-       char *name;
-
-       assert(cod->name);
-       assert(cod->bd);
-
-       name = talloc_asprintf(i, "%s:", cod->name);
-
-       if (cod->bd->image)
-               name = talloc_asprintf_append(name, " %s", cod->bd->image);
-
-       if (cod->bd->initrd)
-               name = talloc_asprintf_append(name, " initrd=%s",
-                       cod->bd->initrd);
-
-       if (cod->bd->args)
-               name = talloc_asprintf_append(name, " %s", cod->bd->args);
-
-       DBGS("@%s@\n", name);
-       return name;
-}
-
 /**
  * cui_on_exit - A generic main menu ESC callback.
  */
@@ -138,6 +109,11 @@ static int cui_boot(struct pmenu_item *item)
        assert(cui->current == &cui->main->scr);
 
        pb_log("%s: %s\n", __func__, cod->name);
+       if (!cod->opt) {
+               pb_log("%s: missing opt?\n", __func__);
+               return -1;
+       }
+
        nc_scr_status_printf(cui->current, "Booting %s...", cod->name);
 
        def_prog_mode();
@@ -167,7 +143,6 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor, enum boot_e
        if (boot_editor_result == boot_editor_update) {
                struct pmenu_item *i = pmenu_find_selected(cui->main);
                struct cui_opt_data *cod = cod_from_item(i);
-               char *name;
 
                assert(bd);
 
@@ -175,8 +150,7 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor, enum boot_e
                talloc_free(cod->bd);
                cod->bd = bd;
 
-               name = cui_make_item_name(i, cod);
-               pmenu_item_replace(i, name);
+               pmenu_item_replace(i, cod->name);
 
                /* FIXME: need to make item visible somehow */
                set_current_item(cui->main->ncm, i->nci);
@@ -225,6 +199,19 @@ struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr)
        return old;
 }
 
+static bool process_global_keys(struct cui *cui, int key)
+{
+       switch (key) {
+       case 0xc:
+               if (cui->current && cui->current->main_ncw) {
+                       redrawwin(cui->current->main_ncw);
+                       wrefresh(cui->current->main_ncw);
+               }
+               return true;
+       }
+       return false;
+}
+
 /**
  * cui_process_key - Process input on stdin.
  */
@@ -236,7 +223,17 @@ static int cui_process_key(void *arg)
        assert(cui->current);
 
        ui_timer_disable(&cui->timer);
-       cui->current->process_key(cui->current);
+       for (;;) {
+               int c = getch();
+
+               if (c == ERR)
+                       break;
+
+               if (process_global_keys(cui, c))
+                       continue;
+
+               cui->current->process_key(cui->current, c);
+       }
 
        return 0;
 }
@@ -358,7 +355,6 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
        unsigned int insert_pt;
        struct pmenu_item *i;
        ITEM *selected;
-       char *name;
        int result;
 
        pb_log("%s: %p %s\n", __func__, opt, opt->id);
@@ -396,8 +392,7 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
        cod->bd->initrd = talloc_strdup(cod->bd, opt->initrd_file);
        cod->bd->args = talloc_strdup(cod->bd, opt->boot_args);
 
-       name = cui_make_item_name(i, cod);
-       pmenu_item_setup(cui->main, i, insert_pt, name);
+       pmenu_item_setup(cui->main, i, insert_pt, cod->name);
 
        pb_log("%s: adding opt '%s'\n", __func__, cod->name);
        pb_log("   image  '%s'\n", cod->bd->image);
@@ -577,7 +572,7 @@ retry_start:
        atexit(nc_atexit);
        nc_start();
 
-       waiter_register(cui->waitset, STDIN_FILENO, WAIT_IN,
+       waiter_register_io(cui->waitset, STDIN_FILENO, WAIT_IN,
                        cui_process_key, cui);
 
        if (js_map) {
@@ -585,7 +580,7 @@ retry_start:
                cui->pjs = pjs_init(cui, js_map);
 
                if (cui->pjs)
-                       waiter_register(cui->waitset, pjs_get_fd(cui->pjs),
+                       waiter_register_io(cui->waitset, pjs_get_fd(cui->pjs),
                                        WAIT_IN, cui_process_js, cui);
        }