From 252fa42be30c38c778c79824995243da2a8a565f Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Tue, 30 Apr 2024 00:33:19 +0800 Subject: [PATCH 1/9] Dex touchpad fix: orientation, click, gesture, etc. --- .../termux/x11/input/TouchInputHandler.java | 48 +++++++++++++++---- app/src/main/res/values/arrays.xml | 2 + 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 0da29c634..4ac093a4a 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -63,13 +63,15 @@ public class TouchInputHandler { int TOUCH = 3; } - @IntDef({CapturedPointerTransformation.NONE, CapturedPointerTransformation.CLOCKWISE, CapturedPointerTransformation.COUNTER_CLOCKWISE, CapturedPointerTransformation.UPSIDE_DOWN}) + @IntDef({CapturedPointerTransformation.NONE, CapturedPointerTransformation.CLOCKWISE, CapturedPointerTransformation.UPSIDE_DOWN, CapturedPointerTransformation.COUNTER_CLOCKWISE, CapturedPointerTransformation.AUTO}) @Retention(RetentionPolicy.SOURCE) public @interface CapturedPointerTransformation { + // values correspond to transformation needed given getRotation(), e.g. getRotation() = 1 requires counter-clockwise transformation int NONE = 0; - int CLOCKWISE = 1; - int COUNTER_CLOCKWISE = 2; - int UPSIDE_DOWN = 3; + int CLOCKWISE = 3; + int UPSIDE_DOWN = 2; + int COUNTER_CLOCKWISE = 1; + int AUTO = -1; } private final RenderData mRenderData; @@ -128,8 +130,9 @@ public class TouchInputHandler { * is performing a drag operation. */ private boolean mIsDragging; + private static DisplayManager mDisplayManager; - @CapturedPointerTransformation int capturedPointerTransformation = CapturedPointerTransformation.NONE; + @CapturedPointerTransformation static int capturedPointerTransformation = CapturedPointerTransformation.NONE; private TouchInputHandler(MainActivity activity, RenderData renderData, final InputEventSender injector, boolean isTouchpad) { @@ -252,9 +255,7 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { if (!isDexEvent(event) && (event.getToolType(event.getActionIndex()) == MotionEvent.TOOL_TYPE_MOUSE || (event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) - || (event.getSource() & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE - || (event.getPointerCount() == 1 && mTouchpadHandler == null - && (event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD)) + || (event.getSource() & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE) return mHMListener.onTouch(view, event); if (event.getToolType(event.getActionIndex()) == MotionEvent.TOOL_TYPE_FINGER) { @@ -339,6 +340,10 @@ public void handleHostSizeChanged(int w, int h) { } public void setInputMode(@InputMode int inputMode) { + if (SamsungDexUtils.checkDeXEnabled(mContext)) { + mInputStrategy = new InputStrategyInterface.TrackpadInputStrategy(mInjector); + return; + } if (inputMode == InputMode.TOUCH) mInputStrategy = new InputStrategyInterface.NullInputStrategy(); else if (inputMode == InputMode.SIMULATED_TOUCH) @@ -396,6 +401,9 @@ public void reloadPreferences(Prefs p) { case "ud": capturedPointerTransformation = CapturedPointerTransformation.UPSIDE_DOWN; break; + case "at": + capturedPointerTransformation = CapturedPointerTransformation.AUTO; + break; default: capturedPointerTransformation = CapturedPointerTransformation.NONE; } @@ -490,6 +498,30 @@ private class GestureListener extends GestureDetector.SimpleOnGestureListener public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int pointerCount = e2.getPointerCount(); + // Automatic (for touchpad) mode is needed because touchpads ignore screen orientation and report physical X and Y + if ((e2.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD + && mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { + float temp; + int transform = capturedPointerTransformation; + if (capturedPointerTransformation == CapturedPointerTransformation.AUTO) { + for (Display display : mDisplayManager.getDisplays()) { + if (display.getState() == Display.STATE_ON) { + transform = display.getRotation() % 4; + break; + } + } + } + switch (transform) { + case CapturedPointerTransformation.NONE: + break; + case CapturedPointerTransformation.CLOCKWISE: + temp = distanceX; distanceX = -distanceY; distanceY = temp; break; + case CapturedPointerTransformation.COUNTER_CLOCKWISE: + temp = distanceX; distanceX = distanceY; distanceY = -temp; break; + case CapturedPointerTransformation.UPSIDE_DOWN: + distanceX = -distanceX; distanceY = -distanceY; break; + } + } if (pointerCount >= 3 && !mSwipeCompleted) { // Note that distance values are reversed. For example, dragging a finger in the // direction of increasing Y coordinate (downwards) results in distanceY being diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 54bf05fe5..a10b56ae0 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -15,12 +15,14 @@ Clockwise Counter clockwise Upside down + Automatic (for touchpad) no c cc ud + at native From 66e61f3185303f1d4ee01c76ef23608a6aeb78ff Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Sat, 4 May 2024 18:42:20 +0800 Subject: [PATCH 2/9] DeX hard touchpad (captured): handle physical buttons --- .../termux/x11/input/TouchInputHandler.java | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 4ac093a4a..c1283368c 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -133,6 +133,20 @@ public class TouchInputHandler { private static DisplayManager mDisplayManager; @CapturedPointerTransformation static int capturedPointerTransformation = CapturedPointerTransformation.NONE; + private final int[][] buttons = { + {MotionEvent.BUTTON_PRIMARY, InputStub.BUTTON_LEFT}, + {MotionEvent.BUTTON_TERTIARY, InputStub.BUTTON_MIDDLE}, + {MotionEvent.BUTTON_SECONDARY, InputStub.BUTTON_RIGHT} + }; + private int savedBS = 0; + private int currentBS = 0; + boolean isMouseButtonChanged(int mask) { + return (savedBS & mask) != (currentBS & mask); + } + + boolean mouseButtonDown(int mask) { + return ((currentBS & mask) != 0); + } private TouchInputHandler(MainActivity activity, RenderData renderData, final InputEventSender injector, boolean isTouchpad) { @@ -259,11 +273,11 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { return mHMListener.onTouch(view, event); if (event.getToolType(event.getActionIndex()) == MotionEvent.TOOL_TYPE_FINGER) { - // Dex touchpad sends events as finger, but it should be considered as a mouse. + // Dex touchpad (in non-captured mode) sends events as finger, but it should be considered as a mouse. if (isDexEvent(event) && mDexListener.onTouch(view, event)) return true; - // Regular touchpads and Dex touchpad send events as finger too, + // Regular touchpads and Dex touchpad (in captured mode) send events as finger too, // but they should be handled as touchscreens with trackpad mode. if (mTouchpadHandler != null && (event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) return mTouchpadHandler.handleTouchEvent(view, view, event); @@ -282,7 +296,19 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { mTapDetector.onTouchEvent(event); mSwipePinchDetector.onTouchEvent(event); + switch (event.getActionMasked()) { + case MotionEvent.ACTION_BUTTON_PRESS: + case MotionEvent.ACTION_BUTTON_RELEASE: + // For hardware touchpad in DeX (captured mode), handle physical click buttons + if ((event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) { + currentBS = event.getButtonState(); + for (int[] button: buttons) + if (isMouseButtonChanged(button[0])) + mInjector.sendMouseEvent(null, button[1], mouseButtonDown(button[0]), true); + savedBS = currentBS; + break; + } case MotionEvent.ACTION_DOWN: mSuppressCursorMovement = false; mSwipeCompleted = false; From 2f161f4ddce75cf5ef08ae2df1f4f159b9399abe Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Fri, 10 May 2024 01:24:44 +0800 Subject: [PATCH 3/9] Fix "captured pointer speed" not applied on captured touchpad --- .../main/java/com/termux/x11/input/TouchInputHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index c1283368c..01a00a542 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -524,6 +524,7 @@ private class GestureListener extends GestureDetector.SimpleOnGestureListener public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int pointerCount = e2.getPointerCount(); + // For captured touchpad pointer: // Automatic (for touchpad) mode is needed because touchpads ignore screen orientation and report physical X and Y if ((e2.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD && mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { @@ -547,7 +548,11 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d case CapturedPointerTransformation.UPSIDE_DOWN: distanceX = -distanceX; distanceY = -distanceY; break; } + distanceX *= mInjector.capturedPointerSpeedFactor; + distanceY *= mInjector.capturedPointerSpeedFactor; } + + if (pointerCount >= 3 && !mSwipeCompleted) { // Note that distance values are reversed. For example, dragging a finger in the // direction of increasing Y coordinate (downwards) results in distanceY being @@ -574,9 +579,10 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d if (mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { if (mInjector.scaleTouchpad) { - distanceX *= mRenderData.scale.x; + distanceX *= mRenderData.scale.x ; distanceY *= mRenderData.scale.y; } + moveCursorByOffset(distanceX, distanceY); } if (!(mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) && mIsDragging) { From 0e3d136e10124978e606d4518ba7a79ecb51a62b Mon Sep 17 00:00:00 2001 From: Twaik Yont Date: Thu, 16 May 2024 21:57:05 +0300 Subject: [PATCH 4/9] Cosmetic changes [no ci] --- .../java/com/termux/x11/input/TouchInputHandler.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 01a00a542..3f97eab26 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -63,15 +63,15 @@ public class TouchInputHandler { int TOUCH = 3; } - @IntDef({CapturedPointerTransformation.NONE, CapturedPointerTransformation.CLOCKWISE, CapturedPointerTransformation.UPSIDE_DOWN, CapturedPointerTransformation.COUNTER_CLOCKWISE, CapturedPointerTransformation.AUTO}) + @IntDef({CapturedPointerTransformation.AUTO, CapturedPointerTransformation.NONE, CapturedPointerTransformation.COUNTER_CLOCKWISE, CapturedPointerTransformation.UPSIDE_DOWN, CapturedPointerTransformation.CLOCKWISE}) @Retention(RetentionPolicy.SOURCE) public @interface CapturedPointerTransformation { // values correspond to transformation needed given getRotation(), e.g. getRotation() = 1 requires counter-clockwise transformation + int AUTO = -1; int NONE = 0; - int CLOCKWISE = 3; - int UPSIDE_DOWN = 2; int COUNTER_CLOCKWISE = 1; - int AUTO = -1; + int UPSIDE_DOWN = 2; + int CLOCKWISE = 3; } private final RenderData mRenderData; @@ -296,7 +296,6 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { mTapDetector.onTouchEvent(event); mSwipePinchDetector.onTouchEvent(event); - switch (event.getActionMasked()) { case MotionEvent.ACTION_BUTTON_PRESS: case MotionEvent.ACTION_BUTTON_RELEASE: @@ -579,10 +578,9 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d if (mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { if (mInjector.scaleTouchpad) { - distanceX *= mRenderData.scale.x ; + distanceX *= mRenderData.scale.x; distanceY *= mRenderData.scale.y; } - moveCursorByOffset(distanceX, distanceY); } if (!(mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) && mIsDragging) { From e3ed74325d649b1c9b75da5fcdbd852793a892e5 Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Mon, 1 Jul 2024 10:20:59 +0800 Subject: [PATCH 5/9] some rebase import fixes --- .../main/java/com/termux/x11/input/TouchInputHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 3f97eab26..317238a3d 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -14,10 +14,12 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.PointF; +import android.hardware.display.DisplayManager; import android.hardware.input.InputManager; import android.os.Handler; import android.os.Build; import android.util.DisplayMetrics; +import android.view.Display; import android.view.GestureDetector; import android.view.InputDevice; import android.view.KeyEvent; @@ -156,6 +158,7 @@ private TouchInputHandler(MainActivity activity, RenderData renderData, mRenderData = renderData != null ? renderData :new RenderData(); mInjector = injector; mActivity = activity; + mDisplayManager = (DisplayManager) mActivity.getSystemService(Context.DISPLAY_SERVICE); GestureListener listener = new GestureListener(); mScroller = new GestureDetector(/*desktop*/ activity, listener, null, false); @@ -365,7 +368,7 @@ public void handleHostSizeChanged(int w, int h) { } public void setInputMode(@InputMode int inputMode) { - if (SamsungDexUtils.checkDeXEnabled(mContext)) { + if (SamsungDexUtils.checkDeXEnabled(mActivity)) { mInputStrategy = new InputStrategyInterface.TrackpadInputStrategy(mInjector); return; } From dfbd5e29ad2296b186eecd205a9084d243b27c2a Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Mon, 1 Jul 2024 10:24:51 +0800 Subject: [PATCH 6/9] simplify with mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY) --- .../java/com/termux/x11/input/TouchInputHandler.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 317238a3d..9056cb762 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -531,15 +531,8 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d if ((e2.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD && mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { float temp; - int transform = capturedPointerTransformation; - if (capturedPointerTransformation == CapturedPointerTransformation.AUTO) { - for (Display display : mDisplayManager.getDisplays()) { - if (display.getState() == Display.STATE_ON) { - transform = display.getRotation() % 4; - break; - } - } - } + int transform = capturedPointerTransformation == CapturedPointerTransformation.AUTO ? + mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4 : capturedPointerTransformation; switch (transform) { case CapturedPointerTransformation.NONE: break; From a5a91473a0224f9c8391f970147ddd917affdae1 Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Mon, 1 Jul 2024 11:23:00 +0800 Subject: [PATCH 7/9] frontload mTouchpadHandler and remove mInputStrategy overriding --- .../termux/x11/input/TouchInputHandler.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 9056cb762..57bdb8f0e 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -247,6 +247,13 @@ boolean isDexEvent(MotionEvent event) { } public boolean handleTouchEvent(View view0, View view, MotionEvent event) { + // Regular touchpads and Dex touchpad (in captured mode) send events as finger too, + // but they should be handled as touchscreens with trackpad mode. + if (event.getToolType(event.getActionIndex()) == MotionEvent.TOOL_TYPE_FINGER && + mTouchpadHandler != null && (event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) { + return mTouchpadHandler.handleTouchEvent(view0, view, event); + } + if (view0 != view) { int[] view0Location = new int[2]; int[] viewLocation = new int[2]; @@ -280,11 +287,6 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { if (isDexEvent(event) && mDexListener.onTouch(view, event)) return true; - // Regular touchpads and Dex touchpad (in captured mode) send events as finger too, - // but they should be handled as touchscreens with trackpad mode. - if (mTouchpadHandler != null && (event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) - return mTouchpadHandler.handleTouchEvent(view, view, event); - // Give the underlying input strategy a chance to observe the current motion event before // passing it to the gesture detectors. This allows the input strategy to react to the // event or save the payload for use in recreating the gesture remotely. @@ -368,11 +370,9 @@ public void handleHostSizeChanged(int w, int h) { } public void setInputMode(@InputMode int inputMode) { - if (SamsungDexUtils.checkDeXEnabled(mActivity)) { + if (mTouchpadHandler == null) mInputStrategy = new InputStrategyInterface.TrackpadInputStrategy(mInjector); - return; - } - if (inputMode == InputMode.TOUCH) + else if (inputMode == InputMode.TOUCH) mInputStrategy = new InputStrategyInterface.NullInputStrategy(); else if (inputMode == InputMode.SIMULATED_TOUCH) mInputStrategy = new InputStrategyInterface.SimulatedTouchInputStrategy(mRenderData, mInjector, mActivity); From f200a51b013dc3096bcd5eb41f9b3cd4d47cf24e Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Mon, 1 Jul 2024 11:27:48 +0800 Subject: [PATCH 8/9] move code block for physical touchpad click out of switch statement --- .../termux/x11/input/TouchInputHandler.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 57bdb8f0e..ba6914c61 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -301,18 +301,15 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { mTapDetector.onTouchEvent(event); mSwipePinchDetector.onTouchEvent(event); + // For hardware touchpad in DeX (captured mode), handle physical click buttons + if ((event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) { + currentBS = event.getButtonState(); + for (int[] button: buttons) + if (isMouseButtonChanged(button[0])) + mInjector.sendMouseEvent(null, button[1], mouseButtonDown(button[0]), true); + savedBS = currentBS; + } switch (event.getActionMasked()) { - case MotionEvent.ACTION_BUTTON_PRESS: - case MotionEvent.ACTION_BUTTON_RELEASE: - // For hardware touchpad in DeX (captured mode), handle physical click buttons - if ((event.getSource() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) { - currentBS = event.getButtonState(); - for (int[] button: buttons) - if (isMouseButtonChanged(button[0])) - mInjector.sendMouseEvent(null, button[1], mouseButtonDown(button[0]), true); - savedBS = currentBS; - break; - } case MotionEvent.ACTION_DOWN: mSuppressCursorMovement = false; mSwipeCompleted = false; From d8842a53005ed1d9c43e7d841c7144d954e7120b Mon Sep 17 00:00:00 2001 From: Ronald Y Date: Mon, 1 Jul 2024 13:50:58 +0800 Subject: [PATCH 9/9] update rotation with DisplayManager#registerDisplayListener() --- .../termux/x11/input/TouchInputHandler.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index ba6914c61..3b9b6c517 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -133,6 +133,23 @@ public class TouchInputHandler { */ private boolean mIsDragging; private static DisplayManager mDisplayManager; + private static int mDisplayRotation; + private static final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + mDisplayRotation = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4; + } + + @Override + public void onDisplayRemoved(int displayId) { + mDisplayRotation = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4; + } + + @Override + public void onDisplayChanged(int displayId) { + mDisplayRotation = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4; + } + }; @CapturedPointerTransformation static int capturedPointerTransformation = CapturedPointerTransformation.NONE; private final int[][] buttons = { @@ -158,7 +175,11 @@ private TouchInputHandler(MainActivity activity, RenderData renderData, mRenderData = renderData != null ? renderData :new RenderData(); mInjector = injector; mActivity = activity; - mDisplayManager = (DisplayManager) mActivity.getSystemService(Context.DISPLAY_SERVICE); + if (mDisplayManager == null) { + mDisplayManager = (DisplayManager) mActivity.getSystemService(Context.DISPLAY_SERVICE); + mDisplayRotation = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4; + mDisplayManager.registerDisplayListener(mDisplayListener, null); + } GestureListener listener = new GestureListener(); mScroller = new GestureDetector(/*desktop*/ activity, listener, null, false); @@ -529,7 +550,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d && mInputStrategy instanceof InputStrategyInterface.TrackpadInputStrategy) { float temp; int transform = capturedPointerTransformation == CapturedPointerTransformation.AUTO ? - mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getRotation() % 4 : capturedPointerTransformation; + mDisplayRotation : capturedPointerTransformation; switch (transform) { case CapturedPointerTransformation.NONE: break;