diff --git a/src/java/org/lwjgl/input/Mouse.java b/src/java/org/lwjgl/input/Mouse.java index 32065586..d33ae87a 100644 --- a/src/java/org/lwjgl/input/Mouse.java +++ b/src/java/org/lwjgl/input/Mouse.java @@ -296,7 +296,7 @@ public class Mouse { created = false; buttons = null; coord_buffer = null; - + implementation.destroyMouse(); } diff --git a/src/java/org/lwjgl/opengl/AbstractAWTInput.java b/src/java/org/lwjgl/opengl/AbstractAWTInput.java index 6aac55fc..72cf12c0 100644 --- a/src/java/org/lwjgl/opengl/AbstractAWTInput.java +++ b/src/java/org/lwjgl/opengl/AbstractAWTInput.java @@ -84,10 +84,6 @@ abstract class AbstractAWTInput implements AWTCanvasInputImplementation { public synchronized void destroy() { canvas.setInput(null); canvas = null; - if (mouse_queue != null) - mouse_queue.unregister(); - if (keyboard_queue != null) - keyboard_queue.unregister(); } public final int getWidth() { @@ -115,8 +111,11 @@ abstract class AbstractAWTInput implements AWTCanvasInputImplementation { return new MouseEventQueue(getCanvas()); } - public void destroyMouse() { - mouse_queue.unregister(); + public synchronized void destroyMouse() { + if (mouse_queue != null) { + mouse_queue.unregister(); + mouse_queue = null; + } } public int getNativeCursorCapabilities() { @@ -145,8 +144,10 @@ abstract class AbstractAWTInput implements AWTCanvasInputImplementation { } public synchronized void destroyKeyboard() { - if (keyboard_queue != null) + if (keyboard_queue != null) { keyboard_queue.unregister(); + keyboard_queue = null; + } } public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { diff --git a/src/java/org/lwjgl/opengl/LinuxAWTInput.java b/src/java/org/lwjgl/opengl/LinuxAWTInput.java index 450e94ef..14aec272 100644 --- a/src/java/org/lwjgl/opengl/LinuxAWTInput.java +++ b/src/java/org/lwjgl/opengl/LinuxAWTInput.java @@ -137,6 +137,11 @@ final class LinuxAWTInput extends AbstractAWTInput { LinuxDisplay.unlockAWT(); } } + + public void destroyMouse() { + ungrabInputLocked(); + super.destroyMouse(); + } private void checkFocus() { if (getCanvas().isFocusOwner()) { @@ -148,7 +153,7 @@ final class LinuxAWTInput extends AbstractAWTInput { } private boolean shouldGrab() { - return !input_released && isGrabbed(); + return !input_released && isGrabbed() && getMouseEventQueue() != null; } private void update() { diff --git a/src/java/org/lwjgl/opengl/LinuxDisplay.java b/src/java/org/lwjgl/opengl/LinuxDisplay.java index a8cb0724..4cbd59a4 100644 --- a/src/java/org/lwjgl/opengl/LinuxDisplay.java +++ b/src/java/org/lwjgl/opengl/LinuxDisplay.java @@ -348,7 +348,7 @@ final class LinuxDisplay implements DisplayImplementation { } private boolean shouldGrab() { - return !input_released && grab; + return !input_released && grab && mouse != null; } private void updatePointerGrab() { @@ -715,6 +715,7 @@ final class LinuxDisplay implements DisplayImplementation { public void destroyMouse() { mouse = null; + updateInputGrab(); } public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons) { diff --git a/src/java/org/lwjgl/opengl/LinuxMouse.java b/src/java/org/lwjgl/opengl/LinuxMouse.java index 4d20483c..b4e440e8 100644 --- a/src/java/org/lwjgl/opengl/LinuxMouse.java +++ b/src/java/org/lwjgl/opengl/LinuxMouse.java @@ -194,7 +194,7 @@ final class LinuxMouse { private static native void nWarpCursor(long display, long window, int x, int y); private void handlePointerMotion(boolean grab, boolean warp_pointer, long millis, long root_window, int x_root, int y_root, int x, int y) { - doHandlePointerMotion(grab, warp_pointer, root_window, x_root, y_root, x, y, millis*1000000); + doHandlePointerMotion(grab, warp_pointer, root_window, x_root, y_root, x, y, millis*1000000); } private void handleButton(boolean grab, int button, byte state, long nanos) { @@ -256,7 +256,7 @@ final class LinuxMouse { } } - private void resetCursor(int x, int y) { + private void resetCursor(int x, int y) { last_x = x; last_y = transformY(y); } diff --git a/src/java/org/lwjgl/opengl/MacOSXAWTInput.java b/src/java/org/lwjgl/opengl/MacOSXAWTInput.java index b5dc96ce..37ac5c0f 100644 --- a/src/java/org/lwjgl/opengl/MacOSXAWTInput.java +++ b/src/java/org/lwjgl/opengl/MacOSXAWTInput.java @@ -60,4 +60,10 @@ final class MacOSXAWTInput extends AbstractAWTInput { ((MacOSXMouseEventQueue)getMouseEventQueue()).warpCursor(); had_focus = has_focus; } + + public synchronized void destroyMouse() { + if (getMouseEventQueue() != null) + getMouseEventQueue().setGrabbed(false); + super.destroyMouse(); + } } diff --git a/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/src/java/org/lwjgl/opengl/MacOSXDisplay.java index a45a5001..d87fa796 100644 --- a/src/java/org/lwjgl/opengl/MacOSXDisplay.java +++ b/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -299,8 +299,10 @@ final class MacOSXDisplay implements DisplayImplementation { } public void destroyMouse() { - if (mouse_queue != null) + if (mouse_queue != null) { + mouse_queue.setGrabbed(false); mouse_queue.unregister(); + } this.mouse_queue = null; } diff --git a/src/java/org/lwjgl/opengl/WindowsAWTInput.java b/src/java/org/lwjgl/opengl/WindowsAWTInput.java index fa1d19fe..ae46882c 100644 --- a/src/java/org/lwjgl/opengl/WindowsAWTInput.java +++ b/src/java/org/lwjgl/opengl/WindowsAWTInput.java @@ -64,12 +64,12 @@ final class WindowsAWTInput extends AbstractAWTInput { blank_cursor = AWTUtil.createCursor(w, h, 0, 0, 1, BufferUtils.createIntBuffer(w*h), null); } - public synchronized void destroy() { - super.destroy(); + public synchronized void destroyMouse() { if (cached_mouse != null) { grab(false); cached_mouse.destroy(); } + super.destroyMouse(); } public synchronized void processInput(PeerInfo peer_info) {