#include "window.h" #include "string.h" #include static window_vtable_t const window_vtable = { { { window_draw, composite_widget_get_focus, widget_model_to_screen, widget_contains_coordinate, window_on_mouse_down, window_on_mouse_up, window_on_mouse_move, composite_widget_on_key_down, composite_widget_on_key_up }, composite_widget_add_child } }; void window_init( window_t *window, widget_t *parent, const int x, const int y, const int w, const int h, const vga_color_t background_color ) { memset( window, 0, sizeof( window_t ) ); composite_widget_init( &window->base, parent, x, y, w, h, background_color ); window->dragging = false; ((widget_t *)window)->vtable = (widget_vtable_t *)&window_vtable; } void window_draw( void *obj, graphics_context_t *context ) { window_t *widget = obj; if( ((widget_t *)widget)->x < 0 ) { ((widget_t *)widget)->x = 0; } if( ((widget_t *)widget)->x > context->mode.x - ((widget_t *)widget)->w ) { ((widget_t *)widget)->x = context->mode.x - ((widget_t *)widget)->w; } if( ((widget_t *)widget)->y < 0 ) { ((widget_t *)widget)->y = 0; } if( ((widget_t *)widget)->y > context->mode.y - ((widget_t *)widget)->h ) { ((widget_t *)widget)->y = context->mode.y - ((widget_t *)widget)->h; } composite_widget_draw( obj, context ); } void window_on_mouse_down( void *obj, const int x, const int y ) { window_t *widget = obj; widget->dragging = true; composite_widget_on_mouse_down( obj, x, y ); } void window_on_mouse_up( void *obj, const int x, const int y ) { window_t *widget = obj; widget->dragging = false; composite_widget_on_mouse_up( obj, x, y ); } void window_on_mouse_move( void *obj, const int old_x, const int old_y, const int x, const int y ) { window_t *widget = obj; if( widget->dragging ) { ((widget_t *)widget)->x += x - old_x; ((widget_t *)widget)->y += y - old_y; } }