1From ada45cc4f5e2ac61992fe10f4d22899971c07793 Mon Sep 17 00:00:00 2001
2From: Sharaf Zaman <sharafzaz121@gmail.com>
3Date: Thu, 10 Sep 2020 10:42:31 +0000
4Subject: [PATCH 4/5] Pass keyboard modifiers for mouse and tablet events
5
6[Android] Pass keyboard modifiers for tablet and mouse events
7
8Change-Id: I79238d8454d8e10303af794625dcc704642f99e5
9---
10 .../org/qtproject/qt5/android/QtNative.java   | 18 ++++++------
11 .../platforms/android/androidjniinput.cpp     | 28 +++++++++++--------
12 2 files changed, 25 insertions(+), 21 deletions(-)
13
14diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
15index ed599a4369..81bdb83a65 100644
16--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
17+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
18@@ -495,7 +495,7 @@ public class QtNative
19             float tiltY = (float) Math.toDegrees(Math.cos(orientation) * tiltRot);
20             tabletEvent(id, event.getDeviceId(), event.getEventTime(), event.getAction(), pointerType,
21                 event.getButtonState(), event.getX(), event.getY(), event.getPressure(), tiltX, tiltY,
22-                (float) Math.toDegrees(orientation));
23+                (float) Math.toDegrees(orientation), event.getMetaState());
24         } else {
25             touchBegin(id);
26             for (int i = 0; i < event.getPointerCount(); ++i) {
27@@ -545,23 +545,23 @@ public class QtNative
28     {
29         switch (event.getActionMasked()) {
30             case MotionEvent.ACTION_UP:
31-                mouseUp(id, (int) event.getX(), (int) event.getY());
32+                mouseUp(id, (int) event.getX(), (int) event.getY(), event.getMetaState());
33                 break;
34
35             case MotionEvent.ACTION_DOWN:
36-                mouseDown(id, (int) event.getX(), (int) event.getY());
37+                mouseDown(id, (int) event.getX(), (int) event.getY(), event.getMetaState());
38                 m_oldx = (int) event.getX();
39                 m_oldy = (int) event.getY();
40                 break;
41             case MotionEvent.ACTION_HOVER_MOVE:
42             case MotionEvent.ACTION_MOVE:
43                 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
44-                    mouseMove(id, (int) event.getX(), (int) event.getY());
45+                    mouseMove(id, (int) event.getX(), (int) event.getY(), event.getMetaState());
46                 } else {
47                     int dx = (int) (event.getX() - m_oldx);
48                     int dy = (int) (event.getY() - m_oldy);
49                     if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
50-                        mouseMove(id, (int) event.getX(), (int) event.getY());
51+                        mouseMove(id, (int) event.getX(), (int) event.getY(), event.getMetaState());
52                         m_oldx = (int) event.getX();
53                         m_oldy = (int) event.getY();
54                     }
55@@ -1043,9 +1043,9 @@ public class QtNative
56     // screen methods
57
58     // pointer methods
59-    public static native void mouseDown(int winId, int x, int y);
60-    public static native void mouseUp(int winId, int x, int y);
61-    public static native void mouseMove(int winId, int x, int y);
62+    public static native void mouseDown(int winId, int x, int y, int modifier);
63+    public static native void mouseUp(int winId, int x, int y, int modifiers);
64+    public static native void mouseMove(int winId, int x, int y, int modifier);
65     public static native void mouseWheel(int winId, int x, int y, float hdelta, float vdelta);
66     public static native void touchBegin(int winId);
67     public static native void touchAdd(int winId, int pointerId, int action, boolean primary, int x, int y, float major, float minor, float rotation, float pressure);
68@@ -1055,7 +1055,7 @@ public class QtNative
69
70     // tablet methods
71     public static native boolean isTabletEventSupported();
72-    public static native void tabletEvent(int winId, int deviceId, long time, int action, int pointerType, int buttonState, float x, float y, float pressure, float tiltX, float tiltY, float rotation);
73+    public static native void tabletEvent(int winId, int deviceId, long time, int action, int pointerType, int buttonState, float x, float y, float pressure, float tiltX, float tiltY, float rotation, int modifiers);
74     // tablet methods
75
76     // keyboard methods
77diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp
78index 864744bf49..deb30e404a 100644
79--- a/src/plugins/platforms/android/androidjniinput.cpp
80+++ b/src/plugins/platforms/android/androidjniinput.cpp
81@@ -59,6 +59,7 @@ using namespace QtAndroid;
82
83 namespace QtAndroidInput
84 {
85+    static Qt::KeyboardModifiers mapAndroidModifiers(jint modifiers);
86     static bool m_ignoreMouseEvents = false;
87     static bool m_softwareKeyboardVisible = false;
88     static QRect m_softwareKeyboardRect;
89@@ -132,7 +133,7 @@ namespace QtAndroidInput
90                                                   anchor.x(), anchor.y(), rtl);
91     }
92
93-    static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y)
94+    static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y, jint modifier)
95     {
96         if (m_ignoreMouseEvents)
97             return;
98@@ -148,10 +149,11 @@ namespace QtAndroidInput
99         QWindowSystemInterface::handleMouseEvent(tlw,
100                                                  localPos,
101                                                  globalPos,
102-                                                 Qt::MouseButtons(Qt::LeftButton));
103+                                                 Qt::MouseButtons(Qt::LeftButton),
104+                                                 mapAndroidModifiers(modifier));
105     }
106
107-    static void mouseUp(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y)
108+    static void mouseUp(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y, jint modifiers)
109     {
110         QPoint globalPos(x,y);
111         QWindow *tlw = m_mouseGrabber.data();
112@@ -164,12 +166,12 @@ namespace QtAndroidInput
113             localPos = platformWindow ? platformWindow->mapFromGlobal(globalPos) : globalPos;
114         }
115         QWindowSystemInterface::handleMouseEvent(tlw, localPos, globalPos
116-                                                , Qt::MouseButtons(Qt::NoButton));
117+                                                , Qt::MouseButtons(Qt::NoButton), mapAndroidModifiers(modifiers));
118         m_ignoreMouseEvents = false;
119         m_mouseGrabber = 0;
120     }
121
122-    static void mouseMove(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y)
123+    static void mouseMove(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y, jint modifier)
124     {
125         if (m_ignoreMouseEvents)
126             return;
127@@ -187,7 +189,8 @@ namespace QtAndroidInput
128         QWindowSystemInterface::handleMouseEvent(tlw,
129                                                  localPos,
130                                                  globalPos,
131-                                                 Qt::MouseButtons(m_mouseGrabber ? Qt::LeftButton : Qt::NoButton));
132+                                                 Qt::MouseButtons(m_mouseGrabber ? Qt::LeftButton : Qt::NoButton),
133+                                                 mapAndroidModifiers(modifier));
134     }
135
136     static void mouseWheel(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y, jfloat hdelta, jfloat vdelta)
137@@ -323,7 +326,8 @@ namespace QtAndroidInput
138     }
139
140     static void tabletEvent(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint deviceId, jlong time, jint action,
141-        jint pointerType, jint buttonState, jfloat x, jfloat y, jfloat pressure, jfloat tiltX, jfloat tiltY, jfloat rotation)
142+        jint pointerType, jint buttonState, jfloat x, jfloat y, jfloat pressure, jfloat tiltX, jfloat tiltY, jfloat rotation,
143+        jint modifiers)
144     {
145 #if QT_CONFIG(tabletevent)
146         QPointF globalPosF(x, y);
147@@ -371,7 +375,7 @@ namespace QtAndroidInput
148
149         QWindowSystemInterface::handleTabletEvent(tlw, ulong(time),
150             localPos, globalPosF, QTabletEvent::Stylus, pointerType,
151-            buttons, pressure, tiltX, tiltY, 0., rotation, 0, deviceId, Qt::NoModifier);
152+            buttons, pressure, tiltX, tiltY, 0., rotation, 0, deviceId, mapAndroidModifiers(modifiers));
153 #endif // QT_CONFIG(tabletevent)
154     }
155
156@@ -870,13 +874,13 @@ namespace QtAndroidInput
157         {"touchBegin","(I)V",(void*)touchBegin},
158         {"touchAdd","(IIIZIIFFFF)V",(void*)touchAdd},
159         {"touchEnd","(II)V",(void*)touchEnd},
160-        {"mouseDown", "(III)V", (void *)mouseDown},
161-        {"mouseUp", "(III)V", (void *)mouseUp},
162-        {"mouseMove", "(III)V", (void *)mouseMove},
163+        {"mouseDown", "(IIII)V", (void *)mouseDown},
164+        {"mouseUp", "(IIII)V", (void *)mouseUp},
165+        {"mouseMove", "(IIII)V", (void *)mouseMove},
166         {"mouseWheel", "(IIIFF)V", (void *)mouseWheel},
167         {"longPress", "(III)V", (void *)longPress},
168         {"isTabletEventSupported", "()Z", (void *)isTabletEventSupported},
169-        {"tabletEvent", "(IIJIIIFFFFFF)V", (void *)tabletEvent},
170+        {"tabletEvent", "(IIJIIIFFFFFFI)V", (void *)tabletEvent},
171         {"keyDown", "(IIIZ)V", (void *)keyDown},
172         {"keyUp", "(IIIZ)V", (void *)keyUp},
173         {"keyboardVisibilityChanged", "(Z)V", (void *)keyboardVisibilityChanged},
174--
1752.28.0
176
177