add drawingarea (Motif)

Fri, 31 Oct 2025 14:47:42 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 31 Oct 2025 14:47:42 +0100
changeset 888
1bb3a6641857
parent 887
2a2aee73c789
child 889
5be43605226f

add drawingarea (Motif)

ui/motif/container.c file | annotate | diff | comparison | revisions
ui/motif/graphics.c file | annotate | diff | comparison | revisions
ui/motif/graphics.h file | annotate | diff | comparison | revisions
--- 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) {
--- 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) {
+    
+}
--- 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

mercurial