1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 or (at your option) any later version
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
22 ** included in the packaging of this file. Please review the following
23 ** information to ensure the GNU General Public License requirements will
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25 **
26 ** $QT_END_LICENSE$
27 **
28 ****************************************************************************/
29 
30 #ifndef QWAYLANDSEAT_H
31 #define QWAYLANDSEAT_H
32 
33 #include <QtCore/qnamespace.h>
34 #include <QtCore/QPoint>
35 #include <QtCore/QString>
36 
37 #include <QtWaylandCompositor/qtwaylandcompositorglobal.h>
38 #include <QtWaylandCompositor/qwaylandcompositorextension.h>
39 #include <QtWaylandCompositor/qwaylandkeyboard.h>
40 
41 QT_BEGIN_NAMESPACE
42 
43 class QWaylandCompositor;
44 class QWaylandSurface;
45 class QKeyEvent;
46 class QTouchEvent;
47 class QWaylandView;
48 class QInputEvent;
49 class QWaylandSeatPrivate;
50 class QWaylandDrag;
51 class QWaylandKeyboard;
52 class QWaylandPointer;
53 class QWaylandTouch;
54 
55 class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandSeat : public QWaylandObject
56 {
57     Q_OBJECT
58     Q_DECLARE_PRIVATE(QWaylandSeat)
59 
60 #if QT_CONFIG(draganddrop)
61     Q_PROPERTY(QWaylandDrag *drag READ drag CONSTANT)
62 #endif
63     Q_PROPERTY(QWaylandKeymap *keymap READ keymap CONSTANT)
64 public:
65     enum CapabilityFlag {
66         // The order should match the enum WL_SEAT_CAPABILITY_*
67         Pointer = 0x01,
68         Keyboard = 0x02,
69         Touch = 0x04,
70 
71         DefaultCapabilities = Pointer | Keyboard | Touch
72     };
73     Q_DECLARE_FLAGS(CapabilityFlags, CapabilityFlag)
74     Q_ENUM(CapabilityFlags)
75 
76     QWaylandSeat(QWaylandCompositor *compositor, CapabilityFlags capabilityFlags = DefaultCapabilities);
77     ~QWaylandSeat() override;
78     virtual void initialize();
79     bool isInitialized() const;
80 
81     void sendMousePressEvent(Qt::MouseButton button);
82     void sendMouseReleaseEvent(Qt::MouseButton button);
83     void sendMouseMoveEvent(QWaylandView *surface , const QPointF &localPos, const QPointF &outputSpacePos = QPointF());
84     void sendMouseWheelEvent(Qt::Orientation orientation, int delta);
85 
86     void sendKeyPressEvent(uint code);
87     void sendKeyReleaseEvent(uint code);
88 
89     void sendFullKeyEvent(QKeyEvent *event);
90     Q_INVOKABLE void sendKeyEvent(int qtKey, bool pressed);
91 
92     uint sendTouchPointEvent(QWaylandSurface *surface, int id, const QPointF &point, Qt::TouchPointState state);
93     Q_INVOKABLE uint sendTouchPointPressed(QWaylandSurface *surface, int id, const QPointF &position);
94     Q_INVOKABLE uint sendTouchPointReleased(QWaylandSurface *surface, int id, const QPointF &position);
95     Q_INVOKABLE uint sendTouchPointMoved(QWaylandSurface *surface, int id, const QPointF &position);
96     Q_INVOKABLE void sendTouchFrameEvent(QWaylandClient *client);
97     Q_INVOKABLE void sendTouchCancelEvent(QWaylandClient *client);
98 
99     void sendFullTouchEvent(QWaylandSurface *surface, QTouchEvent *event);
100 
101     QWaylandPointer *pointer() const;
102     //Normally set by the mouse device,
103     //But can be set manually for use with touch or can reset unset the current mouse focus;
104     QWaylandView *mouseFocus() const;
105     void setMouseFocus(QWaylandView *view);
106 
107     QWaylandKeyboard *keyboard() const;
108     QWaylandSurface *keyboardFocus() const;
109     bool setKeyboardFocus(QWaylandSurface *surface);
110     QWaylandKeymap *keymap();
111 
112     QWaylandTouch *touch() const;
113 
114     QWaylandCompositor *compositor() const;
115 
116 #if QT_CONFIG(draganddrop)
117     QWaylandDrag *drag() const;
118 #endif
119 
120     QWaylandSeat::CapabilityFlags capabilities() const;
121 
122     virtual bool isOwner(QInputEvent *inputEvent) const;
123 
124     static QWaylandSeat *fromSeatResource(struct ::wl_resource *resource);
125 
126 Q_SIGNALS:
127     void mouseFocusChanged(QWaylandView *newFocus, QWaylandView *oldFocus);
128     void keyboardFocusChanged(QWaylandSurface *newFocus, QWaylandSurface *oldFocus);
129     void cursorSurfaceRequest(QWaylandSurface *surface, int hotspotX, int hotspotY);
130 
131 private:
132     void handleMouseFocusDestroyed();
133 };
134 
135 Q_DECLARE_OPERATORS_FOR_FLAGS(QWaylandSeat::CapabilityFlags)
136 
137 QT_END_NAMESPACE
138 
139 #endif // QWAYLANDSEAT_H
140