|
@@ -75,17 +75,19 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
private int wheelPos;
|
|
|
private Point location;
|
|
|
private Point centerLocation;
|
|
|
- private Point centerLocationOnScreen;
|
|
|
private Point lastKnownLocation;
|
|
|
+ private Point lockPosition;
|
|
|
private boolean isRecentering;
|
|
|
private boolean cursorMoved;
|
|
|
private int eventsSinceRecenter;
|
|
|
+ private volatile int mousePressedX;
|
|
|
+ private volatile int mousePressedY;
|
|
|
|
|
|
public NewtMouseInput() {
|
|
|
location = new Point();
|
|
|
centerLocation = new Point();
|
|
|
- centerLocationOnScreen = new Point();
|
|
|
lastKnownLocation = new Point();
|
|
|
+ lockPosition = new Point();
|
|
|
}
|
|
|
|
|
|
public void setInputSource(GLWindow comp) {
|
|
@@ -102,8 +104,8 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
lastEventWheel = 0;
|
|
|
location = new Point();
|
|
|
centerLocation = new Point();
|
|
|
- centerLocationOnScreen = new Point();
|
|
|
lastKnownLocation = new Point();
|
|
|
+ lockPosition = new Point();
|
|
|
}
|
|
|
|
|
|
component = comp;
|
|
@@ -151,17 +153,14 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
|
|
|
@Override
|
|
|
public void setCursorVisible(boolean visible) {
|
|
|
- lastKnownLocation.setX(0);
|
|
|
- lastKnownLocation.setY(0);
|
|
|
-
|
|
|
this.visible = visible;
|
|
|
component.setPointerVisible(visible);
|
|
|
- component.confinePointer(!visible);
|
|
|
+ lockPosition.set(lastKnownLocation.getX(), lastKnownLocation.getY());
|
|
|
hack_confinePointer();
|
|
|
}
|
|
|
|
|
|
private void hack_confinePointer() {
|
|
|
- if (component.hasFocus() && component.isPointerConfined() && !component.isPointerVisible()) {
|
|
|
+ if (component.hasFocus() && !component.isPointerVisible()) {
|
|
|
recenterMouse(component);
|
|
|
}
|
|
|
}
|
|
@@ -215,7 +214,9 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
|
|
|
@Override
|
|
|
public void mousePressed(MouseEvent newtEvt) {
|
|
|
- MouseButtonEvent evt = new MouseButtonEvent(getJMEButtonIndex(newtEvt), true, newtEvt.getX(), component.getSurfaceHeight() - newtEvt.getY());
|
|
|
+ mousePressedX = newtEvt.getX();
|
|
|
+ mousePressedY = component.getSurfaceHeight() - newtEvt.getY();
|
|
|
+ MouseButtonEvent evt = new MouseButtonEvent(getJMEButtonIndex(newtEvt), true, mousePressedX, mousePressedY);
|
|
|
evt.setTime(newtEvt.getWhen());
|
|
|
synchronized (eventQueue) {
|
|
|
eventQueue.add(evt);
|
|
@@ -261,7 +262,7 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
// MHenze (cylab) Fix Issue 35:
|
|
|
// As long as the MouseInput is in recentering mode, nothing is done until the mouse is entered in the component
|
|
|
// by the events generated by the robot. If this happens, the last known location is resetted.
|
|
|
- if ((centerLocation.getX() == awtEvt.getX() && centerLocation.getY() == awtEvt.getY()) || eventsSinceRecenter++ == 5) {
|
|
|
+ if ((lockPosition.getX() == awtEvt.getX() && lockPosition.getY() == awtEvt.getY()) || eventsSinceRecenter++ == 5) {
|
|
|
lastKnownLocation.setX(awtEvt.getX());
|
|
|
lastKnownLocation.setY(awtEvt.getY());
|
|
|
isRecentering = false;
|
|
@@ -285,12 +286,7 @@ public class NewtMouseInput implements MouseInput, MouseListener {
|
|
|
private void recenterMouse(final GLWindow component) {
|
|
|
eventsSinceRecenter = 0;
|
|
|
isRecentering = true;
|
|
|
- centerLocation.setX(component.getSurfaceWidth() / 2);
|
|
|
- centerLocation.setY(component.getSurfaceHeight() / 2);
|
|
|
- centerLocationOnScreen.setX(centerLocation.getX());
|
|
|
- centerLocationOnScreen.setY(centerLocation.getY());
|
|
|
-
|
|
|
- component.warpPointer(centerLocationOnScreen.getX(), centerLocationOnScreen.getY());
|
|
|
+ component.warpPointer(lockPosition.getX(), lockPosition.getY());
|
|
|
}
|
|
|
|
|
|
private int getJMEButtonIndex(MouseEvent awtEvt) {
|