8#include <QtCore/private/qmakearray_p.h>
9#include <QtCore/private/qstringiterator_p.h>
10#include <QtCore/qregularexpression.h>
19 return qstrncmp(key, WebDeadKeyValue.data(), WebDeadKeyValue.size()) == 0;
24 if (
auto mapping = QWasmKeyTranslator::mapWebKeyTextToQtKey(code.c_str()))
27 static QRegularExpression regex(QString(QStringLiteral(R"re((?:Key|Digit)(\w))re")));
28 const auto codeQString = QString::fromStdString(code);
29 const auto match = regex.match(codeQString);
31 if (!match.hasMatch())
32 return Qt::Key_unknown;
34 constexpr size_t CharacterIndex = 1;
35 return static_cast<Qt::Key>(match.capturedView(CharacterIndex).at(0).toLatin1());
39 QFlags<Qt::KeyboardModifier> modifiers)
42 auto mapped = getKeyFromCode(code);
45 return Qt::Key_Dead_Diaeresis;
47 return Qt::Key_Dead_Acute;
49 return Qt::Key_Dead_Circumflex;
51 return Qt::Key_Dead_Tilde;
52 case Qt::Key_QuoteLeft:
53 return modifiers.testFlag(Qt::ShiftModifier) ? Qt::Key_Dead_Tilde : Qt::Key_Dead_Grave;
55 return Qt::Key_Dead_Circumflex;
56 case Qt::Key_Apostrophe:
57 return modifiers.testFlag(Qt::ShiftModifier) ? Qt::Key_Dead_Diaeresis
59 case Qt::Key_AsciiTilde:
60 return Qt::Key_Dead_Tilde;
62 return Qt::Key_unknown;
64 }
else if (
auto mapping = QWasmKeyTranslator::mapWebKeyTextToQtKey(key.c_str())) {
65 if (modifiers.testFlag(Qt::ShiftModifier) && (*mapping == Qt::Key::Key_Tab))
66 *mapping = Qt::Key::Key_Backtab;
71 QString str = QString::fromUtf8(key.c_str()).toUpper();
73 return Qt::Key_unknown;
75 QStringIterator i(str);
76 return static_cast<Qt::Key>(i.next(0));
81 QFlags<Qt::KeyboardModifier> keyModifier = Qt::NoModifier;
82 if (event[
"shiftKey"].as<
bool>())
83 keyModifier |= Qt::ShiftModifier;
84 if (event[
"ctrlKey"].as<
bool>())
85 keyModifier |= platform() == Platform::MacOS ? Qt::MetaModifier : Qt::ControlModifier;
86 if (event[
"altKey"].as<
bool>())
87 keyModifier |= Qt::AltModifier;
88 if (event[
"metaKey"].as<
bool>())
89 keyModifier |= platform() == Platform::MacOS ? Qt::ControlModifier : Qt::MetaModifier;
90 if (event[
"constructor"][
"name"].as<std::string>() ==
"KeyboardEvent" &&
91 event[
"location"].as<
unsigned int>() == DOM_KEY_LOCATION_NUMPAD) {
92 keyModifier |= Qt::KeypadModifier;
110 emscripten::val path = webEvent.call<emscripten::val>(
"composedPath");
111 QString topElementClassName = QString::fromEcmaString(path[0][
"className"]);
112 return topElementClassName.startsWith(
"qt-");
117 const auto code = event[
"code"].as<
std::string>();
118 const auto webKey = event[
"key"].as<
std::string>();
119 deadKey = isDeadKeyEvent(webKey.c_str());
121 modifiers = getKeyboardModifiers(event);
122 key = webKeyToQtKey(code, webKey, deadKey, modifiers);
124 text = QString::fromUtf8(webKey);
130 if ((modifiers & Qt::AltModifier) && (modifiers & Qt::KeypadModifier))
136 if (key == Qt::Key_Tab)
144 mouseButton = MouseEvent::buttonFromWeb(event[
"button"].as<
int>());
145 mouseButtons = MouseEvent::buttonsFromWeb(event[
"buttons"].as<
unsigned short>());
150 if (type == EventType::PointerDown)
151 mouseButtons |= mouseButton;
152 localPoint = QPointF(event[
"offsetX"].as<qreal>(), event[
"offsetY"].as<qreal>());
153 pointInPage = QPointF(event[
"pageX"].as<qreal>(), event[
"pageY"].as<qreal>());
154 pointInViewport = QPointF(event[
"clientX"].as<qreal>(), event[
"clientY"].as<qreal>());
155 modifiers = getKeyboardModifiers(event);
160 pointerId = event[
"pointerId"].as<
int>();
161 pointerType = ([type = event[
"pointerType"].as<std::string>()]() {
170 width = event[
"width"].as<qreal>();
171 height = event[
"height"].as<qreal>();
172 pressure = event[
"pressure"].as<qreal>();
173 tiltX = event[
"tiltX"].as<qreal>();
174 tiltY = event[
"tiltY"].as<qreal>();
175 tangentialPressure = event[
"tangentialPressure"].as<qreal>();
176 twist = event[
"twist"].as<qreal>();
177 isPrimary = event[
"isPrimary"].as<
bool>();
183 dropAction = ([event]() {
184 const std::string effect = event[
"dataTransfer"][
"dropEffect"].as<std::string>();
186 if (effect ==
"copy")
187 return Qt::CopyAction;
188 else if (effect ==
"move")
189 return Qt::MoveAction;
190 else if (effect ==
"link")
191 return Qt::LinkAction;
192 return Qt::IgnoreAction;
198 Q_ASSERT_X(type == EventType::DragStart, Q_FUNC_INFO,
"Only supported for DragStart");
199 webEvent.call<
void>(
"preventDefault");
204 Q_ASSERT_X(type == EventType::DragOver, Q_FUNC_INFO,
"Only supported for DragOver");
205 webEvent.call<
void>(
"preventDefault");
210 Q_ASSERT_X(type == EventType::Drop, Q_FUNC_INFO,
"Only supported for Drop");
211 webEvent.call<
void>(
"preventDefault");
217 const int deltaMode = event[
"deltaMode"].as<
int>();
218 const auto jsWheelEventType = emscripten::val::global(
"WheelEvent");
219 if (deltaMode == jsWheelEventType[
"DOM_DELTA_PIXEL"].as<
int>())
221 else if (deltaMode == jsWheelEventType[
"DOM_DELTA_LINE"].as<
int>())
226 delta = QPointF(event[
"deltaX"].as<qreal>(), event[
"deltaY"].as<qreal>());
void applyDeadKeyTranslations(KeyEvent *event)
QFlags< Qt::KeyboardModifier > getKeyboardModifiers(const emscripten::val &event)
constexpr std::string_view WebDeadKeyValue
bool isDeadKeyEvent(const char *key)
Qt::Key webKeyToQtKey(const std::string &code, const std::string &key, bool isDeadKey, QFlags< Qt::KeyboardModifier > modifiers)
Qt::Key getKeyFromCode(const std::string &code)
DragEvent(EventType type, emscripten::val webEvent, QWindow *targetQWindow)
bool isTargetedForQtElement() const
Event(EventType type, emscripten::val webEvent)
KeyEvent(EventType type, emscripten::val webEvent, QWasmDeadKeySupport *deadKeySupport)
MouseEvent(EventType type, emscripten::val webEvent)
PointerEvent(EventType type, emscripten::val webEvent)
WheelEvent(EventType type, emscripten::val webEvent)
bool webkitDirectionInvertedFromDevice