KWin
Loading...
Searching...
No Matches
events.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "events.h"
10#include "device.h"
11
12#include <QSize>
13
14namespace KWin
15{
16namespace LibInput
17{
18
19std::unique_ptr<Event> Event::create(libinput_event *event)
20{
21 if (!event) {
22 return nullptr;
23 }
24 const auto t = libinput_event_get_type(event);
25 // TODO: add touch events
26 // TODO: add device notify events
27 switch (t) {
28 case LIBINPUT_EVENT_KEYBOARD_KEY:
29 return std::make_unique<KeyEvent>(event);
30 case LIBINPUT_EVENT_POINTER_SCROLL_WHEEL:
31 case LIBINPUT_EVENT_POINTER_SCROLL_FINGER:
32 case LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS:
33 case LIBINPUT_EVENT_POINTER_BUTTON:
34 case LIBINPUT_EVENT_POINTER_MOTION:
35 case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
36 return std::make_unique<PointerEvent>(event, t);
37 case LIBINPUT_EVENT_TOUCH_DOWN:
38 case LIBINPUT_EVENT_TOUCH_UP:
39 case LIBINPUT_EVENT_TOUCH_MOTION:
40 case LIBINPUT_EVENT_TOUCH_CANCEL:
41 case LIBINPUT_EVENT_TOUCH_FRAME:
42 return std::make_unique<TouchEvent>(event, t);
43 case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
44 case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
45 case LIBINPUT_EVENT_GESTURE_SWIPE_END:
46 return std::make_unique<SwipeGestureEvent>(event, t);
47 case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
48 case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
49 case LIBINPUT_EVENT_GESTURE_PINCH_END:
50 return std::make_unique<PinchGestureEvent>(event, t);
51 case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
52 case LIBINPUT_EVENT_GESTURE_HOLD_END:
53 return std::make_unique<HoldGestureEvent>(event, t);
54 case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
55 case LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY:
56 case LIBINPUT_EVENT_TABLET_TOOL_TIP:
57 return std::make_unique<TabletToolEvent>(event, t);
58 case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
59 return std::make_unique<TabletToolButtonEvent>(event, t);
60 case LIBINPUT_EVENT_TABLET_PAD_RING:
61 return std::make_unique<TabletPadRingEvent>(event, t);
62 case LIBINPUT_EVENT_TABLET_PAD_STRIP:
63 return std::make_unique<TabletPadStripEvent>(event, t);
64 case LIBINPUT_EVENT_TABLET_PAD_BUTTON:
65 return std::make_unique<TabletPadButtonEvent>(event, t);
66 case LIBINPUT_EVENT_SWITCH_TOGGLE:
67 return std::make_unique<SwitchEvent>(event, t);
68 default:
69 return std::unique_ptr<Event>{new Event(event, t)};
70 }
71}
72
73Event::Event(libinput_event *event, libinput_event_type type)
74 : m_event(event)
75 , m_type(type)
76 , m_device(nullptr)
77{
78}
79
84
86{
87 if (!m_device) {
88 m_device = Device::get(libinput_event_get_device(m_event));
89 }
90 return m_device;
91}
92
94{
95 if (m_device) {
96 return m_device->device();
97 }
98 return libinput_event_get_device(m_event);
99}
100
102 : Event(event, LIBINPUT_EVENT_KEYBOARD_KEY)
103 , m_keyboardEvent(libinput_event_get_keyboard_event(event))
104{
105}
106
107KeyEvent::~KeyEvent() = default;
108
109uint32_t KeyEvent::key() const
110{
111 return libinput_event_keyboard_get_key(m_keyboardEvent);
112}
113
115{
116 switch (libinput_event_keyboard_get_key_state(m_keyboardEvent)) {
117 case LIBINPUT_KEY_STATE_PRESSED:
119 case LIBINPUT_KEY_STATE_RELEASED:
121 default:
122 Q_UNREACHABLE();
123 }
124}
125
126std::chrono::microseconds KeyEvent::time() const
127{
128 return std::chrono::microseconds(libinput_event_keyboard_get_time_usec(m_keyboardEvent));
129}
130
132 : Event(event, type)
133 , m_pointerEvent(libinput_event_get_pointer_event(event))
134{
135}
136
138
140{
141 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE);
142 return QPointF(libinput_event_pointer_get_absolute_x(m_pointerEvent),
144}
145
146QPointF PointerEvent::absolutePos(const QSize &size) const
147{
148 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE);
149 return QPointF(libinput_event_pointer_get_absolute_x_transformed(m_pointerEvent, size.width()),
150 libinput_event_pointer_get_absolute_y_transformed(m_pointerEvent, size.height()));
151}
152
153QPointF PointerEvent::delta() const
154{
155 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_MOTION);
156 return QPointF(libinput_event_pointer_get_dx(m_pointerEvent), libinput_event_pointer_get_dy(m_pointerEvent));
157}
158
160{
161 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_MOTION);
163}
164
165std::chrono::microseconds PointerEvent::time() const
166{
167 return std::chrono::microseconds(libinput_event_pointer_get_time_usec(m_pointerEvent));
168}
169
170uint32_t PointerEvent::button() const
171{
172 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_BUTTON);
173 return libinput_event_pointer_get_button(m_pointerEvent);
174}
175
177{
178 Q_ASSERT(type() == LIBINPUT_EVENT_POINTER_BUTTON);
179 switch (libinput_event_pointer_get_button_state(m_pointerEvent)) {
180 case LIBINPUT_BUTTON_STATE_PRESSED:
182 case LIBINPUT_BUTTON_STATE_RELEASED:
184 default:
185 Q_UNREACHABLE();
186 }
187}
188
189QList<InputRedirection::PointerAxis> PointerEvent::axis() const
190{
191 QList<InputRedirection::PointerAxis> a;
192 if (libinput_event_pointer_has_axis(m_pointerEvent, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL)) {
194 }
195 if (libinput_event_pointer_has_axis(m_pointerEvent, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL)) {
197 }
198 return a;
199}
200
202{
203 const libinput_pointer_axis a = axis == InputRedirection::PointerAxisHorizontal
204 ? LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL
205 : LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
206 return libinput_event_pointer_get_scroll_value(m_pointerEvent, a) * device()->scrollFactor();
207}
208
210{
211 const libinput_pointer_axis a = (axis == InputRedirection::PointerAxisHorizontal)
212 ? LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL
213 : LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
215}
216
217TouchEvent::TouchEvent(libinput_event *event, libinput_event_type type)
218 : Event(event, type)
219 , m_touchEvent(libinput_event_get_touch_event(event))
220{
221}
222
223TouchEvent::~TouchEvent() = default;
224
225std::chrono::microseconds TouchEvent::time() const
226{
227 return std::chrono::microseconds(libinput_event_touch_get_time_usec(m_touchEvent));
228}
229
231{
232 Q_ASSERT(type() == LIBINPUT_EVENT_TOUCH_DOWN || type() == LIBINPUT_EVENT_TOUCH_MOTION);
233 return QPointF(libinput_event_touch_get_x(m_touchEvent),
234 libinput_event_touch_get_y(m_touchEvent));
235}
236
237QPointF TouchEvent::absolutePos(const QSize &size) const
238{
239 Q_ASSERT(type() == LIBINPUT_EVENT_TOUCH_DOWN || type() == LIBINPUT_EVENT_TOUCH_MOTION);
240 return QPointF(libinput_event_touch_get_x_transformed(m_touchEvent, size.width()),
241 libinput_event_touch_get_y_transformed(m_touchEvent, size.height()));
242}
243
244qint32 TouchEvent::id() const
245{
246 Q_ASSERT(type() != LIBINPUT_EVENT_TOUCH_FRAME);
247
248 return libinput_event_touch_get_seat_slot(m_touchEvent);
249}
250
252 : Event(event, type)
253 , m_gestureEvent(libinput_event_get_gesture_event(event))
254{
255}
256
258
259std::chrono::microseconds GestureEvent::time() const
260{
261 return std::chrono::microseconds(libinput_event_gesture_get_time_usec(m_gestureEvent));
262}
263
268
274
279
281 : GestureEvent(event, type)
282{
283}
284
286
291
296
298 : GestureEvent(event, type)
299{
300}
301
303
305 : GestureEvent(event, type)
306{
307}
308
310
311SwitchEvent::SwitchEvent(libinput_event *event, libinput_event_type type)
312 : Event(event, type)
313 , m_switchEvent(libinput_event_get_switch_event(event))
314{
315}
316
317SwitchEvent::~SwitchEvent() = default;
318
320{
321 switch (libinput_event_switch_get_switch_state(m_switchEvent)) {
322 case LIBINPUT_SWITCH_STATE_OFF:
323 return State::Off;
324 case LIBINPUT_SWITCH_STATE_ON:
325 return State::On;
326 default:
327 Q_UNREACHABLE();
328 }
329 return State::Off;
330}
331
332std::chrono::microseconds SwitchEvent::time() const
333{
334 return std::chrono::microseconds(libinput_event_switch_get_time_usec(m_switchEvent));
335}
336
338 : Event(event, type)
339 , m_tabletToolEvent(libinput_event_get_tablet_tool_event(event))
340{
341}
342
343QPointF TabletToolEvent::transformedPosition(const QSize &size) const
344{
345 const QRectF outputArea = device()->outputArea();
346 return {size.width() * outputArea.x() + libinput_event_tablet_tool_get_x_transformed(m_tabletToolEvent, size.width() * outputArea.width()),
347 size.height() * outputArea.y() + libinput_event_tablet_tool_get_y_transformed(m_tabletToolEvent, size.height() * outputArea.height())};
348}
349
351 : Event(event, type)
352 , m_tabletToolEvent(libinput_event_get_tablet_tool_event(event))
353{
354}
355
357 : Event(event, type)
358 , m_tabletPadEvent(libinput_event_get_tablet_pad_event(event))
359{
360}
361
363 : Event(event, type)
364 , m_tabletPadEvent(libinput_event_get_tablet_pad_event(event))
365{
366}
367
369 : Event(event, type)
370 , m_tabletPadEvent(libinput_event_get_tablet_pad_event(event))
371{
372}
373}
374}
static Device * get(libinput_device *native)
Definition device.cpp:378
libinput_device * device() const
Definition device.h:572
static std::unique_ptr< Event > create(libinput_event *event)
Definition events.cpp:19
libinput_event_type type() const
Definition events.h:422
Device * device() const
Definition events.cpp:85
Event(libinput_event *event, libinput_event_type type)
Definition events.cpp:73
libinput_device * nativeDevice() const
Definition events.cpp:93
std::chrono::microseconds time() const
Definition events.cpp:259
GestureEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:251
libinput_event_gesture * m_gestureEvent
Definition events.h:151
HoldGestureEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:304
uint32_t key() const
Definition events.cpp:109
InputRedirection::KeyboardKeyState state() const
Definition events.cpp:114
KeyEvent(libinput_event *event)
Definition events.cpp:101
std::chrono::microseconds time() const
Definition events.cpp:126
PinchGestureEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:280
std::chrono::microseconds time() const
Definition events.cpp:165
QPointF absolutePos() const
Definition events.cpp:139
qint32 scrollValueV120(InputRedirection::PointerAxis axis) const
Definition events.cpp:209
InputRedirection::PointerButtonState buttonState() const
Definition events.cpp:176
QPointF deltaUnaccelerated() const
Definition events.cpp:159
QList< InputRedirection::PointerAxis > axis() const
Definition events.cpp:189
uint32_t button() const
Definition events.cpp:170
qreal scrollValue(InputRedirection::PointerAxis a) const
Definition events.cpp:201
PointerEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:131
SwipeGestureEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:297
std::chrono::microseconds time() const
Definition events.cpp:332
SwitchEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:311
TabletPadButtonEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:356
TabletPadRingEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:368
TabletPadStripEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:362
TabletToolButtonEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:350
QPointF transformedPosition(const QSize &size) const
Definition events.cpp:343
TabletToolEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:337
std::chrono::microseconds time() const
Definition events.cpp:225
TouchEvent(libinput_event *event, libinput_event_type type)
Definition events.cpp:217
QPointF absolutePos() const
Definition events.cpp:230
uint64_t libinput_event_gesture_get_time_usec(struct libinput_event_gesture *event)
struct libinput_event_keyboard * libinput_event_get_keyboard_event(struct libinput_event *event)
uint64_t libinput_event_keyboard_get_time_usec(struct libinput_event_keyboard *event)
void libinput_event_destroy(struct libinput_event *event)
int libinput_event_pointer_has_axis(struct libinput_event_pointer *event, enum libinput_pointer_axis axis)
double libinput_event_pointer_get_absolute_x_transformed(struct libinput_event_pointer *event, uint32_t width)
double libinput_event_pointer_get_dx(struct libinput_event_pointer *event)
double libinput_event_pointer_get_dy_unaccelerated(struct libinput_event_pointer *event)
double libinput_event_touch_get_y(struct libinput_event_touch *event)
double libinput_event_pointer_get_scroll_value_v120(struct libinput_event_pointer *event, enum libinput_pointer_axis axis)
double libinput_event_touch_get_y_transformed(struct libinput_event_touch *event, uint32_t height)
double libinput_event_gesture_get_dx(struct libinput_event_gesture *event)
struct libinput_event_gesture * libinput_event_get_gesture_event(struct libinput_event *event)
double libinput_event_tablet_tool_get_x_transformed(struct libinput_event_tablet_tool *event, uint32_t width)
double libinput_event_pointer_get_absolute_y(struct libinput_event_pointer *event)
enum libinput_button_state libinput_event_pointer_get_button_state(struct libinput_event_pointer *event)
enum libinput_event_type libinput_event_get_type(struct libinput_event *event)
double libinput_event_gesture_get_angle_delta(struct libinput_event_gesture *event)
struct libinput_event_tablet_tool * libinput_event_get_tablet_tool_event(struct libinput_event *event)
double libinput_event_pointer_get_scroll_value(struct libinput_event_pointer *event, enum libinput_pointer_axis axis)
double libinput_event_tablet_tool_get_y_transformed(struct libinput_event_tablet_tool *event, uint32_t height)
uint32_t libinput_event_pointer_get_button(struct libinput_event_pointer *event)
int libinput_event_gesture_get_cancelled(struct libinput_event_gesture *event)
uint64_t libinput_event_switch_get_time_usec(struct libinput_event_switch *event)
uint64_t libinput_event_touch_get_time_usec(struct libinput_event_touch *event)
double libinput_event_pointer_get_dy(struct libinput_event_pointer *event)
double libinput_event_gesture_get_scale(struct libinput_event_gesture *event)
struct libinput_event_touch * libinput_event_get_touch_event(struct libinput_event *event)
double libinput_event_pointer_get_absolute_y_transformed(struct libinput_event_pointer *event, uint32_t height)
struct libinput_event_pointer * libinput_event_get_pointer_event(struct libinput_event *event)
int32_t libinput_event_touch_get_seat_slot(struct libinput_event_touch *event)
double libinput_event_gesture_get_dy(struct libinput_event_gesture *event)
struct libinput_device * libinput_event_get_device(struct libinput_event *event)
double libinput_event_pointer_get_absolute_x(struct libinput_event_pointer *event)
double libinput_event_touch_get_x(struct libinput_event_touch *event)
int libinput_event_gesture_get_finger_count(struct libinput_event_gesture *event)
struct libinput_event_switch * libinput_event_get_switch_event(struct libinput_event *event)
uint32_t libinput_event_keyboard_get_key(struct libinput_event_keyboard *event)
double libinput_event_pointer_get_dx_unaccelerated(struct libinput_event_pointer *event)
double libinput_event_touch_get_x_transformed(struct libinput_event_touch *event, uint32_t width)
enum libinput_switch_state libinput_event_switch_get_switch_state(struct libinput_event_switch *event)
struct libinput_event_tablet_pad * libinput_event_get_tablet_pad_event(struct libinput_event *event)
uint64_t libinput_event_pointer_get_time_usec(struct libinput_event_pointer *event)
enum libinput_key_state libinput_event_keyboard_get_key_state(struct libinput_event_keyboard *event)
Session::Type type
Definition session.cpp:17