]> uap-core.de Git - rssreader.git/commitdiff
implement methods for accessing values by name
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 22 Dec 2025 08:19:55 +0000 (09:19 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 22 Dec 2025 08:19:55 +0000 (09:19 +0100)
ui-java/src/main/java/de/unixwork/ui/Context.java
ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java

index f65b48c7af4887e3d7df07faf6645be9487534b6..2a33ca0951a4adffe4cc22aa44de30ae756df279 100644 (file)
@@ -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);
+        }
+    }
 }
index 1cd1c38895dc17147f31da50e8b0fbc9827d883c..c94760ebbcb06076b16c3b75ce04bfea888c09c5 100644 (file)
@@ -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);