summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-25 15:05:09 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-25 15:05:09 +0200
commitd5095a462df8c1373da36924a86c1da7fb3b1c49 (patch)
tree40df07dbf466d4ee65f0069547ca2166fd6cb535
parent96d1781a9ba365baef0f89ef85a2b103bfd6370a (diff)
downloadabaos-d5095a462df8c1373da36924a86c1da7fb3b1c49.tar.gz
abaos-d5095a462df8c1373da36924a86c1da7fb3b1c49.tar.bz2
we have a flickering mouse cursor and terrible redrawing of the desktop now :-)
removed the font window for now, far too slow!
-rw-r--r--src/drivers/hdi/ps2/mouse.c6
-rw-r--r--src/drivers/hdi/ps2/mouse.h1
-rw-r--r--src/gui/desktop.c30
-rw-r--r--src/kernel/kernel.c35
4 files changed, 53 insertions, 19 deletions
diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c
index 43b8e4f..36b2119 100644
--- a/src/drivers/hdi/ps2/mouse.c
+++ b/src/drivers/hdi/ps2/mouse.c
@@ -251,3 +251,9 @@ void mouse_set_resolution( mouse_t *mouse, const uint32_t res_x, const uint32_t
mouse->cursor_x = mouse->res_x / 2;
mouse->cursor_y = mouse->res_y / 2;
}
+
+void mouse_set_position( mouse_t *mouse, const uint32_t x, const uint32_t y )
+{
+ mouse->cursor_x = x;
+ mouse->cursor_y = y;
+}
diff --git a/src/drivers/hdi/ps2/mouse.h b/src/drivers/hdi/ps2/mouse.h
index 166b4df..e6ac326 100644
--- a/src/drivers/hdi/ps2/mouse.h
+++ b/src/drivers/hdi/ps2/mouse.h
@@ -61,6 +61,7 @@ void mouse_deinit( void *obj );
void mouse_print_info( void *obj );
void mouse_set_resolution( mouse_t *mouse, const uint32_t x, const uint32_t y );
+void mouse_set_position( mouse_t *mouse, const uint32_t x, const uint32_t y );
uint32_t mouse_handle_interrupt( interrupt_handler_t *handler, uint32_t esp );
diff --git a/src/gui/desktop.c b/src/gui/desktop.c
index 7c886b6..0c0aa01 100644
--- a/src/gui/desktop.c
+++ b/src/gui/desktop.c
@@ -26,9 +26,11 @@ void desktop_init( desktop_t *desktop, const int w, const int h, const vga_color
composite_widget_init( &desktop->base, NULL, 0, 0, w, h, background_color );
- desktop->mouse_x = 0;
- desktop->mouse_y = 0;
+ desktop->mouse_x = w / 2;
+ desktop->mouse_y = h / 2;
+ desktop->base.base.vtable = (widget_vtable_t *)&desktop_vtable;
+ desktop->base.vtable = (composite_widget_vtable_t *)&desktop_vtable;
desktop->vtable = &desktop_vtable;
}
@@ -38,15 +40,22 @@ void desktop_draw( void *obj, graphics_context_t *context )
vga_clear_screen( context, desktop->base.base.background_color );
- ((widget_vtable_t *)(desktop->base.vtable))->draw( obj, context );
+ composite_widget_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 );
+ if( desktop->mouse_x > i ) {
+ vga_set_pixel( context, desktop->mouse_x - i, desktop->mouse_y, VGA_COLOR_WHITE );
+ }
+ if( desktop->mouse_x < context->mode.x - i ) {
+ vga_set_pixel( context, desktop->mouse_x + i, desktop->mouse_y, VGA_COLOR_WHITE );
+ }
+ if( desktop->mouse_y > i ) {
+ vga_set_pixel( context, desktop->mouse_x, desktop->mouse_y - i, VGA_COLOR_WHITE );
+ }
+ if( desktop->mouse_y < context->mode.y - i ) {
+ vga_set_pixel( context, desktop->mouse_x, desktop->mouse_y + i, VGA_COLOR_WHITE );
+ }
}
-*/
}
void desktop_on_mouse_down( void *obj, const int x, const int y )
@@ -55,8 +64,13 @@ 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 )
{
+ composite_widget_on_mouse_up( obj, x, y );
}
void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y )
{
+ desktop_t *desktop = obj;
+
+ desktop->mouse_x = x;
+ desktop->mouse_y = y;
}
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 3135a25..f10a1a2 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -43,6 +43,7 @@ typedef struct {
vga_t vga;
mode_t mode;
mouse_t mouse;
+ desktop_t desktop;
} global_context_t;
static global_context_t global_context;
@@ -134,6 +135,17 @@ void kernel_main( void )
// so we let the main thread sleep instead of
// burning CPU..
kernel_halt( );
+
+ switch( global_context.mode ) {
+ case MODE_TEXT:
+ break;
+
+ case MODE_GRAPHICS:
+ interrupts_disable( );
+ ((widget_vtable_t *)global_context.desktop.vtable)->draw( &global_context.desktop, &global_context.vga );
+ interrupts_enable( );
+ break;
+ }
}
TERMINATE:
@@ -198,16 +210,15 @@ 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 ) ) ) {
- desktop_t desktop;
- desktop_init( &desktop, 320, 200, VGA_COLOR_BLUE );
+ desktop_init( &global_context->desktop, 320, 200, VGA_COLOR_BLUE );
widget_t widget1;
- widget_init( &widget1, (widget_t *)&desktop, 60, 90, 60, 70, VGA_COLOR_LIGHT_GREY );
- ((composite_widget_vtable_t *)desktop.vtable)->add_child( &desktop, &widget1 );
+ widget_init( &widget1, (widget_t *)&global_context->desktop, 60, 90, 60, 70, VGA_COLOR_LIGHT_GREY );
+ ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, &widget1 );
widget_t widget2;
- widget_init( &widget2, (widget_t *)&desktop, 130, 80, 60, 70, VGA_COLOR_GREEN );
- ((composite_widget_vtable_t *)desktop.vtable)->add_child( &desktop, &widget2 );
+ widget_init( &widget2, (widget_t *)&global_context->desktop, 130, 80, 60, 70, VGA_COLOR_GREEN );
+ ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, &widget2 );
char s[100];
char *p = s;
@@ -215,12 +226,13 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
*p++ = c;
}
*p = '\0';
- text_widget_t widget3;
- text_widget_init( &widget3, (widget_t *)&desktop, 55, 5, vga->mode.x - 65 , 100, VGA_COLOR_RED, s );
- ((composite_widget_vtable_t *)desktop.vtable)->add_child( &desktop, (widget_t *)&widget3 );
+// TODO: far too slow, must improve memory to VGA memory operations like copy block and masking
+// text_widget_t widget3;
+// text_widget_init( &widget3, (widget_t *)&global_context->desktop, 55, 5, vga->mode.x - 65 , 100, VGA_COLOR_RED, s );
+// ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&widget3 );
// as vga_t is equals to the graphical context for now
- ((widget_vtable_t *)desktop.vtable)->draw( &desktop, vga );
+ ((widget_vtable_t *)global_context->desktop.vtable)->draw( &global_context->desktop, vga );
mouse_set_resolution( mouse, vga->mode.x, vga->mode.y );
}
@@ -255,6 +267,7 @@ static void handle_mouse_event( mouse_event_t *event, void *context )
global_context_t *global_context = (global_context_t *)context;
vga_text_t *vga_text = &global_context->vga_text;
vga_t *vga = &global_context->vga;
+ desktop_t *desktop = &global_context->desktop;
switch( global_context->mode ) {
case MODE_TEXT:
@@ -287,7 +300,7 @@ static void handle_mouse_event( mouse_event_t *event, void *context )
break;
case MOUSE_EVENT_TYPE_MOVE:
- vga_set_pixel( vga, event->cursor_x, event->cursor_y, VGA_COLOR_WHITE );
+ desktop_on_mouse_move( desktop, event->old_cursor_x, event->old_cursor_y, event->cursor_x, event->cursor_y );
break;
}
break;