summaryrefslogtreecommitdiffstats
path: root/src/core/render_widget_host_view_qt_delegate_client.h
blob: 57354f549f9d165a24775fdd3c819a45780a1f1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#ifndef RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_CLIENT_H
#define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_CLIENT_H

#include "compositor/compositor.h"

#include <QMap>
#include <QtGui/QCursor>
#include <QtGui/QTouchEvent>

QT_BEGIN_NAMESPACE
class QEvent;
class QVariant;
class QMouseEvent;
class QKeyEvent;
class QTabletEvent;
class QNativeGestureEvent;
class QHoverEvent;
class QFocusEvent;
class QInputMethodEvent;
class QInputMethodQueryEvent;
QT_END_NAMESPACE

namespace QtWebEngineCore {

class RenderWidgetHostViewQt;

struct MultipleMouseClickHelper
{
    QPoint lastPressPosition;
    Qt::MouseButton lastPressButton = Qt::NoButton;
    int clickCounter = 0;
    ulong lastPressTimestamp = 0;
};

class Q_WEBENGINECORE_EXPORT RenderWidgetHostViewQtDelegateClient
{
public:
    RenderWidgetHostViewQtDelegateClient(RenderWidgetHostViewQt *rwhv);

    Compositor::Id compositorId();
    void notifyShown();
    void notifyHidden();
    void visualPropertiesChanged();
    bool forwardEvent(QEvent *);
    QVariant inputMethodQuery(Qt::InputMethodQuery query);
    void closePopup();

private:
    friend class RenderWidgetHostViewQt;

    template<class T>
    void handlePointerEvent(T *);
    void handleMouseEvent(QMouseEvent *);
    void handleKeyEvent(QKeyEvent *);
    void handleTouchEvent(QTouchEvent *);
#if QT_CONFIG(tabletevent)
    void handleTabletEvent(QTabletEvent *);
#endif
#if QT_CONFIG(gestures)
    void handleGestureEvent(QNativeGestureEvent *);
#endif
    void handleHoverEvent(QHoverEvent *);
    void handleFocusEvent(QFocusEvent *);
    void handleInputMethodEvent(QInputMethodEvent *);
    void handleInputMethodQueryEvent(QInputMethodQueryEvent *);

    QRect viewRectInDips() const { return m_viewRectInDips; }
    QRect windowRectInDips() const { return m_windowRectInDips; }

    // Mouse
    void resetPreviousMousePosition() { m_previousMousePosition = QCursor::pos(); }

    // Touch
    void clearPreviousTouchMotionState();

    // IME
    void selectionChanged();
    void setCursorPosition(uint pos) { m_cursorPosition = pos; }
    void setSurroundingText(const QString &text) { m_surroundingText = text; }
    bool isPreviousSelectionEmpty() const { return m_emptyPreviousSelection; }

    RenderWidgetHostViewQt *m_rwhv;

    // Mouse
    uint m_mouseButtonPressed = 0;
    QPoint m_previousMousePosition;
    MultipleMouseClickHelper m_clickHelper;

    // Key
    std::string m_editCommand;

    // Touch
    typedef QPair<int, QTouchEvent::TouchPoint> TouchPoint;
    QList<TouchPoint> mapTouchPointIds(const QList<QTouchEvent::TouchPoint> &input);
    QMap<int, int> m_touchIdMapping;
    QList<TouchPoint> m_previousTouchPoints;
    bool m_touchMotionStarted = false;
    bool m_sendMotionActionDown = false;
    int64_t m_eventsToNowDelta = 0; // delta for first touch in microseconds

    // IME
    bool m_receivedEmptyImeEvent = false;
    bool m_imeInProgress = false;
    bool m_emptyPreviousSelection = true;
    uint m_cursorPosition = 0;
    int m_anchorPositionWithinSelection = -1;
    int m_cursorPositionWithinSelection = -1;
    QString m_surroundingText;

    // Geometry of the view in screen DIPs.
    QRect m_viewRectInDips;
    // Geometry of the window, including frame, in screen DIPs.
    QRect m_windowRectInDips;
};

} // namespace QtWebEngineCore

#endif // RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_CLIENT_H