initialize InputManager.cursorPos to fix issue #792 for LWJGL2

v3.2
Stephen Gold 7 years ago committed by Nehon
parent e87eeb20a5
commit 8f1ee0ec9a
  1. 17
      jme3-core/src/main/java/com/jme3/input/InputManager.java
  2. 30
      jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2018 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -423,16 +423,23 @@ public class InputManager implements RawInputListener {
/**
* Callback from RawInputListener. Do not use.
*
* @param evt event to add to the input queue (not null)
*/
@Override
public void onMouseMotionEvent(MouseMotionEvent evt) {
if (!eventsPermitted) {
throw new UnsupportedOperationException("MouseInput has raised an event at an illegal time.");
}
/*
* If events aren't allowed, the event may be a "first mouse event"
* triggered by the constructor setting the the mouse listener.
* In that case, use the event to initialize the cursor position,
* but don't queue it for futher processing.
* This is part of the fix for issue #792.
*/
cursorPos.set(evt.getX(), evt.getY());
if (eventsPermitted) {
inputQueue.add(evt);
}
}
private void onMouseButtonEventQueued(MouseButtonEvent evt) {
int hash = MouseButtonTrigger.mouseButtonHash(evt.getButtonIndex());

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2018 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -85,6 +85,10 @@ public class LwjglMouseInput implements MouseInput {
} catch (LWJGLException ex) {
logger.log(Level.SEVERE, "Error while creating mouse", ex);
}
if (listener != null) {
sendFirstMouseEvent();
}
}
public boolean isInitialized(){
@ -158,8 +162,32 @@ public class LwjglMouseInput implements MouseInput {
Mouse.setGrabbed(!visible);
}
@Override
public void setInputListener(RawInputListener listener) {
this.listener = listener;
if (listener != null && Mouse.isCreated()) {
sendFirstMouseEvent();
}
}
/**
* Send the input listener a special mouse-motion event with zero deltas in
* order to initialize the listener's cursor position.
*/
private void sendFirstMouseEvent() {
assert listener != null;
assert Mouse.isCreated();
int x = Mouse.getX();
int y = Mouse.getY();
int xDelta = 0;
int yDelta = 0;
int wheelDelta = 0;
MouseMotionEvent evt = new MouseMotionEvent(x, y, xDelta, yDelta,
curWheel, wheelDelta);
evt.setTime(Mouse.getEventNanoseconds());
listener.onMouseMotionEvent(evt);
}
public long getInputTimeNanos() {

Loading…
Cancel
Save