From 4f6b1d20c26145b7956ee25dabcf588a41a7b35f Mon Sep 17 00:00:00 2001 From: VAN BOSSUYT Nicolas Date: Thu, 24 Sep 2020 23:18:51 +0200 Subject: [PATCH] Made the margin configurable. --- CONFIG.md | 3 ++- limine.bin | Bin 32768 -> 32768 bytes stage2/drivers/vbe.c | 13 ++++++++----- stage2/drivers/vbe.h | 3 ++- stage2/menu.c | 29 +++++++++++++++++------------ test/limine.cfg | 13 +++++++++++++ 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 91812069..0e9baa62 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -22,7 +22,8 @@ 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). +* `THEME_BLACK`, `THEME_RED`, `THEME_GREEN`, `THEME_BROWN`, `THEME_BLUE`, `THEME_MAGENTA`, `THEME_CYAN`, `THEME_GREY`, `THEME_WHITE` - Specifies the colors used by the terminal (RRGGBB). +* `THEME_MARGIN` - Set the amount of margin around the terminal. *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 e4d70de1b66cb05f4ecd398708516c1602993e97..b92fdfbc8afc04f1489f0a83bf93002d634d172a 100644 GIT binary patch delta 20476 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 DDw9`- delta 20473 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 AcmMzZ diff --git a/stage2/drivers/vbe.c b/stage2/drivers/vbe.c index f6f2a240..a80a1e12 100644 --- a/stage2/drivers/vbe.c +++ b/stage2/drivers/vbe.c @@ -48,6 +48,7 @@ static uint16_t vbe_bpp = 0; static int frame_height; static int frame_width; +static int frame_margin = 64; static struct image *background; @@ -257,8 +258,6 @@ void vbe_get_cursor_pos(int *x, int *y) { *y = cursor_y; } - - void vbe_set_text_fg(int fg) { text_fg = ansi_colours[fg]; } @@ -267,12 +266,16 @@ void vbe_set_text_bg(int bg) { text_bg = ansi_colours[bg]; } -void vge_set_colors(uint32_t *colors){ +void vbe_set_colors(uint32_t *colors){ memcpy(ansi_colours, colors, sizeof(ansi_colours)); text_bg = colors[0]; text_fg = colors[7]; } +void vbe_set_margin(int margin){ + frame_margin = margin; +} + void vbe_putchar(char c) { switch (c) { case '\b': @@ -322,8 +325,8 @@ void vbe_putchar(char c) { void vbe_tty_init(int *_rows, int *_cols, struct image *_background) { init_vbe(&vbe_framebuffer, &vbe_pitch, &vbe_width, &vbe_height, &vbe_bpp); vga_font_retrieve(); - *_cols = cols = (vbe_width - 128) / VGA_FONT_WIDTH; - *_rows = rows = (vbe_height - 128) / VGA_FONT_HEIGHT; + *_cols = cols = (vbe_width - frame_margin * 2) / VGA_FONT_WIDTH; + *_rows = rows = (vbe_height - frame_margin * 2) / VGA_FONT_HEIGHT; grid = ext_mem_alloc(rows * cols * sizeof(struct vbe_char)); background = _background; diff --git a/stage2/drivers/vbe.h b/stage2/drivers/vbe.h index 5c53d430..2dcc9bc9 100644 --- a/stage2/drivers/vbe.h +++ b/stage2/drivers/vbe.h @@ -17,6 +17,7 @@ void vbe_set_cursor_pos(int x, int y); void vbe_get_cursor_pos(int *x, int *y); void vbe_set_text_fg(int fg); void vbe_set_text_bg(int bg); -void vge_set_colors(uint32_t *colors); +void vbe_set_colors(uint32_t *colors); +void vbe_set_margin(int margin); #endif diff --git a/stage2/menu.c b/stage2/menu.c index bc2f7200..92cbf746 100644 --- a/stage2/menu.c +++ b/stage2/menu.c @@ -16,7 +16,7 @@ static char *cmdline; static char config_entry_name[1024]; -void load_color_from_config(void) { +void load_theme_from_config(void) { char buf[16]; uint32_t colorsheme[9] = { @@ -31,43 +31,48 @@ void load_color_from_config(void) { 0x00ffffff, // white }; - if (config_get_value(buf, 0, 16, "COLORSCHEME_BLACK")) { + + if (config_get_value(buf, 0, 16, "THEME_BLACK")) { colorsheme[0] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_RED")) { + if (config_get_value(buf, 0, 16, "THEME_RED")) { colorsheme[1] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_GREEN")) { + if (config_get_value(buf, 0, 16, "THEME_GREEN")) { colorsheme[2] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_BROWN")) { + if (config_get_value(buf, 0, 16, "THEME_BROWN")) { colorsheme[3] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_BLUE")) { + if (config_get_value(buf, 0, 16, "THEME_BLUE")) { colorsheme[4] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_MAGENTA")) { + if (config_get_value(buf, 0, 16, "THEME_MAGENTA")) { colorsheme[5] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_CYAN")) { + if (config_get_value(buf, 0, 16, "THEME_CYAN")) { colorsheme[6] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_GREY")) { + if (config_get_value(buf, 0, 16, "THEME_GREY")) { colorsheme[7] = (int)strtoui16(buf); } - if (config_get_value(buf, 0, 16, "COLORSCHEME_WHITE")) { + if (config_get_value(buf, 0, 16, "THEME_WHITE")) { colorsheme[8] = (int)strtoui16(buf); } - vge_set_colors(colorsheme); + if (config_get_value(buf, 0, 16, "THEME_MARGIN")) { + vbe_set_margin((int)strtoui(buf)); + } + + vbe_set_colors(colorsheme); } char *menu(int boot_drive) { @@ -77,7 +82,7 @@ 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(); + load_theme_from_config(); int bg_drive; if (!config_get_value(buf, 0, 16, "BACKGROUND_DRIVE")) { diff --git a/test/limine.cfg b/test/limine.cfg index 4022f54b..3617dc05 100644 --- a/test/limine.cfg +++ b/test/limine.cfg @@ -1,5 +1,18 @@ TIMEOUT=3 +THEME_BLACK=33000000 +THEME_RED=aa0000 +THEME_GREEN=00aaff +THEME_BROWN=aa5500 +THEME_BLUE=0000aa +THEME_MAGENTA=aa00aa +THEME_CYAN=9076DE +THEME_GREY=aaaaaa +THEME_WHITE=ffffff +THEME_MARGIN=16 + +BACKGROUND_PARTITION=0 +BACKGROUND_PATH=bg.bmp :MyOS