summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-21 17:39:00 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-21 17:39:00 +0200
commitf05524445914e31891ec227520d9bb3fe5857e2c (patch)
tree219f38ac0d3be60dda3613b892b51cae0fee9ec9
parente158c4832aa1d5dc8603fb9c33cac3f7cc19abc9 (diff)
downloadabaos-f05524445914e31891ec227520d9bb3fe5857e2c.tar.gz
abaos-f05524445914e31891ec227520d9bb3fe5857e2c.tar.bz2
improved VGA colors
added basics of a desktop widget class
-rw-r--r--src/Makefile7
-rw-r--r--src/drivers/video/vga.c29
-rw-r--r--src/drivers/video/vga.h10
-rw-r--r--src/gui/composite_widget.c2
-rw-r--r--src/gui/desktop.c54
-rw-r--r--src/gui/desktop.h24
-rw-r--r--src/kernel/kernel.c16
7 files changed, 127 insertions, 15 deletions
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;