diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-10-10 15:35:35 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-10-10 16:08:54 +0800 |
commit | 6d1eff1e8e1db12e7aa179e8dc9c65050c045536 (patch) | |
tree | 18f70566adb3c146840f7964c8877b51a1cefde0 /ui/ncurses/nc-boot-editor.c | |
parent | 97c5d1f5d56d9ce890b4896ad7a9dc7ece7d4347 (diff) | |
download | talos-petitboot-6d1eff1e8e1db12e7aa179e8dc9c65050c045536.tar.gz talos-petitboot-6d1eff1e8e1db12e7aa179e8dc9c65050c045536.zip |
ui/ncurses: Defer item creation until boot editor is done
Currently, when creating new menu entries, we create an empty item, add
it to the menu, then run the boot editor. This means that cancelling the
edit will leave an empty item in the menu.
This change defers the creation until the boot editor is done. To do
this, we modify the on_open callback to take a menu rather than an item,
and pass NULL boot data to the editor.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'ui/ncurses/nc-boot-editor.c')
-rw-r--r-- | ui/ncurses/nc-boot-editor.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/ui/ncurses/nc-boot-editor.c b/ui/ncurses/nc-boot-editor.c index 100830c..8fe3365 100644 --- a/ui/ncurses/nc-boot-editor.c +++ b/ui/ncurses/nc-boot-editor.c @@ -213,16 +213,14 @@ static void boot_editor_process_key(struct nc_scr *scr, int key) /* hot keys */ case 27: /* ESC */ - boot_editor->on_exit(boot_editor, - boot_editor_cancel, NULL); + boot_editor->on_exit(boot_editor, boot_editor_cancel, NULL); nc_flush_keys(); return; case '\n': case '\r': form_driver(boot_editor->ncf, REQ_VALIDATION); bd = boot_editor_prepare_data(boot_editor); - boot_editor->on_exit(boot_editor, - boot_editor_update, bd); + boot_editor->on_exit(boot_editor, boot_editor_update, bd); nc_flush_keys(); return; @@ -310,30 +308,27 @@ static FIELD *boot_editor_setup_label(unsigned int y, unsigned int x, char *str) return f; } -struct boot_editor *boot_editor_init(void *ui_ctx, +struct boot_editor *boot_editor_init(struct pmenu *menu, const struct pb_boot_data *bd, void (*on_exit)(struct boot_editor *, enum boot_editor_result, struct pb_boot_data *)) { + char *image, *initrd, *dtb, *args; struct boot_editor *boot_editor; - pb_log("%s: image: '%s'\n", __func__, bd->image); - pb_log("%s: initrd: '%s'\n", __func__, bd->initrd); - pb_log("%s: dtb: '%s'\n", __func__, bd->dtb); - pb_log("%s: args: '%s'\n", __func__, bd->args); - assert(on_exit); - boot_editor = talloc_zero(ui_ctx, struct boot_editor); + boot_editor = talloc_zero(menu, struct boot_editor); if (!boot_editor) return NULL; talloc_set_destructor(boot_editor, boot_editor_destructor); + boot_editor->original_pmenu = menu; nc_scr_init(&boot_editor->scr, pb_boot_editor_sig, 0, - ui_ctx, boot_editor_process_key, + menu, boot_editor_process_key, boot_editor_post, boot_editor_unpost, boot_editor_resize); boot_editor->scr.frame.ltitle = talloc_strdup(boot_editor, @@ -346,10 +341,19 @@ struct boot_editor *boot_editor_init(void *ui_ctx, boot_editor->fields = talloc_array(boot_editor, FIELD *, 9); - boot_editor->fields[0] = boot_editor_setup_field(0, 9, bd->image); - boot_editor->fields[1] = boot_editor_setup_field(1, 9, bd->initrd); - boot_editor->fields[2] = boot_editor_setup_field(2, 9, bd->dtb); - boot_editor->fields[3] = boot_editor_setup_field(3, 9, bd->args); + if (bd) { + image = bd->image; + initrd = bd->initrd; + dtb = bd->dtb; + args = bd->args; + } else { + image = initrd = dtb = args = ""; + } + + boot_editor->fields[0] = boot_editor_setup_field(0, 9, image); + boot_editor->fields[1] = boot_editor_setup_field(1, 9, initrd); + boot_editor->fields[2] = boot_editor_setup_field(2, 9, dtb); + boot_editor->fields[3] = boot_editor_setup_field(3, 9, args); boot_editor->fields[4] = boot_editor_setup_label(0, 1, "image:"); boot_editor->fields[5] = boot_editor_setup_label(1, 1, "initrd:"); boot_editor->fields[6] = boot_editor_setup_label(2, 1, "dtb:"); |