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