]> uap-core.de Git - rssreader.git/commitdiff
prepare getvaluefunc wrapper
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 25 Jun 2025 21:21:26 +0000 (23:21 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 25 Jun 2025 21:21:26 +0000 (23:21 +0200)
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/Context.java
ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java
ui-java/src/main/java/de/unixwork/ui/Toolkit.java

index f56d838ccd8fe0ef0aaf8f5f8734d2cacd73acfe..dfccef25b08d3967f645567433b43d016b621c30 100644 (file)
@@ -92,6 +92,8 @@ class ArgFuncs {
     MethodHandle list_args_set_model;
     MethodHandle list_args_set_static_elements;
     MethodHandle list_args_set_getvalue_func;
+    MethodHandle list_args_set_getvalue_func2;
+    MethodHandle list_args_set_getvalue_data;
     MethodHandle list_args_set_onactivate;
     MethodHandle list_args_set_onactivatedata;
     MethodHandle list_args_set_onselection;
@@ -203,6 +205,8 @@ class ArgFuncs {
         MemorySegment ui_list_args_set_model_addr = lib.find("ui_list_args_set_model").orElseThrow();
         MemorySegment ui_list_args_set_static_elements_addr = lib.find("ui_list_args_set_static_elements").orElseThrow();
         MemorySegment ui_list_args_set_getvalue_func_addr = lib.find("ui_list_args_set_getvalue_func").orElseThrow();
+        MemorySegment ui_list_args_set_getvalue_func2_addr = lib.find("ui_list_args_set_getvalue_func2").orElseThrow();
+        MemorySegment ui_list_args_set_getvalue_data_addr = lib.find("ui_list_args_set_getvalue_data").orElseThrow();
         MemorySegment ui_list_args_set_onactivate_addr = lib.find("ui_list_args_set_onactivate").orElseThrow();
         MemorySegment ui_list_args_set_onactivatedata_addr = lib.find("ui_list_args_set_onactivatedata").orElseThrow();
         MemorySegment ui_list_args_set_onselection_addr = lib.find("ui_list_args_set_onselection").orElseThrow();
@@ -304,6 +308,8 @@ class ArgFuncs {
         list_args_set_model = linker.downcallHandle(ui_list_args_set_model_addr, sigv_mm);
         list_args_set_static_elements = linker.downcallHandle(ui_list_args_set_static_elements_addr, sigv_mml);
         list_args_set_getvalue_func = linker.downcallHandle(ui_list_args_set_getvalue_func_addr, sigv_mm);
+        list_args_set_getvalue_func2 = linker.downcallHandle(ui_list_args_set_getvalue_func2_addr, sigv_mm);
+        list_args_set_getvalue_data = linker.downcallHandle(ui_list_args_set_getvalue_data_addr, sigv_mm);
         list_args_set_onactivate = linker.downcallHandle(ui_list_args_set_onactivate_addr, sigv_mm);
         list_args_set_onactivatedata = linker.downcallHandle(ui_list_args_set_onactivatedata_addr, sigv_mm);
         list_args_set_onselection = linker.downcallHandle(ui_list_args_set_onselection_addr, sigv_mm);
index 936668c1f3223bf4a22fcc25227fa712fc44569b..36c3da412087b5a3f9d28ab59acdb800aee692e6 100644 (file)
@@ -11,6 +11,7 @@ public abstract class Context {
     private Arena arena = Arena.ofShared();
 
     private ArrayList<UiList> lists = new ArrayList<>();
+    private ArrayList<ListValueConverter> converters = new ArrayList<>();
 
     protected void setCtx(MemorySegment ptr) {
         this.ptr = ptr;
@@ -54,6 +55,14 @@ public abstract class Context {
         return ls;
     }
 
+    public MemorySegment registerValueConverter(ListValueConverter converter) {
+        MemorySegment funcData = arena.allocate(ValueLayout.JAVA_LONG, 2);
+        funcData.setAtIndex(ValueLayout.JAVA_LONG, 0, ptr.address());
+        funcData.setAtIndex(ValueLayout.JAVA_LONG, 1, converters.size());
+        converters.add(converter);
+        return funcData;
+    }
+
 
     public void attach(Document doc) {
         ToolkitFuncs ui = ToolkitFuncs.getInstance();
index a1522e5d019f207c9f7a7c9235e62e55b7aef0bd..0af74c87aa081a929751775cb01babe4dc66d858 100644 (file)
@@ -158,7 +158,10 @@ public class ListViewBuilder<T> extends AbstractWidgetBuilder {
             ui.list_args_set_value.invoke(args, list.valuePtr);
         }
         if(getvalue != null) {
-            // fuck
+            // always use the Toolkit.getValue wrapper function
+            ui.list_args_set_getvalue_func2.invoke(args, Toolkit.getInstance().getValue);
+            MemorySegment userdata = obj.registerValueConverter(getvalue);
+            ui.list_args_set_getvalue_data.invoke(args, userdata);
         }
 
         if (onActivate != null) {
index 58b327ced3c74fee990e9411368e81ecc466f288..7a7e44d968a361e78ec0199e2c1f1696d2a6554f 100644 (file)
@@ -13,7 +13,7 @@ public class Toolkit {
 
     private HashMap<Long, UiObject> toplevelObjects = new HashMap<>();
     private HashMap<Long, Document> documents = new HashMap<>();
-    private HashMap<Long, Context> contexts = new HashMap<>(); // TODO: maybe we can replace the UiObject and Doument maps with just this context map
+    private HashMap<Long, Context> contexts = new HashMap<>(); // TODO: maybe we can replace the UiObject and Document maps with just this context map
 
     // used for all strings and other memory, that is expected to be const
     // and the UI toolkit does not create copies
@@ -29,6 +29,8 @@ public class Toolkit {
     protected MemorySegment listGet;
     protected MemorySegment listCount;
 
+    protected MemorySegment getValue;
+
     private Toolkit(String appName) {
         // load shared library
         System.loadLibrary("uitk");
@@ -103,6 +105,23 @@ public class Toolkit {
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         }
+
+        // list/table getvaluefunc wrapper
+        try {
+            MethodHandle getvalue = MethodHandles.lookup().findStatic(
+                    Toolkit.class,
+                    "getValue",
+                    MethodType.methodType(MemorySegment.class, MemorySegment.class, MemorySegment.class, int.class, int.class, MemorySegment.class));
+
+            getValue = linker.upcallStub(
+                    getvalue,
+                    FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT, ValueLayout.ADDRESS),
+                    staticArena);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     public static Toolkit getInstance() {
@@ -289,4 +308,13 @@ public class Toolkit {
     public Context getContext(long address) {
         return contexts.get(address);
     }
+
+    /*
+     * list getvaluefunc wrapper
+     */
+    public static MemorySegment getValue(MemorySegment list, MemorySegment elm, int row, int col, MemorySegment userdata) {
+
+
+        return MemorySegment.NULL;
+    }
 }