summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-25 09:35:29 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-25 09:35:29 +0200
commit96d1781a9ba365baef0f89ef85a2b103bfd6370a (patch)
treeb435c4fb19cb587495b96829dc9862ca3bb28311
parente77368940afaa2bbc7bd883ef6cd25a5565a1bbd (diff)
downloadabaos-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.c17
-rw-r--r--src/drivers/hdi/ps2/mouse.h4
-rw-r--r--src/gui/desktop.c3
-rw-r--r--src/gui/desktop.h2
-rw-r--r--src/kernel/kernel.c61
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;
}
}