Warning, /graphics/krita/3rdparty/ext_qt/0031-Android-Properly-handle-Tablet-events.patch is written in an unsupported language. File is not indexed.

0001 From 13460c6461f39e49a8abe020a034aaae8d4d657d Mon Sep 17 00:00:00 2001
0002 From: Sharaf Zaman <sharafzaz121@gmail.com>
0003 Date: Thu, 10 Sep 2020 10:46:57 +0000
0004 Subject: [PATCH] Android: Properly handle Tablet events
0005 
0006 Prior to this Hover events from stylus/tablet were treated as Mouse
0007 events and primary and secondary stylus buttons weren't handled either.
0008 This commit also passes batched tablet events to Qt.
0009 
0010 This commit also extracts the batched events from MotionEvent and passes
0011 them down for Qt to handle.
0012 ---
0013  .../org/qtproject/qt5/android/QtNative.java   | 67 +++++++++++++++----
0014  .../platforms/android/androidjniinput.cpp     | 15 +++--
0015  2 files changed, 64 insertions(+), 18 deletions(-)
0016 
0017 diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0018 index d76b7c9008..baa75479eb 100644
0019 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0020 +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0021 @@ -652,7 +652,7 @@ public class QtNative
0022      }
0023      //@ANDROID-9
0024  
0025 -    static public void sendTouchEvent(MotionEvent event, int id)
0026 +    static public boolean sendTouchEvent(MotionEvent event, int id)
0027      {
0028          int pointerType = 0;
0029  
0030 @@ -669,30 +669,64 @@ public class QtNative
0031          }
0032  
0033          if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
0034 -            sendMouseEvent(event, id);
0035 +            return sendMouseEvent(event, id);
0036          } else if (m_tabletEventSupported && pointerType != 0) {
0037 +            final int historySize = event.getHistorySize();
0038 +            for (int h = 0; h < historySize; h++) {
0039 +                float tiltRot = event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, h);
0040 +                float orientation = event.getHistoricalAxisValue(MotionEvent.AXIS_ORIENTATION, h);
0041 +
0042 +                float tiltX = (float) Math.toDegrees(-Math.sin(orientation) * tiltRot);
0043 +                float tiltY = (float) Math.toDegrees(Math.cos(orientation) * tiltRot);
0044 +
0045 +                tabletEvent(id, event.getDeviceId(), event.getHistoricalEventTime(h), event.getActionMasked(),
0046 +                            pointerType, event.getButtonState(), event.getHistoricalX(h),
0047 +                            event.getHistoricalY(h), event.getHistoricalPressure(h), tiltX, tiltY,
0048 +                            (float)Math.toDegrees(orientation), event.getMetaState());
0049 +            }
0050              float tiltRot = event.getAxisValue(MotionEvent.AXIS_TILT);
0051              float orientation = event.getAxisValue(MotionEvent.AXIS_ORIENTATION);
0052              float tiltX = (float) Math.toDegrees(-Math.sin(orientation) * tiltRot);
0053              float tiltY = (float) Math.toDegrees(Math.cos(orientation) * tiltRot);
0054 -            tabletEvent(id, event.getDeviceId(), event.getEventTime(), event.getAction(), pointerType,
0055 +            tabletEvent(id, event.getDeviceId(), event.getEventTime(), event.getActionMasked(), pointerType,
0056                  event.getButtonState(), event.getX(), event.getY(), event.getPressure(), tiltX, tiltY,
0057                  (float) Math.toDegrees(orientation), event.getMetaState());
0058 +            return true;
0059          } else {
0060 +            final int historySize = event.getHistorySize();
0061              touchBegin(id);
0062 -            for (int i = 0; i < event.getPointerCount(); ++i) {
0063 +            // batched ones
0064 +            for (int h = 0; h < historySize; h++) {
0065 +                touchBegin(id);
0066 +                for (int i = 0; i < event.getPointerCount(); ++i) {
0067                      touchAdd(id,
0068                               event.getPointerId(i),
0069                               getAction(i, event),
0070                               i == 0,
0071 -                             (int)event.getX(i),
0072 -                             (int)event.getY(i),
0073 -                             event.getTouchMajor(i),
0074 -                             event.getTouchMinor(i),
0075 -                             event.getOrientation(i),
0076 -                             event.getPressure(i));
0077 +                             (int)event.getHistoricalX(i, h),
0078 +                             (int)event.getHistoricalY(i, h),
0079 +                             event.getHistoricalTouchMajor(i, h),
0080 +                             event.getHistoricalTouchMinor(i, h),
0081 +                             event.getHistoricalOrientation(i, h),
0082 +                             event.getHistoricalPressure(i, h));
0083 +                }
0084 +                touchEnd(id, event.getAction());
0085 +            }
0086 +            touchBegin(id);
0087 +            for (int i = 0; i < event.getPointerCount(); ++i) {
0088 +                touchAdd(id,
0089 +                        event.getPointerId(i),
0090 +                        getAction(i, event),
0091 +                        i == 0,
0092 +                        (int)event.getX(i),
0093 +                        (int)event.getY(i),
0094 +                        event.getTouchMajor(i),
0095 +                        event.getTouchMinor(i),
0096 +                        event.getOrientation(i),
0097 +                        event.getPressure(i));
0098              }
0099              touchEnd(id, event.getAction());
0100 +            return true;
0101          }
0102      }
0103  
0104 @@ -703,12 +737,19 @@ public class QtNative
0105  
0106      static public boolean sendGenericMotionEvent(MotionEvent event, int id)
0107      {
0108 -        if (((event.getAction() & (MotionEvent.ACTION_SCROLL | MotionEvent.ACTION_HOVER_MOVE)) == 0)
0109 -                || (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != InputDevice.SOURCE_CLASS_POINTER) {
0110 +        if (!event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
0111              return false;
0112          }
0113  
0114 -        return sendMouseEvent(event, id);
0115 +        if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
0116 +                return sendMouseEvent(event, id);
0117 +        } else if ((event.getSource() & (InputDevice.SOURCE_STYLUS |
0118 +                                         InputDevice.SOURCE_TOUCHPAD |
0119 +                                         InputDevice.SOURCE_TOUCHSCREEN)) != 0) {
0120 +
0121 +            return sendTouchEvent(event, id);
0122 +        }
0123 +        return false;
0124      }
0125  
0126      static public boolean sendMouseEvent(MotionEvent event, int id)
0127 diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp
0128 index 870b22e15e..fec394f95e 100644
0129 --- a/src/plugins/platforms/android/androidjniinput.cpp
0130 +++ b/src/plugins/platforms/android/androidjniinput.cpp
0131 @@ -380,14 +380,19 @@ namespace QtAndroidInput
0132          // when action == ACTION_UP (1) it's a release; otherwise we say which button is pressed
0133          Qt::MouseButtons buttons = Qt::NoButton;
0134          switch (action) {
0135 -        case 1:     // ACTION_UP
0136 -        case 212:   // stylus release while side-button held on Galaxy Note 4
0137 +        case AMOTION_EVENT_ACTION_UP:
0138              buttons = Qt::NoButton;
0139              break;
0140 -        default:    // action is press or drag
0141 -            if (buttonState == 0)
0142 +        case AMOTION_EVENT_ACTION_MOVE:
0143 +        case AMOTION_EVENT_ACTION_DOWN:
0144 +            if (!buttonState)
0145                  buttons = Qt::LeftButton;
0146 -            else // 2 means RightButton
0147 +        default:
0148 +            if (buttonState == AMOTION_EVENT_BUTTON_STYLUS_PRIMARY)
0149 +                buttons = Qt::MiddleButton;
0150 +            else if (buttonState == AMOTION_EVENT_BUTTON_STYLUS_SECONDARY)
0151 +                buttons = Qt::RightButton;
0152 +            else if (buttonState)
0153                  buttons = Qt::MouseButtons(buttonState);
0154              break;
0155          }
0156 -- 
0157 2.34.1
0158