+ boot_editor->on_exit(boot_editor->cui, NULL, NULL);
+}
+
+static int layout_pair(struct boot_editor *boot_editor, int y,
+ struct nc_widget_label *label,
+ struct nc_widget_textbox *field)
+{
+ struct nc_widget *label_w = widget_label_base(label);
+ struct nc_widget *field_w = widget_textbox_base(field);
+ widget_move(label_w, y, boot_editor->label_x);
+ widget_move(field_w, y, boot_editor->field_x);
+ return max(widget_height(label_w), widget_height(field_w));
+}
+
+static int pad_height(int blockdevs_height)
+{
+ return 10 + blockdevs_height;
+}
+
+static void boot_editor_layout_widgets(struct boot_editor *boot_editor)
+{
+ struct nc_widget *wf, *wl;
+ int y = 1;
+
+ wl = widget_label_base(boot_editor->widgets.device_l);
+ wf = widget_select_base(boot_editor->widgets.device_f);
+ widget_move(wl, y, boot_editor->label_x);
+ widget_move(wf, y, boot_editor->field_x);
+
+ y += widget_height(wf) + 1;
+
+
+ y += layout_pair(boot_editor, y, boot_editor->widgets.image_l,
+ boot_editor->widgets.image_f);
+
+ y += layout_pair(boot_editor, y, boot_editor->widgets.initrd_l,
+ boot_editor->widgets.initrd_f);
+
+ y += layout_pair(boot_editor, y, boot_editor->widgets.dtb_l,
+ boot_editor->widgets.dtb_f);
+
+ y += layout_pair(boot_editor, y, boot_editor->widgets.args_l,
+ boot_editor->widgets.args_f);
+
+
+ y++;
+ widget_move(widget_button_base(boot_editor->widgets.ok_b), y, 9);
+ widget_move(widget_button_base(boot_editor->widgets.cancel_b), y, 19);
+
+ pad_refresh(boot_editor);
+}
+
+static void boot_editor_widget_focus(struct nc_widget *widget, void *arg)
+{
+ struct boot_editor *boot_editor = arg;
+ int w_y, s_max;
+
+ w_y = widget_y(widget) + widget_focus_y(widget);
+ s_max = getmaxy(boot_editor->scr.sub_ncw) - 1;
+
+ if (w_y < boot_editor->scroll_y)
+ boot_editor->scroll_y = w_y;
+
+ else if (w_y + boot_editor->scroll_y + 1 > s_max)
+ boot_editor->scroll_y = 1 + w_y - s_max;
+
+ else
+ return;
+
+ pad_refresh(boot_editor);
+}
+
+static void boot_editor_device_select_change(void *arg, int idx)
+{
+ struct boot_editor *boot_editor = arg;
+ if (idx == -1)
+ boot_editor->selected_device = NULL;
+ else
+ boot_editor->selected_device =
+ boot_editor->cui->sysinfo->blockdevs[idx]->name;
+}
+
+static void boot_editor_populate_device_select(struct boot_editor *boot_editor,
+ const struct system_info *sysinfo)
+{
+ struct nc_widget_select *select = boot_editor->widgets.device_f;
+ unsigned int i;
+ bool selected;
+
+ widget_select_drop_options(select);
+
+ for (i = 0; i < sysinfo->n_blockdevs; i++) {
+ struct blockdev_info *bd_info = sysinfo->blockdevs[i];
+ const char *name;
+
+ name = talloc_asprintf(boot_editor, "%s [%s]",
+ bd_info->name, bd_info->uuid);
+ selected = boot_editor->selected_device &&
+ !strcmp(bd_info->name,
+ boot_editor->selected_device);
+
+ widget_select_add_option(boot_editor->widgets.device_f,
+ i, name, selected);
+ }
+
+ /* If we're editing an existing option, the paths will be fully-
+ * resolved. In this case, we want the manual device pre-selected.
+ * However, we only do this if the widget hasn't been manually
+ * changed. */
+ selected = !boot_editor->selected_device;
+
+ widget_select_add_option(boot_editor->widgets.device_f,
+ -1, "Specify paths/URLs manually", selected);