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 topTarget = webEvent.call<emscripten::val>(
"composedPath")[0];
111 return element == topTarget;
116 const auto code = event[
"code"].as<
std::string>();
117 const auto webKey = event[
"key"].as<
std::string>();
118 deadKey = isDeadKeyEvent(webKey.c_str());
120 modifiers = getKeyboardModifiers(event);
121 key = webKeyToQtKey(code, webKey, deadKey, modifiers);
123 keyCode = event[
"keyCode"].as<
int>();
125 text = QString::fromUtf8(webKey);
131 if ((modifiers & Qt::AltModifier) && (modifiers & Qt::KeypadModifier))
137 if (key == Qt::Key_Tab)
143 mouseButton = MouseEvent::buttonFromWeb(event[
"button"].as<
int>());
144 mouseButtons = MouseEvent::buttonsFromWeb(event[
"buttons"].as<
unsigned short>());
149 if (type == EventType::PointerDown)
150 mouseButtons |= mouseButton;
151 localPoint = QPointF(event[
"offsetX"].as<qreal>(), event[
"offsetY"].as<qreal>());
152 pointInPage = QPointF(event[
"pageX"].as<qreal>(), event[
"pageY"].as<qreal>());
153 pointInViewport = QPointF(event[
"clientX"].as<qreal>(), event[
"clientY"].as<qreal>());
154 modifiers = getKeyboardModifiers(event);
159 pointerId = event[
"pointerId"].as<
int>();
160 pointerType = ([type = event[
"pointerType"].as<std::string>()]() {
169 width = event[
"width"].as<qreal>();
170 height = event[
"height"].as<qreal>();
171 pressure = event[
"pressure"].as<qreal>();
172 tiltX = event[
"tiltX"].as<qreal>();
173 tiltY = event[
"tiltY"].as<qreal>();
174 tangentialPressure = event[
"tangentialPressure"].as<qreal>();
175 twist = event[
"twist"].as<qreal>();
176 isPrimary = event[
"isPrimary"].as<
bool>();
182 dropAction = ([event]() {
183 const std::string effect = event[
"dataTransfer"][
"dropEffect"].as<std::string>();
185 if (effect ==
"copy")
186 return Qt::CopyAction;
187 else if (effect ==
"move")
188 return Qt::MoveAction;
189 else if (effect ==
"link")
190 return Qt::LinkAction;
191 return Qt::IgnoreAction;
197 Q_ASSERT_X(type == EventType::DragStart, Q_FUNC_INFO,
"Only supported for DragStart");
198 webEvent.call<
void>(
"preventDefault");
203 Q_ASSERT_X(type == EventType::DragOver, Q_FUNC_INFO,
"Only supported for DragOver");
204 webEvent.call<
void>(
"preventDefault");
209 Q_ASSERT_X(type == EventType::Drop, Q_FUNC_INFO,
"Only supported for Drop");
210 webEvent.call<
void>(
"preventDefault");
216 const int deltaMode = event[
"deltaMode"].as<
int>();
217 const auto jsWheelEventType = emscripten::val::global(
"WheelEvent");
218 if (deltaMode == jsWheelEventType[
"DOM_DELTA_PIXEL"].as<
int>())
220 else if (deltaMode == jsWheelEventType[
"DOM_DELTA_LINE"].as<
int>())
225 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