Linux: moved Cursor handle allocation to native side
This commit is contained in:
parent
c8fc535c7c
commit
8bb10a1372
|
@ -48,7 +48,6 @@ import org.lwjgl.LWJGLException;
|
||||||
import org.lwjgl.input.Keyboard;
|
import org.lwjgl.input.Keyboard;
|
||||||
|
|
||||||
final class LinuxDisplay implements DisplayImplementation {
|
final class LinuxDisplay implements DisplayImplementation {
|
||||||
private static final int CURSOR_HANDLE_SIZE = 8;
|
|
||||||
// private static final int PBUFFER_HANDLE_SIZE = 24;
|
// private static final int PBUFFER_HANDLE_SIZE = 24;
|
||||||
private static final int NUM_BUTTONS = 3;
|
private static final int NUM_BUTTONS = 3;
|
||||||
|
|
||||||
|
@ -359,16 +358,14 @@ final class LinuxDisplay implements DisplayImplementation {
|
||||||
return Keyboard.STATE_UNKNOWN;
|
return Keyboard.STATE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static native void nCreateCursor(ByteBuffer handle, int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, int images_offset, IntBuffer delays, int delays_offset) throws LWJGLException;
|
private static native ByteBuffer nCreateCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, int images_offset, IntBuffer delays, int delays_offset) throws LWJGLException;
|
||||||
|
|
||||||
public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException {
|
public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException {
|
||||||
lockAWT();
|
lockAWT();
|
||||||
try {
|
try {
|
||||||
incDisplay();
|
incDisplay();
|
||||||
try {
|
try {
|
||||||
ByteBuffer handle = BufferUtils.createByteBuffer(CURSOR_HANDLE_SIZE);
|
return nCreateCursor(width, height, xHotspot, yHotspot, numImages, images, images.position(), delays, delays != null ? delays.position() : -1);
|
||||||
nCreateCursor(handle, width, height, xHotspot, yHotspot, numImages, images, images.position(), delays, delays != null ? delays.position() : -1);
|
|
||||||
return handle;
|
|
||||||
} catch (LWJGLException e) {
|
} catch (LWJGLException e) {
|
||||||
decDisplay();
|
decDisplay();
|
||||||
throw e;
|
throw e;
|
||||||
|
|
|
@ -77,12 +77,13 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetMaxCursorSize
|
||||||
return width_return > height_return ? height_return : width_return;
|
return width_return > height_return ? height_return : width_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor
|
JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor
|
||||||
(JNIEnv *env, jclass clazz, jobject handle_buffer, jint width, jint height, jint x_hotspot, jint y_hotspot, jint num_images, jobject image_buffer, jint images_offset, jobject delay_buffer, jint delays_offset)
|
(JNIEnv *env, jclass clazz, jint width, jint height, jint x_hotspot, jint y_hotspot, jint num_images, jobject image_buffer, jint images_offset, jobject delay_buffer, jint delays_offset)
|
||||||
{
|
{
|
||||||
if ((*env)->GetDirectBufferCapacity(env, handle_buffer) < sizeof(Cursor)) {
|
jobject handle_buffer = newJavaManagedByteBuffer(env, sizeof(Cursor));
|
||||||
throwException(env, "Handle buffer not large enough");
|
if (handle_buffer == NULL) {
|
||||||
return;
|
throwException(env, "Could not allocate handle buffer");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
const int *delays = NULL;
|
const int *delays = NULL;
|
||||||
if (delay_buffer != NULL)
|
if (delay_buffer != NULL)
|
||||||
|
@ -92,7 +93,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor
|
||||||
XcursorImages *cursor_images = XcursorImagesCreate(num_images);
|
XcursorImages *cursor_images = XcursorImagesCreate(num_images);
|
||||||
if (cursor_images == NULL) {
|
if (cursor_images == NULL) {
|
||||||
throwException(env, "Could not allocate cursor.");
|
throwException(env, "Could not allocate cursor.");
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
cursor_images->nimage = num_images;
|
cursor_images->nimage = num_images;
|
||||||
int i;
|
int i;
|
||||||
|
@ -108,6 +109,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor
|
||||||
Cursor *cursor = (Cursor *)(*env)->GetDirectBufferAddress(env, handle_buffer);
|
Cursor *cursor = (Cursor *)(*env)->GetDirectBufferAddress(env, handle_buffer);
|
||||||
*cursor = XcursorImagesLoadCursor(getDisplay(), cursor_images);
|
*cursor = XcursorImagesLoadCursor(getDisplay(), cursor_images);
|
||||||
XcursorImagesDestroy(cursor_images);
|
XcursorImagesDestroy(cursor_images);
|
||||||
|
return handle_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyCursor
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyCursor
|
||||||
|
|
Loading…
Reference in New Issue