Fix native mouse issues
This commit is contained in:
parent
38ebcf5fb3
commit
8da3656540
|
@ -60,9 +60,9 @@
|
||||||
static bool pointer_grabbed;
|
static bool pointer_grabbed;
|
||||||
static bool created;
|
static bool created;
|
||||||
|
|
||||||
static int dx;
|
static int accum_dx;
|
||||||
static int dy;
|
static int accum_dy;
|
||||||
static int dz;
|
static int accum_dz;
|
||||||
static int last_x;
|
static int last_x;
|
||||||
static int last_y;
|
static int last_y;
|
||||||
static jbyte buttons[NUM_BUTTONS];
|
static jbyte buttons[NUM_BUTTONS];
|
||||||
|
@ -77,7 +77,7 @@ static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) {
|
||||||
putEventElement(&event_queue, button);
|
putEventElement(&event_queue, button);
|
||||||
putEventElement(&event_queue, state);
|
putEventElement(&event_queue, state);
|
||||||
putEventElement(&event_queue, dx);
|
putEventElement(&event_queue, dx);
|
||||||
putEventElement(&event_queue, dy);
|
putEventElement(&event_queue, -dy);
|
||||||
putEventElement(&event_queue, dz);
|
putEventElement(&event_queue, dz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,11 +85,11 @@ static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) {
|
||||||
static void setCursorPos(int x, int y) {
|
static void setCursorPos(int x, int y) {
|
||||||
jint event_dx = x - last_x;
|
jint event_dx = x - last_x;
|
||||||
jint event_dy = y - last_y;
|
jint event_dy = y - last_y;
|
||||||
dx += event_dx;
|
accum_dx += event_dx;
|
||||||
dy += event_dy;
|
accum_dy += event_dy;
|
||||||
last_x = x;
|
last_x = x;
|
||||||
last_y = y;
|
last_y = y;
|
||||||
putEvent(-1, 0, event_dx, -event_dy, 0);
|
putEvent(-1, 0, event_dx, event_dy, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int transformY(int y) {
|
static int transformY(int y) {
|
||||||
|
@ -242,7 +242,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nCreate
|
||||||
if (disp == NULL)
|
if (disp == NULL)
|
||||||
return;
|
return;
|
||||||
int i;
|
int i;
|
||||||
last_y = last_x = dx = dy = dz = 0;
|
last_y = last_x = accum_dx = accum_dy = accum_dz = 0;
|
||||||
for (i = 0; i < NUM_BUTTONS; i++)
|
for (i = 0; i < NUM_BUTTONS; i++)
|
||||||
buttons[i] = 0;
|
buttons[i] = 0;
|
||||||
if (!blankCursor()) {
|
if (!blankCursor()) {
|
||||||
|
@ -357,12 +357,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nPoll(JNIEnv * env, jclass cla
|
||||||
printfDebug("ERROR: Not enough space in coords array: %d < 3\n", coords_length);
|
printfDebug("ERROR: Not enough space in coords array: %d < 3\n", coords_length);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
coords[0] = dx;
|
coords[0] = accum_dx;
|
||||||
coords[1] = -dy;
|
coords[1] = -accum_dy;
|
||||||
coords[2] = dz;
|
coords[2] = accum_dz;
|
||||||
dx = 0;
|
accum_dx = accum_dy = accum_dz = 0;
|
||||||
dy = 0;
|
|
||||||
dz = 0;
|
|
||||||
int num_buttons = NUM_BUTTONS;
|
int num_buttons = NUM_BUTTONS;
|
||||||
if (num_buttons > buttons_length)
|
if (num_buttons > buttons_length)
|
||||||
num_buttons = buttons_length;
|
num_buttons = buttons_length;
|
||||||
|
@ -385,4 +383,5 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead(JNIEnv *env, jclass claz
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nGrabMouse(JNIEnv * env, jclass clazz, jboolean new_grab) {
|
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nGrabMouse(JNIEnv * env, jclass clazz, jboolean new_grab) {
|
||||||
setGrab(new_grab == JNI_TRUE ? true : false);
|
setGrab(new_grab == JNI_TRUE ? true : false);
|
||||||
resetCursor(getWindowWidth()/2, transformY(getWindowHeight()/2));
|
resetCursor(getWindowWidth()/2, transformY(getWindowHeight()/2));
|
||||||
|
accum_dx = accum_dy = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,10 +58,10 @@ static bool mFirstTimeInitialization = true; // boolean to determine first time
|
||||||
static bool mouse_grabbed;
|
static bool mouse_grabbed;
|
||||||
static int mouseMask = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND;
|
static int mouseMask = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND;
|
||||||
|
|
||||||
/* These deltas track the cursor position from Windows messages */
|
/* These accumulated deltas track the cursor position from Windows messages */
|
||||||
static int dx;
|
static int accum_dx;
|
||||||
static int dy;
|
static int accum_dy;
|
||||||
static int dwheel;
|
static int accum_dwheel;
|
||||||
static int last_x;
|
static int last_x;
|
||||||
static int last_y;
|
static int last_y;
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) {
|
||||||
putEventElement(&event_queue, button);
|
putEventElement(&event_queue, button);
|
||||||
putEventElement(&event_queue, state);
|
putEventElement(&event_queue, state);
|
||||||
putEventElement(&event_queue, dx);
|
putEventElement(&event_queue, dx);
|
||||||
putEventElement(&event_queue, dy);
|
putEventElement(&event_queue, -dy);
|
||||||
putEventElement(&event_queue, dz);
|
putEventElement(&event_queue, dz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,7 @@ static void resetCursorPos(void) {
|
||||||
GetClientRect(getCurrentHWND(), &clientRect);
|
GetClientRect(getCurrentHWND(), &clientRect);
|
||||||
last_x = (clientRect.left + clientRect.right)/2;
|
last_x = (clientRect.left + clientRect.right)/2;
|
||||||
last_y = clientRect.bottom - 1 - (clientRect.bottom - clientRect.top)/2;
|
last_y = clientRect.bottom - 1 - (clientRect.bottom - clientRect.top)/2;
|
||||||
|
accum_dx = accum_dy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nHasWheel(JNIEnv *, jclass) {
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nHasWheel(JNIEnv *, jclass) {
|
||||||
|
@ -111,7 +112,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nCreate(JNIEnv *env, jclass cl
|
||||||
|
|
||||||
initEventQueue(&event_queue);
|
initEventQueue(&event_queue);
|
||||||
|
|
||||||
last_x = last_y = dx = dy = dwheel = 0;
|
last_x = last_y = accum_dx = accum_dy = accum_dwheel = 0;
|
||||||
buffer_enabled = false;
|
buffer_enabled = false;
|
||||||
|
|
||||||
// Create input
|
// Create input
|
||||||
|
@ -154,16 +155,16 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv * env, jc
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleMouseScrolled(int event_dwheel) {
|
void handleMouseScrolled(int event_dwheel) {
|
||||||
dwheel += event_dwheel;
|
accum_dwheel += event_dwheel;
|
||||||
putEvent(-1, 0, 0, 0, event_dwheel);
|
putEvent(-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 event_dx = x - last_x;
|
||||||
int event_dy = y - last_y;
|
int event_dy = y - last_y;
|
||||||
dx += event_dx;
|
accum_dx += event_dx;
|
||||||
dy += event_dy;
|
accum_dy += event_dy;
|
||||||
putEvent(-1, 0, event_dx, -event_dy, 0);
|
putEvent(-1, 0, event_dx, event_dy, 0);
|
||||||
last_x = x;
|
last_x = x;
|
||||||
last_y = y;
|
last_y = y;
|
||||||
}
|
}
|
||||||
|
@ -206,7 +207,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);
|
putEvent(-1, 0, dx, dy, dwheel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readDXBuffer()
|
static void readDXBuffer()
|
||||||
|
@ -435,27 +436,6 @@ static int cap(int val, int min, int max) {
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static void getGDICursorDelta(int* return_dx, int* return_dy) {
|
|
||||||
|
|
||||||
int dx;
|
|
||||||
int dy;
|
|
||||||
|
|
||||||
POINT newCursorPos;
|
|
||||||
RECT clientRect;
|
|
||||||
GetCursorPos(&newCursorPos);
|
|
||||||
ScreenToClient(getCurrentHWND(), &newCursorPos);
|
|
||||||
GetClientRect(getCurrentHWND(), &clientRect);
|
|
||||||
// Clip the position to the client rect
|
|
||||||
newCursorPos.x = cap(newCursorPos.x, clientRect.left, clientRect.right - 1);
|
|
||||||
newCursorPos.y = cap(newCursorPos.y, clientRect.top, clientRect.bottom - 1);
|
|
||||||
dx = newCursorPos.x - cursorPos.x;
|
|
||||||
dy = newCursorPos.y - cursorPos.y;
|
|
||||||
cursorPos.x += dx;
|
|
||||||
cursorPos.y += dy;
|
|
||||||
*return_dx = dx;
|
|
||||||
*return_dy = dy;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* Updates the fields on the Mouse
|
* Updates the fields on the Mouse
|
||||||
*/
|
*/
|
||||||
|
@ -498,10 +478,10 @@ static void UpdateMouseFields(JNIEnv *env, jclass clsMouse, jobject coord_buffer
|
||||||
coords[1] = -diMouseState.lY;
|
coords[1] = -diMouseState.lY;
|
||||||
coords[2] = diMouseState.lZ;
|
coords[2] = diMouseState.lZ;
|
||||||
} else {
|
} else {
|
||||||
coords[0] = dx;
|
coords[0] = accum_dx;
|
||||||
coords[1] = -dy;
|
coords[1] = -accum_dy;
|
||||||
coords[2] = dwheel;
|
coords[2] = accum_dwheel;
|
||||||
dx = dy = dwheel = 0;
|
accum_dx = accum_dy = accum_dwheel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < mButtoncount; i++) {
|
for (int i = 0; i < mButtoncount; i++) {
|
||||||
|
|
Loading…
Reference in New Issue