From 25228d8927af801667d4be2ea85ee517d1916fc7 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Fri, 30 Jun 2017 20:45:37 +0200 Subject: almost got a complete mode switch (vga graphics back to text) working some cleanup in VGA driver code --- src/kernel/kernel.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'src/kernel/kernel.c') diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 9bd3d98..501ab90 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -143,6 +143,8 @@ void kernel_main( void ) switch( global_context.mode ) { case MODE_TEXT: + // nothing to draw or refresh in text mode, the + // VGA card is doing that for us break; case MODE_GRAPHICS: @@ -150,12 +152,6 @@ void kernel_main( void ) // events originating especially from the mouse interrupts_disable( ); - // wait for VGA retrace, assume drawing the desktop - // is fast enough to finish in time (so we don't recheck - // for retrace), it Z-buffering, this is done in vga_refresh - // directly, no need to do it here -// vga_wait_for_retrace( &global_context.vga ); - // as vga_t is equals to the graphical context for now ((widget_vtable_t *)global_context.desktop.vtable)->draw( &global_context.desktop, &global_context.vga ); @@ -230,6 +226,8 @@ 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_text_save( vga_text ); + desktop_init( &global_context->desktop, 320, 200, VGA_COLOR_BLUE ); window_init( &global_context->window1, (widget_t *)&global_context->desktop, 60, 90, 60, 70, VGA_COLOR_LIGHT_GREY ); @@ -258,13 +256,13 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) // enable Z buffering vga_use_z_buffer( &global_context->vga, true ); - // draw on mode switch -// ((widget_vtable_t *)global_context->desktop.vtable)->draw( &global_context->desktop, &global_context->vga ); - global_context->mode = MODE_GRAPHICS; break; case MODE_GRAPHICS: + vga_text_restore( vga_text ); + vga_text_set_cursor( vga_text, vga_text->cursor_x, vga_text->cursor_y ); + 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; @@ -336,10 +334,6 @@ static void handle_mouse_event( mouse_event_t *event, void *context ) break; } - // alternative way of redrawing on mouse event - // on qemu looses the mouse.. -// ((widget_vtable_t *)desktop->vtable)->draw( &global_context->desktop, &global_context->vga ); - break; } } -- cgit v1.2.3-54-g00ecf