package io.gitlab.jfronny.inceptum.gtk.callback; import io.github.jwharm.javagi.CallbackGenerator; import io.github.jwharm.javagi.Interop; import io.github.jwharm.javagi.Marshal; import io.github.jwharm.javagi.Ownership; import org.gtk.gobject.GiObject; import org.gtk.gobject.ParamSpec; import org.gtk.gobject.Value; import org.jetbrains.annotations.ApiStatus; import java.lang.foreign.FunctionDescriptor; import java.lang.foreign.Linker; import java.lang.foreign.MemoryAddress; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; public interface SetPropertyCallback { void invoke(GiObject object, int propertyId, Value value, ParamSpec paramSpec); default void upcall(MemoryAddress object, int propertyId, MemoryAddress value, MemoryAddress pspec) { invoke(GiObject.fromAddress.marshal(object, Ownership.NONE), propertyId, Value.fromAddress.marshal(value, Ownership.NONE), ParamSpec.fromAddress.marshal(pspec, Ownership.NONE)); } @ApiStatus.Internal FunctionDescriptor DESCRIPTOR = FunctionDescriptor.ofVoid(Interop.valueLayout.ADDRESS, Interop.valueLayout.C_INT, Interop.valueLayout.ADDRESS, Interop.valueLayout.ADDRESS); @ApiStatus.Internal MethodHandle HANDLE = CallbackGenerator.getHandle(MethodHandles.lookup(), SetPropertyCallback.class, DESCRIPTOR); default MemoryAddress toCallback() { return Linker.nativeLinker().upcallStub(HANDLE.bindTo(this), DESCRIPTOR, Interop.getScope()).address(); } }