--- a/ui/motif/graphics.c Sun Oct 19 21:20:08 2025 +0200 +++ b/ui/motif/graphics.c Mon Nov 10 21:52:51 2025 +0100 @@ -34,3 +34,87 @@ #include "graphics.h" #include "container.h" + +UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) { + Arg xargs[16]; + int n = 0; + + UiContainerPrivate *ctn = ui_obj_container(obj); + UiLayout layout = UI_ARGS2LAYOUT(args); + + Widget parent = ui_container_prepare(ctn, &layout, xargs, &n); + char *name = args->name ? (char*)args->name : "drawingarea"; + + Widget widget = XmCreateDrawingArea(parent, name, xargs, n); + XtManageChild(widget); + ui_container_add(ctn, widget); + + UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea)); + drawingarea->obj = obj; + drawingarea->draw = args->draw; + drawingarea->drawdata = args->drawdata; + drawingarea->onclick = args->onclick; + drawingarea->onclickdata = args->onclickdata; + drawingarea->onmotion = args->onmotion; + drawingarea->onmotiondata = args->onmotiondata; + drawingarea->gc = NULL; + + XtAddCallback( + widget, + XmNdestroyCallback, + (XtCallbackProc)ui_drawingarea_destroy, + drawingarea); + XtAddCallback( + widget, + XmNexposeCallback, + (XtCallbackProc)ui_drawingarea_expose, + drawingarea); + + return widget; +} + +void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d) { + if(drawingarea->gc) { + XFreeGC(XtDisplay(w), drawingarea->gc); + } + free(drawingarea); +} + +void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d) { + Display *dp = XtDisplay(w); + + if(!drawingarea->gc) { + XGCValues gcvals; + gcvals.foreground = BlackPixelOfScreen(XtScreen(w)); + drawingarea->gc = XCreateGC(dp, XtWindow(w), (GCForeground), &gcvals); + } + + if(drawingarea->draw) { + 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; + + UiXlibGraphics g; + g.g.width = w->core.width; + g.g.height = w->core.height; + g.widget = w; + g.display = dp; + g.colormap = w->core.colormap; + g.gc = drawingarea->gc; + + drawingarea->draw(&event, (UiGraphics*)&g, drawingarea->drawdata); + } +} + +void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) { + +} + +void ui_drawingarea_redraw(UIWIDGET drawingarea) { + +}