From 0477d34236296b2ee23e67ffda6479d99478b197 Mon Sep 17 00:00:00 2001 From: VAN BOSSUYT Nicolas Date: Thu, 24 Sep 2020 21:48:49 +0200 Subject: [PATCH] The color scheme can be changed using the configuration file. --- CONFIG.md | 1 + limine.bin | Bin 32768 -> 32768 bytes stage2/drivers/vbe.c | 13 +++++++--- stage2/drivers/vbe.h | 1 + stage2/lib/blib.c | 23 ++++++++++++++++- stage2/lib/blib.h | 1 + stage2/lib/term.c | 6 +++++ stage2/menu.c | 57 +++++++++++++++++++++++++++++++++++++++++++ test/limine.cfg | 10 ++++++++ 9 files changed, 108 insertions(+), 4 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 5615aea4..91812069 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -22,6 +22,7 @@ Some *local assignments* are shared between entries using any *protocol*, while *Globally assignable* keys are: * `TIMEOUT` - Specifies the timeout in seconds before the first *entry* is automatically booted. * `TEXTMODE` - If set to `on`, do not use graphical VESA framebuffer for the boot menu. +* `COLORSCHEME_BLACK`, `COLORSCHEME_RED`, `COLORSCHEME_GREEN`, `COLORSCHEME_BROWN`, `COLORSCHEME_BLUE`, `COLORSCHEME_MAGENTA`, `COLORSCHEME_CYAN`, `COLORSCHEME_GREY`, `COLORSCHEME_WHITE` - Specifies the colors used by the terminal (RRGGBB). *Locally assignable (non protocol specific)* keys are: * `PROTOCOL` - The boot protocol that will be used to boot the kernel. Valid protocols are: `linux`, `stivale`, `chainload`. diff --git a/limine.bin b/limine.bin index 183bba7a393af5aaf2c3dde4c2c1bbbc70604ca5..fa3ac1248a1500e98ece741f76d4fcfbf1204de6 100644 GIT binary patch delta 20183 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

wu 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%0AT56(YuC^A>FW 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 uL= 'a' && c <= 'z') { + return (c - 'a') + 10; + } + if (c >= 'A' && c <= 'Z') { + return (c - 'A') + 10; + } + if (c >= '0' && c <= '9'){ + return c - '0'; + } + + return 0; +} + uint64_t strtoui(const char *s) { uint64_t n = 0; while (*s) - n = n * 10 + ((*(s++)) - '0'); + n = n * 10 + char_value(*(s++)); + return n; +} + +uint64_t strtoui16(const char *s) { + uint64_t n = 0; + while (*s) + n = n * 16 + char_value(*(s++)); return n; } diff --git a/stage2/lib/blib.h b/stage2/lib/blib.h index 67d34891..015d5839 100644 --- a/stage2/lib/blib.h +++ b/stage2/lib/blib.h @@ -21,6 +21,7 @@ int pit_sleep_and_quit_on_keypress(uint32_t pit_ticks); int getchar(void); void gets(const char *orig_str, char *buf, size_t limit); uint64_t strtoui(const char *s); +uint64_t strtoui16(const char *s); #define DIV_ROUNDUP(a, b) (((a) + ((b) - 1)) / (b)) diff --git a/stage2/lib/term.c b/stage2/lib/term.c index cf08ba44..5ceacfd5 100644 --- a/stage2/lib/term.c +++ b/stage2/lib/term.c @@ -113,6 +113,12 @@ static void term_putchar(char c) { } static void sgr(void) { + if (esc_value0 == 0){ + set_text_bg(0); + set_text_fg(7); + return; + } + if (esc_value0 >= 30 && esc_value0 <= 37) { set_text_fg(esc_value0 - 30); return; diff --git a/stage2/menu.c b/stage2/menu.c index 4b5d2e3e..bc2f7200 100644 --- a/stage2/menu.c +++ b/stage2/menu.c @@ -9,12 +9,67 @@ #include #include #include +#include static char *cmdline; #define CMDLINE_MAX 1024 static char config_entry_name[1024]; +void load_color_from_config(void) { + char buf[16]; + + uint32_t colorsheme[9] = { + 0x00191919, // black + 0x00aa0000, // red + 0x0000aa00, // green + 0x00aa5500, // brown + 0x000000aa, // blue + 0x009076DE, // magenta + 0x0000aaaa, // cyan + 0x00aaaaaa, // grey + 0x00ffffff, // white + }; + + if (config_get_value(buf, 0, 16, "COLORSCHEME_BLACK")) { + colorsheme[0] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_RED")) { + colorsheme[1] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_GREEN")) { + colorsheme[2] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_BROWN")) { + colorsheme[3] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_BLUE")) { + colorsheme[4] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_MAGENTA")) { + colorsheme[5] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_CYAN")) { + colorsheme[6] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_GREY")) { + colorsheme[7] = (int)strtoui16(buf); + } + + if (config_get_value(buf, 0, 16, "COLORSCHEME_WHITE")) { + colorsheme[8] = (int)strtoui16(buf); + } + + vge_set_colors(colorsheme); +} + char *menu(int boot_drive) { cmdline = conv_mem_alloc(CMDLINE_MAX); @@ -22,6 +77,8 @@ char *menu(int boot_drive) { // If there is no TEXTMODE config key or the value is not "on", enable graphics if (config_get_value(buf, 0, 16, "TEXTMODE") == NULL || strcmp(buf, "on")) { + load_color_from_config(); + int bg_drive; if (!config_get_value(buf, 0, 16, "BACKGROUND_DRIVE")) { bg_drive = boot_drive; diff --git a/test/limine.cfg b/test/limine.cfg index 775a29a4..369e19ec 100644 --- a/test/limine.cfg +++ b/test/limine.cfg @@ -1,5 +1,15 @@ TIMEOUT=3 +COLORSCHEME_BLACK=073642 +COLORSCHEME_RED=aa0000 +COLORSCHEME_GREEN=00aaff +COLORSCHEME_BROWN=aa5500 +COLORSCHEME_BLUE=0000aa +COLORSCHEME_MAGENTA=aa00aa +COLORSCHEME_CYAN=00aaaa +COLORSCHEME_GREY=aaaaaa +COLORSCHEME_WHITE=fdf6e3 + BACKGROUND_PARTITION=0 BACKGROUND_PATH=bg.bmp