X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-cui.c;h=4f7b121b21ec760be378de3b4ccf78cf94ec11e6;hp=342b60342ad5adc5b39f540ce89f79e096782240;hb=63575c2045b1505da7a2abca8a51a4a7aa3df6f7;hpb=488fa97839822949f855de1efa3cf47756b7f72b diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 342b603..4f7b121 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -16,18 +16,22 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #define _GNU_SOURCE #include #include #include #include +#include #include #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" @@ -77,13 +81,13 @@ int cui_run_cmd(struct pmenu_item *item) { int result; struct cui *cui = cui_from_item(item); - const char *const *cmd_argv = item->data; + const char **cmd_argv = item->data; nc_scr_status_printf(cui->current, "Running %s...", cmd_argv[0]); def_prog_mode(); - result = pb_run_cmd(cmd_argv, 1, 0); + result = process_run_simple_argv(item, cmd_argv); reset_prog_mode(); redrawwin(cui->current->main_ncw); @@ -109,6 +113,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(); @@ -153,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); } @@ -194,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. */ @@ -204,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; } @@ -229,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. */ @@ -362,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); @@ -371,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); @@ -427,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. */ @@ -499,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, false); + + setlocale(LC_ALL, ""); + /* Loop here for scripts that just started the server. */ retry_start: @@ -519,7 +529,7 @@ retry_start: start_deamon = 0; - result = pb_start_daemon(); + result = pb_start_daemon(cui); if (!result) goto retry_start; @@ -544,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) { @@ -552,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); } @@ -587,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; } @@ -595,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);