public class ToolkitFuncs {
static ToolkitFuncs instance;
+ public MethodHandle object_get_context;
+
public MethodHandle event_get_obj;
public MethodHandle event_get_document;
public MethodHandle event_get_windowdata;
public MethodHandle event_get_int;
public MethodHandle event_get_set;
+ public MethodHandle string_new;
+ public MethodHandle int_new;
+ public MethodHandle double_new;
+ public MethodHandle text_new;
+ public MethodHandle range_new;
+ public MethodHandle generic_new;
+
+ public MethodHandle string_set;
+ public MethodHandle string_get;
+ public MethodHandle int_set;
+ public MethodHandle int_get;
+ public MethodHandle double_set;
+ public MethodHandle double_get;
+ public MethodHandle text_set;
+ public MethodHandle text_get;
+
private ToolkitFuncs(Linker linker, SymbolLookup lib) {
// void* func(void*)
FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
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);
+
+ MemorySegment object_get_context_addr = lib.find("ui_object_get_context").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_int_addr = lib.find("ui_event_get_int").orElseThrow();
MemorySegment event_get_set_addr = lib.find("ui_event_get_set").orElseThrow();
+ MemorySegment string_new_addr = lib.find("ui_string_new").orElseThrow();
+ MemorySegment int_new_addr = lib.find("ui_int_new").orElseThrow();
+ MemorySegment double_new_addr = lib.find("ui_double_new").orElseThrow();
+ MemorySegment text_new_addr = lib.find("ui_text_new").orElseThrow();
+ MemorySegment range_new_addr = lib.find("ui_range_new").orElseThrow();
+ MemorySegment generic_new_addr = lib.find("ui_generic_new").orElseThrow();
+
+ MemorySegment string_set_addr = lib.find("ui_string_set").orElseThrow();
+ MemorySegment string_get_addr = lib.find("ui_string_get").orElseThrow();
+ MemorySegment int_set_addr = lib.find("ui_int_set").orElseThrow();
+ MemorySegment int_get_addr = lib.find("ui_int_get").orElseThrow();
+ MemorySegment double_set_addr = lib.find("ui_double_set").orElseThrow();
+ MemorySegment double_get_addr = lib.find("ui_double_get").orElseThrow();
+ MemorySegment text_set_addr = lib.find("ui_text_set").orElseThrow();
+ MemorySegment text_get_addr = lib.find("ui_text_get").orElseThrow();
+
+ object_get_context = linker.downcallHandle(object_get_context_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);
event_get_eventdata = linker.downcallHandle(event_get_eventdata_addr, sigm_m);
event_get_int = linker.downcallHandle(event_get_int_addr, sigi_m);
event_get_set = linker.downcallHandle(event_get_set_addr, sigi_m);
+
+ string_new = linker.downcallHandle(string_new_addr, sigm_mm);
+ int_new = linker.downcallHandle(int_new_addr, sigm_mm);
+ double_new = linker.downcallHandle(double_new_addr, sigm_mm);
+ text_new = linker.downcallHandle(text_new_addr, sigm_mm);
+ range_new = linker.downcallHandle(range_new_addr, sigm_mm);
+ generic_new = linker.downcallHandle(generic_new_addr, sigm_mm);
+
+ string_set = linker.downcallHandle(string_set_addr, sigv_mm);
+ string_get = linker.downcallHandle(string_get_addr, sigm_m);
+ int_set = linker.downcallHandle(int_set_addr, FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_LONG));
+ int_get = linker.downcallHandle(int_get_addr, FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
+ double_set = linker.downcallHandle(double_set_addr, FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_DOUBLE));
+ double_get = linker.downcallHandle(double_get_addr, FunctionDescriptor.of(ValueLayout.JAVA_DOUBLE, ValueLayout.ADDRESS));
+ text_set = linker.downcallHandle(text_set_addr, sigv_mm);
+ text_get = linker.downcallHandle(text_get_addr, sigm_m);
}
static ToolkitFuncs getInstance() {
--- /dev/null
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class UiString {
+ private MemorySegment valuePtr;
+
+ protected UiString(Context ctx, String name) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+
+ MemorySegment nameCStr = MemorySegment.NULL;
+ try (Arena arena = Arena.ofConfined()) {
+ if(name != null) {
+ nameCStr = arena.allocateFrom(name);
+ }
+
+ valuePtr = (MemorySegment) ui.string_new.invoke(ctx.getCtx(), nameCStr);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String toString() {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ try {
+ MemorySegment cstr = (MemorySegment) ui.string_get.invoke(valuePtr);
+ if (cstr != null && cstr.address() != 0) {
+ return cstr.getString(0);
+ }
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ return null;
+ }
+
+ public void setString(String string) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ try (Arena arena = Arena.ofConfined()) {
+ MemorySegment cstr = arena.allocateFrom(string);
+ ui.string_set.invoke(valuePtr, cstr);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+}