From 59d8e5ff4840ab08bbcbf910c55f5b310862a710 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 15 Jun 2025 12:21:17 +0200 Subject: [PATCH] implement ui document wrapper --- .../src/main/java/de/unixwork/ui/Context.java | 9 +++++ .../main/java/de/unixwork/ui/Document.java | 33 ++++++++++++++++++- .../src/main/java/de/unixwork/ui/Event.java | 8 +++-- .../src/main/java/de/unixwork/ui/Toolkit.java | 13 ++++++++ .../java/de/unixwork/ui/ToolkitFuncs.java | 23 +++++++++++++ 5 files changed, 82 insertions(+), 4 deletions(-) diff --git a/ui-java/src/main/java/de/unixwork/ui/Context.java b/ui-java/src/main/java/de/unixwork/ui/Context.java index 17d6f1c..f087a7c 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -23,4 +23,13 @@ public abstract class Context { public UiString string(String name) { return new UiString(this, name); } + + public void attach(Document doc) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + ui.attach_document.invoke(ptr, doc.getPtr()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/Document.java b/ui-java/src/main/java/de/unixwork/ui/Document.java index e2477c7..47744c4 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Document.java +++ b/ui-java/src/main/java/de/unixwork/ui/Document.java @@ -1,4 +1,35 @@ package de.unixwork.ui; -public class Document { +import java.lang.foreign.MemorySegment; + +public class Document extends Context { + protected MemorySegment ptr; + + public Document() { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + // create a toolkit document object and get the UiContext ptr + try { + // the document_new size parameter is not really relevant here + ptr = (MemorySegment) ui.document_new.invoke(16); + setCtx((MemorySegment) ui.document_context.invoke(ptr)); + + Toolkit toolkit = Toolkit.getInstance(); + toolkit.registerDocument(this); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public MemorySegment getPtr() { + return ptr; + } + + public void close() { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + ui.document_destroy.invoke(ptr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/Event.java b/ui-java/src/main/java/de/unixwork/ui/Event.java index 00d0732..156674e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Event.java +++ b/ui-java/src/main/java/de/unixwork/ui/Event.java @@ -4,7 +4,7 @@ import java.lang.foreign.MemorySegment; public class Event { private UiObject object; - private Object documemt; + private Document document; private Object windowData; private Object eventdata; private int intval; @@ -30,6 +30,8 @@ public class Event { windowPtr = (MemorySegment) ui.event_get_windowdata.invoke(eventPtr); documentPtr = (MemorySegment) ui.event_get_document.invoke(eventPtr); + document = toolkit.getDocument(documentPtr.address()); + intval = (int)ui.event_get_int.invoke(eventPtr); set = (int)ui.event_get_set.invoke(eventPtr); } catch (Throwable e) { @@ -41,8 +43,8 @@ public class Event { return object; } - public Object getDocumemt() { - return documemt; + public Document getDocumemt() { + return document; } public Object getWindowData() { diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java index b73cb1c..4e205dd 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -12,6 +12,7 @@ public class Toolkit { private Application app; private HashMap toplevelObjects = new HashMap<>(); + private HashMap documents = new HashMap<>(); // used for all strings and other memory, that is expected to be const // and the UI toolkit does not create copies @@ -179,4 +180,16 @@ public class Toolkit { public UiObject getToplevelObject(long address) { return toplevelObjects.get(address); } + + public void registerDocument(Document doc) { + documents.put(doc.ptr.address(), doc); + } + + public void removeDocument(Document doc) { + documents.remove(doc.ptr.address()); + } + + public Document getDocument(long address) { + return documents.get(address); + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java index f286c11..4d5660a 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -8,6 +8,13 @@ public class ToolkitFuncs { public MethodHandle object_get_context; + public MethodHandle document_new; + public MethodHandle document_destroy; + public MethodHandle document_context; + public MethodHandle attach_document; + public MethodHandle detach_document; + public MethodHandle context_parent; + public MethodHandle event_get_obj; public MethodHandle event_get_document; public MethodHandle event_get_windowdata; @@ -37,9 +44,17 @@ public class ToolkitFuncs { FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS); FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS); MemorySegment object_get_context_addr = lib.find("ui_object_get_context").orElseThrow(); + MemorySegment document_new_addr = lib.find("ui_document_new").orElseThrow(); + MemorySegment document_destroy_addr = lib.find("ui_document_destroy").orElseThrow(); + MemorySegment document_context_addr = lib.find("ui_document_context").orElseThrow(); + MemorySegment attach_document_addr = lib.find("ui_attach_document").orElseThrow(); + MemorySegment detach_document_addr = lib.find("ui_detach_document").orElseThrow(); + MemorySegment context_parent_addr = lib.find("ui_context_parent").orElseThrow(); + MemorySegment event_get_obj_addr = lib.find("ui_event_get_obj").orElseThrow(); MemorySegment event_get_document_addr = lib.find("ui_event_get_document").orElseThrow(); MemorySegment event_get_windowdata_addr = lib.find("ui_event_get_windowdata").orElseThrow(); @@ -65,6 +80,14 @@ public class ToolkitFuncs { object_get_context = linker.downcallHandle(object_get_context_addr, sigm_m); + // use JAVA_LONG for size_t, because we don't support 32bit platforms + document_new = linker.downcallHandle(document_new_addr, FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.JAVA_LONG)); + document_destroy = linker.downcallHandle(document_destroy_addr, sigv_m); + document_context = linker.downcallHandle(document_context_addr, sigm_m); + attach_document = linker.downcallHandle(attach_document_addr, sigv_mm); + detach_document = linker.downcallHandle(detach_document_addr, sigv_mm); + context_parent = linker.downcallHandle(context_parent_addr, sigm_m); + event_get_obj = linker.downcallHandle(event_get_obj_addr, sigm_m); event_get_document = linker.downcallHandle(event_get_document_addr, sigm_m); event_get_windowdata = linker.downcallHandle(event_get_windowdata_addr, sigm_m); -- 2.47.3