From: Olaf Wintermann Date: Sun, 10 Aug 2025 12:32:18 +0000 (+0200) Subject: add UiList free method X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=abb210efe7c4c805d732bc575054beddd796ea91;p=rssreader.git add UiList free method --- diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt index 1df2afc..6937d93 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt @@ -3,6 +3,6 @@ package de.unixwork.rssreader import de.unixwork.ui.Document class FeedCollection(name: String) : Document() { - private val name = name - private val items = list("items") + val name = name + val items = list("items") } \ No newline at end of file diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt index e7f1d82..2aca7ae 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt @@ -13,6 +13,7 @@ class FeedSourceList : Document() { val sublist1data = list("sublist1data") val col1 = FeedCollection("Test Feed") sublist1data.add(col1) + sublist1.value = sublist1data feeds.add(sublist1) } } \ No newline at end of file diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt index d05c86c..473b015 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -13,14 +13,17 @@ class MainWindow { window = sidebarWindow("RSS Reader") { sidebar { vbox(fill = true) { - sourcelist(fill = true, varname = "feeds") { elm: Object -> + sourcelist(fill = true, varname = "feeds") { elm: FeedCollection -> val item = SubListItem() - item.label = "todo" + item.label = elm.name item } - hbox(margin = 4) { + hbox(margin = 4, spacing = 4) { button(icon = "list-add") { + } + button(icon = "folder-new") { + } } } 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 89e2b95..11d983e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -48,9 +48,15 @@ public abstract class Context { // create a list object, that will be used as list->data // listObj contains the context pointer and the list index // ctx+index will be used to lookup the UiList java object - MemorySegment listObj = arena.allocate(ValueLayout.JAVA_LONG, 2); - listObj.setAtIndex(ValueLayout.JAVA_LONG, 0, ptr.address()); - listObj.setAtIndex(ValueLayout.JAVA_LONG, 1, lists.size()); + MemorySegment listObj; + try { + listObj = ((MemorySegment)ToolkitFuncs.getInstance().ui_malloc.invoke(ptr, 16)).reinterpret(16); // 2*sizeof(long) + listObj.setAtIndex(ValueLayout.JAVA_LONG, 0, ptr.address()); + listObj.setAtIndex(ValueLayout.JAVA_LONG, 1, lists.size()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + var ls = new UiList(this, name, listObj); lists.add(ls); return ls; 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 4d6655e..b8e2a25 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -62,6 +62,9 @@ public class ToolkitFuncs { public MethodHandle call_mainthread; + public MethodHandle ui_malloc; + public MethodHandle ui_free; + // some libc stuff public MethodHandle malloc; public MethodHandle free; @@ -72,6 +75,7 @@ public class ToolkitFuncs { FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS); FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigm_ml = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_LONG); FunctionDescriptor sigv_mb = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_BOOLEAN); FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS); FunctionDescriptor sigm_l = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.JAVA_LONG); @@ -132,6 +136,9 @@ public class ToolkitFuncs { MemorySegment call_mainthread_addr = lib.find("ui_call_mainthread").orElseThrow(); + MemorySegment ui_malloc_addr = lib.find("ui_malloc").orElseThrow(); + MemorySegment ui_free_addr = lib.find("ui_free").orElseThrow(); + MemorySegment malloc_addr = lib.find("malloc").orElseThrow(); MemorySegment free_addr = lib.find("free").orElseThrow(); @@ -192,6 +199,9 @@ public class ToolkitFuncs { call_mainthread = linker.downcallHandle(call_mainthread_addr, sigv_mm); + ui_malloc = linker.downcallHandle(ui_malloc_addr, sigm_ml); + ui_free = linker.downcallHandle(ui_free_addr, sigv_mm); + malloc = linker.downcallHandle(malloc_addr, sigm_l); free = linker.downcallHandle(free_addr, sigv_m); } diff --git a/ui-java/src/main/java/de/unixwork/ui/UiList.java b/ui-java/src/main/java/de/unixwork/ui/UiList.java index f11f18d..488ad24 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiList.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiList.java @@ -10,12 +10,14 @@ import java.lang.invoke.MethodType; import java.util.ArrayList; public class UiList extends ArrayList { + protected Context ctx; protected MemorySegment valuePtr; protected MemorySegment dataPtr; protected int iter = 0; protected UiList(Context ctx, String name, MemorySegment listObj) { super(); + this.ctx = ctx; ToolkitFuncs ui = ToolkitFuncs.getInstance(); Toolkit toolkit = Toolkit.getInstance(); @@ -60,6 +62,16 @@ public class UiList extends ArrayList { } } + public void free() { + ToolkitFuncs tk = ToolkitFuncs.getInstance(); + try { + tk.ui_free.invoke(ctx.getCtx(), valuePtr); + tk.ui_free.invoke(ctx.getCtx(), dataPtr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + public static UiList getList(MemorySegment ls) { ListFuncs ui = ListFuncs.getInstance(); try {