27 : m_container(containerOrCanvas),
28 m_intermediateContainer(emscripten::val::undefined()),
29 m_shadowContainer(emscripten::val::undefined()),
30 m_compositor(
new QWasmCompositor(
this))
32 auto document = m_container[
"ownerDocument"];
37 m_intermediateContainer = document.call<emscripten::val>(
"createElement", emscripten::val(
"div"));
38 m_intermediateContainer.set(
"id", std::string(
"qt-shadow-container"));
39 emscripten::val intermediateContainerStyle = m_intermediateContainer[
"style"];
40 intermediateContainerStyle.set(
"width", std::string(
"100%"));
41 intermediateContainerStyle.set(
"height", std::string(
"100%"));
42 m_container.call<
void>(
"appendChild", m_intermediateContainer);
46 if (m_container[
"tagName"].call<std::string>(
"toLowerCase") ==
"canvas")
47 qFatal() <<
"Qt does not support using a canvas element as the container element. Use a div element instead";
49 auto shadowOptions = emscripten::val::object();
50 shadowOptions.set(
"mode",
"open");
51 auto shadow = m_intermediateContainer.call<emscripten::val>(
"attachShadow", shadowOptions);
53 m_shadowContainer = document.call<emscripten::val>(
"createElement", emscripten::val(
"div"));
55 shadow.call<
void>(
"appendChild",
QWasmCSSStyle::createStyleElement(m_shadowContainer));
57 shadow.call<
void>(
"appendChild", m_shadowContainer);
59 m_shadowContainer.set(
"id", std::string(
"qt-screen-") + std::to_string(uintptr_t(
this)));
61 m_shadowContainer[
"classList"].call<
void>(
"add", std::string(
"qt-screen"));
65 m_onContextMenu = std::make_unique<qstdweb::EventCallback>(
66 m_shadowContainer,
"contextmenu",
67 [](emscripten::val event) { event.call<
void>(
"preventDefault"); });
71 emscripten::val::module_property(
"specialHTMLTargets")
72 .set(outerScreenId().toStdString(), m_container);
76 m_shadowContainer.call<
void>(
"focus");
78 m_touchDevice = std::make_unique<QPointingDevice>(
79 "touchscreen", 1, QInputDevice::DeviceType::TouchScreen,
80 QPointingDevice::PointerType::Finger,
81 QPointingDevice::Capability::Position | QPointingDevice::Capability::Area
82 | QPointingDevice::Capability::NormalizedPosition,
84 m_tabletDevice = std::make_unique<QPointingDevice>(
85 "stylus", 2, QInputDevice::DeviceType::Stylus,
86 QPointingDevice::PointerType::Pen,
87 QPointingDevice::Capability::Position | QPointingDevice::Capability::Pressure
88 | QPointingDevice::Capability::NormalizedPosition
89 | QInputDevice::Capability::MouseEmulation
90 | QInputDevice::Capability::Hover | QInputDevice::Capability::Rotation
91 | QInputDevice::Capability::XTilt | QInputDevice::Capability::YTilt
92 | QInputDevice::Capability::TangentialPressure,
95 QWindowSystemInterface::registerInputDevice(m_touchDevice.get());
243 emscripten_get_element_css_size(outerScreenId().toUtf8().constData(), &css_width, &css_height);
244 QSizeF cssSize(css_width, css_height);
246 if (cssSize.isNull())
250 auto getElementBodyPosition = [](
const emscripten::val &element) ->
QPoint {
252 element[
"ownerDocument"][
"body"].call<emscripten::val>(
"getBoundingClientRect");
253 emscripten::val canvasRect = element.call<emscripten::val>(
"getBoundingClientRect");
254 return QPoint(canvasRect[
"left"].as<
int>() - bodyRect[
"left"].as<
int>(),
255 canvasRect[
"top"].as<
int>() - bodyRect[
"top"].as<
int>());
258 setGeometry(QRect(getElementBodyPosition(m_shadowContainer), cssSize.toSize()));
285 QList<QWasmWindow *> currentChildren;
286 QList<QWasmWindow *> result;
288 for (
auto *w : childStack())
289 currentChildren << w;
291 while (!currentChildren.empty()) {
292 result << currentChildren;
294 QList<QWasmWindow *> toIterate;
295 currentChildren.swap(toIterate);
297 for (
auto child : toIterate) {
298 for (
auto *w : child->childStack())
299 currentChildren << w;