--- a/ui/gtk/graphics.c Sat Oct 04 14:54:25 2025 +0200 +++ b/ui/gtk/graphics.c Sun Oct 19 21:20:08 2025 +0200 @@ -33,19 +33,88 @@ #include "container.h" #include "../common/object.h" -UIWIDGET ui_drawingarea(UiObject *obj, ui_drawfunc f, void *userdata) { - GtkWidget *widget = gtk_drawing_area_new(); +#if GTK_CHECK_VERSION(3, 0, 0) +#include "draw_cairo.h" +#endif + +static void destroy_drawingarea(GtkWidget *widget, UiDrawingArea *drawingarea) { + free(drawingarea); +} + +static void drawingarea_draw(UiDrawingArea *drawingarea, cairo_t *cr, int width, int height) { + UiEvent event; + event.obj = drawingarea->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = NULL; + event.eventdatatype = 0; + event.intval = 0; + event.set = 0; + - if(f) { - UiDrawEvent *event = malloc(sizeof(UiDrawEvent)); - event->obj = obj; - event->callback = f; - event->userdata = userdata; - ui_connect_draw_handler(widget, event); - } +} + +#if GTK_CHECK_VERSION(4, 0, 0) +static void drawfunc( + GtkDrawingArea *area, + cairo_t *cr, + int width, + int height, + gpointer userdata) +{ + ui_drawingarea_draw(userdata, cr, width, height); +} +#elif GTK_CHECK_VERSION(3, 0, 0) +gboolean draw_callback(GtkWidget *widget, cairo_t *cr, UiDrawingArea *drawingarea) { + int width = gtk_widget_get_allocated_width(widget); + int height = gtk_widget_get_allocated_height(widget); + ui_drawingarea_draw(drawingarea, cr, width, height); + return FALSE; +} +#endif + +UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) { + GtkWidget *widget = gtk_drawing_area_new(); + ui_set_name_and_style(widget, args->name, args->style_class); - UiContainer *ct = uic_get_current_container(obj); - ct->add(ct, widget); +#if GTK_CHECK_VERSION(4, 0, 0) + gtk_drawing_area_set_content_width(GTK_DRAWING_AREA(widget), args->width > 0 ? args->width : 100); + gtk_drawing_area_set_content_height(GTK_DRAWING_AREA(widget), args->height > 0 ? args->height : 100); +#else + int w = args->width > 0 ? args->width : 100; + int h = args->height > 0 ? args->height : 100; + gtk_widget_set_size_request(widget, w, h); +#endif + + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, widget, &layout); + + UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea)); + drawingarea->obj = obj; + drawingarea->widget = widget; + drawingarea->draw = args->draw; + drawingarea->drawdata = args->drawdata; + drawingarea->onclick = args->onclick; + drawingarea->onclickdata = args->onclickdata; + drawingarea->onmotion = args->onmotion; + drawingarea->onmotiondata = args->onmotiondata; + +#if GTK_CHECK_VERSION(4, 0, 0) + gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(widget), drawfunc, drawingarea, NULL); +#elif GTK_CHECK_VERSION(3, 0, 0) + g_signal_connect( + widget, + "draw", + G_CALLBACK(draw_callback), + NULL); +#endif + + g_signal_connect( + widget, + "destroy", + G_CALLBACK(destroy_drawingarea), + drawingarea); return widget; } @@ -142,7 +211,7 @@ pango_layout_set_text(layout->layout, str, len); } -void ui_text_setfont(UiTextLayout *layout, char *font, int size) { +void ui_text_setfont(UiTextLayout *layout, const char *font, int size) { PangoFontDescription *fontDesc; fontDesc = pango_font_description_from_string(font); pango_font_description_set_size(fontDesc, size * PANGO_SCALE);