summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmcompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.cpp120
1 files changed, 56 insertions, 64 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp
index e93098cf79d..53daa62bedd 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.cpp
+++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp
@@ -27,7 +27,8 @@
#include <emscripten/bind.h>
namespace {
-QWasmWindow *AsWasmWindow(QWindow *window) {
+QWasmWindow *asWasmWindow(QWindow *window)
+{
return static_cast<QWasmWindow*>(window->handle());
}
} // namespace
@@ -50,10 +51,11 @@ EMSCRIPTEN_BINDINGS(qtMouseModule) {
}
QWasmCompositor::QWasmCompositor(QWasmScreen *screen)
- : QObject(screen)
- , m_windowManipulation(screen)
- , m_blitter(new QOpenGLTextureBlitter)
- , m_eventTranslator(std::make_unique<QWasmEventTranslator>())
+ : QObject(screen),
+ m_windowManipulation(screen),
+ m_windowStack(std::bind(&QWasmCompositor::onTopWindowChanged, this, std::placeholders::_1)),
+ m_blitter(new QOpenGLTextureBlitter),
+ m_eventTranslator(std::make_unique<QWasmEventTranslator>())
{
m_touchDevice = std::make_unique<QPointingDevice>(
"touchscreen", 1, QInputDevice::DeviceType::TouchScreen,
@@ -171,23 +173,14 @@ void QWasmCompositor::setEnabled(bool enabled)
void QWasmCompositor::addWindow(QWasmWindow *window)
{
m_windowVisibility.insert(window, false);
-
- m_windowStack.append(window);
-
- notifyTopWindowChanged(window);
+ m_windowStack.pushWindow(window);
}
void QWasmCompositor::removeWindow(QWasmWindow *window)
{
- m_windowStack.removeAll(window);
m_windowVisibility.remove(window);
m_requestUpdateWindows.remove(window);
-
- if (!m_windowStack.isEmpty() && !QGuiApplication::focusWindow()) {
- auto m_lastMouseTargetWindow = m_windowStack.last();
- m_lastMouseTargetWindow->requestActivateWindow();
- notifyTopWindowChanged(m_lastMouseTargetWindow);
- }
+ m_windowStack.removeWindow(window);
}
void QWasmCompositor::setVisible(QWasmWindow *window, bool visible)
@@ -205,47 +198,36 @@ void QWasmCompositor::setVisible(QWasmWindow *window, bool visible)
void QWasmCompositor::raise(QWasmWindow *window)
{
- if (m_windowStack.size() <= 1)
- return;
-
- m_windowStack.removeAll(window);
- m_windowStack.append(window);
-
- notifyTopWindowChanged(window);
+ m_windowStack.raise(window);
}
void QWasmCompositor::lower(QWasmWindow *window)
{
- if (m_windowStack.size() <= 1)
- return;
-
- m_windowStack.removeAll(window);
- m_windowStack.prepend(window);
m_globalDamage = window->window()->geometry(); // repaint previously covered area.
-
- notifyTopWindowChanged(window);
+ m_windowStack.lower(window);
}
int QWasmCompositor::windowCount() const
{
- return m_windowStack.count();
+ return m_windowStack.size();
}
QWindow *QWasmCompositor::windowAt(QPoint targetPointInScreenCoords, int padding) const
{
- const auto found = std::find_if(m_windowStack.rbegin(), m_windowStack.rend(),
- [this, padding, &targetPointInScreenCoords](const QWasmWindow* window) {
- const QRect geometry = window->windowFrameGeometry()
- .adjusted(-padding, -padding, padding, padding);
-
- return m_windowVisibility[window] && geometry.contains(targetPointInScreenCoords);
- });
- return found != m_windowStack.rend() ? (*found)->window() : nullptr;
+ const auto found = std::find_if(
+ m_windowStack.begin(), m_windowStack.end(),
+ [this, padding, &targetPointInScreenCoords](const QWasmWindow *window) {
+ const QRect geometry = window->windowFrameGeometry().adjusted(-padding, -padding,
+ padding, padding);
+
+ return m_windowVisibility[window] && geometry.contains(targetPointInScreenCoords);
+ });
+ return found != m_windowStack.end() ? (*found)->window() : nullptr;
}
QWindow *QWasmCompositor::keyWindow() const
{
- return m_windowStack.at(m_windowStack.count() - 1)->window();
+ return m_windowStack.topWindow() ? m_windowStack.topWindow()->window() : nullptr;
}
void QWasmCompositor::blit(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, const QOpenGLTexture *texture, QRect targetGeometry)
@@ -267,7 +249,8 @@ void QWasmCompositor::blit(QOpenGLTextureBlitter *blitter, QWasmScreen *screen,
blitter->blit(texture->textureId(), m, QOpenGLTextureBlitter::OriginTopLeft);
}
-void QWasmCompositor::drawWindowContent(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window)
+void QWasmCompositor::drawWindowContent(QOpenGLTextureBlitter *blitter, QWasmScreen *screen,
+ const QWasmWindow *window)
{
QWasmBackingStore *backingStore = window->backingStore();
if (!backingStore)
@@ -498,7 +481,8 @@ QWasmCompositor::QWasmTitleBarOptions QWasmCompositor::makeTitleBarOptions(const
return titleBarOptions;
}
-void QWasmCompositor::drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window)
+void QWasmCompositor::drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWasmScreen *screen,
+ const QWasmWindow *window)
{
int width = window->windowFrameGeometry().width();
int height = window->windowFrameGeometry().height();
@@ -753,7 +737,8 @@ void QWasmCompositor::drawShadePanel(QWasmTitleBarOptions options, QPainter *pai
}
-void QWasmCompositor::drawWindow(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window)
+void QWasmCompositor::drawWindow(QOpenGLTextureBlitter *blitter, QWasmScreen *screen,
+ const QWasmWindow *window)
{
if (window->window()->type() != Qt::Popup && !(window->m_windowState & Qt::WindowFullScreen))
drawWindowDecorations(blitter, screen, window);
@@ -767,9 +752,9 @@ void QWasmCompositor::frame()
QWasmWindow *someWindow = nullptr;
- for (QWasmWindow *window : qAsConst(m_windowStack)) {
+ for (QWasmWindow *window : m_windowStack) {
if (window->window()->surfaceClass() == QSurface::Window
- && qt_window_private(static_cast<QWindow *>(window->window()))->receivedExpose) {
+ && qt_window_private(window->window())->receivedExpose) {
someWindow = window;
break;
}
@@ -801,10 +786,10 @@ void QWasmCompositor::frame()
m_blitter->bind();
m_blitter->setRedBlueSwizzle(true);
- for (QWasmWindow *window : qAsConst(m_windowStack)) {
+ std::for_each(m_windowStack.rbegin(), m_windowStack.rend(), [this](const QWasmWindow *window) {
if (m_windowVisibility[window])
drawWindow(m_blitter.data(), screen(), window);
- }
+ });
m_blitter->release();
@@ -835,14 +820,18 @@ void QWasmCompositor::WindowManipulation::resizeWindow(const QPoint& amount)
));
}
-void QWasmCompositor::notifyTopWindowChanged(QWasmWindow *window)
+void QWasmCompositor::onTopWindowChanged(QWasmWindow *window)
{
+ if (!QGuiApplication::focusWindow())
+ window->requestActivateWindow();
+
QWindow *modalWindow;
- bool isTargetWindowBlocked = QGuiApplicationPrivate::instance()->isWindowBlocked(window->window(), &modalWindow);
+ const bool isTargetWindowBlocked =
+ QGuiApplicationPrivate::instance()->isWindowBlocked(window->window(), &modalWindow);
if (isTargetWindowBlocked) {
modalWindow->requestActivate();
- raise(AsWasmWindow(modalWindow));
+ raise(asWasmWindow(modalWindow));
return;
}
@@ -913,7 +902,7 @@ bool QWasmCompositor::processPointer(const PointerEvent& event)
m_windowUnderMouse = targetWindow;
}
- QWasmWindow *wasmTargetWindow = AsWasmWindow(targetWindow);
+ QWasmWindow *wasmTargetWindow = asWasmWindow(targetWindow);
Qt::WindowStates windowState = targetWindow->windowState();
const bool isTargetWindowResizable = !windowState.testFlag(Qt::WindowMaximized) && !windowState.testFlag(Qt::WindowFullScreen);
@@ -936,7 +925,9 @@ bool QWasmCompositor::processPointer(const PointerEvent& event)
if (m_pressedWindow) {
// Always deliver the released event to the same window that was pressed
- AsWasmWindow(m_pressedWindow)->injectMouseReleased(pointInTargetWindowCoords, targetPointInScreenCoords, event.mouseButton, event.modifiers);
+ asWasmWindow(m_pressedWindow)
+ ->injectMouseReleased(pointInTargetWindowCoords, targetPointInScreenCoords,
+ event.mouseButton, event.modifiers);
if (event.mouseButton == Qt::MouseButton::LeftButton)
m_pressedWindow = nullptr;
} else {
@@ -1064,20 +1055,21 @@ void QWasmCompositor::WindowManipulation::onPointerDown(
const auto pointInScreenCoords = m_screen->geometry().topLeft() + event.point;
std::unique_ptr<std::variant<ResizeState, MoveState>> operationSpecific;
- if (AsWasmWindow(windowAtPoint)->isPointOnTitle(pointInScreenCoords)) {
+ if (asWasmWindow(windowAtPoint)->isPointOnTitle(pointInScreenCoords)) {
operationSpecific = std::make_unique<std::variant<ResizeState, MoveState>>(MoveState {
.m_lastPointInScreenCoords = pointInScreenCoords
});
- } else if (AsWasmWindow(windowAtPoint)->isPointOnResizeRegion(pointInScreenCoords)) {
- operationSpecific = std::make_unique<std::variant<ResizeState, MoveState>>(ResizeState {
- .m_resizeMode = AsWasmWindow(windowAtPoint)->resizeModeAtPoint(pointInScreenCoords),
- .m_originInScreenCoords = pointInScreenCoords,
- .m_initialWindowBounds = windowAtPoint->geometry(),
- .m_minShrink = QPoint(windowAtPoint->minimumWidth() - windowAtPoint->geometry().width(),
- windowAtPoint->minimumHeight() - windowAtPoint->geometry().height()),
- .m_maxGrow = QPoint(
- windowAtPoint->maximumWidth() - windowAtPoint->geometry().width(),
- windowAtPoint->maximumHeight() - windowAtPoint->geometry().height()),
+ } else if (asWasmWindow(windowAtPoint)->isPointOnResizeRegion(pointInScreenCoords)) {
+ operationSpecific = std::make_unique<std::variant<ResizeState, MoveState>>(ResizeState{
+ .m_resizeMode = asWasmWindow(windowAtPoint)->resizeModeAtPoint(pointInScreenCoords),
+ .m_originInScreenCoords = pointInScreenCoords,
+ .m_initialWindowBounds = windowAtPoint->geometry(),
+ .m_minShrink =
+ QPoint(windowAtPoint->minimumWidth() - windowAtPoint->geometry().width(),
+ windowAtPoint->minimumHeight() - windowAtPoint->geometry().height()),
+ .m_maxGrow =
+ QPoint(windowAtPoint->maximumWidth() - windowAtPoint->geometry().width(),
+ windowAtPoint->maximumHeight() - windowAtPoint->geometry().height()),
});
} else {
return;
@@ -1204,7 +1196,7 @@ int QWasmCompositor::handleTouch(int eventType, const EmscriptenTouchEvent *touc
{
QList<QWindowSystemInterface::TouchPoint> touchPointList;
touchPointList.reserve(touchEvent->numTouches);
- QWindow *targetWindow;
+ QWindow *targetWindow = nullptr;
for (int i = 0; i < touchEvent->numTouches; i++) {