]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-config.c
ui/ncurses: Correctly size pad for config screen
[petitboot] / ui / ncurses / nc-config.c
index a09535371c7131d1f09e19457ecfee2fb2cbef77..4b1a58f98ade8635b16b941ee2ab341407b2987d 100644 (file)
@@ -33,7 +33,7 @@
 #include "nc-config.h"
 #include "nc-widgets.h"
 
-#define N_FIELDS       25
+#define N_FIELDS       26
 
 extern struct help_text config_help_text;
 
@@ -94,6 +94,7 @@ struct config_screen {
                struct nc_widget_label          *dns_dhcp_help_l;
                struct nc_widget_label          *dns_help_l;
 
+               struct nc_widget_label          *safe_mode;
                struct nc_widget_button         *ok_b;
                struct nc_widget_button         *help_b;
                struct nc_widget_button         *cancel_b;
@@ -307,6 +308,7 @@ static int screen_process_form(struct config_screen *screen)
                }
        }
 
+       config->safe_mode = false;
        rc = cui_send_config(screen->cui, config);
        talloc_free(config);
 
@@ -470,6 +472,13 @@ static void config_screen_layout_widgets(struct config_screen *screen)
 
        y += 1;
 
+       show = screen->cui->config->safe_mode;
+       if (show) {
+               widget_move(widget_label_base(screen->widgets.safe_mode),
+                       y, screen->field_x);
+               y += 1;
+       }
+
        widget_move(widget_button_base(screen->widgets.ok_b),
                        y, screen->field_x);
        widget_move(widget_button_base(screen->widgets.help_b),
@@ -730,6 +739,10 @@ static void config_screen_setup_widgets(struct config_screen *screen,
        screen->widgets.dns_dhcp_help_l = widget_new_label(set, 0, 0,
                        _("(if not provided by DHCP server)"));
 
+       if (config->safe_mode)
+               screen->widgets.safe_mode = widget_new_label(set, 0, 0,
+                        _("Selecting 'OK' will exit safe mode"));
+
        screen->widgets.ok_b = widget_new_button(set, 0, 0, 6, _("OK"),
                        ok_click, screen);
        screen->widgets.help_b = widget_new_button(set, 0, 0, 6, _("Help"),
@@ -768,13 +781,18 @@ static void config_screen_draw(struct config_screen *screen,
        /* The size of the pad we'll need depends on the number of interfaces.
         *
         * We use N_FIELDS (which is quite conservative, as some fields share
-        * a line) as a base, then add 3 (as the network select field is
-        * takes 3 lines), and n_interfaces (as the network interface field
-        * has n_interfaces lines).
+        * a line) as a base, then:
+        * - add 6 (as the network select & boot device select fields take 3
+        *   lines each),
+        * - add n_interfaces for every field in the network select field, and
+        * - add (n_blockdevs + n_interfaces) for every field in the boot device
+        *   select field
         */
-       height = N_FIELDS + 3;
-       if (sysinfo)
+       height = N_FIELDS + 6;
+       if (sysinfo) {
                height += sysinfo->n_interfaces;
+               height += (sysinfo->n_blockdevs + sysinfo->n_interfaces);
+       }
        if (!screen->pad || getmaxy(screen->pad) < height) {
                if (screen->pad)
                        delwin(screen->pad);