+ if (boot_editor->use_signature_files)
+ if (bd->args_sig_file && !path_on_device(bd_info,
+ bd->args_sig_file))
+ return;
+
+ /* ok, we match; preselect the device option, and remove the common
+ * prefix */
+ boot_editor->selected_device = bd_info->name;
+ boot_editor->image += len;
+
+ if (boot_editor->initrd)
+ boot_editor->initrd += len;
+ if (boot_editor->dtb)
+ boot_editor->dtb += len;
+ if (boot_editor->use_signature_files)
+ if (boot_editor->args_sig_file)
+ boot_editor->args_sig_file += len;
+}
+
+static void boot_editor_setup_widgets(struct boot_editor *boot_editor,
+ const struct system_info *sysinfo)
+{
+ struct nc_widgetset *set = boot_editor->widgetset;
+ int field_size;
+
+ field_size = COLS - 1 - boot_editor->field_x;
+
+ boot_editor->widgets.device_l = widget_new_label(set, 0, 0,
+ _("Device:"));
+ boot_editor->widgets.device_f = widget_new_select(set, 0, 0,
+ field_size);
+ widget_select_on_change(boot_editor->widgets.device_f,
+ boot_editor_device_select_change, boot_editor);
+
+ boot_editor_populate_device_select(boot_editor, sysinfo);
+
+ boot_editor->widgets.image_l = widget_new_label(set, 0, 0,
+ _("Kernel:"));
+ boot_editor->widgets.image_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->image);
+
+ boot_editor->widgets.initrd_l = widget_new_label(set, 0, 0,
+ _("Initrd:"));
+ boot_editor->widgets.initrd_f = widget_new_textbox(set, 0, 0,
+ field_size,
+ boot_editor->initrd);
+
+ boot_editor->widgets.dtb_l = widget_new_label(set, 0, 0,
+ _("Device tree:"));
+ boot_editor->widgets.dtb_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->dtb);
+
+ boot_editor->widgets.args_l = widget_new_label(set, 0, 0,
+ _("Boot arguments:"));
+ boot_editor->widgets.args_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->args);
+
+ if (boot_editor->use_signature_files) {
+ boot_editor->widgets.args_sig_file_l = widget_new_label(set,
+ 0, 0, _("Argument signature file:"));
+ boot_editor->widgets.args_sig_file_f = widget_new_textbox(set,
+ 0, 0, field_size, boot_editor->args_sig_file);
+ }
+ else {
+ boot_editor->widgets.args_sig_file_l = NULL;
+ boot_editor->widgets.args_sig_file_f = NULL;
+ }
+
+ boot_editor->widgets.ok_b = widget_new_button(set, 0, 0, 10,
+ _("OK"), ok_click, boot_editor);
+ boot_editor->widgets.help_b = widget_new_button(set, 0, 0, 10,
+ _("Help"), help_click, boot_editor);
+ boot_editor->widgets.cancel_b = widget_new_button(set, 0, 0, 10,
+ _("Cancel"), cancel_click, boot_editor);
+}
+
+static void boot_editor_draw(struct boot_editor *boot_editor,
+ const struct system_info *sysinfo)
+{
+ bool repost = false;
+ int height;
+
+ height = pad_height(sysinfo ? sysinfo->n_blockdevs : 0);
+
+ if (!boot_editor->pad || getmaxy(boot_editor->pad) < height) {
+ if (boot_editor->pad)
+ delwin(boot_editor->pad);
+ boot_editor->pad = newpad(height, COLS);
+ }
+
+ if (boot_editor->widgetset) {
+ widgetset_unpost(boot_editor->widgetset);
+ talloc_free(boot_editor->widgetset);
+ repost = true;
+ }
+
+ boot_editor->widgetset = widgetset_create(boot_editor,
+ boot_editor->scr.main_ncw,
+ boot_editor->pad);
+ widgetset_set_widget_focus(boot_editor->widgetset,
+ boot_editor_widget_focus, boot_editor);
+
+ boot_editor_setup_widgets(boot_editor, sysinfo);
+ boot_editor_layout_widgets(boot_editor);
+
+ if (repost)
+ widgetset_post(boot_editor->widgetset);
+}
+
+void boot_editor_update(struct boot_editor *boot_editor,
+ const struct system_info *sysinfo)
+{
+ const char *str;
+
+ if (boot_editor->cui->current != boot_editor_scr(boot_editor)) {
+ boot_editor->need_update = true;
+ return;
+ }
+
+ str = widget_textbox_get_value(boot_editor->widgets.image_f);
+ if (str) {
+ talloc_free(boot_editor->image);
+ boot_editor->image = talloc_strdup(boot_editor, str);
+ }
+
+ str = widget_textbox_get_value(boot_editor->widgets.initrd_f);
+ if (str) {
+ talloc_free(boot_editor->initrd);
+ boot_editor->initrd = talloc_strdup(boot_editor, str);
+ }
+
+ str = widget_textbox_get_value(boot_editor->widgets.dtb_f);
+ if (str) {
+ talloc_free(boot_editor->dtb);
+ boot_editor->dtb = talloc_strdup(boot_editor, str);
+ }
+
+ str = widget_textbox_get_value(boot_editor->widgets.args_f);
+ if (str) {
+ talloc_free(boot_editor->args);
+ boot_editor->args = talloc_strdup(boot_editor, str);
+ }
+
+ if (boot_editor->use_signature_files) {
+ str = widget_textbox_get_value(boot_editor->widgets.args_sig_file_f);
+ if (str) {
+ talloc_free(boot_editor->args_sig_file);
+ boot_editor->args_sig_file = talloc_strdup(boot_editor, str);
+ }
+ }
+
+ boot_editor_draw(boot_editor, sysinfo);
+ pad_refresh(boot_editor);
+}
+
+struct boot_editor *boot_editor_init(struct cui *cui,
+ struct pmenu_item *item,
+ const struct system_info *sysinfo,
+ void (*on_exit)(struct cui *cui,
+ struct pmenu_item *item,
+ struct pb_boot_data *bd))
+{
+ struct boot_editor *boot_editor;
+ int ncols1, ncols2, ncols3;
+
+ boot_editor = talloc_zero(cui, struct boot_editor);