From d5095a462df8c1373da36924a86c1da7fb3b1c49 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 25 Jun 2017 15:05:09 +0200 Subject: we have a flickering mouse cursor and terrible redrawing of the desktop now :-) removed the font window for now, far too slow! --- src/drivers/hdi/ps2/mouse.c | 6 ++++++ src/drivers/hdi/ps2/mouse.h | 1 + src/gui/desktop.c | 30 ++++++++++++++++++++++-------- src/kernel/kernel.c | 35 ++++++++++++++++++++++++----------- 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; -- cgit v1.2.3-54-g00ecf