Add UI option --dry-run
[petitboot] / ui / ncurses / nc-cui.c
index 9951df3a4116416168270c90af1ad58b4a36432d..09e7a57fafe9454eb11cb24fa90fee11234718d1 100644 (file)
@@ -111,7 +111,7 @@ int cui_run_cmd(struct pmenu_item *item)
 
        def_prog_mode();
 
-       result = pb_run_cmd(cmd_argv);
+       result = pb_run_cmd(cmd_argv, 1);
 
        reset_prog_mode();
        redrawwin(cui->current->main_ncw);
@@ -230,6 +230,10 @@ struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr)
        return old;
 }
 
+/**
+ * cui_process_key - Process input on stdin.
+ */
+
 static int cui_process_key(void *arg)
 {
        struct cui *cui = cui_from_arg(arg);
@@ -242,6 +246,24 @@ static int cui_process_key(void *arg)
        return 0;
 }
 
+/**
+ * cui_process_js - Process joystick events.
+ */
+
+static int cui_process_js(void *arg)
+{
+       struct cui *cui = cui_from_arg(arg);
+       int c;
+
+       c = pjs_process_event(cui->pjs);
+
+       if (c) {
+               ungetch(c);
+               cui_process_key(arg);
+       }
+
+       return 0;
+}
 /**
  * cui_client_process_socket - Process a socket event from the discover server.
  */
@@ -511,7 +533,8 @@ static struct discover_client_ops cui_client_ops = {
  */
 
 struct cui *cui_init(void* platform_info,
-       int (*on_kexec)(struct cui *, struct cui_opt_data *))
+       int (*on_kexec)(struct cui *, struct cui_opt_data *),
+       int (*js_map)(const struct js_event *e), int start_deamon)
 {
        struct cui *cui;
        struct discover_client *client;
@@ -532,6 +555,7 @@ struct cui *cui_init(void* platform_info,
 
        /* Loop here for scripts that just started the server. */
 
+start_deamon:
        for (i = 10; i; i--) {
                client = discover_client_init(&cui_client_ops, cui);
                if (client)
@@ -540,6 +564,24 @@ struct cui *cui_init(void* platform_info,
                sleep(1);
        }
 
+       if (!client && start_deamon) {
+               int result;
+
+               start_deamon = 0;
+
+               result = pb_start_daemon();
+
+               if (!result)
+                       goto start_deamon;
+
+               pb_log("%s: discover_client_init failed.\n", __func__);
+               fprintf(stderr, "%s: error: discover_client_init failed.\n",
+                       __func__);
+               fprintf(stderr, "could not start pb-discover, the petitboot "
+                       "daemon.\n");
+               goto fail_client_init;
+       }
+
        if (!client) {
                pb_log("%s: discover_client_init failed.\n", __func__);
                fprintf(stderr, "%s: error: discover_client_init failed.\n",
@@ -557,6 +599,15 @@ struct cui *cui_init(void* platform_info,
 
        waiter_register(STDIN_FILENO, WAIT_IN, cui_process_key, cui);
 
+       if (js_map) {
+
+               cui->pjs = pjs_init(cui, js_map);
+
+               if (cui->pjs)
+                       waiter_register(pjs_get_fd(cui->pjs), WAIT_IN,
+                               cui_process_js, cui);
+       }
+
        return cui;
 
 fail_client_init: