diff options
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmcompositor.h')
-rw-r--r-- | src/plugins/platforms/wasm/qwasmcompositor.h | 159 |
1 files changed, 99 insertions, 60 deletions
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h index 29a0f02267..8a6fd400d3 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.h +++ b/src/plugins/platforms/wasm/qwasmcompositor.h @@ -11,6 +11,7 @@ #include <QtGui/qpalette.h> #include <QtGui/qpainter.h> #include <QtGui/qinputdevice.h> +#include <QtCore/private/qstdweb_p.h> #include <QPointer> #include <QPointingDevice> @@ -21,25 +22,13 @@ QT_BEGIN_NAMESPACE +struct PointerEvent; class QWasmWindow; class QWasmScreen; class QOpenGLContext; class QOpenGLTexture; class QWasmEventTranslator; -class QWasmCompositedWindow -{ -public: - QWasmCompositedWindow(); - - QWasmWindow *window; - QWasmWindow *parentWindow; - QRegion damage; - bool flushPending; - bool visible; - QList<QWasmWindow *> childWindows; -}; - class QWasmCompositor : public QObject { Q_OBJECT @@ -69,16 +58,23 @@ public: }; Q_DECLARE_FLAGS(StateFlags, QWasmStateFlag) + enum ResizeDimension { + Left = 1, + Right = 1 << 1, + Top = 1 << 2, + Bottom = 1 << 3 + }; + enum ResizeMode { ResizeNone, - ResizeTopLeft, - ResizeTop, - ResizeTopRight, - ResizeRight, - ResizeBottomRight, - ResizeBottom, - ResizeBottomLeft, - ResizeLeft + ResizeTopLeft = Top | Left, + ResizeTop = Top, + ResizeTopRight = Top | Right, + ResizeRight = Right, + ResizeBottomRight = Bottom | Right, + ResizeBottom = Bottom, + ResizeBottomLeft = Bottom | Left, + ResizeLeft = Left }; struct QWasmTitleBarOptions { @@ -99,13 +95,12 @@ public: void setEnabled(bool enabled); - void addWindow(QWasmWindow *window, QWasmWindow *parentWindow = nullptr); + void addWindow(QWasmWindow *window); void removeWindow(QWasmWindow *window); void setVisible(QWasmWindow *window, bool visible); void raise(QWasmWindow *window); void lower(QWasmWindow *window); - void setParent(QWasmWindow *window, QWasmWindow *parent); int windowCount() const; @@ -125,11 +120,11 @@ public: void deliverUpdateRequests(); void deliverUpdateRequest(QWasmWindow *window, UpdateRequestDeliveryType updateType); void handleBackingStoreFlush(); - bool processMouse(int eventType, const EmscriptenMouseEvent *mouseEvent); bool processKeyboard(int eventType, const EmscriptenKeyboardEvent *keyEvent); bool processWheel(int eventType, const EmscriptenWheelEvent *wheelEvent); int handleTouch(int eventType, const EmscriptenTouchEvent *touchEvent); - void resizeWindow(QWindow *window, QWasmCompositor::ResizeMode mode, QRect startRect, QPoint amount); + void setCapture(QWasmWindow *window); + void releaseCapture(); bool processMouseEnter(const EmscriptenMouseEvent *mouseEvent); bool processMouseLeave(); @@ -140,65 +135,109 @@ private slots: void frame(); 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); - void drwPanelButton(); + + 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<QWasmWindow *, QWasmCompositedWindow> m_compositedWindows; + QHash<const QWasmWindow *, bool> m_windowVisibility; QList<QWasmWindow *> m_windowStack; QRegion m_globalDamage; // damage caused by expose, window close, etc. - bool m_needComposit; - bool m_inFlush; - bool m_inResize; - bool m_isEnabled; + bool m_needComposit = false; + bool m_inFlush = false; + bool m_isEnabled = true; QSize m_targetSize; - qreal m_targetDevicePixelRatio; + qreal m_targetDevicePixelRatio = 1; QMap<QWasmWindow *, UpdateRequestDeliveryType> m_requestUpdateWindows; bool m_requestUpdateAllWindows = false; int m_requestAnimationFrameId = -1; bool m_inDeliverUpdateRequest = false; - QPointer<QWindow> draggedWindow; - QPointer<QWindow> pressedWindow; - QPointer<QWindow> lastWindow; - Qt::MouseButtons pressedButtons; + QPointer<QWindow> m_pressedWindow; + QPointer<QWindow> m_lastMouseTargetWindow; + QPointer<QWindow> m_mouseCaptureWindow; - QWasmCompositor::ResizeMode resizeMode; - QPoint resizePoint; - QRect resizeStartRect; - QPointingDevice *touchDevice; - - QMap <int, QPointF> pressedTouchIds; - - QCursor overriddenCursor; - bool isCursorOverridden = false; - - static QPalette makeWindowPalette(); + 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; - 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; + std::unique_ptr<QPointingDevice> m_touchDevice; - static int keyboard_cb(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData); - static int mouse_cb(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); - static int focus_cb(int eventType, const EmscriptenFocusEvent *focusEvent, void *userData); - static int wheel_cb(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData); + QMap <int, QPointF> m_pressedTouchIds; - static int touchCallback(int eventType, const EmscriptenTouchEvent *ev, void *userData); + bool m_isResizeCursorDisplayed = false; - QWasmEventTranslator *eventTranslator; + std::unique_ptr<QWasmEventTranslator> m_eventTranslator; - bool mouseInCanvas; - QPointer<QWindow> windowUnderMouse; + bool m_mouseInCanvas = false; + QPointer<QWindow> m_windowUnderMouse; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QWasmCompositor::SubControls) |