Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qwasmevent.cpp
Go to the documentation of this file.
1
// Copyright (C) 2022 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
"qwasmevent.h"
6
7
#
include
"qwasmkeytranslator.h"
8
9
#
include
<
QtCore
/
private
/
qmakearray_p
.
h
>
10
#
include
<
QtCore
/
private
/
qstringiterator_p
.
h
>
11
#
include
<
QtCore
/
qregularexpression
.
h
>
12
13
QT_BEGIN_NAMESPACE
14
15
namespace
{
16
constexpr
std
::
string_view
WebDeadKeyValue
=
"Dead"
;
17
18
bool
isDeadKeyEvent
(
const
char
*key)
19
{
20
return
qstrncmp(key, WebDeadKeyValue.data(), WebDeadKeyValue.size()) == 0;
21
}
22
23
Qt
::
Key
getKeyFromCode
(
const
std
::string &code)
24
{
25
if
(
auto
mapping = QWasmKeyTranslator::mapWebKeyTextToQtKey(code.c_str()))
26
return
*mapping;
27
28
static
QRegularExpression regex(QString(QStringLiteral(R"re((?:Key|Digit)(\w))re")));
29
const
auto
codeQString = QString::fromStdString(code);
30
const
auto
match = regex.match(codeQString);
31
32
if
(!match.hasMatch())
33
return
Qt::Key_unknown;
34
35
constexpr
size_t CharacterIndex = 1;
36
return
static_cast
<Qt::Key>(match.capturedView(CharacterIndex).at(0).toLatin1());
37
}
38
39
Qt
::
Key
webKeyToQtKey
(
const
std
::string &code,
const
std
::string &key,
bool
isDeadKey,
40
QFlags<Qt::KeyboardModifier> modifiers)
41
{
42
if
(isDeadKey) {
43
auto
mapped = getKeyFromCode(code);
44
switch
(mapped) {
45
case
Qt::Key_U:
46
return
Qt::Key_Dead_Diaeresis;
47
case
Qt::Key_E:
48
return
Qt::Key_Dead_Acute;
49
case
Qt::Key_I:
50
return
Qt::Key_Dead_Circumflex;
51
case
Qt::Key_N:
52
return
Qt::Key_Dead_Tilde;
53
case
Qt::Key_QuoteLeft:
54
return
modifiers.testFlag(Qt::ShiftModifier) ? Qt::Key_Dead_Tilde : Qt::Key_Dead_Grave;
55
case
Qt::Key_6:
56
return
Qt::Key_Dead_Circumflex;
57
case
Qt::Key_Apostrophe:
58
return
modifiers.testFlag(Qt::ShiftModifier) ? Qt::Key_Dead_Diaeresis
59
: Qt::Key_Dead_Acute;
60
case
Qt::Key_AsciiTilde:
61
return
Qt::Key_Dead_Tilde;
62
default
:
63
return
Qt::Key_unknown;
64
}
65
}
else
if
(
auto
mapping = QWasmKeyTranslator::mapWebKeyTextToQtKey(key.c_str())) {
66
if
(modifiers.testFlag(Qt::ShiftModifier) && (*mapping == Qt::Key::Key_Tab))
67
*mapping = Qt::Key::Key_Backtab;
68
return
*mapping;
69
}
70
71
// cast to unicode key
72
QString str = QString::fromUtf8(key.c_str()).toUpper();
73
if
(str.length() > 1)
74
return
Qt::Key_unknown;
75
76
QStringIterator i(str);
77
return
static_cast
<Qt::Key>(i.next(0));
78
}
79
80
QFlags
<
Qt
::
KeyboardModifier
>
getKeyboardModifiers
(
const
emscripten::val &event)
81
{
82
QFlags<Qt::KeyboardModifier> keyModifier = Qt::NoModifier;
83
if
(event[
"shiftKey"
].as<
bool
>())
84
keyModifier |= Qt::ShiftModifier;
85
if
(event[
"ctrlKey"
].as<
bool
>())
86
keyModifier |= platform() == Platform::MacOS ? Qt::MetaModifier : Qt::ControlModifier;
87
if
(event[
"altKey"
].as<
bool
>())
88
keyModifier |= Qt::AltModifier;
89
if
(event[
"metaKey"
].as<
bool
>())
90
keyModifier |= platform() == Platform::MacOS ? Qt::ControlModifier : Qt::MetaModifier;
91
if
(event[
"constructor"
][
"name"
].as<std::string>() ==
"KeyboardEvent"
&&
92
event[
"location"
].as<
unsigned
int
>() == DOM_KEY_LOCATION_NUMPAD) {
93
keyModifier |= Qt::KeypadModifier;
94
}
95
return
keyModifier;
96
}
97
98
}
// namespace
99
100
Event
::Event(
EventType
type, emscripten::val webEvent)
101
: webEvent(webEvent),
type
(type)
102
{
103
}
104
105
emscripten::val
Event
::composedTarget(emscripten::val webEvent)
106
{
107
return
webEvent.call<emscripten::val>(
"composedPath"
)[0];
108
}
109
110
bool
Event
::isTargetedForElement(emscripten::val element)
const
111
{
112
// Check event target via composedPath, which returns the true path even
113
// if the browser retargets the event for Qt's shadow DOM container. This
114
// is needed to avoid capturing the pointer in cases where foreign html
115
// elements are embedded inside Qt's shadow DOM.
116
return
element == composedTarget(webEvent);
117
}
118
119
KeyEvent
::KeyEvent(
EventType
type, emscripten::val event) :
Event
(type, event)
120
{
121
const
auto
code = event[
"code"
].as<
std
::string>();
122
const
auto
webKey = event[
"key"
].as<
std
::string>();
123
deadKey
= isDeadKeyEvent(webKey.c_str());
124
autoRepeat
= event[
"repeat"
].as<
bool
>();
125
modifiers = getKeyboardModifiers(event);
126
key = webKeyToQtKey(code, webKey, deadKey, modifiers);
127
isComposing
= event[
"isComposing"
].as<
bool
>();
128
keyCode
= event[
"keyCode"
].as<
int
>();
129
130
text = QString::fromUtf8(webKey);
131
132
// Alt + keypad number -> insert utf-8 character
133
// The individual numbers shall not be inserted but
134
// on some platforms they are if numlock is
135
// activated
136
if
((modifiers & Qt::AltModifier) && (modifiers & Qt::KeypadModifier))
137
text.clear();
138
139
if
(text.size() > 1)
140
text.clear();
141
142
if
(key == Qt::Key_Tab)
143
text =
"\t"
;
144
}
145
146
MouseEvent
::MouseEvent(
EventType
type, emscripten::val event) :
Event
(type, event)
147
{
148
mouseButton = MouseEvent::buttonFromWeb(event[
"button"
].as<
int
>());
149
mouseButtons = MouseEvent::buttonsFromWeb(event[
"buttons"
].as<
unsigned
short
>());
150
// The current button state (event.buttons) may be out of sync for some PointerDown
151
// events where the "down" state is very brief, for example taps on Apple trackpads.
152
// Qt expects that the current button state is in sync with the event, so we sync
153
// it up here.
154
if
(type == EventType::PointerDown)
155
mouseButtons |= mouseButton;
156
localPoint = QPointF(event[
"offsetX"
].as<qreal>(), event[
"offsetY"
].as<qreal>());
157
pointInPage = QPointF(event[
"pageX"
].as<qreal>(), event[
"pageY"
].as<qreal>());
158
pointInViewport = QPointF(event[
"clientX"
].as<qreal>(), event[
"clientY"
].as<qreal>());
159
modifiers = getKeyboardModifiers(event);
160
}
161
162
PointerEvent
::PointerEvent(
EventType
type, emscripten::val event) :
MouseEvent
(type, event)
163
{
164
pointerId
= event[
"pointerId"
].as<
int
>();
165
pointerType
= ([type = event[
"pointerType"
].as<std::string>()]() {
166
if
(type ==
"mouse"
)
167
return
PointerType
::
Mouse
;
168
if
(type ==
"touch"
)
169
return
PointerType
::
Touch
;
170
if
(type ==
"pen"
)
171
return
PointerType
::
Pen
;
172
return
PointerType
::
Other
;
173
})();
174
width = event[
"width"
].as<qreal>();
175
height = event[
"height"
].as<qreal>();
176
pressure = event[
"pressure"
].as<qreal>();
177
tiltX = event[
"tiltX"
].as<qreal>();
178
tiltY = event[
"tiltY"
].as<qreal>();
179
tangentialPressure = event[
"tangentialPressure"
].as<qreal>();
180
twist = event[
"twist"
].as<qreal>();
181
isPrimary
= event[
"isPrimary"
].as<
bool
>();
182
}
183
184
DragEvent
::DragEvent(
EventType
type, emscripten::val event, QWindow *window)
185
:
MouseEvent
(type, event), dataTransfer(event[
"dataTransfer"
]),
targetWindow
(window)
186
{
187
dropAction = ([event]() {
188
const
std::string effect = event[
"dataTransfer"
][
"dropEffect"
].as<std::string>();
189
190
if
(effect ==
"copy"
)
191
return
Qt::CopyAction;
192
else
if
(effect ==
"move"
)
193
return
Qt::MoveAction;
194
else
if
(effect ==
"link"
)
195
return
Qt::LinkAction;
196
return
Qt::IgnoreAction;
197
})();
198
}
199
200
void
DragEvent
::
cancelDragStart
()
201
{
202
Q_ASSERT_X(type == EventType::DragStart, Q_FUNC_INFO,
"Only supported for DragStart"
);
203
webEvent.call<
void
>(
"preventDefault"
);
204
}
205
206
void
DragEvent
::
acceptDragOver
()
207
{
208
Q_ASSERT_X(type == EventType::DragOver, Q_FUNC_INFO,
"Only supported for DragOver"
);
209
webEvent.call<
void
>(
"preventDefault"
);
210
}
211
212
void
DragEvent
::
acceptDrop
()
213
{
214
Q_ASSERT_X(type == EventType::Drop, Q_FUNC_INFO,
"Only supported for Drop"
);
215
webEvent.call<
void
>(
"preventDefault"
);
216
}
217
218
WheelEvent
::WheelEvent(
EventType
type, emscripten::val event) :
MouseEvent
(type, event)
219
{
220
deltaMode
= ([event]() {
221
const
int
deltaMode = event[
"deltaMode"
].as<
int
>();
222
const
auto
jsWheelEventType = emscripten::val::global(
"WheelEvent"
);
223
if
(deltaMode == jsWheelEventType[
"DOM_DELTA_PIXEL"
].as<
int
>())
224
return
DeltaMode
::
Pixel
;
225
else
if
(deltaMode == jsWheelEventType[
"DOM_DELTA_LINE"
].as<
int
>())
226
return
DeltaMode
::
Line
;
227
return
DeltaMode
::
Page
;
228
})();
229
230
delta = QPointF(event[
"deltaX"
].as<qreal>(), event[
"deltaY"
].as<qreal>());
231
232
webkitDirectionInvertedFromDevice
= event[
"webkitDirectionInvertedFromDevice"
].as<
bool
>();
233
}
234
235
QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QT_BEGIN_NAMESPACE::getKeyboardModifiers
QFlags< Qt::KeyboardModifier > getKeyboardModifiers(const emscripten::val &event)
Definition
qwasmevent.cpp:80
QT_BEGIN_NAMESPACE::WebDeadKeyValue
constexpr std::string_view WebDeadKeyValue
Definition
qwasmevent.cpp:16
QT_BEGIN_NAMESPACE::isDeadKeyEvent
bool isDeadKeyEvent(const char *key)
Definition
qwasmevent.cpp:18
QT_BEGIN_NAMESPACE::webKeyToQtKey
Qt::Key webKeyToQtKey(const std::string &code, const std::string &key, bool isDeadKey, QFlags< Qt::KeyboardModifier > modifiers)
Definition
qwasmevent.cpp:39
QT_BEGIN_NAMESPACE::getKeyFromCode
Qt::Key getKeyFromCode(const std::string &code)
Definition
qwasmevent.cpp:23
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
DeltaMode
DeltaMode
Definition
qwasmevent.h:53
DeltaMode::Pixel
@ Pixel
Definition
qwasmevent.h:53
DeltaMode::Page
@ Page
Definition
qwasmevent.h:53
DeltaMode::Line
@ Line
Definition
qwasmevent.h:53
PointerType
PointerType
Definition
qwasmevent.h:41
PointerType::Other
@ Other
Definition
qwasmevent.h:45
PointerType::Pen
@ Pen
Definition
qwasmevent.h:44
PointerType::Touch
@ Touch
Definition
qwasmevent.h:43
PointerType::Mouse
@ Mouse
Definition
qwasmevent.h:42
EventType
EventType
Definition
qwasmevent.h:23
DragEvent
Definition
qwasmevent.h:145
DragEvent::acceptDrop
void acceptDrop()
Definition
qwasmevent.cpp:212
DragEvent::acceptDragOver
void acceptDragOver()
Definition
qwasmevent.cpp:206
DragEvent::cancelDragStart
void cancelDragStart()
Definition
qwasmevent.cpp:200
DragEvent::targetWindow
QWindow * targetWindow
Definition
qwasmevent.h:154
Event
Definition
qwasmevent.h:56
Event::type
EventType type
Definition
qwasmevent.h:64
KeyEvent
Definition
qwasmevent.h:69
KeyEvent::deadKey
bool deadKey
Definition
qwasmevent.h:74
KeyEvent::autoRepeat
bool autoRepeat
Definition
qwasmevent.h:76
KeyEvent::keyCode
int keyCode
Definition
qwasmevent.h:78
KeyEvent::isComposing
bool isComposing
Definition
qwasmevent.h:77
MouseEvent
Definition
qwasmevent.h:82
PointerEvent
Definition
qwasmevent.h:129
PointerEvent::pointerType
PointerType pointerType
Definition
qwasmevent.h:132
PointerEvent::isPrimary
bool isPrimary
Definition
qwasmevent.h:141
PointerEvent::pointerId
int pointerId
Definition
qwasmevent.h:133
WheelEvent
Definition
qwasmevent.h:158
WheelEvent::deltaMode
DeltaMode deltaMode
Definition
qwasmevent.h:161
WheelEvent::webkitDirectionInvertedFromDevice
bool webkitDirectionInvertedFromDevice
Definition
qwasmevent.h:162
qtbase
src
plugins
platforms
wasm
qwasmevent.cpp
Generated on
for Qt by
1.18.0