codemp/dist/java/src/mp/code/CursorController.java

92 lines
2.5 KiB
Java
Raw Normal View History

2024-08-06 23:30:00 +02:00
package mp.code;
import mp.code.data.Cursor;
2024-09-05 02:45:33 +02:00
import mp.code.exceptions.ControllerException;
2024-08-06 23:30:00 +02:00
import java.util.Optional;
import java.util.function.Consumer;
/**
* Allows interaction with the CodeMP cursor position tracking system.
* <p>
* It is generally safer to avoid storing this directly, see the api notes for {@link Workspace}.
*/
public final class CursorController {
2024-08-06 23:30:00 +02:00
private final long ptr;
CursorController(long ptr) {
this.ptr = ptr;
Extensions.CLEANER.register(this, () -> free(ptr));
2024-08-06 23:30:00 +02:00
}
2024-09-05 02:45:33 +02:00
private static native Cursor try_recv(long self) throws ControllerException;
/**
* Tries to get a {@link Cursor} update from the queue if any were present, and returns
* an empty optional otherwise.
* @return the first cursor event in queue, if any are present
* @throws ControllerException if the controller was stopped
*/
2024-09-05 02:45:33 +02:00
public Optional<Cursor> tryRecv() throws ControllerException {
return Optional.ofNullable(try_recv(this.ptr));
}
2024-09-05 02:45:33 +02:00
private static native Cursor recv(long self) throws ControllerException;
/**
* Blocks until a {@link Cursor} update is available and returns it.
* @return the cursor update that occurred
* @throws ControllerException if the controller was stopped
*/
2024-09-05 02:45:33 +02:00
public Cursor recv() throws ControllerException {
return recv(this.ptr);
2024-08-06 23:30:00 +02:00
}
2024-09-05 02:45:33 +02:00
private static native void send(long self, Cursor cursor) throws ControllerException;
/**
* Tries to send a {@link Cursor} update.
* @throws ControllerException if the controller was stopped
*/
2024-09-05 02:45:33 +02:00
public void send(Cursor cursor) throws ControllerException {
send(this.ptr, cursor);
2024-08-06 23:30:00 +02:00
}
private static native void callback(long self, Consumer<CursorController> cb);
/**
* Registers a callback to be invoked whenever a {@link Cursor} update occurs.
* This will not work unless a Java thread has been dedicated to the event loop.
* @see Extensions#drive(boolean)
*/
public void callback(Consumer<CursorController> cb) {
callback(this.ptr, cb);
}
private static native void clear_callback(long self);
/**
* Clears the registered callback.
* @see #callback(Consumer)
*/
public void clearCallback() {
clear_callback(this.ptr);
}
private static native void poll(long self) throws ControllerException;
/**
* Blocks until a {@link Cursor} update is available.
* @throws ControllerException if the controller was stopped
*/
public void poll() throws ControllerException {
poll(this.ptr);
}
2024-08-06 23:30:00 +02:00
private static native void free(long self);
static {
NativeUtils.loadLibraryIfNeeded();
}
2024-08-06 23:30:00 +02:00
}