summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-01 20:10:14 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-01 20:10:14 +0200
commit85df1646ecccc7e484e2efc903166b89e4c55684 (patch)
tree66bb29f09354a3a9bb7b448dfc10929f27d0210e
parent8fa1c09199378f86ca7c3fc4b844bd272926cdf6 (diff)
downloadabaos-85df1646ecccc7e484e2efc903166b89e4c55684.tar.gz
abaos-85df1646ecccc7e484e2efc903166b89e4c55684.tar.bz2
fixed get_focus error in widget (called the wrong parent)
the text widget reacts to mouse down and key events and appends text to the output buffer so we have text input in GUI 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 ) {