add: color cmd
This commit is contained in:
parent
02059bff33
commit
484e013ceb
@ -16,6 +16,7 @@ struct screen {
|
||||
size_t column;
|
||||
uint8_t color;
|
||||
uint16_t buffer[VGA_WIDTH * VGA_HEIGHT];
|
||||
uint8_t default_color;
|
||||
char line[256];
|
||||
};
|
||||
|
||||
@ -53,3 +54,7 @@ struct key_event terminal_getkey(void);
|
||||
void update_cursor(void);
|
||||
void move_cursor(int direction);
|
||||
void set_color_level(int level);
|
||||
void terminal_set_default_fg_color(uint8_t fg_color);
|
||||
void terminal_set_default_bg_color(uint8_t fg_color);
|
||||
void terminal_change_default_fg_color(uint8_t color);
|
||||
uint8_t terminal_get_default_color(void);
|
36
src/shell/commands/color_cmd.c
Normal file
36
src/shell/commands/color_cmd.c
Normal file
@ -0,0 +1,36 @@
|
||||
#include "kprintf.h"
|
||||
#include "string.h"
|
||||
#include "terminal.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define ARRAY_SIZE(array) sizeof(array) / sizeof(array[0])
|
||||
|
||||
void color_cmd(char *arg)
|
||||
{
|
||||
uint8_t tmp_color;
|
||||
static const char *colors[] = {
|
||||
"BLACK", "BLUE", "GREEN", "CYAN",
|
||||
"RED", "MAGENTA", "BROWN", "LIGHT_GREY",
|
||||
"DARK_GREY", "LIGHT_BLUE", "LIGHT_GREEN", "LIGHT_CYAN",
|
||||
"LIGHT_RED", "LIGHT_MAGENTA", "LIGHT_YELLOW", "WHITE",
|
||||
};
|
||||
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
||||
if (strcmp(colors[i], arg) == 0) {
|
||||
terminal_change_default_fg_color(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
tmp_color = terminal_get_default_color();
|
||||
kprintf(KERN_WARNING "Invalid argument\navailable color: ");
|
||||
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
||||
terminal_set_default_fg_color(i);
|
||||
// Unai the STRING MERGE argument of kprintf cause me a
|
||||
// cramptissue. I lost all my skibidi aura to fix it but it work
|
||||
// (;
|
||||
kprintf(colors[i]);
|
||||
if (i != ARRAY_SIZE(colors) - 1)
|
||||
kprintf(", ");
|
||||
}
|
||||
terminal_set_default_fg_color(tmp_color);
|
||||
kprintf("\n");
|
||||
}
|
@ -65,6 +65,21 @@ void terminal_set_color(uint8_t color)
|
||||
screen->color = color;
|
||||
}
|
||||
|
||||
void terminal_set_default_fg_color(uint8_t fg_color)
|
||||
{
|
||||
screen->default_color = (screen->default_color & 0xF0) | fg_color;
|
||||
}
|
||||
|
||||
void terminal_set_default_bg_color(uint8_t bg_color)
|
||||
{
|
||||
screen->default_color = bg_color << 4 | (screen->default_color & 0x0F);
|
||||
}
|
||||
|
||||
uint8_t terminal_get_default_color(void)
|
||||
{
|
||||
return screen->default_color;
|
||||
}
|
||||
|
||||
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
|
||||
{
|
||||
const size_t index = y * VGA_WIDTH + x;
|
||||
@ -87,6 +102,35 @@ static void terminal_new_line(void)
|
||||
terminal_scroll();
|
||||
}
|
||||
|
||||
static uint8_t get_entry_color(uint16_t vga_entry)
|
||||
{
|
||||
return vga_entry >> 8;
|
||||
}
|
||||
|
||||
void terminal_change_default_color(uint8_t color)
|
||||
{
|
||||
terminal_set_color(color);
|
||||
for (size_t y = 0; y < VGA_HEIGHT; y++) {
|
||||
for (size_t x = 0; x < VGA_WIDTH; x++) {
|
||||
const size_t index = y * VGA_WIDTH + x;
|
||||
uint8_t entry_color = get_entry_color(TERM_BUF[index]);
|
||||
TERM_BUF[index] = vga_entry(
|
||||
TERM_BUF[index],
|
||||
entry_color == screen->default_color ? color
|
||||
: entry_color);
|
||||
}
|
||||
}
|
||||
memcpy(screen->buffer, TERM_BUF, sizeof(screen->buffer));
|
||||
screen->default_color = color;
|
||||
screen->color = color;
|
||||
}
|
||||
|
||||
void terminal_change_default_fg_color(uint8_t fg_color)
|
||||
{
|
||||
terminal_set_fg_color(fg_color);
|
||||
terminal_change_default_color(screen->color);
|
||||
}
|
||||
|
||||
void terminal_clear(void)
|
||||
{
|
||||
for (size_t y = 0; y < VGA_HEIGHT; y++) {
|
||||
@ -179,7 +223,9 @@ void set_color_level(int level)
|
||||
VGA_COLOR_LIGHT_BLUE, VGA_COLOR_GREEN,
|
||||
VGA_COLOR_LIGHT_GREY};
|
||||
|
||||
if (level == 0)
|
||||
if (level == 0) {
|
||||
terminal_set_color(screen->default_color);
|
||||
return;
|
||||
}
|
||||
terminal_set_fg_color(color_translation[level]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user