#include "desktop.h" #include "string.h" #include static desktop_vtable_t const desktop_vtable = { { { desktop_draw, composite_widget_get_focus, widget_model_to_screen, widget_contains_coordinate, desktop_on_mouse_down, desktop_on_mouse_up, desktop_on_mouse_move, desktop_on_key_down, composite_widget_on_key_up }, composite_widget_add_child } }; void desktop_init( desktop_t *desktop, const int w, const int h, const vga_color_t background_color ) { memset( desktop, 0, sizeof( desktop_t ) ); composite_widget_init( &desktop->base, NULL, 0, 0, w, h, background_color ); desktop->mouse_x = w / 2; desktop->mouse_y = h / 2; desktop->needs_redrawing = true; ((widget_t *)desktop)->vtable = (widget_vtable_t *)&desktop_vtable; } void desktop_draw( void *obj, graphics_context_t *context ) { desktop_t *desktop = obj; if( !desktop->needs_redrawing ) { return; } vga_clear_screen( context, desktop->base.base.background_color ); composite_widget_draw( obj, context ); for( int i = 0; i < 4; i++ ) { if( desktop->mouse_x > i ) { vga_set_pixel( context, desktop->mouse_x - i, desktop->mouse_y, VGA_COLOR_WHITE ); } if( desktop->mouse_x < context->mode.x - i ) { vga_set_pixel( context, desktop->mouse_x + i, desktop->mouse_y, VGA_COLOR_WHITE ); } if( desktop->mouse_y > i ) { vga_set_pixel( context, desktop->mouse_x, desktop->mouse_y - i, VGA_COLOR_WHITE ); } if( desktop->mouse_y < context->mode.y - i ) { vga_set_pixel( context, desktop->mouse_x, desktop->mouse_y + i, VGA_COLOR_WHITE ); } } desktop->needs_redrawing = false; } void desktop_on_mouse_down( void *obj, const int x, const int y ) { desktop_t *desktop = obj; composite_widget_on_mouse_down( obj, x, y ); desktop->needs_redrawing = true; } void desktop_on_mouse_up( void *obj, const int x, const int y ) { desktop_t *desktop = obj; composite_widget_on_mouse_up( obj, x, y ); desktop->needs_redrawing = true; } void desktop_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y ) { desktop_t *desktop = obj; desktop->mouse_x = x; desktop->mouse_y = y; composite_widget_on_mouse_move( obj, old_x, old_y, x, y ); 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; }