From 2bf9e7b2055ea4341a50530abb7fb8ed7cacee61 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Fri, 22 Jul 2016 00:47:47 +0200 Subject: [PATCH] Do not send mouse up event after scrolling This fixes an issue where e.g. in tmux, when pressing the finger on an upper pane and dragging it down to scroll and releasing it further down on another pane, the upper pane lost focus to to a mouse click being sent to the pane below. --- .../main/java/com/termux/view/TerminalView.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/termux/view/TerminalView.java b/app/src/main/java/com/termux/view/TerminalView.java index d33f9940..73734f15 100644 --- a/app/src/main/java/com/termux/view/TerminalView.java +++ b/app/src/main/java/com/termux/view/TerminalView.java @@ -80,16 +80,19 @@ public final class TerminalView extends View { super(context, attributes); mGestureRecognizer = new GestureAndScaleRecognizer(context, new GestureAndScaleRecognizer.Listener() { + boolean scrolledWithFinger; + @Override public boolean onUp(MotionEvent e) { mScrollRemainder = 0.0f; - if (mEmulator != null && mEmulator.isMouseTrackingActive() && !mIsSelectingText) { + if (mEmulator != null && mEmulator.isMouseTrackingActive() && !mIsSelectingText && !scrolledWithFinger) { // Quick event processing when mouse tracking is active - do not wait for check of double tapping // for zooming. sendMouseEventCode(e, TerminalEmulator.MOUSE_LEFT_BUTTON, true); sendMouseEventCode(e, TerminalEmulator.MOUSE_LEFT_BUTTON, false); return true; } + scrolledWithFinger = false; return false; } @@ -111,19 +114,20 @@ public final class TerminalView extends View { } @Override - public boolean onScroll(MotionEvent e2, float distanceX, float distanceY) { + public boolean onScroll(MotionEvent e, float distanceX, float distanceY) { if (mEmulator == null || mIsSelectingText) return true; - if (mEmulator.isMouseTrackingActive() && e2.isFromSource(InputDevice.SOURCE_MOUSE)) { + if (mEmulator.isMouseTrackingActive() && e.isFromSource(InputDevice.SOURCE_MOUSE)) { // If moving with mouse pointer while pressing button, report that instead of scroll. // This means that we never report moving with button press-events for touch input, // since we cannot just start sending these events without a starting press event, // which we do not do for touch input, only mouse in onTouchEvent(). - sendMouseEventCode(e2, TerminalEmulator.MOUSE_LEFT_BUTTON_MOVED, true); + sendMouseEventCode(e, TerminalEmulator.MOUSE_LEFT_BUTTON_MOVED, true); } else { + scrolledWithFinger = true; distanceY += mScrollRemainder; int deltaRows = (int) (distanceY / mRenderer.mFontLineSpacing); mScrollRemainder = distanceY - deltaRows * mRenderer.mFontLineSpacing; - doScroll(e2, deltaRows); + doScroll(e, deltaRows); } return true; }