11#include <config-kwin.h>
20#include <QDBusArgument>
21#include <QDBusConnection>
22#include <QDBusMetaType>
24#include <linux/input.h>
26QDBusArgument &
operator<<(QDBusArgument &argument,
const QMatrix4x4 &matrix)
28 argument.beginArray(qMetaTypeId<double>());
29 for (quint8 row = 0; row < 4; ++row) {
30 for (quint8 col = 0; col < 4; ++col) {
31 argument << matrix(row, col);
38const QDBusArgument &
operator>>(
const QDBusArgument &argument, QMatrix4x4 &matrix)
40 argument.beginArray();
41 for (quint8 row = 0; row < 4; ++row) {
42 for (quint8 col = 0; col < 4; ++col) {
45 matrix(row, col) = val;
59 for (uint i = KEY_1; i <= KEY_0; i++) {
64 for (uint i = KEY_Q; i <= KEY_P; i++) {
69 for (uint i = KEY_A; i <= KEY_L; i++) {
74 for (uint i = KEY_Z; i <= KEY_M; i++) {
114 virtual void read(
Device * ,
const KConfigGroup & )
const = 0;
130 void read(
Device *device,
const KConfigGroup &values)
const override
159 void read(
Device *device,
const KConfigGroup &values)
const override
162 device->
setOrientation(
static_cast<Qt::ScreenOrientation
>(values.readEntry(
key.constData(), defaultValue)));
176 void read(
Device *device,
const KConfigGroup &values)
const override
178 if (values.hasKey(
key.constData())) {
179 auto list = values.readEntry(
key.constData(), QList<float>());
180 if (list.size() == 16) {
190static const QMap<ConfigKey, std::shared_ptr<ConfigDataBase>> s_configData{
218 if (!getter(device, matrix)) {
222 matrix[0], matrix[1], matrix[2], 0.0f,
223 matrix[3], matrix[4], matrix[5], 0.0f,
224 0.0f, 0.0f, 1.0f, 0.0f,
225 0.0f, 0.0f, 0.0f, 1.0f};
228bool setOrientedCalibrationMatrix(
libinput_device *device, QMatrix4x4 matrix, Qt::ScreenOrientation orientation)
231 static const QMatrix4x4 portraitMatrix{
232 0.0f, -1.0f, 1.0f, 0.0f,
233 1.0f, 0.0f, 0.0f, 0.0f,
234 0.0f, 0.0f, 1.0f, 0.0f,
235 0.0f, 0.0f, 0.0f, 1.0f};
237 static const QMatrix4x4 invertedLandscapeMatrix{
238 -1.0f, 0.0f, 1.0f, 0.0f,
239 0.0f, -1.0f, 1.0f, 0.0f,
240 0.0f, 0.0f, 1.0f, 0.0f,
241 0.0f, 0.0f, 0.0f, 1.0f};
243 static const QMatrix4x4 invertedPortraitMatrix{
244 0.0f, 1.0f, 0.0f, 0.0f,
245 -1.0f, 0.0f, 1.0f, 0.0f,
246 0.0f, 0.0f, 1.0f, 0.0f,
247 0.0f, 0.0f, 0.0f, 1.0f};
249 switch (orientation) {
250 case Qt::PortraitOrientation:
251 matrix *= portraitMatrix;
253 case Qt::InvertedLandscapeOrientation:
254 matrix *= invertedLandscapeMatrix;
256 case Qt::InvertedPortraitOrientation:
257 matrix *= invertedPortraitMatrix;
259 case Qt::PrimaryOrientation:
260 case Qt::LandscapeOrientation:
265 float data[6]{matrix(0, 0), matrix(0, 1), matrix(0, 2), matrix(1, 0), matrix(1, 1), matrix(1, 2)};
290 , m_tapToClickEnabledByDefault(true)
292 , m_tapAndDragEnabledByDefault(true)
319 , m_scrollFactor(1.0)
337 m_size = QSizeF(width, height);
341 for (
int button = BTN_LEFT; button < 0x120; ++button) {
349 m_alphaNumericKeyboard = checkAlphaNumericKeyboard(m_device);
352 if (m_supportsCalibrationMatrix && m_calibrationMatrix != m_defaultCalibrationMatrix) {
353 float matrix[]{m_defaultCalibrationMatrix(0, 0),
354 m_defaultCalibrationMatrix(0, 1),
355 m_defaultCalibrationMatrix(0, 2),
356 m_defaultCalibrationMatrix(1, 0),
357 m_defaultCalibrationMatrix(1, 1),
358 m_defaultCalibrationMatrix(1, 2)};
360 m_calibrationMatrix = m_defaultCalibrationMatrix;
363 qDBusRegisterMetaType<QMatrix4x4>();
365 QDBusConnection::sessionBus().registerObject(QStringLiteral(
"/org/kde/KWin/InputDevice/") + m_sysName,
366 QStringLiteral(
"org.kde.KWin.InputDevice"),
368 QDBusConnection::ExportAllProperties);
373 QDBusConnection::sessionBus().unregisterObject(QStringLiteral(
"/org/kde/KWin/InputDevice/") + m_sysName);
384void Device::writeEntry(
const ConfigKey &key,
const T &value)
386 if (!m_config.isValid()) {
392 auto it = s_configData.find(key);
393 Q_ASSERT(it != s_configData.end());
394 m_config.writeEntry(it.value()->key.constData(), value);
400 if (!m_config.isValid() && !m_defaultConfig.isValid()) {
405 for (
auto it = s_configData.begin(), end = s_configData.end(); it != end; ++it) {
406 (*it)->read(
this, m_config);
414 if (!m_supportsPointerAcceleration) {
417 acceleration = std::clamp(acceleration, -1.0, 1.0);
419 if (m_pointerAcceleration != acceleration) {
420 m_pointerAcceleration = acceleration;
429 if (!(m_supportedScrollMethods & LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN)) {
433 if (m_scrollButton != button) {
434 m_scrollButton = button;
443 if (!(m_supportedPointerAccelerationProfiles & profile)) {
447 profile = (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE : LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT;
448 if (!(m_supportedPointerAccelerationProfiles & profile)) {
454 if (m_pointerAccelerationProfile != profile) {
455 m_pointerAccelerationProfile = profile;
464 if (!(m_supportedClickMethods & method)) {
468 method = (method == LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS) ? LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER : LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
469 if (!(m_supportedClickMethods & method)) {
475 if (m_clickMethod != method) {
476 m_clickMethod = method;
485 if (!(m_supportedScrollMethods & method)) {
489 bool isCurrent = m_scrollMethod == method;
492 method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
501 m_scrollMethod = method;
510 enum libinput_config_tap_button_map map = set ? LIBINPUT_CONFIG_TAP_MAP_LMR : LIBINPUT_CONFIG_TAP_MAP_LRM;
512 if (m_tapFingerCount < 2) {
516 map = LIBINPUT_CONFIG_TAP_MAP_LRM;
520 if (m_tapButtonMap != map) {
521 m_tapButtonMap = map;
544#define CONFIG(method, condition, function, variable, key) \
545 void Device::method(bool set) \
550 if (libinput_device_config_##function(m_device, set) == LIBINPUT_CONFIG_STATUS_SUCCESS) { \
551 if (m_##variable != set) { \
552 m_##variable = set; \
553 writeEntry(ConfigKey::key, m_##variable); \
554 Q_EMIT variable##Changed(); \
559CONFIG(setLeftHanded, !m_supportsLeftHanded, left_handed_set, leftHanded,
LeftHanded)
560CONFIG(setNaturalScroll, !m_supportsNaturalScroll, scroll_set_natural_scroll_enabled, naturalScroll,
NaturalScroll)
564#define CONFIG(method, condition, function, enum, variable, key) \
565 void Device::method(bool set) \
570 if (libinput_device_config_##function(m_device, set ? LIBINPUT_CONFIG_##enum##_ENABLED : LIBINPUT_CONFIG_##enum##_DISABLED) == LIBINPUT_CONFIG_STATUS_SUCCESS) { \
571 if (m_##variable != set) { \
572 m_##variable = set; \
573 writeEntry(ConfigKey::key, m_##variable); \
574 Q_EMIT variable##Changed(); \
579CONFIG(setEnabled, !m_supportsDisableEvents, send_events_set_mode, SEND_EVENTS, enabled,
Enabled)
580CONFIG(setDisableWhileTyping, !m_supportsDisableWhileTyping, dwt_set_enabled, DWT, disableWhileTyping,
DisableWhileTyping)
581CONFIG(setTapToClick, m_tapFingerCount == 0, tap_set_enabled, TAP, tapToClick,
TapToClick)
582CONFIG(setTapAndDrag,
false, tap_set_drag_enabled, DRAG, tapAndDrag,
TapAndDrag)
583CONFIG(setTapDragLock,
false, tap_set_drag_lock_enabled, DRAG_LOCK, tapDragLock,
TapDragLock)
584CONFIG(setMiddleEmulation, m_supportsMiddleEmulation ==
false, middle_emulation_set_enabled, MIDDLE_EMULATION, middleEmulation,
MiddleButtonEmulation)
590 if (m_scrollFactor != factor) {
591 m_scrollFactor = factor;
599 if (!m_supportsCalibrationMatrix || m_calibrationMatrix == matrix) {
603 if (setOrientedCalibrationMatrix(m_device, matrix, m_orientation)) {
606 for (uchar row = 0; row < 4; ++row) {
607 for (uchar col = 0; col < 4; ++col) {
608 list << matrix(row, col);
612 m_calibrationMatrix = matrix;
619 if (!m_supportsCalibrationMatrix || m_orientation ==
orientation) {
623 if (setOrientedCalibrationMatrix(m_device, m_calibrationMatrix,
orientation)) {
632#ifndef KWIN_BUILD_TESTING
633 if (
name == m_outputName) {
638 auto outputs = kwinApp()->outputBackend()->outputs();
639 for (
int i = 0; i < outputs.count(); ++i) {
665static libinput_led toLibinputLEDS(LEDs leds)
667 quint32 libinputLeds = 0;
669 libinputLeds = libinputLeds | LIBINPUT_LED_NUM_LOCK;
672 libinputLeds = libinputLeds | LIBINPUT_LED_CAPS_LOCK;
675 libinputLeds = libinputLeds | LIBINPUT_LED_SCROLL_LOCK;
677 return libinput_led(libinputLeds);
687 if (m_leds !=
leds) {
700 return QRectF(0, 0, 1, 1);
728#include "moc_device.cpp"
QDBusArgument & operator<<(QDBusArgument &argument, const QMatrix4x4 &matrix)
#define CONFIG(method, condition, function, variable, key)
const QDBusArgument & operator>>(const QDBusArgument &argument, QMatrix4x4 &matrix)
Qt::MouseButton buttonToQtMouseButton(uint32_t button)