# HG changeset patch # User Olaf Wintermann # Date 1761918462 -3600 # Node ID 1bb3a664185759d05c44ceb9b6d10c52b44b01a8 # Parent 2a2aee73c789fd7d62ccb735374b8b3bab2f16a7 add drawingarea (Motif) diff -r 2a2aee73c789 -r 1bb3a6641857 ui/motif/container.c --- a/ui/motif/container.c Fri Oct 31 10:31:02 2025 +0100 +++ b/ui/motif/container.c Fri Oct 31 14:47:42 2025 +0100 @@ -304,6 +304,20 @@ // NOOP } +/* -------------------------- SplitPane -------------------------- */ + +UIWIDGET ui_splitpane_create(UiObject *obj, UiSplitPaneArgs *args, int orientation) { + return NULL; // TODO +} + +UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { + return ui_splitpane_create(obj, args, XmHORIZONTAL); +} + +UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { + return ui_splitpane_create(obj, args, XmVERTICAL); +} + /* -------------------------- TabView Container -------------------------- */ static void ui_tabbar_resize(Widget widget, XtPointer udata, XtPointer cdata) { diff -r 2a2aee73c789 -r 1bb3a6641857 ui/motif/graphics.c --- a/ui/motif/graphics.c Fri Oct 31 10:31:02 2025 +0100 +++ b/ui/motif/graphics.c Fri Oct 31 14:47:42 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) { + +} diff -r 2a2aee73c789 -r 1bb3a6641857 ui/motif/graphics.h --- a/ui/motif/graphics.h Fri Oct 31 10:31:02 2025 +0100 +++ b/ui/motif/graphics.h Fri Oct 31 14:47:42 2025 +0100 @@ -35,7 +35,30 @@ #ifdef __cplusplus extern "C" { #endif + +typedef struct UiDrawingArea { + UiObject *obj; + ui_drawfunc draw; + void *drawdata; + ui_callback onclick; + void *onclickdata; + ui_callback onmotion; + void *onmotiondata; + + GC gc; +} UiDrawingArea; +typedef struct UiXlibGraphics { + UiGraphics g; + Display *display; + Widget widget; + Colormap colormap; + GC gc; +} UiXlibGraphics; + +void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d); + +void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d); #ifdef __cplusplus