ui/motif/graphics.c

changeset 113
dde28a806552
parent 100
d2bd73d28ff1
--- 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) {
+    
+}

mercurial