From 2bbedaff7b4b65f6e5fc21e1362b66cc36fcf2bc Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Mon, 22 Dec 2025 09:19:55 +0100 Subject: [PATCH] implement methods for accessing values by name --- .../src/main/java/de/unixwork/ui/Context.java | 61 +++++++++++++++++++ .../java/de/unixwork/ui/ToolkitFuncs.java | 53 ++++++++++++++++ 2 files changed, 114 insertions(+) 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 f65b48c..2a33ca0 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -182,4 +182,65 @@ public abstract class Context { public Arena getArena() { return arena; } + + public int getInt(String name) { + return (int)getLong(name); + } + + public long getLong(String name) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try (Arena arena = Arena.ofConfined()) { + MemorySegment nameCstr = arena.allocateFrom(name); + return (long)ui.ui_var_get_int.invoke(ptr, nameCstr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public void setInt(String name, int value) { + setLong(name, value); + } + + public void setLong(String name, long value) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try (Arena arena = Arena.ofConfined()) { + MemorySegment nameCstr = arena.allocateFrom(name); + ui.ui_var_set_int.invoke(ptr, nameCstr, value); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public String getString(String name) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try (Arena arena = Arena.ofConfined()) { + MemorySegment nameCstr = arena.allocateFrom(name); + MemorySegment cstr = (MemorySegment) ui.ui_var_get_string.invoke(ptr, nameCstr); + if(cstr.address() == 0) { + return ""; + } + long length = (long)ui.strlen.invoke(cstr); + cstr = cstr.reinterpret(length+1); + if (cstr != null && cstr.address() != 0) { + return cstr.getString(0); + } + } catch (Throwable e) { + throw new RuntimeException(e); + } + return ""; + } + + public void setString(String name, String value) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + if(value == null) { + value = ""; + } + try (Arena arena = Arena.ofConfined()) { + MemorySegment nameCstr = arena.allocateFrom(name); + MemorySegment cstr = arena.allocateFrom(value); + ui.ui_var_set_string.invoke(ptr, nameCstr, cstr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } } 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 1cd1c38..c94760e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -1,7 +1,10 @@ package de.unixwork.ui; +import com.sun.jdi.Value; + import java.lang.foreign.*; import java.lang.invoke.MethodHandle; +import java.util.function.Function; public class ToolkitFuncs { static ToolkitFuncs instance; @@ -71,6 +74,21 @@ public class ToolkitFuncs { public MethodHandle text_set; public MethodHandle text_get; + public MethodHandle ui_var_set_int; + public MethodHandle ui_var_get_int; + public MethodHandle ui_var_set_double; + public MethodHandle ui_var_get_double; + public MethodHandle ui_var_set_string; + public MethodHandle ui_var_get_string; + + public MethodHandle ui_get_int_var; + public MethodHandle ui_get_double_var; + public MethodHandle ui_get_string_var; + public MethodHandle ui_get_text_var; + public MethodHandle ui_get_range_var; + public MethodHandle ui_get_list_var; + public MethodHandle ui_get_generic_var; + public MethodHandle model_new; public MethodHandle model_add_column; public MethodHandle model_free; @@ -117,6 +135,11 @@ public class ToolkitFuncs { FunctionDescriptor sigl_m = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS); FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigv_mml = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_LONG); + FunctionDescriptor sigl_mm = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigv_mmd = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_DOUBLE); + FunctionDescriptor sigd_mm = FunctionDescriptor.of(ValueLayout.JAVA_DOUBLE, ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigv_mmm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigm_ml = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_LONG); FunctionDescriptor sigm_mi = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_INT); FunctionDescriptor sigv_mb = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_BOOLEAN); @@ -197,6 +220,21 @@ public class ToolkitFuncs { MemorySegment range_set_extent_addr = lib.find("ui_range_set_extent").orElseThrow(); MemorySegment range_get_extent_addr = lib.find("ui_range_get_extent").orElseThrow(); + MemorySegment var_set_int_addr = lib.find("ui_var_set_int").orElseThrow(); + MemorySegment var_get_int_addr = lib.find("ui_var_get_int").orElseThrow(); + MemorySegment var_set_double_addr = lib.find("ui_var_set_double").orElseThrow(); + MemorySegment var_get_double_addr = lib.find("ui_var_get_double").orElseThrow(); + MemorySegment var_set_string_addr = lib.find("ui_var_set_string").orElseThrow(); + MemorySegment var_get_string_addr = lib.find("ui_var_get_string").orElseThrow(); + + MemorySegment get_int_var_addr = lib.find("ui_get_int_var").orElseThrow(); + MemorySegment get_double_var_addr = lib.find("ui_get_double_var").orElseThrow(); + MemorySegment get_string_var_addr = lib.find("ui_get_string_var").orElseThrow(); + MemorySegment get_text_var_addr = lib.find("ui_get_text_var").orElseThrow(); + MemorySegment get_range_var_addr = lib.find("ui_get_range_var").orElseThrow(); + MemorySegment get_list_var_addr = lib.find("ui_get_list_var").orElseThrow(); + MemorySegment get_generic_var_addr = lib.find("ui_get_generic_var").orElseThrow(); + MemorySegment model_new_addr = lib.find("ui_model_new").orElseThrow(); MemorySegment model_add_column_addr = lib.find("ui_model_add_column").orElseThrow(); MemorySegment model_free_addr = lib.find("ui_model_free").orElseThrow(); @@ -298,6 +336,21 @@ public class ToolkitFuncs { range_set_extent = linker.downcallHandle(range_set_extent_addr, sigv_md); range_get_extent = linker.downcallHandle(range_get_extent_addr, sigd_m); + ui_var_set_int = linker.downcallHandle(var_set_int_addr, sigv_mml); + ui_var_get_int = linker.downcallHandle(var_get_int_addr, sigl_mm); + ui_var_set_double = linker.downcallHandle(var_set_double_addr, sigv_mmd); + ui_var_get_double = linker.downcallHandle(var_get_double_addr, sigd_mm); + ui_var_set_string = linker.downcallHandle(var_set_string_addr, sigv_mmm); + ui_var_get_string = linker.downcallHandle(var_get_string_addr, sigm_mm); + + ui_get_int_var = linker.downcallHandle(get_int_var_addr, sigm_mm); + ui_get_double_var = linker.downcallHandle(get_double_var_addr, sigm_mm); + ui_get_string_var = linker.downcallHandle(get_string_var_addr, sigm_mm); + ui_get_text_var = linker.downcallHandle(get_text_var_addr, sigm_mm); + ui_get_range_var = linker.downcallHandle(get_range_var_addr, sigm_mm); + ui_get_list_var = linker.downcallHandle(get_list_var_addr, sigm_mm); + ui_get_generic_var = linker.downcallHandle(get_generic_var_addr, sigm_mm); + model_new = linker.downcallHandle(model_new_addr, sigm_m); model_add_column = linker.downcallHandle(model_add_column_addr, sigv_mimi); model_free = linker.downcallHandle(model_free_addr, sigv_m); -- 2.47.3