X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-cui.c;h=09e7a57fafe9454eb11cb24fa90fee11234718d1;hp=9951df3a4116416168270c90af1ad58b4a36432d;hb=59e81c46a962da51e51474e9b36258ff0e04ae42;hpb=4341aeae5ace4f8137334d6e8fa885d546fd3216 diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 9951df3..09e7a57 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -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: