9#include <QtCore/private/qmakearray_p.h>
10#include <QtCore/private/qstringiterator_p.h>
11#include <QtCore/qregularexpression.h>
20 return qstrncmp(key, WebDeadKeyValue.data(), WebDeadKeyValue.size()) == 0;
25 if (
auto mapping = QWasmKeyTranslator::mapWebKeyTextToQtKey(code.c_str()))
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);
32 if (!match.hasMatch())
33 return Qt::Key_unknown;
35 constexpr size_t CharacterIndex = 1;
36 return static_cast<Qt::Key>(match.capturedView(CharacterIndex).at(0).toLatin1());
40 QFlags<Qt::KeyboardModifier> modifiers)
43 auto mapped = getKeyFromCode(code);
46 return Qt::Key_Dead_Diaeresis;
48 return Qt::Key_Dead_Acute;
50 return Qt::Key_Dead_Circumflex;
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;
56 return Qt::Key_Dead_Circumflex;
57 case Qt::Key_Apostrophe:
58 return modifiers.testFlag(Qt::ShiftModifier) ? Qt::Key_Dead_Diaeresis
60 case Qt::Key_AsciiTilde:
61 return Qt::Key_Dead_Tilde;
63 return Qt::Key_unknown;
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;
72 QString str = QString::fromUtf8(key.c_str()).toUpper();
74 return Qt::Key_unknown;
76 QStringIterator i(str);
77 return static_cast<Qt::Key>(i.next(0));
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;
111 emscripten::val topTarget = webEvent.call<emscripten::val>(
"composedPath")[0];
112 return element == topTarget;
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 keyCode = event[
"keyCode"].as<
int>();
126 text = QString::fromUtf8(webKey);
132 if ((modifiers & Qt::AltModifier) && (modifiers & Qt::KeypadModifier))
138 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>());
Combined button and popup list for selecting options.
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 isTargetedForElement(emscripten::val element) const
Event(EventType type, emscripten::val webEvent)
KeyEvent(EventType type, emscripten::val webEvent)
MouseEvent(EventType type, emscripten::val webEvent)
PointerEvent(EventType type, emscripten::val webEvent)
WheelEvent(EventType type, emscripten::val webEvent)
bool webkitDirectionInvertedFromDevice