1 /*
2     KWin - the KDE window manager
3     This file is part of the KDE project.
4 
5     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 #ifndef KWIN_INPUT_EVENT_H
10 #define KWIN_INPUT_EVENT_H
11 
12 #include "input.h"
13 
14 #include <QInputEvent>
15 
16 namespace KWin
17 {
18 
19 namespace LibInput
20 {
21 class Device;
22 }
23 
24 class MouseEvent : public QMouseEvent
25 {
26 public:
27     explicit MouseEvent(QEvent::Type type, const QPointF &pos, Qt::MouseButton button, Qt::MouseButtons buttons,
28                         Qt::KeyboardModifiers modifiers, quint32 timestamp,
29                         const QSizeF &delta, const QSizeF &deltaNonAccelerated, quint64 timestampMicroseconds,
30                         LibInput::Device *device);
31 
delta()32     QSizeF delta() const {
33         return m_delta;
34     }
35 
deltaUnaccelerated()36     QSizeF deltaUnaccelerated() const {
37         return m_deltaUnccelerated;
38     }
39 
timestampMicroseconds()40     quint64 timestampMicroseconds() const {
41         return m_timestampMicroseconds;
42     }
43 
device()44     LibInput::Device *device() const {
45         return m_device;
46     }
47 
modifiersRelevantForGlobalShortcuts()48     Qt::KeyboardModifiers modifiersRelevantForGlobalShortcuts() const {
49         return m_modifiersRelevantForShortcuts;
50     }
51 
setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers & mods)52     void setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers &mods) {
53         m_modifiersRelevantForShortcuts = mods;
54     }
55 
nativeButton()56     quint32 nativeButton() const {
57         return m_nativeButton;
58     }
59 
setNativeButton(quint32 button)60     void setNativeButton(quint32 button) {
61         m_nativeButton = button;
62     }
63 
64 private:
65     QSizeF m_delta;
66     QSizeF m_deltaUnccelerated;
67     quint64 m_timestampMicroseconds;
68     LibInput::Device *m_device;
69     Qt::KeyboardModifiers m_modifiersRelevantForShortcuts = Qt::KeyboardModifiers();
70     quint32 m_nativeButton = 0;
71 };
72 
73 // TODO: Don't derive from QWheelEvent, this event is quite domain specific.
74 class WheelEvent : public QWheelEvent
75 {
76 public:
77     explicit WheelEvent(const QPointF &pos, qreal delta, qint32 discreteDelta, Qt::Orientation orientation,
78                         Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, InputRedirection::PointerAxisSource source,
79                         quint32 timestamp, LibInput::Device *device);
80 
orientation()81     Qt::Orientation orientation() const {
82         return m_orientation;
83     }
84 
delta()85     qreal delta() const {
86         return m_delta;
87     }
88 
discreteDelta()89     qint32 discreteDelta() const {
90         return m_discreteDelta;
91     }
92 
axisSource()93     InputRedirection::PointerAxisSource axisSource() const {
94         return m_source;
95     }
96 
device()97     LibInput::Device *device() const {
98         return m_device;
99     }
100 
modifiersRelevantForGlobalShortcuts()101     Qt::KeyboardModifiers modifiersRelevantForGlobalShortcuts() const {
102         return m_modifiersRelevantForShortcuts;
103     }
104 
setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers & mods)105     void setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers &mods) {
106         m_modifiersRelevantForShortcuts = mods;
107     }
108 
109 private:
110     LibInput::Device *m_device;
111     Qt::Orientation m_orientation;
112     qreal m_delta;
113     qint32 m_discreteDelta;
114     InputRedirection::PointerAxisSource m_source;
115     Qt::KeyboardModifiers m_modifiersRelevantForShortcuts = Qt::KeyboardModifiers();
116 };
117 
118 class KeyEvent : public QKeyEvent
119 {
120 public:
121     explicit KeyEvent(QEvent::Type type, Qt::Key key, Qt::KeyboardModifiers modifiers, quint32 code, quint32 keysym,
122                       const QString &text, bool autorepeat, quint32 timestamp, LibInput::Device *device);
123 
device()124     LibInput::Device *device() const {
125         return m_device;
126     }
127 
modifiersRelevantForGlobalShortcuts()128     Qt::KeyboardModifiers modifiersRelevantForGlobalShortcuts() const {
129         return m_modifiersRelevantForShortcuts;
130     }
131 
setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers & mods)132     void setModifiersRelevantForGlobalShortcuts(const Qt::KeyboardModifiers &mods) {
133         m_modifiersRelevantForShortcuts = mods;
134     }
135 
136 private:
137     LibInput::Device *m_device;
138     Qt::KeyboardModifiers m_modifiersRelevantForShortcuts = Qt::KeyboardModifiers();
139 };
140 
141 class SwitchEvent : public QInputEvent
142 {
143 public:
144     enum class State {
145         Off,
146         On
147     };
148     explicit SwitchEvent(State state, quint32 timestamp, quint64 timestampMicroseconds, LibInput::Device *device);
149 
state()150     State state() const {
151         return m_state;
152     }
153 
timestampMicroseconds()154     quint64 timestampMicroseconds() const {
155         return m_timestampMicroseconds;
156     }
157 
device()158     LibInput::Device *device() const {
159         return m_device;
160     }
161 
162 private:
163     State m_state;
164     quint64 m_timestampMicroseconds;
165     LibInput::Device *m_device;
166 };
167 
168 class TabletToolId
169 {
170 public:
171     const InputRedirection::TabletToolType m_toolType;
172     const QVector<InputRedirection::Capability> m_capabilities;
173     const quint64 m_serialId;
174     const quint64 m_uniqueId;
175     void *const m_deviceGroupData;
176 };
177 
178 class TabletPadId
179 {
180 public:
181     void *data;
182 };
183 
184 class TabletEvent : public QTabletEvent
185 {
186 public:
187     TabletEvent(Type t, const QPointF &pos, const QPointF &globalPos,
188                 int device, int pointerType, qreal pressure, int xTilt, int yTilt,
189                 qreal tangentialPressure, qreal rotation, int z,
190                 Qt::KeyboardModifiers keyState, qint64 uniqueID,
191                 Qt::MouseButton button, Qt::MouseButtons buttons, const TabletToolId &tabletId);
192 
tabletId()193     const TabletToolId &tabletId() const {
194         return m_id;
195     }
196 
197 private:
198     const TabletToolId m_id;
199 };
200 
201 }
202 
203 #endif
204