]> uap-core.de Git - rssreader.git/commitdiff
add UiObject close handler
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 10 Sep 2025 16:52:06 +0000 (18:52 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 10 Sep 2025 16:52:06 +0000 (18:52 +0200)
ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/Toolkit.java
ui-java/src/main/java/de/unixwork/ui/UiObject.java

diff --git a/ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java b/ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java
new file mode 100644 (file)
index 0000000..d509265
--- /dev/null
@@ -0,0 +1,6 @@
+package de.unixwork.ui;
+
+@FunctionalInterface
+public interface ObjectDestroyHandler {
+    public void callback(UiObject obj);
+}
index abf7868bc973977896029c4c3c94c4a89da40e67..5ae476b9ce57b93cd21d96f90604a6685cfb9840 100644 (file)
@@ -322,6 +322,10 @@ public class Toolkit {
 
     private static void onObjectDestroy(MemorySegment obj, MemorySegment unused) {
         Toolkit toolkit = Toolkit.getInstance();
+        UiObject uiObj = toolkit.getToplevelObject(obj.address());
+        if(uiObj != null) {
+            uiObj.destroy();
+        }
         toolkit.toplevelObjects.remove(obj.address());
     }
 
index bfcafae6ef71b05980c081f8d1d866fea2f17c0b..f8cdeb837ab23868114892629682e2bf39e38c8a 100644 (file)
@@ -1,16 +1,14 @@
 package de.unixwork.ui;
 
 import java.lang.foreign.Arena;
-import java.lang.foreign.FunctionDescriptor;
 import java.lang.foreign.MemorySegment;
-import java.lang.invoke.MethodHandle;
 import java.util.ArrayList;
-import java.util.function.Function;
 
 public class UiObject extends Context {
     MemorySegment ptr;
 
     private ArrayList<EventHandler> eventHandlers = new ArrayList<>();
+    private ArrayList<ObjectDestroyHandler> closeHandlers = new ArrayList<>();
 
     private Arena arena;
 
@@ -33,6 +31,20 @@ public class UiObject extends Context {
         }
     }
 
+    public void addCloseHandler(ObjectDestroyHandler handler) {
+        closeHandlers.add(handler);
+    }
+
+    public void removeCloseHandler(ObjectDestroyHandler handler) {
+        closeHandlers.remove(handler);
+    }
+
+    protected void destroy() {
+        for(var handler : closeHandlers) {
+            handler.callback(this);
+        }
+    }
+
     public static UiObject createWindow(String title) {
         return UiObjectFuncs.instance.window(title);
     }