Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
input.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <qarkui/input.h>
5
6#include <qarkui/displaymanager.h>
7#include <qarkui/qarkuiutils.h>
8#include <qohoskeymodifiers.h>
9
10namespace ch = std::chrono;
11
12QT_BEGIN_NAMESPACE
13
14namespace QArkUi {
15
16using JsDisplayId = QOhosDisplayInfo::JsDisplayId;
17
19{
20 switch (actionValue) {
21 case ::MOUSE_ACTION_CANCEL:
22 case ::MOUSE_ACTION_MOVE:
23 case ::MOUSE_ACTION_BUTTON_DOWN:
24 case ::MOUSE_ACTION_BUTTON_UP:
25 case ::MOUSE_ACTION_AXIS_BEGIN:
26 case ::MOUSE_ACTION_AXIS_UPDATE:
27 case ::MOUSE_ACTION_AXIS_END:
28 return static_cast<::Input_MouseEventAction>(actionValue);
29 }
30 return {};
31}
32
34{
35 switch (buttonValue) {
36 case ::MOUSE_BUTTON_NONE:
37 case ::MOUSE_BUTTON_LEFT:
38 case ::MOUSE_BUTTON_MIDDLE:
39 case ::MOUSE_BUTTON_RIGHT:
40 case ::MOUSE_BUTTON_FORWARD:
41 case ::MOUSE_BUTTON_BACK:
42 return static_cast<::Input_MouseEventButton>(buttonValue);
43 }
44 return {};
45}
46
48{
49 switch (actionValue) {
50 case ::TOUCH_ACTION_CANCEL:
51 case ::TOUCH_ACTION_DOWN:
52 case ::TOUCH_ACTION_MOVE:
53 case ::TOUCH_ACTION_UP:
54 return static_cast<::Input_TouchEventAction>(actionValue);
55 }
56 return {};
57}
58
60{
61 switch (actionValue) {
62 case ::KEY_ACTION_CANCEL:
63 case ::KEY_ACTION_DOWN:
64 case ::KEY_ACTION_UP:
65 return static_cast<::Input_KeyEventAction>(actionValue);
66 }
67 return {};
68}
69
70std::optional<MouseEvent> MouseEvent::createFromNativeEvent(const ::Input_MouseEvent *event)
71{
72 auto jsWindowId = JsWindowId(::OH_Input_GetMouseEventWindowId(event));
73
74 auto actionValue = ::OH_Input_GetMouseEventAction(event);
75 auto optMappedAction = tryMapMouseEventAction(actionValue);
76 if (!optMappedAction.has_value()) {
77 qOhosPrintfError(
78 "%s: Filter for jsWindowId: %f, received unrecognized mouse event action: %d, event will be ignored",
79 Q_FUNC_INFO, jsWindowId.value(), actionValue);
80 return {};
81 }
82
83 auto buttonValue = ::OH_Input_GetMouseEventButton(event);
84 auto optMappedButton = tryMapMouseEventButton(buttonValue);
85 if (!optMappedButton.has_value()) {
86 qOhosPrintfError(
87 "%s: Filter for jsWindowId: %f, received unrecognized mouse event action: %d, event will be ignored",
88 Q_FUNC_INFO, jsWindowId.value(), actionValue);
89 return {};
90 }
91
92 auto displayId = QOhosDisplayInfo::JsDisplayId(::OH_Input_GetMouseEventDisplayId(event));
93 auto displayPosition =
94 QPoint(
95 ::OH_Input_GetMouseEventDisplayX(event),
96 ::OH_Input_GetMouseEventDisplayY(event));
97
98 MouseEvent mouseEvent = {
99 .jsWindowId = jsWindowId,
100 .jsDisplayId = displayId,
101 .button = optMappedButton.value(),
102 .action = optMappedAction.value(),
103 .displayPosition = displayPosition,
104 .globalPosition = mapFromDisplayToGlobal(displayPosition, displayId),
105 .actionTime = std::chrono::microseconds(::OH_Input_GetMouseEventActionTime(event)),
106 };
107
108 return mouseEvent;
109}
110
111std::optional<TouchEvent> TouchEvent::createFromNativeEvent(const ::Input_TouchEvent *event)
112{
113 auto jsWindowId = JsWindowId(::OH_Input_GetTouchEventWindowId(event));
114
115 auto actionValue = ::OH_Input_GetTouchEventAction(event);
116 auto optMappedAction = tryMapTouchEventAction(actionValue);
117 if (!optMappedAction.has_value()) {
118 qOhosPrintfError(
119 "%s: Filter for jsWindowId: %f, received unrecognized touch event action: %d, event will be ignored",
120 Q_FUNC_INFO, jsWindowId.value(), actionValue);
121 return {};
122 }
123
124 auto displayId = JsDisplayId(::OH_Input_GetTouchEventDisplayId(event));
125 auto displayPosition = QPoint(
126 ::OH_Input_GetTouchEventDisplayX(event),
127 ::OH_Input_GetTouchEventDisplayY(event));
128
129 TouchEvent keyEvent = {
130 .jsWindowId = jsWindowId,
131 .jsDisplayId = displayId,
132 .displayPosition = displayPosition,
133 .globalPosition = mapFromDisplayToGlobal(displayPosition, displayId),
134 .action = optMappedAction.value(),
135 .fingerId = ::OH_Input_GetTouchEventFingerId(event),
136 .actionTime = std::chrono::microseconds(::OH_Input_GetTouchEventActionTime(event)),
137 };
138
139 return keyEvent;
140}
141
142std::optional<KeyEvent> KeyEvent::createFromNativeEvent(const ::Input_KeyEvent *event)
143{
144 auto jsWindowId = JsWindowId(::OH_Input_GetKeyEventWindowId(event));
145
146 auto actionValue = ::OH_Input_GetKeyEventAction(event);
147 auto optMappedAction = tryMapKeyEventAction(actionValue);
148 if (!optMappedAction.has_value()) {
149 qOhosPrintfError(
150 "%s: Filter for jsWindowId: %f, received unrecognized key event action: %d, event will be ignored",
151 Q_FUNC_INFO, jsWindowId.value(), actionValue);
152 return {};
153 }
154
155 KeyEvent keyEvent = {
156 .jsWindowId = jsWindowId,
157 .jsDisplayId = {},
158 .actionTime = std::chrono::microseconds(::OH_Input_GetKeyEventActionTime(event)),
159 .action = optMappedAction.value(),
160 .keyCode = ::OH_Input_GetKeyEventKeyCode(event),
161 };
162
163 return keyEvent;
164}
165
166QInputDevice::DeviceType getPointingDeviceType(const ::ArkUI_UIInputEvent *inputEvent)
167{
168 const auto sourceType = ::OH_ArkUI_UIInputEvent_GetSourceType(inputEvent);
169 if (sourceType == ::UI_INPUT_EVENT_SOURCE_TYPE_UNKNOWN)
170 qOhosWarning(QtForOhos) << "Obtained ArkUI unknown source type for input event";
171 if (sourceType == ::UI_INPUT_EVENT_SOURCE_TYPE_TOUCH_SCREEN)
172 return QInputDevice::DeviceType::TouchScreen;
173 if (sourceType == ::UI_INPUT_EVENT_SOURCE_TYPE_MOUSE)
174 return QInputDevice::DeviceType::Mouse;
175 return QInputDevice::DeviceType::TouchPad;
176}
177
178QPointF getPointerEventLocalPosition(const ::ArkUI_UIInputEvent *event)
179{
180 return QPointF(
181 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetX), event),
182 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetY), event));
183}
184
185QPointF getPointerEventDisplayPosition(const ::ArkUI_UIInputEvent *event)
186{
187 return QPointF(
188 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetDisplayX), event),
189 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetDisplayY), event));
190}
191
192QPointF getPointerEventGlobalPosition(const ::ArkUI_UIInputEvent *event)
193{
194 return QPointF(
195 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetGlobalDisplayX), event),
196 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetGlobalDisplayY), event));
197}
198
199ch::milliseconds getInputEventTimeMs(const ::ArkUI_UIInputEvent *event)
200{
201 auto eventTime = ch::nanoseconds(callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_UIInputEvent_GetEventTime), event));
202 return ch::duration_cast<ch::milliseconds>(eventTime);
203}
204
205NativeNodeMouseEvent NativeNodeMouseEvent::makeFromUiInputEvent(::ArkUI_UIInputEvent *event)
206{
207 return NativeNodeMouseEvent {
208 .timestampMs = getInputEventTimeMs(event),
209 .localPosition = getPointerEventLocalPosition(event),
210 .displayPosition = getPointerEventDisplayPosition(event),
211 .globalPosition = getPointerEventGlobalPosition(event),
212 .button = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_MouseEvent_GetMouseButton), event),
213 .action = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_MouseEvent_GetMouseAction), event),
214 .modifiers = readKeyModifiersFromOhosUiInputEvent(event),
215 .deviceType = getPointingDeviceType(event),
216 };
217}
218
219NativeNodeHoverEvent NativeNodeHoverEvent::makeFromUiInputEvent(::ArkUI_UIInputEvent *event)
220{
221 return NativeNodeHoverEvent {
222 .isHovered = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_HoverEvent_IsHovered), event),
223 };
224}
225
226}
227
228QT_END_NAMESPACE
QInputDevice::DeviceType getPointingDeviceType(const ::ArkUI_UIInputEvent *inputEvent)
Definition input.cpp:166
std::optional<::Input_MouseEventAction > tryMapMouseEventAction(std::int32_t actionValue)
Definition input.cpp:18
std::optional<::Input_KeyEventAction > tryMapKeyEventAction(std::int32_t actionValue)
Definition input.cpp:59
ch::milliseconds getInputEventTimeMs(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:199
QPointF getPointerEventDisplayPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:185
std::optional<::Input_MouseEventButton > tryMapMouseEventButton(std::int32_t buttonValue)
Definition input.cpp:33
QPointF getPointerEventLocalPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:178
QPointF getPointerEventGlobalPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:192
QOhosDisplayInfo::JsDisplayId JsDisplayId
Definition input.cpp:16
std::optional<::Input_TouchEventAction > tryMapTouchEventAction(std::int32_t actionValue)
Definition input.cpp:47