Fix win32 mouse event deltas too

This commit is contained in:
Elias Naur 2004-09-27 13:43:34 +00:00
parent 468502cb00
commit 4c631207c5
1 changed files with 33 additions and 29 deletions

View File

@ -62,8 +62,10 @@ static int mouseMask = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND;
static int accum_dx; static int accum_dx;
static int accum_dy; static int accum_dy;
static int accum_dwheel; static int accum_dwheel;
static int last_x; static int last_poll_x;
static int last_y; static int last_poll_y;
static int last_event_x;
static int last_event_y;
static event_queue_t event_queue; static event_queue_t event_queue;
static bool buffer_enabled; static bool buffer_enabled;
@ -77,22 +79,19 @@ void SetupMouse();
void InitializeMouseFields(); void InitializeMouseFields();
void UpdateMouseFields(JNIEnv *env, jclass clsMouse, jobject coord_buffer_obj, jobject button_buffer_obj); void UpdateMouseFields(JNIEnv *env, jclass clsMouse, jobject coord_buffer_obj, jobject button_buffer_obj);
static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) { static bool putMouseEvent(jint button, jint state, jint dx, jint dy, jint dz) {
if (buffer_enabled) { jint event[] = {button, state, dx, -dy, dz};
putEventElement(&event_queue, button); return putEvent(&event_queue, event);
putEventElement(&event_queue, state);
putEventElement(&event_queue, dx);
putEventElement(&event_queue, -dy);
putEventElement(&event_queue, dz);
}
} }
static void resetCursorPos(void) { static void resetCursorPos(void) {
/* Reset cursor position to middle of the window */ /* Reset cursor position to middle of the window */
RECT clientRect; RECT clientRect;
GetClientRect(getCurrentHWND(), &clientRect); GetClientRect(getCurrentHWND(), &clientRect);
last_x = (clientRect.left + clientRect.right)/2; last_poll_x = (clientRect.left + clientRect.right)/2;
last_y = clientRect.bottom - 1 - (clientRect.bottom - clientRect.top)/2; last_poll_y = clientRect.bottom - 1 - (clientRect.bottom - clientRect.top)/2;
last_event_x = last_poll_x;
last_event_y = last_poll_y;
accum_dx = accum_dy = 0; accum_dx = accum_dy = 0;
} }
@ -110,9 +109,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nGetButtonCount(JNIEnv *, jcla
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nCreate(JNIEnv *env, jclass clazz) { JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nCreate(JNIEnv *env, jclass clazz) {
HRESULT hr; HRESULT hr;
initEventQueue(&event_queue); initEventQueue(&event_queue, 5);
last_x = last_y = accum_dx = accum_dy = accum_dwheel = 0; last_poll_x = last_poll_y = last_event_x = last_event_y = accum_dx = accum_dy = accum_dwheel = 0;
buffer_enabled = false; buffer_enabled = false;
// Create input // Create input
@ -156,21 +155,26 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv * env, jc
void handleMouseScrolled(int event_dwheel) { void handleMouseScrolled(int event_dwheel) {
accum_dwheel += event_dwheel; accum_dwheel += event_dwheel;
putEvent(-1, 0, 0, 0, event_dwheel); putMouseEvent(-1, 0, 0, 0, event_dwheel);
} }
void handleMouseMoved(int x, int y) { void handleMouseMoved(int x, int y) {
int event_dx = x - last_x; int poll_dx = x - last_poll_x;
int event_dy = y - last_y; int poll_dy = y - last_poll_y;
accum_dx += event_dx; accum_dx += poll_dx;
accum_dy += event_dy; accum_dy += poll_dy;
putEvent(-1, 0, event_dx, event_dy, 0); last_poll_x = x;
last_x = x; last_poll_y = y;
last_y = y; int event_dx = x - last_event_x;
int event_dy = y - last_event_y;
if (putMouseEvent(-1, 0, event_dx, event_dy, 0)) {
last_event_x = x;
last_event_y = y;
}
} }
void handleMouseButton(int button, int state) { void handleMouseButton(int button, int state) {
putEvent(button, state, 0, 0, 0); putMouseEvent(button, state, 0, 0, 0);
} }
static void copyDXEvents(int num_di_events, DIDEVICEOBJECTDATA *di_buffer) { static void copyDXEvents(int num_di_events, DIDEVICEOBJECTDATA *di_buffer) {
@ -180,19 +184,19 @@ static void copyDXEvents(int num_di_events, DIDEVICEOBJECTDATA *di_buffer) {
int button_state = (di_buffer[i].dwData & 0x80) != 0 ? 1 : 0; int button_state = (di_buffer[i].dwData & 0x80) != 0 ? 1 : 0;
switch (di_buffer[i].dwOfs) { switch (di_buffer[i].dwOfs) {
case DIMOFS_BUTTON0: case DIMOFS_BUTTON0:
putEvent(0, button_state, dx, dy, dwheel); putMouseEvent(0, button_state, dx, dy, dwheel);
dx = dy = dwheel = 0; dx = dy = dwheel = 0;
break; break;
case DIMOFS_BUTTON1: case DIMOFS_BUTTON1:
putEvent(1, button_state, dx, dy, dwheel); putMouseEvent(1, button_state, dx, dy, dwheel);
dx = dy = dwheel = 0; dx = dy = dwheel = 0;
break; break;
case DIMOFS_BUTTON2: case DIMOFS_BUTTON2:
putEvent(2, button_state, dx, dy, dwheel); putMouseEvent(2, button_state, dx, dy, dwheel);
dx = dy = dwheel = 0; dx = dy = dwheel = 0;
break; break;
case DIMOFS_BUTTON3: case DIMOFS_BUTTON3:
putEvent(3, button_state, dx, dy, dwheel); putMouseEvent(3, button_state, dx, dy, dwheel);
dx = dy = dwheel = 0; dx = dy = dwheel = 0;
break; break;
case DIMOFS_X: case DIMOFS_X:
@ -207,7 +211,7 @@ static void copyDXEvents(int num_di_events, DIDEVICEOBJECTDATA *di_buffer) {
} }
} }
if (dx != 0 || dy != 0 || dwheel != 0) if (dx != 0 || dy != 0 || dwheel != 0)
putEvent(-1, 0, dx, dy, dwheel); putMouseEvent(-1, 0, dx, dy, dwheel);
} }
static void readDXBuffer() static void readDXBuffer()
@ -257,7 +261,7 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead
} else { } else {
handleMessages(); handleMessages();
} }
return copyEvents(&event_queue, buffer_ptr, buffer_size, 5); return copyEvents(&event_queue, buffer_ptr, buffer_size);
} }
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nGetNativeCursorCaps JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nGetNativeCursorCaps