Saved input events for win32

This commit is contained in:
Elias Naur 2004-03-26 21:49:10 +00:00
parent 0a576f8e33
commit 8a2d246060
2 changed files with 47 additions and 43 deletions

View File

@ -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 { } else {
*buf++ = 0; buf[index++] = 0;
*buf++ = 0; buf[index++] = 0;
} }
} else { } else {
*buf++ = 0; buf[index++] = 0;
*buf++ = 0; buf[index++] = 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;
} }
/* /*

View File

@ -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) {