]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-cui.c
lib/process: replace pb_run_cmd_pipe
[petitboot] / ui / ncurses / nc-cui.c
index 167c2bb4eee4e13c996fc462ae2b56628ffe64a0..0dc8d4b9f378dbe8456b1f1498f178a09be55862 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include "config.h"
+
 #define _GNU_SOURCE
 
 #include <assert.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <locale.h>
 #include <sys/ioctl.h>
 
 #include "log/log.h"
 #include "pb-protocol/pb-protocol.h"
 #include "talloc/talloc.h"
 #include "waiter/waiter.h"
+#include "process/process.h"
 #include "ui/common/discover-client.h"
 #include "nc-cui.h"
 
@@ -158,6 +162,7 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor, enum boot_e
                pb_log("%s: updating opt '%s'\n", __func__, cod->name);
                pb_log(" image  '%s'\n", cod->bd->image);
                pb_log(" initrd '%s'\n", cod->bd->initrd);
+               pb_log(" dtb    '%s'\n", cod->bd->dtb);
                pb_log(" args   '%s'\n", cod->bd->args);
        }
 
@@ -199,6 +204,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.
  */
@@ -209,8 +227,21 @@ static int cui_process_key(void *arg)
 
        assert(cui->current);
 
-       ui_timer_disable(&cui->timer);
-       cui->current->process_key(cui->current);
+       if (!cui->has_input)
+               discover_client_cancel_default(cui->client);
+       cui->has_input = true;
+
+       for (;;) {
+               int c = getch();
+
+               if (c == ERR)
+                       break;
+
+               if (process_global_keys(cui, c))
+                       continue;
+
+               cui->current->process_key(cui->current, c);
+       }
 
        return 0;
 }
@@ -234,24 +265,6 @@ static int cui_process_js(void *arg)
        return 0;
 }
 
-/**
- * cui_handle_timeout - Handle the timeout.
- */
-
-static void cui_handle_timeout(struct ui_timer *timer)
-{
-       struct cui *cui = cui_from_timer(timer);
-       struct pmenu_item *i = pmenu_find_selected(cui->main);
-
-#if defined(DEBUG)
-       {
-               struct cui_opt_data *cod = cod_from_item(i);
-               assert(cod && (cod->opt_hash == cui->default_item));
-       }
-#endif
-       i->on_execute(i);
-}
-
 /**
  * cui_handle_resize - Handle the term resize.
  */
@@ -367,6 +380,7 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
 
        cod->bd->image = talloc_strdup(cod->bd, opt->boot_image_file);
        cod->bd->initrd = talloc_strdup(cod->bd, opt->initrd_file);
+       cod->bd->dtb = talloc_strdup(cod->bd, opt->dtb_file);
        cod->bd->args = talloc_strdup(cod->bd, opt->boot_args);
 
        pmenu_item_setup(cui->main, i, insert_pt, cod->name);
@@ -376,12 +390,6 @@ static int cui_boot_option_add(struct device *dev, struct boot_option *opt,
        pb_log("   initrd '%s'\n", cod->bd->initrd);
        pb_log("   args   '%s'\n", cod->bd->args);
 
-       /* If this is the default_item select it and start timer. */
-       if (cod->opt_hash == cui->default_item) {
-               selected = i->nci;
-               ui_timer_kick(&cui->timer);
-       }
-
        /* Re-attach the items array. */
        result = set_menu_items(cui->main->ncm, cui->main->items);
 
@@ -432,15 +440,9 @@ static void cui_device_remove(struct device *dev, void *arg)
 
        list_for_each_entry(&dev->boot_options, opt, list) {
                struct pmenu_item *i = pmenu_item_from_arg(opt->ui_info);
-               struct cui_opt_data *cod = cod_from_item(i);
 
-               assert(pb_protocol_device_cmp(dev, cod->dev));
+               assert(pb_protocol_device_cmp(dev, cod_from_item(i)->dev));
                pmenu_remove(cui->main, i);
-
-               /* If this is the default_item disable timer. */
-
-               if (cod->opt_hash == cui->default_item)
-                       ui_timer_disable(&cui->timer);
        }
 
        /* Re-attach the items array. */
@@ -504,9 +506,12 @@ struct cui *cui_init(void* platform_info,
 
        cui->c_sig = pb_cui_sig;
        cui->platform_info = platform_info;
-       cui->timer.handle_timeout = cui_handle_timeout;
        cui->waitset = waitset_create(cui);
 
+       process_init(cui, cui->waitset);
+
+       setlocale(LC_ALL, "");
+
        /* Loop here for scripts that just started the server. */
 
 retry_start:
@@ -549,7 +554,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) {
@@ -557,7 +562,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);
        }
 
@@ -592,7 +597,7 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item)
        while (1) {
                int result = waiter_poll(cui->waitset);
 
-               if (result < 0 && errno != EINTR) {
+               if (result < 0) {
                        pb_log("%s: poll: %s\n", __func__, strerror(errno));
                        break;
                }
@@ -600,8 +605,6 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item)
                if (cui->abort)
                        break;
 
-               ui_timer_process_sig(&cui->timer);
-
                while (cui->resize) {
                        cui->resize = 0;
                        cui_handle_resize(cui);