mirror of
https://github.com/shadowfacts/lwjgl2-arm64.git
synced 2026-04-10 17:04:01 +00:00
Windows: LWJGL didn't work well with jinput, but compatibility could be greatly improved if LWJGL used DirectInput 8 (like jinput). This can't be done unconditionally, since we need the DX3 support for older versions of windows. So, I've moved most Mouse and Keyboard stuff from native to java side and generalized DirectInput access through an abstract base class, with two concrete subclasses, one for dx3 and one for dx8.
This commit is contained in:
parent
e99b357a1b
commit
6cf49718db
33 changed files with 1972 additions and 894 deletions
130
src/java/org/lwjgl/opengl/WindowsDirectInputDevice.java
Executable file
130
src/java/org/lwjgl/opengl/WindowsDirectInputDevice.java
Executable file
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Copyright (c) 2002-2004 LWJGL Project
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of 'LWJGL' nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.lwjgl.opengl;
|
||||
|
||||
/**
|
||||
* This is the DirectInputDevice interface
|
||||
* @author elias_naur
|
||||
*/
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import org.lwjgl.LWJGLException;
|
||||
import org.lwjgl.BufferUtils;
|
||||
|
||||
abstract class WindowsDirectInputDevice {
|
||||
public final static int DISCL_EXCLUSIVE = 0x00000001;
|
||||
public final static int DISCL_NONEXCLUSIVE = 0x00000002;
|
||||
public final static int DISCL_FOREGROUND = 0x00000004;
|
||||
public final static int DISCL_BACKGROUND = 0x00000008;
|
||||
public final static int DISCL_NOWINKEY = 0x00000010;
|
||||
|
||||
public final static int GUID_XAxis = 1;
|
||||
public final static int GUID_YAxis = 2;
|
||||
public final static int GUID_ZAxis = 3;
|
||||
public final static int GUID_Button = 4;
|
||||
public final static int GUID_Unknown = 5;
|
||||
|
||||
private final long di_device;
|
||||
private ByteBuffer event_buffer;
|
||||
|
||||
public WindowsDirectInputDevice(long di_device) {
|
||||
this.di_device = di_device;
|
||||
}
|
||||
|
||||
public void release() {
|
||||
release(di_device);
|
||||
}
|
||||
protected abstract void release(long di_device);
|
||||
|
||||
public int poll() {
|
||||
return poll(di_device);
|
||||
}
|
||||
protected abstract int poll(long di_device);
|
||||
|
||||
public void setDataFormat(int type) throws LWJGLException {
|
||||
int ret = setDataFormat(di_device, type);
|
||||
if (ret != WindowsDirectInput.DI_OK)
|
||||
throw new LWJGLException("Failed to set data format (" + ret + ")");
|
||||
}
|
||||
protected abstract int setDataFormat(long di_device, int type);
|
||||
|
||||
public void setCooperateLevel(long hwnd, int flags) throws LWJGLException {
|
||||
int ret = setCooperativeLevel(di_device, hwnd, flags);
|
||||
if (ret != WindowsDirectInput.DI_OK)
|
||||
throw new LWJGLException("Failed to set cooperative level (" + ret + ")");
|
||||
}
|
||||
protected abstract int setCooperativeLevel(long di_device, long hwnd, int flags);
|
||||
|
||||
public int acquire() {
|
||||
return acquire(di_device);
|
||||
}
|
||||
protected abstract int acquire(long di_device);
|
||||
|
||||
public void setBufferSize(int buffer_size) throws LWJGLException {
|
||||
int ret = setBufferSize(di_device, buffer_size);
|
||||
if (ret != WindowsDirectInput.DI_OK)
|
||||
throw new LWJGLException("Failed to set buffer size (" + ret + ")");
|
||||
int event_buffer_size = getEventSize()*buffer_size;
|
||||
event_buffer = BufferUtils.createByteBuffer(event_buffer_size);
|
||||
}
|
||||
protected abstract int setBufferSize(long di_device, int buffer_size);
|
||||
|
||||
public int getDeviceData(IntBuffer buffer) {
|
||||
int events_remaining = buffer.remaining()/2;
|
||||
if (event_buffer == null || events_remaining > event_buffer.remaining()/getEventSize())
|
||||
event_buffer = BufferUtils.createByteBuffer(events_remaining*getEventSize());
|
||||
return getDeviceData(di_device, event_buffer, event_buffer.capacity(), buffer, buffer.position(), buffer.remaining());
|
||||
}
|
||||
protected abstract int getDeviceData(long di_device, ByteBuffer event_buffer, int event_buffer_size, IntBuffer buffer, int position, int size);
|
||||
|
||||
/**
|
||||
* Device data is returned in tuples of the form <dwOfs, dwData>.
|
||||
* buffer position() is moved accordingly to number of events.
|
||||
*/
|
||||
public int getDeviceState(ByteBuffer buffer) {
|
||||
return getDeviceState(di_device, buffer, buffer.position(), buffer.remaining());
|
||||
}
|
||||
protected abstract int getDeviceState(long di_device, ByteBuffer buffer, int position, int size);
|
||||
|
||||
public void unacquire() {
|
||||
unacquire(di_device);
|
||||
}
|
||||
protected abstract int unacquire(long di_device);
|
||||
|
||||
public int enumObjects(WindowsDirectInputDeviceObjectCallback enumerator) {
|
||||
return enumObjects(di_device, enumerator);
|
||||
}
|
||||
protected abstract int enumObjects(long di_device, WindowsDirectInputDeviceObjectCallback enumerator);
|
||||
|
||||
protected abstract int getEventSize();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue