From f05524445914e31891ec227520d9bb3fe5857e2c Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Wed, 21 Jun 2017 17:39:00 +0200 Subject: improved VGA colors added basics of a desktop widget class --- src/Makefile | 7 ++++-- src/drivers/video/vga.c | 29 ++++++++++++++++++++----- src/drivers/video/vga.h | 10 +++++++++ src/gui/composite_widget.c | 2 ++ src/gui/desktop.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++ src/gui/desktop.h | 24 +++++++++++++++++++++ src/kernel/kernel.c | 16 +++++++------- 7 files changed, 127 insertions(+), 15 deletions(-) create mode 100644 src/gui/desktop.c create mode 100644 src/gui/desktop.h (limited to 'src') diff --git a/src/Makefile b/src/Makefile index 02ab439..d919cbc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -33,7 +33,7 @@ kernel.bin: kernel.elf kernel.sym: kernel.elf $(OBJCOPY) --only-keep-debug kernel.elf kernel.sym -kernel.elf: kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o drivers/video/vga.o drivers/video/vga_font.o gui/widget.o gui/composite_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o +kernel.elf: kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o drivers/video/vga.o drivers/video/vga_font.o gui/widget.o gui/composite_widget.o gui/desktop.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o $(LD) -o kernel.elf -N -n -Ttext 0x8800 --oformat elf32-i386 \ kernel/kernel.o kernel/kernel_asm.o \ kernel/console.o kernel/vgatext.o kernel/serial.o \ @@ -44,7 +44,7 @@ kernel.elf: kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext. drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o \ drivers/video/vga.o drivers/video/vga_font.o \ libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o \ - gui/widget.o gui/composite_widget.o + gui/widget.o gui/composite_widget.o gui/desktop.o magic.bin: boot/magic.asm $(NASM) boot/magic.asm -DMAGIC='"$(MAGIC)"' -f bin -o magic.bin @@ -109,6 +109,9 @@ gui/widget.o: gui/widget.c gui/widget.h gui/composite_widget.o: gui/composite_widget.c gui/composite_widget.h $(CC) $(CFLAGS) -c -o gui/composite_widget.o gui/composite_widget.c +gui/desktop.o: gui/desktop.c gui/desktop.h + $(CC) $(CFLAGS) -c -o gui/desktop.o gui/desktop.c + clean: -rm -f boot.bin kernel.bin kernel.sym kernel.elf image.bin magic.bin boot.map image.tmp \ serial.log \ diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 0d3c49a..5da642a 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -268,13 +268,32 @@ vga_color_t vga_make_RGB( int R, int G, int B ) return c; } -static uint8_t get_color_index( const vga_color_t c ) +const vga_color_t VGA_COLOR_BLACK = { 0x00, 0x00, 0x00 }; +const vga_color_t VGA_COLOR_BLUE = { 0x00, 0x00, 0xAA }; +const vga_color_t VGA_COLOR_GREEN = { 0x00, 0xAA, 0x00 }; +const vga_color_t VGA_COLOR_CYAN = { 0x00, 0xAA, 0xAA }; +const vga_color_t VGA_COLOR_RED = { 0xAA, 0x00, 0x00 }; +const vga_color_t VGA_COLOR_MAGENTA = { 0xAA, 0x00, 0xAA }; +const vga_color_t VGA_COLOR_BROWN = { 0xAA, 0x55, 0x00 }; +const vga_color_t VGA_COLOR_LIGHT_GREY = { 0xAA, 0xAA, 0xAA }; +const vga_color_t VGA_COLOR_WHITE = { 0xFF, 0xFF, 0xFF }; + +static bool is_same( const vga_color_t c1, const vga_color_t c2 ) { - // TODO: for now white and black, standard VGA palette entries? - if( c.R == 0x00 && c.G == 0x00 && c.B == 0x00 ) return 0x00; - if( c.R == 0x00 && c.G == 0x00 && c.B == 0xA8 ) return 0x01; - if( c.R == 0xFF && c.G == 0xFF && c.B == 0xFF ) return 0x3F; + return c1.R == c2.R && c1.G == c2.G && c1.B == c2.B; +} +static uint8_t get_color_index( const vga_color_t c ) +{ + if( is_same( c, VGA_COLOR_BLACK ) ) return 0x00; + if( is_same( c, VGA_COLOR_BLUE ) ) return 0x01; + if( is_same( c, VGA_COLOR_GREEN ) ) return 0x02; + if( is_same( c, VGA_COLOR_CYAN ) ) return 0x03; + if( is_same( c, VGA_COLOR_RED ) ) return 0x04; + if( is_same( c, VGA_COLOR_MAGENTA ) ) return 0x05; + if( is_same( c, VGA_COLOR_BROWN ) ) return 0x06; + if( is_same( c, VGA_COLOR_LIGHT_GREY ) ) return 0x07; + if( is_same( c, VGA_COLOR_WHITE ) ) return 0x3F; return 0x00; } diff --git a/src/drivers/video/vga.h b/src/drivers/video/vga.h index 86897c4..3b09c37 100644 --- a/src/drivers/video/vga.h +++ b/src/drivers/video/vga.h @@ -64,6 +64,16 @@ typedef struct { int B; } vga_color_t; +extern const vga_color_t VGA_COLOR_BLACK; +extern const vga_color_t VGA_COLOR_BLUE; +extern const vga_color_t VGA_COLOR_GREEN; +extern const vga_color_t VGA_COLOR_CYAN; +extern const vga_color_t VGA_COLOR_RED; +extern const vga_color_t VGA_COLOR_MAGENTA; +extern const vga_color_t VGA_COLOR_BROWN; +extern const vga_color_t VGA_COLOR_LIGHT_GREY; +extern const vga_color_t VGA_COLOR_WHITE; + vga_color_t vga_make_RGB( int R, int G, int B ); void vga_set_pixel( vga_t *vga, const int x, const int y, const vga_color_t color ); diff --git a/src/gui/composite_widget.c b/src/gui/composite_widget.c index e9cc166..afef28c 100644 --- a/src/gui/composite_widget.c +++ b/src/gui/composite_widget.c @@ -98,6 +98,8 @@ void composite_widget_on_mouse_move( void *obj, const int old_x, const int old_y composite_widget_t *widget = obj; widget_t *moved_out_from = NULL; + // TODO: have a mouse leave and mouse enter event instead + for( int i = 0; i < widget->nof_children; i++ ) { widget_t *child = widget->children[i]; if( child->vtable->contains_coordinate( child, old_x - widget->base.x, old_y - widget->base.y ) ) { diff --git a/src/gui/desktop.c b/src/gui/desktop.c new file mode 100644 index 0000000..39235d2 --- /dev/null +++ b/src/gui/desktop.c @@ -0,0 +1,54 @@ +#include "desktop.h" + +#include "string.h" +#include "stddef.h" + +static desktop_vtable_t desktop_vtable = { + { + desktop_draw, + composite_widget_get_focus, + widget_model_to_screen, + widget_contains_coordinate, + desktop_on_mouse_down, + desktop_on_mouse_up, + desktop_on_mouse_move, + composite_widget_on_key_down, + composite_widget_on_key_up + } +}; + +void desktop_init( desktop_t *desktop, const int w, const int h ) +{ + memset( desktop, 0, sizeof( desktop_t ) ); + + composite_widget_init( &desktop->base, NULL, 0, 0, w, h ); + + desktop->vtable = &desktop_vtable; +} + +void desktop_draw( void *obj, graphics_context_t *context ) +{ + desktop_t *desktop = obj; + + ((widget_vtable_t *)(desktop->base.vtable))->draw( obj, context ); + + // TODO: use a mouse bitmap and copy it +/* + for( int i = 0; i < 4; i++ ) { + vga_set_pixel( context, +void vga_set_pixel( vga_t *vga, const int x, const int y, const vga_color_t color ); + } +*/ +} + +void desktop_on_mouse_down( void *obj, const int x, const int y ) +{ +} + +void desktop_on_mouse_up( void *obj, const int x, const int y ) +{ +} + +void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y ) +{ +} diff --git a/src/gui/desktop.h b/src/gui/desktop.h new file mode 100644 index 0000000..b160dc0 --- /dev/null +++ b/src/gui/desktop.h @@ -0,0 +1,24 @@ +#ifndef DESKTOP_H +#define DESKTOP_H + +#include "composite_widget.h" + +#define MAX_NOF_WIDGET_CHILDREN 100 + +typedef struct { + composite_widget_vtable_t base; +} desktop_vtable_t; + +typedef struct { + composite_widget_t base; + desktop_vtable_t *vtable; +} desktop_t; + +void desktop_init( desktop_t *widget, const int w, const int h ); + +void desktop_draw( void *obj, graphics_context_t *context ); +void desktop_on_mouse_down( void *obj, const int x, const int y ); +void desktop_on_mouse_up( void *obj, const int x, const int y ); +void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y ); + +#endif // DESKTOP_H diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index ee63295..180bf39 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -194,20 +194,20 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) switch( global_context->mode ) { case MODE_TEXT: if( vga_set_mode( vga, vga_make_mode( VGA_MODE_TYPE_GRAPHICS, 320, 200, 8 ) ) ) { - vga_clear_screen( vga, vga_make_RGB( 0x00, 0x00, 0xA8 ) ); - vga_draw_char( vga, 'A', 10, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_clear_screen( vga, vga_make_RGB( 0x00, 0x00, 0xAA ) ); + vga_draw_char( vga, 'A', 10, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'B', 20, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'B', 20, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'C', 30, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'C', 30, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'D', 40, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'D', 40, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'E', 50, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'E', 50, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'F', 60, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'F', 60, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); - vga_draw_char( vga, 'G', 70, 10, vga_make_RGB( 0x00, 0x00, 0xA8 ), + vga_draw_char( vga, 'G', 70, 10, vga_make_RGB( 0x00, 0x00, 0xAA ), vga_make_RGB( 0xFF, 0xFF, 0xFF ) ); widget_t widget; -- cgit v1.2.3-54-g00ecf