Saved input events for win32
This commit is contained in:
parent
0a576f8e33
commit
8a2d246060
|
@ -46,13 +46,14 @@
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
#include "org_lwjgl_input_Keyboard.h"
|
#include "org_lwjgl_input_Keyboard.h"
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
|
||||||
#include "common_tools.h"
|
#include "common_tools.h"
|
||||||
|
|
||||||
#define KEYBOARD_BUFFER_SIZE 50
|
#define KEYBOARD_BUFFER_SIZE 50
|
||||||
|
|
||||||
static BYTE readBuffer[KEYBOARD_BUFFER_SIZE*4];
|
|
||||||
static LPDIRECTINPUTDEVICE lpdiKeyboard = NULL;
|
static LPDIRECTINPUTDEVICE lpdiKeyboard = NULL;
|
||||||
static bool translationEnabled;
|
static bool translationEnabled;
|
||||||
|
|
||||||
static bool useUnicode;
|
static bool useUnicode;
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,21 +168,21 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll
|
||||||
lpdiKeyboard->GetDeviceState((DWORD)buffer_size, keyboardBuffer);
|
lpdiKeyboard->GetDeviceState((DWORD)buffer_size, keyboardBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: org_lwjgl_input_Keyboard
|
* Class: org_lwjgl_input_Keyboard
|
||||||
* Method: nRead
|
* Method: nRead
|
||||||
* Signature: (I)V
|
* Signature: (I)V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead
|
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead
|
||||||
(JNIEnv * env, jclass clazz)
|
(JNIEnv * env, jclass clazz, jobject buffer_obj, jint buffer_position)
|
||||||
{
|
{
|
||||||
|
|
||||||
static DIDEVICEOBJECTDATA rgdod[KEYBOARD_BUFFER_SIZE];
|
static DIDEVICEOBJECTDATA rgdod[KEYBOARD_BUFFER_SIZE];
|
||||||
wchar_t transBufUnicode[KEYBOARD_BUFFER_SIZE];
|
wchar_t transBufUnicode[KEYBOARD_BUFFER_SIZE];
|
||||||
WORD transBufAscii[KEYBOARD_BUFFER_SIZE];
|
WORD transBufAscii[KEYBOARD_BUFFER_SIZE];
|
||||||
|
|
||||||
BYTE state[256];
|
BYTE state[256];
|
||||||
DWORD bufsize = KEYBOARD_BUFFER_SIZE;
|
DWORD num_di_events = KEYBOARD_BUFFER_SIZE;
|
||||||
|
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
int num_chars;
|
int num_chars;
|
||||||
|
@ -194,56 +195,63 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead
|
||||||
ret = lpdiKeyboard->GetDeviceData(
|
ret = lpdiKeyboard->GetDeviceData(
|
||||||
sizeof(DIDEVICEOBJECTDATA),
|
sizeof(DIDEVICEOBJECTDATA),
|
||||||
rgdod,
|
rgdod,
|
||||||
&bufsize,
|
&num_di_events,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (ret == DI_OK) {
|
if (ret == DI_OK) {
|
||||||
unsigned char * buf = readBuffer;
|
unsigned char * buf = buffer_position + (unsigned char *)env->GetDirectBufferAddress(buffer_obj);
|
||||||
for (unsigned int i = 0; i < bufsize; i ++) {
|
int buffer_size = (int)env->GetDirectBufferCapacity(buffer_obj) - buffer_position;
|
||||||
|
int index = 0;
|
||||||
|
int event_size = translationEnabled ? 4 : 2;
|
||||||
|
DWORD current_di_event = 0;
|
||||||
|
while (index + event_size <= buffer_size && current_di_event < num_di_events) {
|
||||||
num_events++;
|
num_events++;
|
||||||
*buf++ = (unsigned char) rgdod[i].dwOfs;
|
buf[index++] = (unsigned char) rgdod[current_di_event].dwOfs;
|
||||||
*buf++ = (unsigned char) rgdod[i].dwData;
|
buf[index++] = (unsigned char) rgdod[current_di_event].dwData;
|
||||||
if (translationEnabled) {
|
if (translationEnabled) {
|
||||||
UINT virt_key = MapVirtualKey(rgdod[i].dwOfs, 1);
|
UINT virt_key = MapVirtualKey(rgdod[current_di_event].dwOfs, 1);
|
||||||
if (virt_key != 0 && GetKeyboardState(state)) {
|
if (virt_key != 0 && GetKeyboardState(state)) {
|
||||||
if (useUnicode) {
|
if (useUnicode) {
|
||||||
num_chars = ToUnicode(virt_key,
|
num_chars = ToUnicode(virt_key,
|
||||||
rgdod[i].dwOfs,
|
rgdod[current_di_event].dwOfs,
|
||||||
state,
|
state,
|
||||||
transBufUnicode,
|
transBufUnicode,
|
||||||
KEYBOARD_BUFFER_SIZE, 0);
|
KEYBOARD_BUFFER_SIZE, 0);
|
||||||
} else {
|
} else {
|
||||||
num_chars = ToAscii(virt_key,
|
num_chars = ToAscii(virt_key,
|
||||||
rgdod[i].dwOfs,
|
rgdod[current_di_event].dwOfs,
|
||||||
state,
|
state,
|
||||||
transBufAscii,
|
transBufAscii,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
if (num_chars > 0) {
|
if (num_chars > 0) {
|
||||||
for (int i = 0; i < num_chars; i++) {
|
int current_char = 0;
|
||||||
if (i >= 1) {
|
do {
|
||||||
|
if (current_char >= 1) {
|
||||||
num_events++;
|
num_events++;
|
||||||
*buf++ = 0;
|
buf[index++] = 0;
|
||||||
*buf++ = 0;
|
buf[index++] = 0;
|
||||||
}
|
}
|
||||||
if (useUnicode) {
|
if (useUnicode) {
|
||||||
wchar_t ch = transBufUnicode[i];
|
wchar_t ch = transBufUnicode[current_char];
|
||||||
*buf++ = (unsigned char) (ch & 0xff);
|
buf[index++] = (unsigned char) (ch & 0xff);
|
||||||
*buf++ = (unsigned char) ((ch & 0xff00) >> 8);
|
buf[index++] = (unsigned char) ((ch & 0xff00) >> 8);
|
||||||
} else {
|
} else {
|
||||||
*buf++ = (unsigned char)transBufAscii[0];
|
buf[index++] = (unsigned char)transBufAscii[current_char];
|
||||||
*buf++ = 0;
|
buf[index++] = 0;
|
||||||
}
|
}
|
||||||
|
current_char++;
|
||||||
|
} while (index + event_size <= buffer_size && current_char < num_chars);
|
||||||
|
} else {
|
||||||
|
buf[index++] = 0;
|
||||||
|
buf[index++] = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*buf++ = 0;
|
buf[index++] = 0;
|
||||||
*buf++ = 0;
|
buf[index++] = 0;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*buf++ = 0;
|
|
||||||
*buf++ = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
current_di_event++;
|
||||||
}
|
}
|
||||||
} else if (ret == DI_BUFFEROVERFLOW) {
|
} else if (ret == DI_BUFFEROVERFLOW) {
|
||||||
printfDebug("Keyboard buffer overflowed\n");
|
printfDebug("Keyboard buffer overflowed\n");
|
||||||
|
@ -291,11 +299,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation
|
||||||
* Method: nEnableBuffer
|
* Method: nEnableBuffer
|
||||||
* Signature: ()I
|
* Signature: ()I
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jobject JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer
|
JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer
|
||||||
(JNIEnv * env, jclass clazz)
|
(JNIEnv * env, jclass clazz)
|
||||||
{
|
{
|
||||||
jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, KEYBOARD_BUFFER_SIZE*4);
|
|
||||||
return newBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -47,8 +47,6 @@
|
||||||
#include "common_tools.h"
|
#include "common_tools.h"
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
|
|
||||||
static BYTE readBuffer[EVENT_BUFFER_SIZE];
|
|
||||||
|
|
||||||
static LPDIRECTINPUTDEVICE mDIDevice; // DI Device instance
|
static LPDIRECTINPUTDEVICE mDIDevice; // DI Device instance
|
||||||
static int mButtoncount = 0; // Temporary buttoncount
|
static int mButtoncount = 0; // Temporary buttoncount
|
||||||
static bool mHaswheel; // Temporary wheel check
|
static bool mHaswheel; // Temporary wheel check
|
||||||
|
@ -145,9 +143,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nCreate(JNIEnv *env, jclass cl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv * env, jclass clazz) {
|
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv * env, jclass clazz) {
|
||||||
jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, EVENT_BUFFER_SIZE);
|
|
||||||
return newBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char mapButton(DWORD button_id) {
|
static unsigned char mapButton(DWORD button_id) {
|
||||||
|
@ -164,17 +160,17 @@ static unsigned char mapButton(DWORD button_id) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bufferButtons(int count, DIDEVICEOBJECTDATA *di_buffer) {
|
static int bufferButtons(int num_di_events, DIDEVICEOBJECTDATA *di_buffer, unsigned char *buffer, int buffer_size) {
|
||||||
int buffer_index = 0;
|
int buffer_index = 0;
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < num_di_events; i++) {
|
||||||
unsigned char button = mapButton(di_buffer[i].dwOfs);
|
unsigned char button = mapButton(di_buffer[i].dwOfs);
|
||||||
if (button >= 0 && button < mButtoncount) {
|
if (button >= 0 && button < mButtoncount) {
|
||||||
unsigned char state = (unsigned char)di_buffer[i].dwData & 0x80;
|
unsigned char state = (unsigned char)di_buffer[i].dwData & 0x80;
|
||||||
if (state != 0)
|
if (state != 0)
|
||||||
state = 1;
|
state = 1;
|
||||||
readBuffer[buffer_index++] = button;
|
buffer[buffer_index++] = button;
|
||||||
readBuffer[buffer_index++] = state;
|
buffer[buffer_index++] = state;
|
||||||
if (buffer_index == EVENT_BUFFER_SIZE)
|
if (buffer_index == buffer_size)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,11 +178,11 @@ static int bufferButtons(int count, DIDEVICEOBJECTDATA *di_buffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead
|
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead
|
||||||
(JNIEnv * env, jclass clazz)
|
(JNIEnv * env, jclass clazz, jobject buffer_obj, jint buffer_position)
|
||||||
{
|
{
|
||||||
|
|
||||||
static DIDEVICEOBJECTDATA rgdod[EVENT_BUFFER_SIZE];
|
static DIDEVICEOBJECTDATA rgdod[EVENT_BUFFER_SIZE];
|
||||||
DWORD bufsize = EVENT_BUFFER_SIZE;
|
DWORD num_di_events = EVENT_BUFFER_SIZE;
|
||||||
|
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
|
|
||||||
|
@ -197,11 +193,13 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead
|
||||||
ret = mDIDevice->GetDeviceData(
|
ret = mDIDevice->GetDeviceData(
|
||||||
sizeof(DIDEVICEOBJECTDATA),
|
sizeof(DIDEVICEOBJECTDATA),
|
||||||
rgdod,
|
rgdod,
|
||||||
&bufsize,
|
&num_di_events,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (ret == DI_OK) {
|
if (ret == DI_OK) {
|
||||||
return bufferButtons(bufsize, rgdod);
|
unsigned char *buffer_ptr = buffer_position + (unsigned char*)env->GetDirectBufferAddress(buffer_obj);
|
||||||
|
int buffer_size = (int)env->GetDirectBufferCapacity(buffer_obj) - buffer_position;
|
||||||
|
return bufferButtons(num_di_events, rgdod, buffer_ptr, buffer_size);
|
||||||
} else if (ret == DI_BUFFEROVERFLOW) {
|
} else if (ret == DI_BUFFEROVERFLOW) {
|
||||||
printfDebug("Buffer overflowed\n");
|
printfDebug("Buffer overflowed\n");
|
||||||
} else if (ret == DIERR_INPUTLOST) {
|
} else if (ret == DIERR_INPUTLOST) {
|
||||||
|
|
Loading…
Reference in New Issue