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
qohoskeymodifiers.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 <QtCore/private/qohoscommon_p.h>
5#include <array>
6#include <cstdint>
7#include <qarkui/qarkuiutils.h>
8#include <qohoskeymodifiers.h>
9#include <qohosplugincore.h>
10
12
13namespace {
14
16{
17std::uint64_t keys;
18 QArkUi::callArkUiOrFailOnErrorResult(
19 Q_OHOS_NAMED_FUNC(::OH_ArkUI_UIInputEvent_GetModifierKeyStates),
20 uiInputEvent, &keys);
21 return makeQOhosOptional(keys);
22}
23
25{
26 static const std::pair<std::uint64_t, OhosKeyboardModifier> arkUiToQtModifiersMap[] = {
27 {::ArkUI_ModifierKeyName::ARKUI_MODIFIER_KEY_CTRL, OhosKeyboardModifier::CTRL},
28 {::ArkUI_ModifierKeyName::ARKUI_MODIFIER_KEY_SHIFT, OhosKeyboardModifier::SHIFT},
29 {::ArkUI_ModifierKeyName::ARKUI_MODIFIER_KEY_ALT, OhosKeyboardModifier::ALT},
30 };
31
32 QFlags<OhosKeyboardModifier> modifiers;
33 for (const auto &arkUiToQtModifier : arkUiToQtModifiersMap)
34 modifiers.setFlag(arkUiToQtModifier.second, (modifierKeyStates & arkUiToQtModifier.first) != 0);
35
36 return modifiers;
37}
38
40{
41 constexpr int ohosKeyboardModifierCount = 3;
42 static const std::array<OhosKeyToModifier, ohosKeyboardModifierCount> keysToStandardModifiers = {{
43 {
44 OhosKeyboardModifier::CTRL,
45 {::Input_KeyCode::KEYCODE_CTRL_LEFT, ::Input_KeyCode::KEYCODE_CTRL_RIGHT},
46 &::OH_Input_GetKeyPressed,
47 ::Input_KeyStateAction::KEY_PRESSED
48 },
49 {
50 OhosKeyboardModifier::ALT,
51 {::Input_KeyCode::KEYCODE_ALT_LEFT, ::Input_KeyCode::KEYCODE_ALT_RIGHT},
52 &::OH_Input_GetKeyPressed,
53 ::Input_KeyStateAction::KEY_PRESSED
54 },
55 {
56 OhosKeyboardModifier::SHIFT,
57 {::Input_KeyCode::KEYCODE_SHIFT_LEFT, ::Input_KeyCode::KEYCODE_SHIFT_RIGHT},
58 &::OH_Input_GetKeyPressed,
59 ::Input_KeyStateAction::KEY_PRESSED
60 },
61 }};
62
63 return readKeyModifiersFromKeyState(
64 QSpan(keysToStandardModifiers.data(), keysToStandardModifiers.size()));
65}
66
67QFlags<OhosKeyboardModifier> readKeyStandardModifiers(::ArkUI_UIInputEvent *uiInputEvent)
68{
69 const auto uiInputEventModifierKeyStats = tryGetUiInputEventModifierKeyStates(uiInputEvent);
70 return uiInputEventModifierKeyStats.hasValue()
71 ? mapArkUiModifierKeyStatesToOhosKeyboardModifiers(uiInputEventModifierKeyStats.value())
72 : readKeyStandardModifiersFromKeyState();
73}
74
76{
77 constexpr int ohosKeyboardModifierCount = 3;
78 static const std::array<OhosKeyToModifier, ohosKeyboardModifierCount> keysToExtendedModifiers = {{
79 {
80 OhosKeyboardModifier::LOGO,
81 {::Input_KeyCode::KEYCODE_META_LEFT, ::Input_KeyCode::KEYCODE_META_RIGHT},
82 &::OH_Input_GetKeyPressed,
83 ::Input_KeyStateAction::KEY_PRESSED
84 },
85 {
86 OhosKeyboardModifier::CAPS_LOCK,
87 {::Input_KeyCode::KEYCODE_CAPS_LOCK},
88 &::OH_Input_GetKeySwitch,
89 ::Input_KeyStateAction::KEY_SWITCH_ON
90 },
91 {
92 OhosKeyboardModifier::NUM_LOCK,
93 {::Input_KeyCode::KEYCODE_NUM_LOCK},
94 &::OH_Input_GetKeySwitch,
95 ::Input_KeyStateAction::KEY_SWITCH_ON
96 },
97 }};
98
99 return readKeyModifiersFromKeyState(
100 QSpan(keysToExtendedModifiers.data(), keysToExtendedModifiers.size()));
101}
102
103}
104
105QFlags<OhosKeyboardModifier> readKeyModifiersFromKeyState(QSpan<const OhosKeyToModifier> keysToModifiers)
106{
107 auto keyStatusDeleter = [](::Input_KeyState *ptr) { ::OH_Input_DestroyKeyState(&ptr); };
108 std::unique_ptr<::Input_KeyState, decltype(keyStatusDeleter)> keyState(::OH_Input_CreateKeyState(), keyStatusDeleter);
109 if (keyState == nullptr) {
110 qOhosReportFatalErrorAndAbort(
111 "Acquisition of Input_KeyState object failed. Cannot read modifiers keys state.");
112 }
113
114 QFlags<OhosKeyboardModifier> keyModifiers = {};
115 for (const auto &entry : keysToModifiers) {
116 keyModifiers.setFlag(
117 entry.modifier,
118 std::any_of(
119 entry.keysToCheck.begin(), entry.keysToCheck.end(),
120 [&](::Input_KeyCode keyCode) {
121 ::OH_Input_SetKeyCode(keyState.get(), keyCode);
122 if (::OH_Input_GetKeyState(keyState.get()) != ::INPUT_SUCCESS) {
123 qOhosWarning(QtForOhos) << "Cannot get key state for key: " << keyCode;
124 return false;
125 }
126 return entry.getKeyStateActionFunc(keyState.get()) == entry.keyStateActionKeyActive;
127 }));
128 }
129
130 return keyModifiers;
131}
132
134{
135 return readKeyStandardModifiers(uiInputEvent) | readKeyExtendedModifiers();
136}
137
138Qt::KeyboardModifiers convertOhosToQtKeyboardModifiers(QFlags<OhosKeyboardModifier> ohosKeysModifiers)
139{
140 Qt::KeyboardModifiers keyboardModifiers = Qt::NoModifier;
141 keyboardModifiers.setFlag(
142 Qt::ShiftModifier, ohosKeysModifiers.testFlag(OhosKeyboardModifier::SHIFT));
143 keyboardModifiers.setFlag(
144 Qt::AltModifier, ohosKeysModifiers.testFlag(OhosKeyboardModifier::ALT));
145 keyboardModifiers.setFlag(
146 Qt::ControlModifier, ohosKeysModifiers.testFlag(OhosKeyboardModifier::CTRL));
147 keyboardModifiers.setFlag(
148 Qt::MetaModifier, ohosKeysModifiers.testFlag(OhosKeyboardModifier::LOGO));
149
150 return keyboardModifiers;
151}
152
153QT_END_NAMESPACE
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
Combined button and popup list for selecting options.
QOhosOptional< std::uint64_t > tryGetUiInputEventModifierKeyStates(::ArkUI_UIInputEvent *uiInputEvent)
QFlags< OhosKeyboardModifier > readKeyStandardModifiers(::ArkUI_UIInputEvent *uiInputEvent)
QFlags< OhosKeyboardModifier > mapArkUiModifierKeyStatesToOhosKeyboardModifiers(std::uint64_t modifierKeyStates)
QFlags< OhosKeyboardModifier > readKeyStandardModifiersFromKeyState()
QFlags< OhosKeyboardModifier > readKeyExtendedModifiers()
Qt::KeyboardModifiers convertOhosToQtKeyboardModifiers(QFlags< OhosKeyboardModifier > ohosKeysModifiers)
QFlags< OhosKeyboardModifier > readKeyModifiersFromKeyState(QSpan< const OhosKeyToModifier > keysToModifiers)
QFlags< OhosKeyboardModifier > readKeyModifiersFromOhosUiInputEvent(::ArkUI_UIInputEvent *uiInputEvent)
OhosKeyboardModifier