fix: color change is now working
This commit is contained in:
44
headers/color.h
Normal file
44
headers/color.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct color {
|
||||||
|
char *name;
|
||||||
|
uint32_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BLACK 0x000000
|
||||||
|
#define BLUE 0x0000FF
|
||||||
|
#define GREEN 0x008000
|
||||||
|
#define CYAN 0x00FFFF
|
||||||
|
#define RED 0xFF0000
|
||||||
|
#define MAGENTA 0xFF00FF
|
||||||
|
#define BROWN 0xA52A2A
|
||||||
|
#define LIGHT_GREY 0xD3D3D3
|
||||||
|
#define DARK_GREY 0x555555
|
||||||
|
#define LIGHT_BLUE 0xADD8E6
|
||||||
|
#define LIGHT_GREEN 0x90EE90
|
||||||
|
#define LIGHT_CYAN 0xE0FFFF
|
||||||
|
#define LIGHT_RED 0xFF6666
|
||||||
|
#define LIGHT_MAGENTA 0xFF77FF
|
||||||
|
#define LIGHT_YELLOW 0xFFFF01
|
||||||
|
#define WHITE 0xFFFFFF
|
||||||
|
|
||||||
|
static const struct color colors[] = {
|
||||||
|
{"BLACK", BLACK},
|
||||||
|
{"BLUE", BLUE},
|
||||||
|
{"GREEN", GREEN},
|
||||||
|
{"CYAN", CYAN},
|
||||||
|
{"RED", RED},
|
||||||
|
{"MAGENTA", MAGENTA},
|
||||||
|
{"BROWN", BROWN},
|
||||||
|
{"LIGHT_GREY", LIGHT_GREY},
|
||||||
|
{"DARK_GREY", DARK_GREY},
|
||||||
|
{"LIGHT_BLUE", LIGHT_BLUE},
|
||||||
|
{"LIGHT_GREEN", LIGHT_GREEN},
|
||||||
|
{"LIGHT_CYAN", LIGHT_CYAN},
|
||||||
|
{"LIGHT_RED", LIGHT_RED},
|
||||||
|
{"LIGHT_MAGENTA", LIGHT_MAGENTA},
|
||||||
|
{"LIGHT_YELLOW", LIGHT_YELLOW},
|
||||||
|
{"WHITE", WHITE},
|
||||||
|
};
|
||||||
@ -22,7 +22,6 @@ struct screen {
|
|||||||
uint32_t fg_color;
|
uint32_t fg_color;
|
||||||
uint32_t bg_color;
|
uint32_t bg_color;
|
||||||
uint8_t buffer[VGA_WIDTH * VGA_HEIGHT];
|
uint8_t buffer[VGA_WIDTH * VGA_HEIGHT];
|
||||||
uint32_t default_color;
|
|
||||||
struct icon *background;
|
struct icon *background;
|
||||||
struct font *font;
|
struct font *font;
|
||||||
char line[256];
|
char line[256];
|
||||||
@ -52,6 +51,8 @@ enum cursor_direction { LEFT, RIGHT, UP, DOWN };
|
|||||||
void terminal_initialize(void);
|
void terminal_initialize(void);
|
||||||
void terminal_set_bg_color(uint32_t color);
|
void terminal_set_bg_color(uint32_t color);
|
||||||
void terminal_set_fg_color(uint32_t color);
|
void terminal_set_fg_color(uint32_t color);
|
||||||
|
uint32_t terminal_get_fg_color(void);
|
||||||
|
uint32_t terminal_get_bg_color(void);
|
||||||
int terminal_putchar(char c);
|
int terminal_putchar(char c);
|
||||||
int terminal_write(const char *data, size_t size);
|
int terminal_write(const char *data, size_t size);
|
||||||
int terminal_writestring(const char *data);
|
int terminal_writestring(const char *data);
|
||||||
@ -61,11 +62,7 @@ void terminal_clear(void);
|
|||||||
struct key_event terminal_getkey(void);
|
struct key_event terminal_getkey(void);
|
||||||
void update_cursor(void);
|
void update_cursor(void);
|
||||||
void move_cursor(int direction);
|
void move_cursor(int direction);
|
||||||
void set_color_level(int level);
|
|
||||||
void terminal_set_default_fg_color(uint32_t fg_color);
|
|
||||||
void terminal_set_default_bg_color(uint32_t fg_color);
|
|
||||||
void terminal_change_default_fg_color(uint32_t color);
|
|
||||||
uint32_t terminal_get_default_color(void);
|
uint32_t terminal_get_default_color(void);
|
||||||
uint8_t terminal_get_char(int column, int row);
|
uint8_t terminal_get_char(int column, int row);
|
||||||
void terminal_remove_last_char(void);
|
void terminal_remove_last_char(void);
|
||||||
void terminal_refresh_color(void);
|
// TODO void terminal_refresh_color(void);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
#include "base.h"
|
#include "base.h"
|
||||||
|
#include "color.h"
|
||||||
#include "ctype.h"
|
#include "ctype.h"
|
||||||
#include "terminal.h"
|
#include "terminal.h"
|
||||||
|
|
||||||
@ -7,6 +8,15 @@
|
|||||||
|
|
||||||
int print_int_base(int64_t number, const char *prefix, const char *base);
|
int print_int_base(int64_t number, const char *prefix, const char *base);
|
||||||
|
|
||||||
|
static void set_color_level(int level)
|
||||||
|
{
|
||||||
|
static uint32_t levels[] = {
|
||||||
|
BLACK, RED, RED, MAGENTA, LIGHT_YELLOW,
|
||||||
|
LIGHT_YELLOW, LIGHT_BLUE, GREEN, LIGHT_GREY,
|
||||||
|
};
|
||||||
|
terminal_set_fg_color(levels[level]);
|
||||||
|
}
|
||||||
|
|
||||||
static int get_level(const char *str)
|
static int get_level(const char *str)
|
||||||
{
|
{
|
||||||
if (!str || !isdigit(str[0]))
|
if (!str || !isdigit(str[0]))
|
||||||
@ -43,9 +53,11 @@ int kvprintf(const char *restrict format, va_list *ap)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
const int level = get_level(format);
|
const int level = get_level(format);
|
||||||
|
uint32_t old_color = terminal_get_fg_color();
|
||||||
|
if (level) {
|
||||||
set_color_level(level);
|
set_color_level(level);
|
||||||
if (level)
|
|
||||||
start++;
|
start++;
|
||||||
|
}
|
||||||
while (*start != '\0') {
|
while (*start != '\0') {
|
||||||
if (*start == '%' && *(start + 1) != '\0') {
|
if (*start == '%' && *(start + 1) != '\0') {
|
||||||
ret += print_flag(*(start + 1), ap);
|
ret += print_flag(*(start + 1), ap);
|
||||||
@ -55,7 +67,7 @@ int kvprintf(const char *restrict format, va_list *ap)
|
|||||||
}
|
}
|
||||||
start++;
|
start++;
|
||||||
}
|
}
|
||||||
set_color_level(0);
|
terminal_set_fg_color(old_color);
|
||||||
update_cursor();
|
update_cursor();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,47 +1,31 @@
|
|||||||
|
#include "color.h"
|
||||||
#include "kprintf.h"
|
#include "kprintf.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "terminal.h"
|
#include "terminal.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
struct color {
|
|
||||||
char *name;
|
|
||||||
int value;
|
|
||||||
};
|
|
||||||
|
|
||||||
void color_cmd(char *arg)
|
void color_cmd(char *arg)
|
||||||
{
|
{
|
||||||
uint8_t tmp_color;
|
|
||||||
static const struct color colors[] = {
|
|
||||||
{"BLACK", 0x000000}, {"BLUE", 0x0000FF},
|
|
||||||
{"GREEN", 0x008000}, {"CYAN", 0x00FFFF},
|
|
||||||
{"RED", 0xFF0000}, {"MAGENTA", 0xFF00FF},
|
|
||||||
{"BROWN", 0xA52A2A}, {"LIGHT_GREY", 0xD3D3D3},
|
|
||||||
{"DARK_GREY", 0x555555}, {"LIGHT_BLUE", 0xADD8E6},
|
|
||||||
{"LIGHT_GREEN", 0x90EE90}, {"LIGHT_CYAN", 0xE0FFFF},
|
|
||||||
{"LIGHT_RED", 0xFF6666}, {"LIGHT_MAGENTA", 0xFF77FF},
|
|
||||||
{"LIGHT_YELLOW", 0xFFFFE0}, {"WHITE", 0xFFFFFF}};
|
|
||||||
|
|
||||||
if (!arg)
|
if (!arg)
|
||||||
goto invalid;
|
goto invalid;
|
||||||
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
||||||
if (strcmp(colors[i].name, arg) == 0) {
|
if (strcmp(colors[i].name, arg) == 0) {
|
||||||
terminal_set_fg_color(colors[i].value);
|
terminal_set_fg_color(colors[i].value);
|
||||||
kprintf("color: %s\n", colors[i].name);
|
|
||||||
// terminal_refresh_color();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
invalid:
|
invalid:
|
||||||
tmp_color = terminal_get_default_color();
|
uint32_t tmp_color = terminal_get_fg_color();
|
||||||
kprintf(KERN_WARNING "Invalid argument\n");
|
kprintf(KERN_WARNING "Invalid argument\n");
|
||||||
kprintf("Available colors: ");
|
kprintf("Available colors: ");
|
||||||
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
for (size_t i = 0; i < ARRAY_SIZE(colors); i++) {
|
||||||
terminal_set_default_fg_color(colors[i].value);
|
terminal_set_fg_color(colors[i].value);
|
||||||
kprintf(colors[i].name);
|
kprintf(colors[i].name);
|
||||||
if (i != ARRAY_SIZE(colors) - 1)
|
if (i != ARRAY_SIZE(colors) - 1)
|
||||||
kprintf(", ");
|
kprintf(", ");
|
||||||
}
|
}
|
||||||
terminal_set_default_fg_color(tmp_color);
|
terminal_set_fg_color(tmp_color);
|
||||||
kprintf("\n");
|
kprintf("\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,8 +26,7 @@ void terminal_initialize(void)
|
|||||||
for (int i = 0; i < TERM_COUNT; i++) {
|
for (int i = 0; i < TERM_COUNT; i++) {
|
||||||
screens[i].row = 0;
|
screens[i].row = 0;
|
||||||
screens[i].column = 0;
|
screens[i].column = 0;
|
||||||
screens[i].default_color = 0;
|
screens[i].fg_color = 0;
|
||||||
screens[i].fg_color = screens[i].default_color;
|
|
||||||
screens[i].bg_color = 0x8acd01;
|
screens[i].bg_color = 0x8acd01;
|
||||||
// screens[i].background = &image_icon;
|
// screens[i].background = &image_icon;
|
||||||
screens[i].font = consolas_regular_13_font;
|
screens[i].font = consolas_regular_13_font;
|
||||||
@ -86,22 +85,22 @@ void terminal_set_fg_color(uint32_t fg_color)
|
|||||||
screen->fg_color = fg_color;
|
screen->fg_color = fg_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t terminal_get_bg_color(void)
|
||||||
|
{
|
||||||
|
return screen->bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t terminal_get_fg_color(void)
|
||||||
|
{
|
||||||
|
return screen->fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
void terminal_set_color(uint32_t fg_color, uint32_t bg_color)
|
void terminal_set_color(uint32_t fg_color, uint32_t bg_color)
|
||||||
{
|
{
|
||||||
screen->fg_color = fg_color;
|
screen->fg_color = fg_color;
|
||||||
screen->bg_color = bg_color;
|
screen->bg_color = bg_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void terminal_set_default_fg_color(uint32_t fg_color)
|
|
||||||
{
|
|
||||||
screen->default_color = fg_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t terminal_get_default_color(void)
|
|
||||||
{
|
|
||||||
return screen->default_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t terminal_get_char(int x, int y)
|
uint8_t terminal_get_char(int x, int y)
|
||||||
{
|
{
|
||||||
return screen->buffer[y * VGA_WIDTH + x];
|
return screen->buffer[y * VGA_WIDTH + x];
|
||||||
@ -145,15 +144,16 @@ static void terminal_new_line(void)
|
|||||||
terminal_scroll();
|
terminal_scroll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void terminal_refresh_color(void)
|
// TODO
|
||||||
{
|
// void terminal_refresh_color(void)
|
||||||
// terminal_clear();
|
// {
|
||||||
for (uint32_t y = 0; y < VGA_HEIGHT; y++)
|
// // terminal_clear();
|
||||||
for (uint32_t x = 0; x < VGA_WIDTH; x++)
|
// for (uint32_t y = 0; y < VGA_HEIGHT; y++)
|
||||||
terminal_putentryat(
|
// for (uint32_t x = 0; x < VGA_WIDTH; x++)
|
||||||
get_font_node(screen->buffer[y * VGA_WIDTH + x]),
|
// terminal_putentryat(
|
||||||
screen->fg_color, x, y);
|
// get_font_node(screen->buffer[y * VGA_WIDTH + x]),
|
||||||
}
|
// screen->fg_color, x, y);
|
||||||
|
// }
|
||||||
|
|
||||||
void terminal_clear(void)
|
void terminal_clear(void)
|
||||||
{
|
{
|
||||||
@ -235,20 +235,3 @@ void move_cursor(int direction)
|
|||||||
}
|
}
|
||||||
update_cursor();
|
update_cursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_color_level(int level)
|
|
||||||
{
|
|
||||||
int color_translation[] = {
|
|
||||||
VGA_COLOR_WHITE, VGA_COLOR_RED,
|
|
||||||
VGA_COLOR_RED, VGA_COLOR_MAGENTA,
|
|
||||||
VGA_COLOR_LIGHT_YELLOW, VGA_COLOR_LIGHT_YELLOW,
|
|
||||||
VGA_COLOR_LIGHT_BLUE, VGA_COLOR_GREEN,
|
|
||||||
VGA_COLOR_LIGHT_GREY,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (level == 0) {
|
|
||||||
terminal_set_color(screen->default_color, screen->bg_color);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
terminal_set_fg_color(color_translation[level]);
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user