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.h159
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)