}
}
+ private static void onObjectCreate(MemorySegment obj, MemorySegment unused) {
+ // Is this object already registered?
+ // normal toplevel objects created by the java bindings should be already
+ // in the toplevelObjects map, but it is possible that other sources create objects
+ Toolkit toolkit = Toolkit.getInstance();
+ if(toolkit.toplevelObjects.containsKey(obj.address())) {
+ return;
+ }
+ new UiObject(obj); // this will register the object
+ }
+
+ private static void onObjectDestroy(MemorySegment obj, MemorySegment unused) {
+ Toolkit toolkit = Toolkit.getInstance();
+ toolkit.toplevelObjects.remove(obj.address());
+ }
+
public static void runApplication(Application app) {
Toolkit toolkit = Toolkit.getInstance();
toolkit.app = app;
MethodHandle onstartup = toolkit.linker.downcallHandle(toolkit.lib.find("ui_onstartup").orElseThrow(), handlerSig);
MethodHandle onshutdown = toolkit.linker.downcallHandle(toolkit.lib.find("ui_onexit").orElseThrow(), handlerSig);
MethodHandle onopen = toolkit.linker.downcallHandle(toolkit.lib.find("ui_onopen").orElseThrow(), handlerSig);
+ MethodHandle regobjcreate = toolkit.linker.downcallHandle(toolkit.lib.find("ui_register_object_creation_callback").orElseThrow(), handlerSig);
+ MethodHandle regobjdestroy = toolkit.linker.downcallHandle(toolkit.lib.find("ui_register_object_destruction_callback").orElseThrow(), handlerSig);
// get java wrapper method handles
MethodHandle onstartupCallback = null;
onshutdown.invoke(onShutdownFunc, MemorySegment.NULL);
onopen.invoke(onOpenFunc, MemorySegment.NULL);
+ // register object callbacks
+ MethodHandle onObjectCreateCallback = MethodHandles.lookup().findStatic(
+ Toolkit.class,
+ "onObjectCreate",
+ MethodType.methodType(void.class, MemorySegment.class, MemorySegment.class));
+ MethodHandle onObjectDestroyCallback = MethodHandles.lookup().findStatic(
+ Toolkit.class,
+ "onObjectDestroy",
+ MethodType.methodType(void.class, MemorySegment.class, MemorySegment.class));
+ MemorySegment onObjectCreateCallbackFunc = toolkit.linker.upcallStub(
+ onObjectCreateCallback,
+ callbackDescriptor,
+ arena);
+ MemorySegment onObjectDestroyCallbackFunc = toolkit.linker.upcallStub(
+ onObjectDestroyCallback,
+ callbackDescriptor,
+ arena);
+
+ regobjcreate.invoke(onObjectCreateCallbackFunc, MemorySegment.NULL);
+ regobjdestroy.invoke(onObjectDestroyCallbackFunc, MemorySegment.NULL);
+
// run ui_main(), which invokes the application callback functions
Toolkit.mainloop();
} catch (Throwable e) {