diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-25 09:35:29 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-25 09:35:29 +0200 |
commit | 96d1781a9ba365baef0f89ef85a2b103bfd6370a (patch) | |
tree | b435c4fb19cb587495b96829dc9862ca3bb28311 | |
parent | e77368940afaa2bbc7bd883ef6cd25a5565a1bbd (diff) | |
download | abaos-96d1781a9ba365baef0f89ef85a2b103bfd6370a.tar.gz abaos-96d1781a9ba365baef0f89ef85a2b103bfd6370a.tar.bz2 |
put the mouse object into the global context so we can adjust the
resolution when switching video modes
-rw-r--r-- | src/drivers/hdi/ps2/mouse.c | 17 | ||||
-rw-r--r-- | src/drivers/hdi/ps2/mouse.h | 4 | ||||
-rw-r--r-- | src/gui/desktop.c | 3 | ||||
-rw-r--r-- | src/gui/desktop.h | 2 | ||||
-rw-r--r-- | src/kernel/kernel.c | 61 |
5 files changed, 59 insertions, 28 deletions
diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c index 46984eb..43b8e4f 100644 --- a/src/drivers/hdi/ps2/mouse.c +++ b/src/drivers/hdi/ps2/mouse.c @@ -85,19 +85,14 @@ static mouse_vtable_t mouse_vtable = { } }; -void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, void *context ) +void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, const uint32_t res_x, const uint32_t res_y, void *context ) { memset( mouse, 0, sizeof( mouse_t ) ); // TODO: we should probe for wheel mouse and more than 3 packets mouse->nof_packets = DEFAULT_NOF_PACKETS; - vga_text_t *vga_text = (vga_text_t *)context; - - mouse->res_x = vga_text->res_x; - mouse->res_y = vga_text->res_y; - mouse->cursor_x = mouse->res_x / 2; - mouse->cursor_y = mouse->res_y / 2; + mouse_set_resolution( mouse, res_x, res_y ); mouse->handler = handler; mouse->context = context; @@ -248,3 +243,11 @@ void mouse_print_info( void *obj ) { puts( "PS/2 mouse driver" ); } + +void mouse_set_resolution( mouse_t *mouse, const uint32_t res_x, const uint32_t res_y ) +{ + mouse->res_x = res_x; + mouse->res_y = res_y; + mouse->cursor_x = mouse->res_x / 2; + mouse->cursor_y = mouse->res_y / 2; +} diff --git a/src/drivers/hdi/ps2/mouse.h b/src/drivers/hdi/ps2/mouse.h index cbd02ef..166b4df 100644 --- a/src/drivers/hdi/ps2/mouse.h +++ b/src/drivers/hdi/ps2/mouse.h @@ -54,12 +54,14 @@ typedef struct { driver_vtable_t base; } mouse_vtable_t; -void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, void *context ); +void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, const uint32_t res_x, const uint32_t res_y, void *context ); void mouse_activate( void *obj ); void mouse_deactivate( void *obj ); 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 ); + uint32_t mouse_handle_interrupt( interrupt_handler_t *handler, uint32_t esp ); #endif // MOUSE_H diff --git a/src/gui/desktop.c b/src/gui/desktop.c index ee4a6e5..7c886b6 100644 --- a/src/gui/desktop.c +++ b/src/gui/desktop.c @@ -26,6 +26,9 @@ 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->vtable = &desktop_vtable; } diff --git a/src/gui/desktop.h b/src/gui/desktop.h index 1f3ef93..a8db094 100644 --- a/src/gui/desktop.h +++ b/src/gui/desktop.h @@ -12,6 +12,8 @@ typedef struct { typedef struct { composite_widget_t base; desktop_vtable_t *vtable; + int mouse_x; + int mouse_y; } desktop_t; void desktop_init( desktop_t *widget, const int w, const int h, const vga_color_t background_color ); diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index b17baf4..3135a25 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -42,6 +42,7 @@ typedef struct { driver_manager_t driver_manager; vga_t vga; mode_t mode; + mouse_t mouse; } global_context_t; static global_context_t global_context; @@ -92,12 +93,11 @@ void kernel_main( void ) interrupts_register_interrupt_handler( keyboard_interrupt_handler ); driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&keyboard ); - mouse_t mouse; - mouse_init( &mouse, &handle_mouse_event, (void *)&global_context ); + mouse_init( &global_context.mouse, &handle_mouse_event, global_context.vga_text.res_x, global_context.vga_text.res_y, (void *)&global_context ); interrupt_handler_t mouse_interrupt_handler; - interrupt_handler_init( &mouse_interrupt_handler, IRQ_BASE + 0x0C, &interrupt, mouse_handle_interrupt, &mouse ); + interrupt_handler_init( &mouse_interrupt_handler, IRQ_BASE + 0x0C, &interrupt, mouse_handle_interrupt, &global_context.mouse ); interrupts_register_interrupt_handler( mouse_interrupt_handler ); - driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&mouse ); + driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&global_context.mouse ); // exit point in case of kernel panic, do this as soon as // possible @@ -165,6 +165,7 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) vga_text_t *vga_text = &global_context->vga_text; driver_manager_t *driver_manager = &global_context->driver_manager; vga_t *vga = &global_context->vga; + mouse_t *mouse = &global_context->mouse; vga_text_hide_mouse_cursor( vga_text ); @@ -220,14 +221,17 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) // as vga_t is equals to the graphical context for now ((widget_vtable_t *)desktop.vtable)->draw( &desktop, vga ); + + mouse_set_resolution( mouse, vga->mode.x, vga->mode.y ); } global_context->mode = MODE_GRAPHICS; break; case MODE_GRAPHICS: if( vga_set_mode( vga, vga_make_mode( VGA_MODE_TYPE_TEXT, 640, 480, 4 ) ) ) { + mouse_set_resolution( mouse, vga_text->res_x, vga_text->res_y ); + global_context->mode = MODE_TEXT; } - global_context->mode = MODE_TEXT; break; } } else { @@ -250,25 +254,42 @@ 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; - switch( event->type ) { - case MOUSE_EVENT_TYPE_BUTTON_UP: - vga_text_hide_mouse_cursor( vga_text ); - printf( "MOUSE UP %d AT X:%d, Y:%d\n", event->button, event->cursor_x, - event->cursor_y ); - vga_text_show_mouse_cursor( vga_text ); + switch( global_context->mode ) { + case MODE_TEXT: + switch( event->type ) { + case MOUSE_EVENT_TYPE_BUTTON_UP: + vga_text_hide_mouse_cursor( vga_text ); + printf( "MOUSE UP %d AT X:%d, Y:%d\n", event->button, event->cursor_x, + event->cursor_y ); + vga_text_show_mouse_cursor( vga_text ); + break; + + case MOUSE_EVENT_TYPE_BUTTON_DOWN: + vga_text_hide_mouse_cursor( vga_text ); + printf( "MOUSE DOWN %d AT X:%d, Y:%d\n", event->button, event->cursor_x, + event->cursor_y ); + vga_text_show_mouse_cursor( vga_text ); + break; + + case MOUSE_EVENT_TYPE_MOVE: + vga_text_move_mouse_cursor( vga_text, event->cursor_x, event->cursor_y ); + vga_text_show_mouse_cursor( vga_text ); + break; + } break; - case MOUSE_EVENT_TYPE_BUTTON_DOWN: - vga_text_hide_mouse_cursor( vga_text ); - printf( "MOUSE DOWN %d AT X:%d, Y:%d\n", event->button, event->cursor_x, - event->cursor_y ); - vga_text_show_mouse_cursor( vga_text ); - break; + case MODE_GRAPHICS: + switch( event->type ) { + case MOUSE_EVENT_TYPE_BUTTON_UP: + case MOUSE_EVENT_TYPE_BUTTON_DOWN: + break; - case MOUSE_EVENT_TYPE_MOVE: - vga_text_move_mouse_cursor( vga_text, event->cursor_x, event->cursor_y ); - vga_text_show_mouse_cursor( vga_text ); + case MOUSE_EVENT_TYPE_MOVE: + vga_set_pixel( vga, event->cursor_x, event->cursor_y, VGA_COLOR_WHITE ); + break; + } break; } } |