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 "org_lwjgl_input_Keyboard.h"
#include "Window.h"
#include "common_tools.h"
#define KEYBOARD_BUFFER_SIZE 50
static BYTE readBuffer[KEYBOARD_BUFFER_SIZE*4];
static LPDIRECTINPUTDEVICE lpdiKeyboard = NULL;
static bool translationEnabled;
static bool useUnicode;
@ -167,21 +168,21 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll
lpdiKeyboard->GetDeviceState((DWORD)buffer_size, keyboardBuffer);
}
/*
* Class: org_lwjgl_input_Keyboard
* Method: nRead
* Signature: (I)V
*/
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];
wchar_t transBufUnicode[KEYBOARD_BUFFER_SIZE];
WORD transBufAscii[KEYBOARD_BUFFER_SIZE];
BYTE state[256];
DWORD bufsize = KEYBOARD_BUFFER_SIZE;
DWORD num_di_events = KEYBOARD_BUFFER_SIZE;
HRESULT ret;
int num_chars;
@ -194,56 +195,63 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead
ret = lpdiKeyboard->GetDeviceData(
sizeof(DIDEVICEOBJECTDATA),
rgdod,
&bufsize,
&num_di_events,
0);
if (ret == DI_OK) {
unsigned char * buf = readBuffer;
for (unsigned int i = 0; i < bufsize; i ++) {
unsigned char * buf = buffer_position + (unsigned char *)env->GetDirectBufferAddress(buffer_obj);
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++;
*buf++ = (unsigned char) rgdod[i].dwOfs;
*buf++ = (unsigned char) rgdod[i].dwData;
buf[index++] = (unsigned char) rgdod[current_di_event].dwOfs;
buf[index++] = (unsigned char) rgdod[current_di_event].dwData;
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 (useUnicode) {
num_chars = ToUnicode(virt_key,
rgdod[i].dwOfs,
rgdod[current_di_event].dwOfs,
state,
transBufUnicode,
KEYBOARD_BUFFER_SIZE, 0);
} else {
num_chars = ToAscii(virt_key,
rgdod[i].dwOfs,
rgdod[current_di_event].dwOfs,
state,
transBufAscii,
0);
}
if (num_chars > 0) {
for (int i = 0; i < num_chars; i++) {
if (i >= 1) {
int current_char = 0;
do {
if (current_char >= 1) {
num_events++;
*buf++ = 0;
*buf++ = 0;
buf[index++] = 0;
buf[index++] = 0;
}
if (useUnicode) {
wchar_t ch = transBufUnicode[i];
*buf++ = (unsigned char) (ch & 0xff);
*buf++ = (unsigned char) ((ch & 0xff00) >> 8);
wchar_t ch = transBufUnicode[current_char];
buf[index++] = (unsigned char) (ch & 0xff);
buf[index++] = (unsigned char) ((ch & 0xff00) >> 8);
} else {
*buf++ = (unsigned char)transBufAscii[0];
*buf++ = 0;
buf[index++] = (unsigned char)transBufAscii[current_char];
buf[index++] = 0;
}
}
current_char++;
} while (index + event_size <= buffer_size && current_char < num_chars);
} else {
*buf++ = 0;
*buf++ = 0;
buf[index++] = 0;
buf[index++] = 0;
}
} else {
*buf++ = 0;
*buf++ = 0;
buf[index++] = 0;
buf[index++] = 0;
}
}
current_di_event++;
}
} else if (ret == DI_BUFFEROVERFLOW) {
printfDebug("Keyboard buffer overflowed\n");
@ -291,11 +299,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation
* Method: nEnableBuffer
* Signature: ()I
*/
JNIEXPORT jobject JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer
JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer
(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 <dinput.h>
static BYTE readBuffer[EVENT_BUFFER_SIZE];
static LPDIRECTINPUTDEVICE mDIDevice; // DI Device instance
static int mButtoncount = 0; // Temporary buttoncount
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) {
jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, EVENT_BUFFER_SIZE);
return newBuffer;
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv * env, jclass clazz) {
}
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;
for (int i = 0; i < count; i++) {
for (int i = 0; i < num_di_events; i++) {
unsigned char button = mapButton(di_buffer[i].dwOfs);
if (button >= 0 && button < mButtoncount) {
unsigned char state = (unsigned char)di_buffer[i].dwData & 0x80;
if (state != 0)
state = 1;
readBuffer[buffer_index++] = button;
readBuffer[buffer_index++] = state;
if (buffer_index == EVENT_BUFFER_SIZE)
buffer[buffer_index++] = button;
buffer[buffer_index++] = state;
if (buffer_index == buffer_size)
break;
}
}
@ -182,11 +178,11 @@ static int bufferButtons(int count, DIDEVICEOBJECTDATA *di_buffer) {
}
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];
DWORD bufsize = EVENT_BUFFER_SIZE;
DWORD num_di_events = EVENT_BUFFER_SIZE;
HRESULT ret;
@ -197,11 +193,13 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead
ret = mDIDevice->GetDeviceData(
sizeof(DIDEVICEOBJECTDATA),
rgdod,
&bufsize,
&num_di_events,
0);
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) {
printfDebug("Buffer overflowed\n");
} else if (ret == DIERR_INPUTLOST) {