diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-30 13:02:10 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-30 13:02:10 +0200 |
commit | d2af238397ab523b2c1ba7d24875a186b4a8acc6 (patch) | |
tree | 5a99466020e9a6632ad361e846e92e51de5e6be3 | |
parent | ad7f1dd777eda2d6505118c4e47faba3f21e78ba (diff) | |
download | abaos-d2af238397ab523b2c1ba7d24875a186b4a8acc6.tar.gz abaos-d2af238397ab523b2c1ba7d24875a186b4a8acc6.tar.bz2 |
added a third widget (for drawing fonts)
fixed drawing races due to mouse interrupts
-rw-r--r-- | src/drivers/video/vga.c | 8 | ||||
-rw-r--r-- | src/drivers/video/vga.h | 2 | ||||
-rw-r--r-- | src/kernel/kernel.c | 23 |
3 files changed, 27 insertions, 6 deletions
diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 2080283..9d540af 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -253,6 +253,8 @@ bool vga_set_mode( vga_t *vga, const vga_mode_t mode ) vga->mode = mode; vga->mode.segment = get_frame_buffer_segment( vga ); + vga->use_z_buffer = false; + return true; } @@ -380,3 +382,9 @@ void vga_wait_for_retrace( vga_t *vga ) while( !( port8_read( &vga->attribute_controller_reset_port ) & 0x08 ) ); } +void vga_use_z_buffer( vga_t *vga, bool use ) +{ + vga->use_z_buffer = use; +} + + diff --git a/src/drivers/video/vga.h b/src/drivers/video/vga.h index b9a5c87..0f55f74 100644 --- a/src/drivers/video/vga.h +++ b/src/drivers/video/vga.h @@ -42,6 +42,7 @@ typedef struct { port8_t attribute_controller_reset_port; vga_mode_t mode; void *context; + bool use_z_buffer; } vga_t; typedef struct { @@ -81,5 +82,6 @@ void vga_draw_rectangle( vga_t *vga, const int x, const int y, const int w, cons void vga_clear_screen( vga_t *vga, const vga_color_t color ); void vga_draw_char( vga_t *vga, const unsigned char c, const int x, const int y, const vga_color_t background, const vga_color_t foreground ); void vga_wait_for_retrace( vga_t *vga ); +void vga_use_z_buffer( vga_t *vga, bool use ); #endif // VGA_H diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index babb6e0..197f491 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -47,6 +47,8 @@ typedef struct { desktop_t desktop; window_t window1; window_t window2; + window_t window3; + text_widget_t widget3; } global_context_t; static global_context_t global_context; @@ -144,11 +146,20 @@ void kernel_main( void ) break; case MODE_GRAPHICS: + // for now we must avoid races with the interrupt + // 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) 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 ); + + interrupts_enable( ); + break; } } @@ -170,6 +181,7 @@ void kernel_panic( const char *format, ... ) va_start( args, format ); (void)vprintf( format, args ); va_end( args ); + puts( "" ); longjmp( panic_jmp_buf, 47 ); } @@ -229,13 +241,12 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) *p++ = c; } *p = '\0'; -// 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 *)global_context->desktop.vtable)->draw( &global_context->desktop, vga ); + window_init( &global_context->window3, (widget_t *)&global_context->desktop, 55, 5, vga->mode.x - 65, 100, VGA_COLOR_WHITE ); + ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&global_context->window3 ); + +// text_widget_init( &global_context->widget3, (widget_t *)&global_context->window3, 1, 1, global_context->window3.base.base.w - 2, global_context->window3.base.base.h - 2, VGA_COLOR_RED, s ); +// ((composite_widget_vtable_t *)global_context->window3.vtable)->add_child( (composite_widget_t *)&global_context->window3, (widget_t *)&global_context->widget3 ); mouse_set_resolution( mouse, vga->mode.x, vga->mode.y ); } |