summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmcompositor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.h')
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.h227
1 files changed, 22 insertions, 205 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h
index c883fc310d..4953d65233 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.h
+++ b/src/plugins/platforms/wasm/qwasmcompositor.h
@@ -4,239 +4,56 @@
#ifndef QWASMCOMPOSITOR_H
#define QWASMCOMPOSITOR_H
-#include <QtGui/qregion.h>
-#include <qpa/qplatformwindow.h>
-
-#include <QtOpenGL/qopengltextureblitter.h>
-#include <QtGui/qpalette.h>
-#include <QtGui/qpainter.h>
-#include <QtGui/qinputdevice.h>
-#include <QtCore/private/qstdweb_p.h>
+#include "qwasmwindowstack.h"
-#include <QPointer>
-#include <QPointingDevice>
+#include <qpa/qplatformwindow.h>
-#include <emscripten/html5.h>
-#include <emscripten/emscripten.h>
-#include <emscripten/bind.h>
+#include <QMap>
QT_BEGIN_NAMESPACE
-struct PointerEvent;
class QWasmWindow;
class QWasmScreen;
-class QOpenGLContext;
-class QOpenGLTexture;
-class QWasmEventTranslator;
-class QWasmCompositor : public QObject
+enum class QWasmWindowTreeNodeChangeType;
+
+class QWasmCompositor final : public QObject
{
Q_OBJECT
public:
QWasmCompositor(QWasmScreen *screen);
- ~QWasmCompositor();
- void initEventHandlers();
- void deregisterEventHandlers();
- void destroy();
-
- enum QWasmSubControl {
- SC_None = 0x00000000,
- SC_TitleBarSysMenu = 0x00000001,
- SC_TitleBarMinButton = 0x00000002,
- SC_TitleBarMaxButton = 0x00000004,
- SC_TitleBarCloseButton = 0x00000008,
- SC_TitleBarNormalButton = 0x00000010,
- SC_TitleBarLabel = 0x00000100
- };
- Q_DECLARE_FLAGS(SubControls, QWasmSubControl)
-
- enum QWasmStateFlag {
- State_None = 0x00000000,
- State_Enabled = 0x00000001,
- State_Raised = 0x00000002,
- State_Sunken = 0x00000004
- };
- Q_DECLARE_FLAGS(StateFlags, QWasmStateFlag)
-
- enum ResizeDimension {
- Left = 1,
- Right = 1 << 1,
- Top = 1 << 2,
- Bottom = 1 << 3
- };
-
- enum ResizeMode {
- ResizeNone,
- ResizeTopLeft = Top | Left,
- ResizeTop = Top,
- ResizeTopRight = Top | Right,
- ResizeRight = Right,
- ResizeBottomRight = Bottom | Right,
- ResizeBottom = Bottom,
- ResizeBottomLeft = Bottom | Left,
- ResizeLeft = Left
- };
-
- struct QWasmTitleBarOptions {
- QRect rect;
- Qt::WindowFlags flags;
- int state;
- QPalette palette;
- QString titleBarOptionsString;
- QWasmCompositor::SubControls subControls;
- QIcon windowIcon;
- };
-
- struct QWasmFrameOptions {
- QRect rect;
- int lineWidth;
- QPalette palette;
- };
-
- void setEnabled(bool enabled);
-
- void addWindow(QWasmWindow *window);
- void removeWindow(QWasmWindow *window);
+ ~QWasmCompositor() final;
void setVisible(QWasmWindow *window, bool visible);
- void raise(QWasmWindow *window);
- void lower(QWasmWindow *window);
- int windowCount() const;
-
- QWindow *windowAt(QPoint globalPoint, int padding = 0) const;
- QWindow *keyWindow() const;
-
- static QWasmTitleBarOptions makeTitleBarOptions(const QWasmWindow *window);
- static QRect titlebarRect(QWasmTitleBarOptions tb, QWasmCompositor::SubControls subcontrol);
+ void onScreenDeleting();
QWasmScreen *screen();
- QOpenGLContext *context();
+ void setEnabled(bool enabled);
+
+ static bool releaseRequestUpdateHold();
+ void requestUpdate();
enum UpdateRequestDeliveryType { ExposeEventDelivery, UpdateRequestDelivery };
- void requestUpdateAllWindows();
void requestUpdateWindow(QWasmWindow *window, UpdateRequestDeliveryType updateType = ExposeEventDelivery);
- void requestUpdate();
- void deliverUpdateRequests();
- void deliverUpdateRequest(QWasmWindow *window, UpdateRequestDeliveryType updateType);
- void handleBackingStoreFlush();
- bool processKeyboard(int eventType, const EmscriptenKeyboardEvent *keyEvent);
- bool processWheel(int eventType, const EmscriptenWheelEvent *wheelEvent);
- int handleTouch(int eventType, const EmscriptenTouchEvent *touchEvent);
-
- bool processMouseEnter(const EmscriptenMouseEvent *mouseEvent);
- bool processMouseLeave();
- void enterWindow(QWindow* window, const QPoint &localPoint, const QPoint &globalPoint);
- void leaveWindow(QWindow* window);
-private slots:
- void frame();
+ void handleBackingStoreFlush(QWindow *window);
+ void onWindowTreeChanged(QWasmWindowTreeNodeChangeType changeType, QWasmWindow *window);
private:
- class WindowManipulation {
- public:
- enum class Operation {
- None,
- Move,
- Resize,
- };
-
- WindowManipulation(QWasmScreen* screen);
-
- void onPointerDown(const PointerEvent& event, QWindow* windowAtPoint);
- void onPointerMove(const PointerEvent& event);
- void onPointerUp(const PointerEvent& event);
-
- Operation operation() const;
-
- private:
- struct ResizeState {
- ResizeMode m_resizeMode;
- QPoint m_originInScreenCoords;
- QRect m_initialWindowBounds;
- const QPoint m_minShrink;
- const QPoint m_maxGrow;
- };
- struct MoveState {
- QPoint m_lastPointInScreenCoords;
- };
- struct OperationState
- {
- int pointerId;
- QPointer<QWindow> window;
- std::variant<ResizeState, MoveState> operationSpecific;
- };
-
- void resizeWindow(const QPoint& amount);
-
- QWasmScreen *m_screen;
-
- std::unique_ptr<OperationState> m_state;
- };
-
- void notifyTopWindowChanged(QWasmWindow *window);
- void drawWindow(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
- void drawWindowContent(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
- void blit(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, const QOpenGLTexture *texture, QRect targetGeometry);
-
- void drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
-
- static QPalette makeWindowPalette();
-
- void drawFrameWindow(QWasmFrameOptions options, QPainter *painter);
- void drawTitlebarWindow(QWasmTitleBarOptions options, QPainter *painter);
- void drawShadePanel(QWasmTitleBarOptions options, QPainter *painter);
- void drawItemPixmap(QPainter *painter, const QRect &rect,
- int alignment, const QPixmap &pixmap) const;
-
- static int keyboard_cb(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData);
- static int focus_cb(int eventType, const EmscriptenFocusEvent *focusEvent, void *userData);
- static int wheel_cb(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData);
-
- bool processPointer(const PointerEvent& event);
- bool deliverEventToTarget(const PointerEvent& event, QWindow *eventTarget);
-
- static int touchCallback(int eventType, const EmscriptenTouchEvent *ev, void *userData);
-
- WindowManipulation m_windowManipulation;
-
- QScopedPointer<QOpenGLContext> m_context;
- QScopedPointer<QOpenGLTextureBlitter> m_blitter;
-
- QHash<const QWasmWindow *, bool> m_windowVisibility;
- QList<QWasmWindow *> m_windowStack;
- QRegion m_globalDamage; // damage caused by expose, window close, etc.
- bool m_needComposit = false;
- bool m_inFlush = false;
+ void frame(const QList<QWasmWindow *> &windows);
+
+ void deregisterEventHandlers();
+
+ void deliverUpdateRequests();
+ void deliverUpdateRequest(QWasmWindow *window, UpdateRequestDeliveryType updateType);
+
bool m_isEnabled = true;
- QSize m_targetSize;
- qreal m_targetDevicePixelRatio = 1;
QMap<QWasmWindow *, UpdateRequestDeliveryType> m_requestUpdateWindows;
- bool m_requestUpdateAllWindows = false;
int m_requestAnimationFrameId = -1;
bool m_inDeliverUpdateRequest = false;
-
- QPointer<QWindow> m_pressedWindow;
- QPointer<QWindow> m_lastMouseTargetWindow;
-
- std::unique_ptr<qstdweb::EventCallback> m_pointerDownCallback;
- std::unique_ptr<qstdweb::EventCallback> m_pointerMoveCallback;
- std::unique_ptr<qstdweb::EventCallback> m_pointerUpCallback;
- std::unique_ptr<qstdweb::EventCallback> m_pointerLeaveCallback;
- std::unique_ptr<qstdweb::EventCallback> m_pointerEnterCallback;
-
- std::unique_ptr<QPointingDevice> m_touchDevice;
-
- QMap <int, QPointF> m_pressedTouchIds;
-
- bool m_isResizeCursorDisplayed = false;
-
- std::unique_ptr<QWasmEventTranslator> m_eventTranslator;
-
- bool m_mouseInCanvas = false;
- QPointer<QWindow> m_windowUnderMouse;
+ static bool m_requestUpdateHoldEnabled;
};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QWasmCompositor::SubControls)
QT_END_NAMESPACE