summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-30 13:02:10 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-30 13:02:10 +0200
commitd2af238397ab523b2c1ba7d24875a186b4a8acc6 (patch)
tree5a99466020e9a6632ad361e846e92e51de5e6be3
parentad7f1dd777eda2d6505118c4e47faba3f21e78ba (diff)
downloadabaos-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.c8
-rw-r--r--src/drivers/video/vga.h2
-rw-r--r--src/kernel/kernel.c23
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 );
}