Attempt to fix lost key up events when Display is out of focus. (Windows)
This commit is contained in:
parent
ad4f4c74eb
commit
814f9a141e
|
@ -345,6 +345,9 @@ final class WindowsDisplay implements DisplayImplementation {
|
||||||
redoMakeContextCurrent = true;
|
redoMakeContextCurrent = true;
|
||||||
if (Display.isFullscreen())
|
if (Display.isFullscreen())
|
||||||
updateClipping();
|
updateClipping();
|
||||||
|
|
||||||
|
if ( keyboard != null )
|
||||||
|
keyboard.fireLostKeyEvents();
|
||||||
} else if (Display.isFullscreen()) {
|
} else if (Display.isFullscreen()) {
|
||||||
showWindow(getHwnd(), SW_SHOWMINNOACTIVE);
|
showWindow(getHwnd(), SW_SHOWMINNOACTIVE);
|
||||||
resetDisplayMode();
|
resetDisplayMode();
|
||||||
|
@ -1045,15 +1048,6 @@ final class WindowsDisplay implements DisplayImplementation {
|
||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int firstMouseButtonDown() {
|
|
||||||
for(int i=0; i<Mouse.getButtonCount(); i++) {
|
|
||||||
if(Mouse.isButtonDown(i)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private native boolean nTrackMouseEvent(long hwnd);
|
private native boolean nTrackMouseEvent(long hwnd);
|
||||||
|
|
||||||
public boolean isInsideWindow() {
|
public boolean isInsideWindow() {
|
||||||
|
|
|
@ -49,8 +49,8 @@ final class WindowsKeyboard {
|
||||||
private static final int BUFFER_SIZE = 50;
|
private static final int BUFFER_SIZE = 50;
|
||||||
|
|
||||||
private final long hwnd;
|
private final long hwnd;
|
||||||
private final ByteBuffer keyboard_state;
|
|
||||||
private final byte[] key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE];
|
private final byte[] key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE];
|
||||||
|
private final byte[] virt_key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE];
|
||||||
private final EventQueue event_queue = new EventQueue(Keyboard.EVENT_SIZE);
|
private final EventQueue event_queue = new EventQueue(Keyboard.EVENT_SIZE);
|
||||||
private final ByteBuffer tmp_event = ByteBuffer.allocate(Keyboard.EVENT_SIZE);
|
private final ByteBuffer tmp_event = ByteBuffer.allocate(Keyboard.EVENT_SIZE);
|
||||||
|
|
||||||
|
@ -65,7 +65,6 @@ final class WindowsKeyboard {
|
||||||
|
|
||||||
WindowsKeyboard(long hwnd) throws LWJGLException {
|
WindowsKeyboard(long hwnd) throws LWJGLException {
|
||||||
this.hwnd = hwnd;
|
this.hwnd = hwnd;
|
||||||
keyboard_state = BufferUtils.createByteBuffer(256);
|
|
||||||
}
|
}
|
||||||
private static native boolean isWindowsNT();
|
private static native boolean isWindowsNT();
|
||||||
|
|
||||||
|
@ -99,6 +98,7 @@ final class WindowsKeyboard {
|
||||||
private static native int ToAscii(int wVirtKey, int wScanCode, ByteBuffer lpKeyState, ByteBuffer lpChar, int flags);
|
private static native int ToAscii(int wVirtKey, int wScanCode, ByteBuffer lpKeyState, ByteBuffer lpChar, int flags);
|
||||||
private static native int GetKeyboardState(ByteBuffer lpKeyState);
|
private static native int GetKeyboardState(ByteBuffer lpKeyState);
|
||||||
private static native int GetKeyState(int virt_key);
|
private static native int GetKeyState(int virt_key);
|
||||||
|
private static native int GetAsyncKeyState(int virt_key);
|
||||||
|
|
||||||
private void putEvent(int keycode, byte state, int ch, long millis, boolean repeat) {
|
private void putEvent(int keycode, byte state, int ch, long millis, boolean repeat) {
|
||||||
tmp_event.clear();
|
tmp_event.clear();
|
||||||
|
@ -155,8 +155,10 @@ final class WindowsKeyboard {
|
||||||
flushRetained();
|
flushRetained();
|
||||||
has_retained_event = true;
|
has_retained_event = true;
|
||||||
int keycode = WindowsKeycodes.mapVirtualKeyToLWJGLCode(virt_key);
|
int keycode = WindowsKeycodes.mapVirtualKeyToLWJGLCode(virt_key);
|
||||||
if (keycode < key_down_buffer.length)
|
if (keycode < key_down_buffer.length) {
|
||||||
key_down_buffer[keycode] = event_state;
|
key_down_buffer[keycode] = event_state;
|
||||||
|
virt_key_down_buffer[virt_key] = event_state;
|
||||||
|
}
|
||||||
retained_key_code = keycode;
|
retained_key_code = keycode;
|
||||||
retained_state = event_state;
|
retained_state = event_state;
|
||||||
retained_millis = millis;
|
retained_millis = millis;
|
||||||
|
@ -164,6 +166,14 @@ final class WindowsKeyboard {
|
||||||
retained_repeat = repeat;
|
retained_repeat = repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void fireLostKeyEvents() {
|
||||||
|
for ( int i = 0; i < virt_key_down_buffer.length; i++ ) {
|
||||||
|
if ( (virt_key_down_buffer[i] & 1) == 1 && (GetAsyncKeyState(i) & 1) == 0 )
|
||||||
|
handleKey(i, 0, false, (byte)0, System.currentTimeMillis(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void handleChar(int event_char, long millis, boolean repeat) {
|
public void handleChar(int event_char, long millis, boolean repeat) {
|
||||||
if (has_retained_event && retained_char != 0)
|
if (has_retained_event && retained_char != 0)
|
||||||
flushRetained();
|
flushRetained();
|
||||||
|
|
|
@ -45,6 +45,10 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetKeyState(JNIEnv
|
||||||
return GetKeyState(virt_key);
|
return GetKeyState(virt_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetAsyncKeyState(JNIEnv *env, jclass unused, jint virt_key) {
|
||||||
|
return GetAsyncKeyState(virt_key);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_MapVirtualKey(JNIEnv *env, jclass unused, jint uCode, jint uMapType) {
|
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_MapVirtualKey(JNIEnv *env, jclass unused, jint uCode, jint uMapType) {
|
||||||
return MapVirtualKey(uCode, uMapType);
|
return MapVirtualKey(uCode, uMapType);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue