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 makeQOhosOptional(static_cast<::Input_MouseEventAction>(actionValue));
29 }
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 makeQOhosOptional(static_cast<::Input_MouseEventButton>(buttonValue));
43 }
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 makeQOhosOptional(static_cast<::Input_TouchEventAction>(actionValue));
55 }
57}
58
60{
61 switch (actionValue) {
62 case ::KEY_ACTION_CANCEL:
63 case ::KEY_ACTION_DOWN:
64 case ::KEY_ACTION_UP:
65 return makeQOhosOptional(static_cast<::Input_KeyEventAction>(actionValue));
66 }
68}
69
70QOhosOptional<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);
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);
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 makeQOhosOptional(mouseEvent);
109}
110
111QOhosOptional<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);
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 makeQOhosOptional(keyEvent);
140}
141
142QOhosOptional<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);
153 }
154
155 KeyEvent keyEvent = {
156 .jsWindowId = jsWindowId,
157 .actionTime = std::chrono::microseconds(::OH_Input_GetKeyEventActionTime(event)),
158 .action = optMappedAction.value(),
159 .keyCode = ::OH_Input_GetKeyEventKeyCode(event),
160 };
161
162 return makeQOhosOptional(keyEvent);
163}
164
165QInputDevice::DeviceType getTouchDeviceType(const ::ArkUI_UIInputEvent *inputEvent)
166{
167 const auto sourceType = ::OH_ArkUI_UIInputEvent_GetSourceType(inputEvent);
168 if (sourceType == ::UI_INPUT_EVENT_SOURCE_TYPE_UNKNOWN)
169 qOhosWarning(QtForOhos) << "Obtained ArkUI unknown source type for input event";
170 return sourceType == ::UI_INPUT_EVENT_SOURCE_TYPE_TOUCH_SCREEN
171 ? QInputDevice::DeviceType::TouchScreen
172 : QInputDevice::DeviceType::TouchPad;
173}
174
175QPointF getPointerEventLocalPosition(const ::ArkUI_UIInputEvent *event)
176{
177 return QPointF(
178 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetX), event),
179 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetY), event));
180}
181
182QPointF getPointerEventDisplayPosition(const ::ArkUI_UIInputEvent *event)
183{
184 return QPointF(
185 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetDisplayX), event),
186 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetDisplayY), event));
187}
188
189QPointF getPointerEventGlobalPosition(const ::ArkUI_UIInputEvent *event)
190{
191 return QPointF(
192 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetGlobalDisplayX), event),
193 callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_PointerEvent_GetGlobalDisplayY), event));
194}
195
196ch::milliseconds getInputEventTimeMs(const ::ArkUI_UIInputEvent *event)
197{
198 auto eventTime = ch::nanoseconds(callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_UIInputEvent_GetEventTime), event));
199 return ch::duration_cast<ch::milliseconds>(eventTime);
200}
201
202NativeNodeMouseEvent NativeNodeMouseEvent::makeFromUiInputEvent(::ArkUI_UIInputEvent *event)
203{
204 return NativeNodeMouseEvent {
205 .timestampMs = getInputEventTimeMs(event),
206 .localPosition = getPointerEventLocalPosition(event),
207 .displayPosition = getPointerEventDisplayPosition(event),
208 .globalPosition = getPointerEventGlobalPosition(event),
209 .button = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_MouseEvent_GetMouseButton), event),
210 .action = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_MouseEvent_GetMouseAction), event),
211 .modifiers = readKeyModifiersFromOhosUiInputEvent(event),
212 };
213}
214
215NativeNodeHoverEvent NativeNodeHoverEvent::makeFromUiInputEvent(::ArkUI_UIInputEvent *event)
216{
217 return NativeNodeHoverEvent {
218 .isHovered = callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_HoverEvent_IsHovered), event),
219 };
220}
221
222}
223
224QT_END_NAMESPACE
QOhosOptional<::Input_MouseEventButton > tryMapMouseEventButton(std::int32_t buttonValue)
Definition input.cpp:33
QOhosOptional<::Input_KeyEventAction > tryMapKeyEventAction(std::int32_t actionValue)
Definition input.cpp:59
ch::milliseconds getInputEventTimeMs(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:196
QPointF getPointerEventDisplayPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:182
QPointF getPointerEventLocalPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:175
QPointF getPointerEventGlobalPosition(const ::ArkUI_UIInputEvent *event)
Definition input.cpp:189
QOhosOptional<::Input_TouchEventAction > tryMapTouchEventAction(std::int32_t actionValue)
Definition input.cpp:47
QOhosDisplayInfo::JsDisplayId JsDisplayId
Definition input.cpp:16
QInputDevice::DeviceType getTouchDeviceType(const ::ArkUI_UIInputEvent *inputEvent)
Definition input.cpp:165
QOhosOptional<::Input_MouseEventAction > tryMapMouseEventAction(std::int32_t actionValue)
Definition input.cpp:18
std::nullopt_t makeEmptyQOhosOptional()