diff --git a/src/java/org/lwjgl/input/Cursor.java b/src/java/org/lwjgl/input/Cursor.java index d4dab101..7596408c 100644 --- a/src/java/org/lwjgl/input/Cursor.java +++ b/src/java/org/lwjgl/input/Cursor.java @@ -38,7 +38,7 @@ import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; import org.lwjgl.Sys; -import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayImplementation; /** * @@ -115,7 +115,7 @@ public class Cursor { * @return the maximum size of a native cursor */ public static int getMinCursorSize() { - return Display.getImplementation().getMinCursorSize(); + return Mouse.getImplementation().getMinCursorSize(); } /** @@ -126,7 +126,7 @@ public class Cursor { * @return the maximum size of a native cursor */ public static int getMaxCursorSize() { - return Display.getImplementation().getMaxCursorSize(); + return Mouse.getImplementation().getMaxCursorSize(); } /** @@ -138,7 +138,7 @@ public class Cursor { * @return A bit mask with native cursor capabilities. */ public static int getCapabilities() { - return Display.getImplementation().getNativeCursorCapabilities(); + return Mouse.getImplementation().getNativeCursorCapabilities(); } /** @@ -164,7 +164,7 @@ public class Cursor { // create our cursor elements cursors = new CursorElement[numImages]; for(int i=0; i @@ -263,6 +264,8 @@ public class Keyboard { /** One time initialization */ private static boolean initialized; + private static DisplayImplementation implementation; + /** * Keyboard cannot be constructed. */ @@ -292,7 +295,8 @@ public class Keyboard { initialize(); if (created) return; - Display.getImplementation().createKeyboard(); + implementation = Mouse.getImplementation(); + implementation.createKeyboard(); created = true; readBuffer = ByteBuffer.allocate(EVENT_SIZE*BUFFER_SIZE); reset(); @@ -321,7 +325,7 @@ public class Keyboard { if (!created) return; created = false; - Display.getImplementation().destroyKeyboard(); + implementation.destroyKeyboard(); reset(); } @@ -346,13 +350,13 @@ public class Keyboard { public static void poll() { if (!created) throw new IllegalStateException("Keyboard must be created before you can poll the device"); - Display.getImplementation().pollKeyboard(keyDownBuffer); + implementation.pollKeyboard(keyDownBuffer); read(); } private static void read() { readBuffer.compact(); - Display.getImplementation().readKeyboard(readBuffer); + implementation.readKeyboard(readBuffer); readBuffer.flip(); } @@ -376,7 +380,7 @@ public class Keyboard { /* public static int isStateKeySet(int key) { if (!created) throw new IllegalStateException("Keyboard must be created before you can query key state"); - return Display.getImplementation().isStateKeySet(key); + return implementation.isStateKeySet(key); } */ /** diff --git a/src/java/org/lwjgl/input/Mouse.java b/src/java/org/lwjgl/input/Mouse.java index 96bed759..74c5dad4 100644 --- a/src/java/org/lwjgl/input/Mouse.java +++ b/src/java/org/lwjgl/input/Mouse.java @@ -40,8 +40,15 @@ import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; import org.lwjgl.Sys; +import org.lwjgl.opengl.DisplayImplementation; import org.lwjgl.opengl.Display; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; +import java.security.PrivilegedActionException; + + /** *
* A raw Mouse interface. This can be used to poll the current state of the @@ -126,6 +133,8 @@ public class Mouse { private static final int BUFFER_SIZE = 50; private static boolean isGrabbed; + + private static DisplayImplementation implementation; /** Whether we're running windows - which need to manually update cursor animation */ private static final boolean isWindows = LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_WINDOWS; @@ -163,10 +172,10 @@ public class Mouse { currentCursor = cursor; if (isCreated()) { if (currentCursor != null) { - Display.getImplementation().setNativeCursor(currentCursor.getHandle()); + implementation.setNativeCursor(currentCursor.getHandle()); currentCursor.setTimeout(); } else { - Display.getImplementation().setNativeCursor(null); + implementation.setNativeCursor(null); } } return oldCursor; @@ -187,7 +196,7 @@ public class Mouse { x = event_x = new_x; y = event_y = new_y; if (!isGrabbed() && (Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) != 0) - Display.getImplementation().setCursorPosition(x, y); + implementation.setCursorPosition(x, y); } /** @@ -211,6 +220,23 @@ public class Mouse { readBuffer.position(readBuffer.limit()); } + static DisplayImplementation getImplementation() { + /* Use reflection since we can't make Display.getImplementation + * public + */ + try { + return (DisplayImplementation)AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Object run() throws Exception{ + Method getImplementation_method = Display.class.getDeclaredMethod("getImplementation", null); + getImplementation_method.setAccessible(true); + return getImplementation_method.invoke(null, null); + } + }); + } catch (PrivilegedActionException e) { + throw new Error(e); + } + } + /** * "Create" the mouse. The display must first have been created. * Initially, the mouse is not grabbed and the delta values are reported @@ -224,12 +250,13 @@ public class Mouse { if (!initialized) initialize(); if (created) return; - Display.getImplementation().createMouse(); - hasWheel = Display.getImplementation().hasWheel(); + implementation = getImplementation(); + implementation.createMouse(); + hasWheel = implementation.hasWheel(); created = true; // set mouse buttons - buttonCount = Display.getImplementation().getButtonCount(); + buttonCount = implementation.getButtonCount(); buttons = BufferUtils.createByteBuffer(buttonCount); coord_buffer = BufferUtils.createIntBuffer(3); if (currentCursor != null) @@ -255,7 +282,7 @@ public class Mouse { buttons = null; coord_buffer = null; - Display.getImplementation().destroyMouse(); + implementation.destroyMouse(); } /** @@ -281,7 +308,7 @@ public class Mouse { */ public static void poll() { if (!created) throw new IllegalStateException("Mouse must be created before you can poll it"); - Display.getImplementation().pollMouse(coord_buffer, buttons); + implementation.pollMouse(coord_buffer, buttons); /* If we're grabbed, poll returns mouse deltas, if not it returns absolute coordinates */ int poll_coord1 = coord_buffer.get(0); @@ -308,7 +335,7 @@ public class Mouse { private static void read() { readBuffer.compact(); - Display.getImplementation().readMouse(readBuffer); + implementation.readMouse(readBuffer); readBuffer.flip(); } @@ -527,7 +554,7 @@ public class Mouse { public static void setGrabbed(boolean grab) { isGrabbed = grab; if (isCreated()) { - Display.getImplementation().grabMouse(isGrabbed); + implementation.grabMouse(isGrabbed); resetMouse(); } } diff --git a/src/java/org/lwjgl/opengl/Display.java b/src/java/org/lwjgl/opengl/Display.java index 260c7809..851fe18b 100644 --- a/src/java/org/lwjgl/opengl/Display.java +++ b/src/java/org/lwjgl/opengl/Display.java @@ -718,7 +718,7 @@ public final class Display { GL11.glViewport(0, 0, current_mode.getWidth(), current_mode.getHeight()); } - public static DisplayImplementation getImplementation() { + static DisplayImplementation getImplementation() { return display_impl; }