diff --git a/share/man/man5/loader.conf.5 b/share/man/man5/loader.conf.5 index dd99b1a..1e16ef1 100644 --- a/share/man/man5/loader.conf.5 +++ b/share/man/man5/loader.conf.5 @@ -185,6 +185,9 @@ To make his life a bit more colorful, consider setting .Pa loader_color to .Dq YES . +.It Va fred_on_left +.Pq Dq NO +Shows Fred on the left side of the menu rather than the right side. .It Va kernel .Pq Dq kernel .It Va loader_color diff --git a/sys/boot/dloader/cmds.c b/sys/boot/dloader/cmds.c index 5f27974..105a8f9 100644 --- a/sys/boot/dloader/cmds.c +++ b/sys/boot/dloader/cmds.c @@ -431,17 +431,144 @@ command_menu(int ac, char **av) return (res); } +#define LOGO_LINES 17 +#define FRED_LEFT 0 +#define FRED_RIGHT 1 +static char *logo_blank_line = " "; +static char *menu_header_left = "============================ DragonFly BSD ====================================\n"; +static char *menu_header_right = "==================================== DragonFly BSD ============================\n"; +static char *menu_footer = "===============================================================================\n"; + +static char *logo_color[LOGO_LINES] = { + " ", + " ,--, | ,--, ", + " | `-, ,^, ,-' | ", + " `, `-, (/ \\) ,-' ,' ", + " `-, `-,/ \\,-' ,-' ", + " `------( )------' ", + " ,----------( )----------, ", + " | _,-( )-,_ | ", + " `-,__,-' \\ / `-,__,-' ", + " | | ", + " | | ", + " | | ", + " | | ", + " | | ", + " | | ", + " `|' ", + " " }; + +static char *logo_mono[LOGO_LINES] = { + " ", + " ,--, | ,--, ", + " | `-, ,^, ,-' | ", + " `, `-, (/ \\) ,-' ,' ", + " `-, `-,/ \\,-' ,-' ", + " `------( )------' ", + " ,----------( )----------, ", + " | _,-( )-,_ | ", + " `-,__,-' \\ / `-,__,-' ", + " | | ", + " | | ", + " | | ", + " | | ", + " | | ", + " | | ", + " `|' ", + " " }; + +static char *logo_blank[LOGO_LINES] = { + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }; + +static void +logo_display(char **logo, int line, int orientation) +{ + const char *fmt; + + if (orientation == FRED_LEFT) + fmt = "%s | "; + else + fmt = " | %s"; + + if (logo != NULL) { + if (line < LOGO_LINES) + printf(fmt, logo[line]); + else + printf(fmt, logo_blank_line); + } +} + static void menu_display(void) { dvar_t dvar; + int i; + int logo_left = 0; /* default to fred on right */ + char **logo = logo_mono; + const char *fmt; - for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) { - if (strncmp(dvar->name, "menu_", 5) == 0) { - printf("%c. %s\n", dvar->name[5], dvar->data[0]); + if (dvar_istrue(dvar_get("loader_color"))) + logo = logo_color; + + if (dvar_istrue(dvar_get("fred_disable"))) + logo = NULL; + + if (dvar_istrue(dvar_get("fred_on_left"))) + logo_left = 1; + + dvar = dvar_first(); + i = 0; + + if (logo != NULL) { + printf(logo_left ? menu_header_left : menu_header_right); + printf(logo_left ? "%35s|%43s\n" : "%43s|%35s\n", " ", " "); + } + + while (dvar || i < LOGO_LINES) { + if (logo_left) + logo_display(logo, i, FRED_LEFT); + i++; + + while (dvar) { + if (strncmp(dvar->name, "menu_", 5) == 0) { + printf(" %c. %-38.38s", dvar->name[5], dvar->data[0]); + dvar = dvar_next(dvar); + break; + } + dvar = dvar_next(dvar); + } + /* + * Pad when the number of menu entries is less than + * LOGO_LINES. + */ + if (dvar == NULL) { + printf(" %38.38s", " "); } + + if (!logo_left) + logo_display(logo, i, FRED_RIGHT); + printf("\n"); + } + + if (logo != NULL) { + printf(menu_footer); } - printf("\n"); } static int diff --git a/sys/boot/dloader/subs.c b/sys/boot/dloader/subs.c index a9577c4..ee5fc50 100644 --- a/sys/boot/dloader/subs.c +++ b/sys/boot/dloader/subs.c @@ -136,3 +136,17 @@ dvar_free(dvar_t *lastp) free(dvar->data); free(dvar); } + +int +dvar_istrue(dvar_t var) +{ + int retval = 0; + + if (var != NULL && (strcasecmp(var->data[0], "yes") == 0 || + strcasecmp(var->data[0], "true") == 0 || + strcasecmp(var->data[0], "on") == 0 || + strcasecmp(var->data[0], "1") == 0)) + retval = 1; + + return (retval); +}