Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qwaylandinputdevice_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QWAYLANDINPUTDEVICE_H
5#define QWAYLANDINPUTDEVICE_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
19#include <QtWaylandClient/private/qwaylandwindow_p.h>
20
21#include <QtCore/QScopedPointer>
22#include <QSocketNotifier>
23#include <QObject>
24#include <QTimer>
25#include <qpa/qplatformintegration.h>
26#include <qpa/qplatformscreen.h>
27#include <qpa/qwindowsysteminterface.h>
28
29#include <QtWaylandClient/private/qwayland-wayland.h>
30#include <QtWaylandClient/private/qwayland-pointer-gestures-unstable-v1.h>
31
32#if QT_CONFIG(xkbcommon)
33#include <QtGui/private/qxkbcommon_p.h>
34#endif
35
36#include <QtCore/QDebug>
37#include <QtCore/QElapsedTimer>
38#include <QtCore/QPointer>
39
40#if QT_CONFIG(cursor)
41struct wl_cursor_image;
42#endif
43
45
46namespace QtWayland {
47class zwp_primary_selection_device_v1;
48} //namespace QtWayland
49
50namespace QtWaylandClient {
51
52class QWaylandDataDevice;
53class QWaylandDisplay;
54#if QT_CONFIG(wayland_client_primary_selection)
55class QWaylandPrimarySelectionDeviceV1;
56#endif
57#if QT_CONFIG(tabletevent)
58class QWaylandTabletSeatV2;
59#endif
60class QWaylandPointerGestures;
61class QWaylandPointerGestureSwipe;
62class QWaylandPointerGesturePinch;
63class QWaylandTextInputInterface;
64class QWaylandTextInputMethod;
65#if QT_CONFIG(cursor)
66class QWaylandCursorTheme;
67class QWaylandCursorShape;
68class CursorSurface;
69#endif
70
71Q_DECLARE_LOGGING_CATEGORY(lcQpaWaylandInput);
72
73class Q_WAYLANDCLIENT_EXPORT QWaylandInputDevice
74 : public QObject
75 , public QtWayland::wl_seat
76{
78public:
79 class Keyboard;
80 class Pointer;
81 class Touch;
82
83 QWaylandInputDevice(QWaylandDisplay *display, int version, uint32_t id);
85
86 uint32_t capabilities() const { return mCaps; }
87
88 QWaylandDisplay *display() const { return mQDisplay; }
89 struct ::wl_seat *wl_seat() { return QtWayland::wl_seat::object(); }
90 QString seatName() const { return QString::number(mId); }
91
92#if QT_CONFIG(cursor)
93 void setCursor(const QCursor *cursor, const QSharedPointer<QWaylandBuffer> &cachedBuffer = {}, int fallbackOutputScale = 1);
94#endif
95 void handleEndDrag();
96
97#if QT_CONFIG(wayland_datadevice)
98 void setDataDevice(QWaylandDataDevice *device);
99 QWaylandDataDevice *dataDevice() const;
100#endif
101
102#if QT_CONFIG(wayland_client_primary_selection)
103 void setPrimarySelectionDevice(QWaylandPrimarySelectionDeviceV1 *primarySelectionDevice);
104 QWaylandPrimarySelectionDeviceV1 *primarySelectionDevice() const;
105#endif
106
107#if QT_CONFIG(tabletevent)
108 void setTabletSeat(QWaylandTabletSeatV2 *tabletSeat);
109 QWaylandTabletSeatV2* tabletSeat() const;
110#endif
111
112 void setTextInput(QWaylandTextInputInterface *textInput);
113 QWaylandTextInputInterface *textInput() const;
114
115 void setTextInputMethod(QWaylandTextInputMethod *textInputMethod);
116 QWaylandTextInputMethod *textInputMethod() const;
117
118 void removeMouseButtonFromState(Qt::MouseButton button);
119
120 QWaylandWindow *pointerFocus() const;
121 QWaylandWindow *keyboardFocus() const;
122 QWaylandWindow *touchFocus() const;
123
124 QList<int> possibleKeys(const QKeyEvent *event) const;
125
126 QPointF pointerSurfacePosition() const;
127
128 Qt::KeyboardModifiers modifiers() const;
129
130 uint32_t serial() const;
131
132 virtual Keyboard *createKeyboard(QWaylandInputDevice *device);
133 virtual Pointer *createPointer(QWaylandInputDevice *device);
134 virtual Touch *createTouch(QWaylandInputDevice *device);
135
136 Keyboard *keyboard() const;
137 Pointer *pointer() const;
138 QWaylandPointerGestureSwipe *pointerGestureSwipe() const;
139 QWaylandPointerGesturePinch *pointerGesturePinch() const;
140 Touch *touch() const;
141
142protected:
143 QWaylandDisplay *mQDisplay = nullptr;
144 struct wl_display *mDisplay = nullptr;
145
146 uint32_t mId = -1;
147 uint32_t mCaps = 0;
148
149#if QT_CONFIG(cursor)
150 struct CursorState {
151 QSharedPointer<QWaylandBuffer> bitmapBuffer; // not used with shape cursors
152 int bitmapScale = 1;
154 int fallbackOutputScale = 1;
155 QPoint hotspot;
156 QElapsedTimer animationTimer;
157 } mCursor;
158#endif
159
160#if QT_CONFIG(wayland_datadevice)
161 QWaylandDataDevice *mDataDevice = nullptr;
162#endif
163
164#if QT_CONFIG(wayland_client_primary_selection)
166#endif
167
173
176#if QT_CONFIG(tabletevent)
178#endif
179
180 uint32_t mTime = 0;
181 uint32_t mSerial = 0;
182
183 void seat_capabilities(uint32_t caps) override;
184 void handleTouchPoint(int id, QEventPoint::State state, const QPointF &surfacePosition = QPoint());
185
186 QPointingDevice *mTouchDevice = nullptr;
187 QPointingDevice *mTouchPadDevice = nullptr;
188
193 friend class QWaylandWindow;
194};
195
196inline uint32_t QWaylandInputDevice::serial() const
197{
198 return mSerial;
199}
200
201
202class Q_WAYLANDCLIENT_EXPORT QWaylandInputDevice::Keyboard : public QObject, public QtWayland::wl_keyboard
203{
205
206public:
208 ~Keyboard() override;
209
211
212 void keyboard_keymap(uint32_t format,
213 int32_t fd,
214 uint32_t size) override;
215 void keyboard_enter(uint32_t time,
216 struct wl_surface *surface,
217 struct wl_array *keys) override;
218 void keyboard_leave(uint32_t time,
219 struct wl_surface *surface) override;
220 void keyboard_key(uint32_t serial, uint32_t time,
221 uint32_t key, uint32_t state) override;
222 void keyboard_modifiers(uint32_t serial,
223 uint32_t mods_depressed,
224 uint32_t mods_latched,
225 uint32_t mods_locked,
226 uint32_t group) override;
227 void keyboard_repeat_info(int32_t rate, int32_t delay) override;
228
229 QWaylandInputDevice *mParent = nullptr;
230 ::wl_surface *mFocus = nullptr;
231
232 uint32_t mNativeModifiers = 0;
233
234 struct repeatKey {
235 int key = 0;
236 uint32_t code = 0;
237 uint32_t time = 0 ;
239 Qt::KeyboardModifiers modifiers;
240 uint32_t nativeVirtualKey = 0;
241 uint32_t nativeModifiers = 0;
242 } mRepeatKey;
243
245 int mRepeatRate = 25;
246 int mRepeatDelay = 400;
247
248 uint32_t mKeymapFormat = WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1;
249
250 Qt::KeyboardModifiers modifiers() const;
251
252 struct ::wl_keyboard *wl_keyboard() { return QtWayland::wl_keyboard::object(); }
253
254#if QT_CONFIG(xkbcommon)
255 virtual int keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers, xkb_state *state, xkb_keycode_t code) {
256 return QXkbCommon::keysymToQtKey(keysym, modifiers, state, code);
257 }
258#endif
259
260private slots:
261 void handleFocusDestroyed();
262 void handleFocusLost();
263
264private:
265#if QT_CONFIG(xkbcommon)
266 bool createDefaultKeymap();
267#endif
268 void handleKey(ulong timestamp, QEvent::Type type, int key, Qt::KeyboardModifiers modifiers,
269 quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers,
270 const QString &text, bool autorepeat = false, ushort count = 1);
271
272#if QT_CONFIG(xkbcommon)
275#endif
277};
278
279class Q_WAYLANDCLIENT_EXPORT QWaylandInputDevice::Pointer : public QObject, public QtWayland::wl_pointer
280{
282public:
284 ~Pointer() override;
286#if QT_CONFIG(cursor)
287 int idealCursorScale() const;
288 void updateCursorTheme();
289 void updateCursor();
290 void cursorTimerCallback();
291 void cursorFrameCallback();
292 CursorSurface *getOrCreateCursorSurface();
293#endif
294 QWaylandInputDevice *seat() const { return mParent; }
295
296 struct ::wl_pointer *wl_pointer() { return QtWayland::wl_pointer::object(); }
297
298protected:
299 void pointer_enter(uint32_t serial, struct wl_surface *surface,
300 wl_fixed_t sx, wl_fixed_t sy) override;
301 void pointer_leave(uint32_t time, struct wl_surface *surface) override;
302 void pointer_motion(uint32_t time,
303 wl_fixed_t sx, wl_fixed_t sy) override;
304 void pointer_button(uint32_t serial, uint32_t time,
305 uint32_t button, uint32_t state) override;
306 void pointer_axis(uint32_t time,
307 uint32_t axis,
308 wl_fixed_t value) override;
309 void pointer_axis_source(uint32_t source) override;
310 void pointer_axis_stop(uint32_t time, uint32_t axis) override;
311 void pointer_axis_discrete(uint32_t axis, int32_t value) override;
312 void pointer_frame() override;
313 void pointer_axis_value120(uint32_t axis, int32_t value120) override;
314
315private slots:
316 void handleFocusDestroyed() { invalidateFocus(); }
317
318private:
319 void invalidateFocus();
320
321public:
323
324 QWaylandInputDevice *mParent = nullptr;
326 uint32_t mEnterSerial = 0;
327#if QT_CONFIG(cursor)
328 struct {
330 QWaylandCursorTheme *theme = nullptr;
331 int themeBufferScale = 0;
334 bool gotFrameCallback = false;
335 bool gotTimerCallback = false;
336 } mCursor;
337#endif
340 Qt::MouseButtons mButtons = Qt::NoButton;
342#if QT_CONFIG(cursor)
343 wl_buffer *mCursorBuffer = nullptr;
344 Qt::CursorShape mCursorShape = Qt::BitmapCursor;
345#endif
346
347 struct FrameData {
348 QWaylandPointerEvent *event = nullptr;
349
352 axis_source axisSource = axis_source_wheel;
353
355 bool hasPixelDelta() const;
356 QPoint pixelDeltaAndError(QPointF *accumulatedError) const;
357 QPoint pixelDelta() const { return hasPixelDelta() ? delta.toPoint() : QPoint(); }
360 } mFrameData;
361
362 bool mScrollBeginSent = false;
364
368private: //TODO: should other methods be private as well?
369 bool isDefinitelyTerminated(axis_source source) const;
370};
371
372class Q_WAYLANDCLIENT_EXPORT QWaylandInputDevice::Touch : public QtWayland::wl_touch
373{
374public:
376 ~Touch() override;
377
378 void touch_down(uint32_t serial,
379 uint32_t time,
380 struct wl_surface *surface,
381 int32_t id,
382 wl_fixed_t x,
383 wl_fixed_t y) override;
384 void touch_up(uint32_t serial,
385 uint32_t time,
386 int32_t id) override;
387 void touch_motion(uint32_t time,
388 int32_t id,
389 wl_fixed_t x,
390 wl_fixed_t y) override;
391 void touch_frame() override;
392 void touch_cancel() override;
393
396
397 struct ::wl_touch *wl_touch() { return QtWayland::wl_touch::object(); }
398
399 QWaylandInputDevice *mParent = nullptr;
402};
403
405{
407public:
409 ulong timestamp, const QPointF &localPos, const QPointF &globalPos,
410 Qt::MouseButtons buttons, Qt::MouseButton button,
411 Qt::KeyboardModifiers modifiers)
412 : type(type)
413 , phase(phase)
415 , local(localPos)
416 , global(globalPos)
418 , button(button)
421 {}
423 ulong timestamp, const QPointF &local, const QPointF &global,
424 const QPoint &pixelDelta, const QPoint &angleDelta,
426 Qt::KeyboardModifiers modifiers)
427 : type(type)
428 , phase(phase)
430 , local(local)
431 , global(global)
435 , source(source)
437 {}
438
444 Qt::MouseButtons buttons;
445 Qt::MouseButton button = Qt::NoButton; // Button that caused the event (QMouseEvent::button)
446 Qt::KeyboardModifiers modifiers;
451};
452
453#ifndef QT_NO_GESTURES
455{
457public:
460 const QPointF &global, uint fingers, const QPointF& delta)
462 , state(state)
464 , local(local)
465 , global(global)
467 , delta(delta)
468 {}
469
477};
478
480{
482public:
485 const QPointF &global, uint fingers, const QPointF& delta,
488 , state(state)
490 , local(local)
491 , global(global)
493 , delta(delta)
496 {}
497
507};
508#endif // #ifndef QT_NO_GESTURES
509
510}
511
513
514#endif
IOBluetoothDevice * device
The QCursor class provides a mouse cursor with an arbitrary shape.
Definition qcursor.h:45
\inmodule QtCore
State
Specifies the state of this event point.
Definition qeventpoint.h:49
Type
This enum type defines the valid event types in Qt.
Definition qcoreevent.h:51
The QKeyEvent class describes a key event.
Definition qevent.h:423
Definition qlist.h:74
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore\reentrant
Definition qpoint.h:214
constexpr QPoint toPoint() const
Rounds the coordinates of this point to the nearest integer, and returns a QPoint object with the rou...
Definition qpoint.h:394
\inmodule QtCore\reentrant
Definition qpoint.h:23
\inmodule QtCore
Definition qpointer.h:18
The QPointingDevice class describes a device from which mouse, touch or tablet events originate.
\inmodule QtCore
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:7822
\inmodule QtCore
Definition qtimer.h:20
std::unique_ptr< struct xkb_keymap, XKBKeymapDeleter > ScopedXKBKeymap
std::unique_ptr< struct xkb_state, XKBStateDeleter > ScopedXKBState
static int keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers)
void keyboard_key(uint32_t serial, uint32_t time, uint32_t key, uint32_t state) override
void touch_down(uint32_t serial, uint32_t time, struct wl_surface *surface, int32_t id, wl_fixed_t x, wl_fixed_t y) override
void touch_up(uint32_t serial, uint32_t time, int32_t id) override
void pointer_axis(uint32_t time, uint32_t axis, wl_fixed_t value) override
void pointer_axis_value120(uint32_t axis, int32_t value120) override
void pointer_axis_stop(uint32_t time, uint32_t axis) override
void pointer_axis_discrete(uint32_t axis, int32_t value) override
QList< QWindowSystemInterface::TouchPoint > mPendingTouchPoints
Pointer(QWaylandInputDevice *seat)
void touch_motion(uint32_t time, int32_t id, wl_fixed_t x, wl_fixed_t y) override
void keyboard_repeat_info(int32_t rate, int32_t delay) override
QScopedPointer< QWaylandPointerGestureSwipe > mPointerGestureSwipe
QScopedPointer< QWaylandTextInputInterface > mTextInput
Keyboard(QWaylandInputDevice *p)
Qt::KeyboardModifiers modifiers() const
void keyboard_modifiers(uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) override
QWaylandWindow * focusWindow() const
void pointer_button(uint32_t serial, uint32_t time, uint32_t button, uint32_t state) override
void pointer_leave(uint32_t time, struct wl_surface *surface) override
void setFrameEvent(QWaylandPointerEvent *event)
void keyboard_keymap(uint32_t format, int32_t fd, uint32_t size) override
void keyboard_enter(uint32_t time, struct wl_surface *surface, struct wl_array *keys) override
QScopedPointer< QWaylandPointerGesturePinch > mPointerGesturePinch
void pointer_enter(uint32_t serial, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy) override
void keyboard_leave(uint32_t time, struct wl_surface *surface) override
QScopedPointer< QWaylandTextInputMethod > mTextInputMethod
Touch(QWaylandInputDevice *p)
void pointer_motion(uint32_t time, wl_fixed_t sx, wl_fixed_t sy) override
void pointer_axis_source(uint32_t source) override
QWaylandPointerEvent(QEvent::Type type, Qt::ScrollPhase phase, QWaylandWindow *surface, ulong timestamp, const QPointF &local, const QPointF &global, const QPoint &pixelDelta, const QPoint &angleDelta, Qt::MouseEventSource source, Qt::KeyboardModifiers modifiers)
QWaylandPointerEvent(QEvent::Type type, Qt::ScrollPhase phase, QWaylandWindow *surface, ulong timestamp, const QPointF &localPos, const QPointF &globalPos, Qt::MouseButtons buttons, Qt::MouseButton button, Qt::KeyboardModifiers modifiers)
QWaylandPointerGesturePinchEvent(QWaylandWindow *surface, Qt::GestureState state, ulong timestamp, const QPointF &local, const QPointF &global, uint fingers, const QPointF &delta, qreal scale_delta, qreal rotation_delta)
QWaylandPointerGestureSwipeEvent(QWaylandWindow *surface, Qt::GestureState state, ulong timestamp, const QPointF &local, const QPointF &global, uint fingers, const QPointF &delta)
EGLImageKHR int int EGLuint64KHR * modifiers
QString text
QPushButton * button
[2]
QCursor cursor
else opt state
[0]
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
MouseButton
Definition qnamespace.h:55
@ NoButton
Definition qnamespace.h:56
GestureState
@ NoGesture
MouseEventSource
@ MouseEventNotSynthesized
CursorShape
@ BitmapCursor
@ ArrowCursor
ScrollPhase
@ NoScrollPhase
@ Keyboard
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLint GLint GLint GLint GLint x
[0]
GLuint64 key
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLenum type
GLboolean GLuint group
GLuint64 GLenum GLint fd
GLint GLsizei GLsizei GLenum format
GLint y
GLsizei GLsizei GLchar * source
struct _cl_event * event
GLuint GLenum * rate
GLsizei const void * pointer
Definition qopenglext.h:384
GLfloat GLfloat p
[1]
static QT_BEGIN_NAMESPACE QElapsedTimer frameTimer
#define Q_OBJECT
#define Q_GADGET
#define slots
unsigned int quint32
Definition qtypes.h:45
unsigned long ulong
Definition qtypes.h:30
unsigned int uint
Definition qtypes.h:29
unsigned short ushort
Definition qtypes.h:28
double qreal
Definition qtypes.h:92
QStringList keys
item setCursor(Qt::IBeamCursor)
[1]
Qt::MouseEventSource wheelEventSource() const
QPoint pixelDeltaAndError(QPointF *accumulatedError) const