summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/README3
-rw-r--r--src/gui/desktop.c12
-rw-r--r--src/gui/desktop.h1
-rw-r--r--src/gui/text_widget.c12
-rw-r--r--src/gui/text_widget.h2
-rw-r--r--src/gui/widget.c2
-rw-r--r--src/kernel/kernel.c180
7 files changed, 127 insertions, 85 deletions
diff --git a/src/README b/src/README
index 1f3c8dc..b529282 100644
--- a/src/README
+++ b/src/README
@@ -49,9 +49,12 @@ Driver framework and specific drivers.
gui
---
+Small GUI library, should be completly independend on the video driver.
+
* widget.c - basic GUI widget definining the interface of all GUI objects
* composite_widget.c - a widget which is composed of a set of widgets
* text_widget.c - a widget showing text
+* window.c - a clickable, focusable, closable, etc. window
* desktop.c - the top-level composite widget covering the whole desktop
libc
diff --git a/src/gui/desktop.c b/src/gui/desktop.c
index ad4aad9..4a3876e 100644
--- a/src/gui/desktop.c
+++ b/src/gui/desktop.c
@@ -13,7 +13,7 @@ static desktop_vtable_t desktop_vtable = {
desktop_on_mouse_down,
desktop_on_mouse_up,
desktop_on_mouse_move,
- composite_widget_on_key_down,
+ desktop_on_key_down,
composite_widget_on_key_up
},
composite_widget_add_child
@@ -94,3 +94,13 @@ void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const i
desktop->needs_redrawing = true;
}
+
+void desktop_on_key_down( void *obj, char c )
+{
+ desktop_t *desktop = obj;
+
+ composite_widget_on_key_down( obj, c );
+
+ desktop->needs_redrawing = true;
+}
+
diff --git a/src/gui/desktop.h b/src/gui/desktop.h
index a9d1946..f644691 100644
--- a/src/gui/desktop.h
+++ b/src/gui/desktop.h
@@ -25,5 +25,6 @@ void desktop_draw( void *obj, graphics_context_t *context );
void desktop_on_mouse_down( void *obj, const int x, const int y );
void desktop_on_mouse_up( void *obj, const int x, const int y );
void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y );
+void desktop_on_key_down( void *obj, char c );
#endif // DESKTOP_H
diff --git a/src/gui/text_widget.c b/src/gui/text_widget.c
index dc12c11..f6ba8eb 100644
--- a/src/gui/text_widget.c
+++ b/src/gui/text_widget.c
@@ -12,8 +12,8 @@ static text_widget_vtable_t text_widget_vtable = {
widget_on_mouse_down,
widget_on_mouse_up,
widget_on_mouse_move,
- widget_on_key_down,
- widget_on_key_up
+ text_widget_on_key_down,
+ text_widget_on_key_up
},
text_widget_set_text
};
@@ -25,6 +25,8 @@ void text_widget_init( text_widget_t *widget, widget_t *parent, const int x, con
widget_init( &widget->base, parent, x, y, w, h, background_color );
text_widget_set_text( widget, s );
+
+ widget->base.focusable = true;
widget->base.vtable = (widget_vtable_t *)&text_widget_vtable;
widget->vtable = &text_widget_vtable;
@@ -64,6 +66,12 @@ void text_widget_set_text( void *obj, const char *s )
void text_widget_on_key_down( void *obj, char c )
{
+ text_widget_t *widget = obj;
+
+ if( strlen( widget->s ) < TEXT_WIDGET_MAX_TEXT_SIZE - 1 ) {
+ widget->s[strlen( widget->s )] = c;
+ widget->s[strlen( widget->s )+1] = '\0';
+ }
}
void text_widget_on_key_up( void *obj, char c )
diff --git a/src/gui/text_widget.h b/src/gui/text_widget.h
index 4919e26..3b22cf1 100644
--- a/src/gui/text_widget.h
+++ b/src/gui/text_widget.h
@@ -3,7 +3,7 @@
#include "widget.h"
-#define TEXT_WIDGET_MAX_TEXT_SIZE 100
+#define TEXT_WIDGET_MAX_TEXT_SIZE 300
typedef struct {
widget_vtable_t base;
diff --git a/src/gui/widget.c b/src/gui/widget.c
index 1c26680..81ab264 100644
--- a/src/gui/widget.c
+++ b/src/gui/widget.c
@@ -46,7 +46,7 @@ void widget_get_focus( void *obj, widget_t *widget )
widget_t *o = obj;
if( o->parent != NULL ) {
- o->parent->vtable->get_focus( widget->parent, widget );
+ o->parent->vtable->get_focus( o->parent, widget );
}
}
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 5bc3b52..9a66e89 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -194,94 +194,111 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
driver_manager_t *driver_manager = &global_context->driver_manager;
vga_t *vga = &global_context->vga;
mouse_t *mouse = &global_context->mouse;
+ //~ desktop_t *desktop = &global_context->desktop;
- vga_text_hide_mouse_cursor( vga_text );
-
- if( event->type == KEYBOARD_EVENT_TYPE_KEY_PRESSED ) {
- if( event->key == KEYBOARD_KEY_ASCII ) {
- if( event->ascii_key == '\n' ) {
- buf[pos] = '\0';
- pos = 0;
- puts( "" );
- if( strcmp( buf, "help" ) == 0 ) {
- puts( "halt - terminate os" );
- puts( "mem - show memory usage" );
- puts( "driver - show status of drivers" );
- puts( "proc - show process status" );
- puts( "clear - clear screen" );
- puts( "mode - switch between text/graphics mode" );
- } else if( strcmp( buf, "halt" ) == 0 ) {
- terminate = true;
- } else if( strcmp( buf, "mem" ) == 0 ) {
- // TODO: print memory usage
- } else if( strcmp( buf, "proc" ) == 0 ) {
- // TODO: print scheduler status
- } else if( strcmp( buf, "driver" ) == 0 ) {
- driver_manager_print_info_all( driver_manager );
- } else if( strcmp( buf, "clear" ) == 0 ) {
- vga_text_clear_screen( vga_text );
- } else if( strcmp( buf, "mode" ) == 0 ) {
- // TODO: move mode switches to and from graphics/text mode here,
- // for now when we enter the graphics mode we remain there
- 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 );
- ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&global_context->window1 );
-
- window_init( &global_context->window2, (widget_t *)&global_context->desktop, 130, 80, 60, 70, VGA_COLOR_GREEN );
- ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&global_context->window2 );
-
- char s[100];
-
- char *p = s;
- for( char c = ' '; c <= '~'; c++ ) {
- *p++ = c;
- }
- *p = '\0';
-
- window_init( &global_context->window3, (widget_t *)&global_context->desktop, 55, 5, vga->mode.x - 65, 100, VGA_COLOR_CYAN );
- ((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 );
- }
-
- // enable Z buffering
- vga_use_z_buffer( &global_context->vga, true );
-
- global_context->mode = MODE_GRAPHICS;
- break;
+ switch( global_context->mode ) {
- case MODE_GRAPHICS:
- vga_text_restore( vga_text );
+ case MODE_TEXT:
- if( vga_set_mode( vga, vga_make_mode( VGA_MODE_TYPE_TEXT, 640, 480, 4 ) ) ) {
- vga_text_set_cursor( vga_text, vga_text->cursor_x, vga_text->cursor_y );
- mouse_set_resolution( mouse, vga_text->res_x, vga_text->res_y );
- global_context->mode = MODE_TEXT;
+ vga_text_hide_mouse_cursor( vga_text );
+
+ if( event->type == KEYBOARD_EVENT_TYPE_KEY_PRESSED ) {
+ if( event->key == KEYBOARD_KEY_ASCII ) {
+ if( event->ascii_key == '\n' ) {
+ buf[pos] = '\0';
+ pos = 0;
+ puts( "" );
+ if( strcmp( buf, "help" ) == 0 ) {
+ puts( "halt - terminate os" );
+ puts( "mem - show memory usage" );
+ puts( "driver - show status of drivers" );
+ puts( "proc - show process status" );
+ puts( "clear - clear screen" );
+ puts( "mode - switch between text/graphics mode" );
+ } else if( strcmp( buf, "halt" ) == 0 ) {
+ terminate = true;
+ } else if( strcmp( buf, "mem" ) == 0 ) {
+ // TODO: print memory usage
+ } else if( strcmp( buf, "proc" ) == 0 ) {
+ // TODO: print scheduler status
+ } else if( strcmp( buf, "driver" ) == 0 ) {
+ driver_manager_print_info_all( driver_manager );
+ } else if( strcmp( buf, "clear" ) == 0 ) {
+ vga_text_clear_screen( vga_text );
+ } else if( strcmp( buf, "mode" ) == 0 ) {
+ // TODO: move mode switches to and from graphics/text mode here,
+ // for now when we enter the graphics mode we remain there
+ 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 );
+ ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&global_context->window1 );
+
+ window_init( &global_context->window2, (widget_t *)&global_context->desktop, 130, 80, 60, 70, VGA_COLOR_GREEN );
+ ((composite_widget_vtable_t *)global_context->desktop.vtable)->add_child( &global_context->desktop, (widget_t *)&global_context->window2 );
+
+ char s[100];
+
+ char *p = s;
+ for( char c = ' '; c <= '~'; c++ ) {
+ *p++ = c;
+ }
+ *p = '\0';
+
+ window_init( &global_context->window3, (widget_t *)&global_context->desktop, 55, 5, vga->mode.x - 65, 100, VGA_COLOR_CYAN );
+ ((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 );
+
+ // enable Z buffering
+ vga_use_z_buffer( &global_context->vga, true );
+
+ global_context->mode = MODE_GRAPHICS;
+ }
+
+ break;
+
+ case MODE_GRAPHICS:
+ vga_text_restore( vga_text );
+
+ if( vga_set_mode( vga, vga_make_mode( VGA_MODE_TYPE_TEXT, 640, 480, 4 ) ) ) {
+ vga_text_set_cursor( vga_text, vga_text->cursor_x, vga_text->cursor_y );
+ mouse_set_resolution( mouse, vga_text->res_x, vga_text->res_y );
+ global_context->mode = MODE_TEXT;
+ }
+
+ break;
}
- break;
+ } else {
+ printf( "ERR: Unknown pre-boot command '%s'\n", buf );
+ }
+ } else if( event->ascii_key == '\b' ) {
+ if( pos > 0 ) {
+ buf[--pos] = '\0';
+ printf( "\n%s", buf );
+ }
+ } else {
+ printf( "%c", event->ascii_key );
+ buf[pos++] = event->ascii_key;
}
- } else {
- printf( "ERR: Unknown pre-boot command '%s'\n", buf );
}
- } else if( event->ascii_key == '\b' ) {
- if( pos > 0 ) {
- buf[--pos] = '\0';
- printf( "\n%s", buf );
+ }
+ break;
+
+ case MODE_GRAPHICS:
+ if( event->type == KEYBOARD_EVENT_TYPE_KEY_PRESSED ) {
+ if( event->key == KEYBOARD_KEY_ASCII ) {
+ ((widget_vtable_t *)global_context->desktop.vtable)->on_key_down( &global_context->desktop, event->ascii_key );
}
- } else {
- printf( "%c", event->ascii_key );
- buf[pos++] = event->ascii_key;
}
- }
+ break;
}
}
@@ -292,7 +309,9 @@ static void handle_mouse_event( mouse_event_t *event, void *context )
desktop_t *desktop = &global_context->desktop;
switch( global_context->mode ) {
+
case MODE_TEXT:
+
switch( event->type ) {
case MOUSE_EVENT_TYPE_BUTTON_UP:
vga_text_hide_mouse_cursor( vga_text );
@@ -316,6 +335,7 @@ static void handle_mouse_event( mouse_event_t *event, void *context )
break;
case MODE_GRAPHICS:
+
switch( event->type ) {
case MOUSE_EVENT_TYPE_BUTTON_UP:
if( event->button == MOUSE_BUTTON_LEFT ) {