Inceptum/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/callback/GetPropertyCallback.java

37 lines
1.5 KiB
Java

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 GetPropertyCallback {
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(), GetPropertyCallback.class, DESCRIPTOR);
default MemoryAddress toCallback() {
return Linker.nativeLinker().upcallStub(HANDLE.bindTo(this), DESCRIPTOR, Interop.getScope()).address();
}
}