diff options
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmscreen.cpp')
-rw-r--r-- | src/plugins/platforms/wasm/qwasmscreen.cpp | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/src/plugins/platforms/wasm/qwasmscreen.cpp b/src/plugins/platforms/wasm/qwasmscreen.cpp index fb14803ff8..a26cafa900 100644 --- a/src/plugins/platforms/wasm/qwasmscreen.cpp +++ b/src/plugins/platforms/wasm/qwasmscreen.cpp @@ -29,8 +29,10 @@ #include "qwasmscreen.h" #include "qwasmwindow.h" +#include "qwasmeventtranslator.h" #include "qwasmcompositor.h" #include <emscripten/bind.h> +#include <emscripten/val.h> #include <QtEglSupport/private/qeglconvenience_p.h> #ifndef QT_NO_OPENGL @@ -44,12 +46,13 @@ QT_BEGIN_NAMESPACE -QWasmScreen::QWasmScreen(QWasmCompositor *compositor) - : m_compositor(compositor) - , m_depth(32) - , m_format(QImage::Format_RGB32) +QWasmScreen::QWasmScreen(const QString &canvasId) + : m_canvasId(canvasId) + { - m_compositor->setScreen(this); + m_compositor = new QWasmCompositor(this); + m_eventTranslator = new QWasmEventTranslator(this); + updateQScreenAndCanvasRenderSize(); } QWasmScreen::~QWasmScreen() @@ -57,6 +60,31 @@ QWasmScreen::~QWasmScreen() } +QWasmScreen *QWasmScreen::get(QPlatformScreen *screen) +{ + return static_cast<QWasmScreen *>(screen); +} + +QWasmScreen *QWasmScreen::get(QScreen *screen) +{ + return get(screen->handle()); +} + +QWasmCompositor *QWasmScreen::compositor() +{ + return m_compositor; +} + +QWasmEventTranslator *QWasmScreen::eventTranslator() +{ + return m_eventTranslator; +} + +QString QWasmScreen::canvasId() const +{ + return m_canvasId; +} + QRect QWasmScreen::geometry() const { return m_geometry; @@ -82,6 +110,11 @@ qreal QWasmScreen::devicePixelRatio() const return qreal(htmlWindowDpr); } +QString QWasmScreen::name() const +{ + return m_canvasId; +} + QPlatformCursor *QWasmScreen::cursor() const { return const_cast<QWasmCursor *>(&m_cursor); @@ -114,14 +147,7 @@ void QWasmScreen::setGeometry(const QRect &rect) resizeMaximizedWindows(); } -static void set_canvas_size(double width, double height, const char *canvasId) -{ - emscripten::val canvas = emscripten::val::global(canvasId); - canvas.set("width", width); - canvas.set("height", height); -} - -void QWasmScreen::updateQScreenAndCanvasRenderSize(const QString &canvasId) +void QWasmScreen::updateQScreenAndCanvasRenderSize() { // The HTML canvas has two sizes: the CSS size and the canvas render size. // The CSS size is determined according to standard CSS rules, while the @@ -130,17 +156,22 @@ void QWasmScreen::updateQScreenAndCanvasRenderSize(const QString &canvasId) // Setting the render size to a value larger than the CSS size enables high-dpi // rendering. + QByteArray canvasId = m_canvasId.toUtf8(); double css_width; double css_height; - emscripten_get_element_css_size(canvasId.toLocal8Bit().constData(), &css_width, &css_height); + emscripten_get_element_css_size(canvasId.constData(), &css_width, &css_height); QSizeF cssSize(css_width, css_height); - QWasmScreen *screen = QWasmIntegration::get()->screen(); - QSizeF canvasSize = cssSize * screen->devicePixelRatio(); + QSizeF canvasSize = cssSize * devicePixelRatio(); + emscripten::val canvas = emscripten::val::global(canvasId.constData()); + canvas.set("width", canvasSize.width()); + canvas.set("height", canvasSize.height()); + + emscripten::val rect = canvas.call<emscripten::val>("getBoundingClientRect"); + QPoint position(rect["left"].as<int>(), rect["top"].as<int>()); - set_canvas_size(canvasSize.width(), canvasSize.height(), canvasId.toLocal8Bit().constData()); - screen->setGeometry(QRect(QPoint(0, 0), cssSize.toSize())); - QWasmIntegration::get()->compositor()->redrawWindowContent(); + setGeometry(QRect(position, cssSize.toSize())); + m_compositor->redrawWindowContent(); } QT_END_NAMESPACE |