From: Olaf Wintermann Date: Wed, 25 Jun 2025 21:21:26 +0000 (+0200) Subject: prepare getvaluefunc wrapper X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=e0d4b331aba0213d80ceb7728b12e87c640e4185;p=rssreader.git prepare getvaluefunc wrapper --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index f56d838..dfccef2 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -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); 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 936668c..36c3da4 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -11,6 +11,7 @@ public abstract class Context { private Arena arena = Arena.ofShared(); private ArrayList lists = new ArrayList<>(); + private ArrayList 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(); diff --git a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java index a1522e5..0af74c8 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java @@ -158,7 +158,10 @@ public class ListViewBuilder 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) { 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 58b327c..7a7e44d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -13,7 +13,7 @@ public class Toolkit { private HashMap toplevelObjects = new HashMap<>(); private HashMap documents = new HashMap<>(); - private HashMap contexts = new HashMap<>(); // TODO: maybe we can replace the UiObject and Doument maps with just this context map + private HashMap 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; + } }