|
|
|
|
@ -101,7 +101,9 @@ enum class ConfigKey { |
|
|
|
|
ScrollMethod, |
|
|
|
|
ScrollButton, |
|
|
|
|
ClickMethod, |
|
|
|
|
ScrollFactor |
|
|
|
|
ScrollFactor, |
|
|
|
|
Orientation, |
|
|
|
|
Calibration |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct ConfigData { |
|
|
|
|
@ -121,6 +123,14 @@ struct ConfigData { |
|
|
|
|
: key(_key) |
|
|
|
|
{ qrealSetter.setter = _setter; qrealSetter.defaultValue = _defaultValue; } |
|
|
|
|
|
|
|
|
|
explicit ConfigData(QByteArray _key, void (Device::*_setter)(Qt::ScreenOrientation), Qt::ScreenOrientation (Device::*_defaultValue)() const = nullptr) |
|
|
|
|
: key(_key) |
|
|
|
|
{ screenOrientationSetter.setter = _setter; screenOrientationSetter.defaultValue = _defaultValue; } |
|
|
|
|
|
|
|
|
|
explicit ConfigData(QByteArray _key, void (Device::*_setter)(QMatrix4x4), QMatrix4x4 (Device::*_defaultValue)() const = nullptr) |
|
|
|
|
: key(_key) |
|
|
|
|
{ qMatrix4x4Setter.setter = _setter, qMatrix4x4Setter.defaultValue = _defaultValue; } |
|
|
|
|
|
|
|
|
|
QByteArray key; |
|
|
|
|
|
|
|
|
|
struct { |
|
|
|
|
@ -140,6 +150,14 @@ struct ConfigData { |
|
|
|
|
void (Device::*setter)(qreal) = nullptr; |
|
|
|
|
qreal (Device::*defaultValue)() const; |
|
|
|
|
} qrealSetter; |
|
|
|
|
struct { |
|
|
|
|
void (Device::*setter)(Qt::ScreenOrientation) = nullptr; |
|
|
|
|
Qt::ScreenOrientation (Device::*defaultValue)() const; |
|
|
|
|
} screenOrientationSetter; |
|
|
|
|
struct { |
|
|
|
|
void (Device::*setter)(QMatrix4x4) = nullptr; |
|
|
|
|
QMatrix4x4 (Device::*defaultValue)() const; |
|
|
|
|
} qMatrix4x4Setter; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const QMap<ConfigKey, ConfigData> s_configData { |
|
|
|
|
@ -157,18 +175,19 @@ static const QMap<ConfigKey, ConfigData> s_configData { |
|
|
|
|
{ConfigKey::ScrollMethod, ConfigData(QByteArrayLiteral("ScrollMethod"), &Device::activateScrollMethodFromInt, &Device::defaultScrollMethodToInt)}, |
|
|
|
|
{ConfigKey::ScrollButton, ConfigData(QByteArrayLiteral("ScrollButton"), &Device::setScrollButton, &Device::defaultScrollButton)}, |
|
|
|
|
{ConfigKey::ClickMethod, ConfigData(QByteArrayLiteral("ClickMethod"), &Device::setClickMethodFromInt, &Device::defaultClickMethodToInt)}, |
|
|
|
|
{ConfigKey::ScrollFactor, ConfigData(QByteArrayLiteral("ScrollFactor"), &Device::setScrollFactor, &Device::scrollFactorDefault)} |
|
|
|
|
{ConfigKey::ScrollFactor, ConfigData(QByteArrayLiteral("ScrollFactor"), &Device::setScrollFactor, &Device::scrollFactorDefault)}, |
|
|
|
|
{ConfigKey::Orientation, ConfigData(QByteArrayLiteral("Orientation"), &Device::setOrientation, &Device::defaultOrientation)}, |
|
|
|
|
{ConfigKey::Calibration, ConfigData(QByteArrayLiteral("CalibrationMatrix"), &Device::setCalibrationMatrix, &Device::defaultCalibrationMatrix)} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
QMatrix4x4 getDefaultCalibrationMatrix(libinput_device *device) |
|
|
|
|
QMatrix4x4 getMatrix(libinput_device *device, std::function<int(libinput_device*, float[6])> getter) |
|
|
|
|
{ |
|
|
|
|
float matrix[6]; |
|
|
|
|
const int ret = libinput_device_config_calibration_get_default_matrix(device, matrix); |
|
|
|
|
if (ret == 0) { |
|
|
|
|
return QMatrix4x4(); |
|
|
|
|
if(!getter(device, matrix)) { |
|
|
|
|
return {}; |
|
|
|
|
} |
|
|
|
|
return QMatrix4x4{ |
|
|
|
|
return QMatrix4x4 { |
|
|
|
|
matrix[0], matrix[1], matrix[2], 0.0f, |
|
|
|
|
matrix[3], matrix[4], matrix[5], 0.0f, |
|
|
|
|
0.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
@ -176,23 +195,23 @@ QMatrix4x4 getDefaultCalibrationMatrix(libinput_device *device) |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void setOrientedCalibrationMatrix(libinput_device *device, QMatrix4x4 matrix, Qt::ScreenOrientation orientation) { |
|
|
|
|
// 90 deg cw:
|
|
|
|
|
static const QMatrix4x4 portraitMatrix{ |
|
|
|
|
bool setOrientedCalibrationMatrix(libinput_device *device, QMatrix4x4 matrix, Qt::ScreenOrientation orientation) { |
|
|
|
|
// 90 deg cw
|
|
|
|
|
static const QMatrix4x4 portraitMatrix { |
|
|
|
|
0.0f, -1.0f, 1.0f, 0.0f, |
|
|
|
|
1.0f, 0.0f, 0.0f, 0.0f, |
|
|
|
|
0.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
0.0f, 0.0f, 0.0f, 1.0f |
|
|
|
|
}; |
|
|
|
|
// 180 deg cw:
|
|
|
|
|
static const QMatrix4x4 invertedLandscapeMatrix{ |
|
|
|
|
// 180 deg cw
|
|
|
|
|
static const QMatrix4x4 invertedLandscapeMatrix { |
|
|
|
|
-1.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
0.0f, -1.0f, 1.0f, 0.0f, |
|
|
|
|
0.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
0.0f, 0.0f, 0.0f, 1.0f |
|
|
|
|
}; |
|
|
|
|
// 270 deg cw
|
|
|
|
|
static const QMatrix4x4 invertedPortraitMatrix{ |
|
|
|
|
static const QMatrix4x4 invertedPortraitMatrix { |
|
|
|
|
0.0f, 1.0f, 0.0f, 0.0f, |
|
|
|
|
-1.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
0.0f, 0.0f, 1.0f, 0.0f, |
|
|
|
|
@ -215,12 +234,9 @@ void setOrientedCalibrationMatrix(libinput_device *device, QMatrix4x4 matrix, Qt |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const auto columnOrder = matrix.constData(); |
|
|
|
|
float m[6] = { |
|
|
|
|
columnOrder[0], columnOrder[4], columnOrder[8], |
|
|
|
|
columnOrder[1], columnOrder[5], columnOrder[9] |
|
|
|
|
}; |
|
|
|
|
libinput_device_config_calibration_set_matrix(device, m); |
|
|
|
|
float data[6] { matrix(0,0), matrix(0,1), matrix(0,2), |
|
|
|
|
matrix(1,0), matrix(1,1), matrix(1,2) }; |
|
|
|
|
return libinput_device_config_calibration_set_matrix(device, data) == LIBINPUT_CONFIG_STATUS_SUCCESS; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -279,8 +295,8 @@ Device::Device(libinput_device *device, QObject *parent) |
|
|
|
|
, m_pointerAccelerationProfile(libinput_device_config_accel_get_profile(m_device)) |
|
|
|
|
, m_enabled(m_supportsDisableEvents ? libinput_device_config_send_events_get_mode(m_device) == LIBINPUT_CONFIG_SEND_EVENTS_ENABLED : true) |
|
|
|
|
, m_config() |
|
|
|
|
, m_defaultCalibrationMatrix(m_supportsCalibrationMatrix ? getDefaultCalibrationMatrix(m_device) : QMatrix4x4{}) |
|
|
|
|
, m_calibrationMatrix(m_defaultCalibrationMatrix) |
|
|
|
|
, m_defaultCalibrationMatrix(getMatrix(m_device, &libinput_device_config_calibration_get_default_matrix)) |
|
|
|
|
, m_calibrationMatrix(getMatrix(m_device, &libinput_device_config_calibration_get_matrix)) |
|
|
|
|
, m_supportedClickMethods(libinput_device_config_click_get_methods(m_device)) |
|
|
|
|
, m_defaultClickMethod(libinput_device_config_click_get_default_method(m_device)) |
|
|
|
|
, m_clickMethod(libinput_device_config_click_get_method(m_device)) |
|
|
|
|
@ -322,6 +338,14 @@ Device::Device(libinput_device *device, QObject *parent) |
|
|
|
|
m_alphaNumericKeyboard = checkAlphaNumericKeyboard(m_device); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (m_supportsCalibrationMatrix && |
|
|
|
|
m_calibrationMatrix != m_defaultCalibrationMatrix) { |
|
|
|
|
float matrix[] {m_defaultCalibrationMatrix(0,0), m_defaultCalibrationMatrix(0,1), m_defaultCalibrationMatrix(0,2), |
|
|
|
|
m_defaultCalibrationMatrix(1,0), m_defaultCalibrationMatrix(1,1), m_defaultCalibrationMatrix(1,2)}; |
|
|
|
|
libinput_device_config_calibration_set_matrix(m_device, matrix); |
|
|
|
|
m_calibrationMatrix = m_defaultCalibrationMatrix; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
qDBusRegisterMetaType<QMatrix4x4>(); |
|
|
|
|
|
|
|
|
|
s_devices << this; |
|
|
|
|
@ -379,6 +403,19 @@ void Device::loadConfiguration() |
|
|
|
|
readEntry(key, it.value().quint32Setter, 0); |
|
|
|
|
readEntry(key, it.value().stringSetter, ""); |
|
|
|
|
readEntry(key, it.value().qrealSetter, 1.0); |
|
|
|
|
|
|
|
|
|
if(it.value().screenOrientationSetter.setter != nullptr) { |
|
|
|
|
auto setter = it.value().screenOrientationSetter; |
|
|
|
|
int def = setter.defaultValue ? (this->*(setter.defaultValue))() : Qt::PrimaryOrientation; |
|
|
|
|
int orientation = m_config.readEntry(key.constData(), def); |
|
|
|
|
(this->*(setter.setter))(static_cast<Qt::ScreenOrientation>(orientation)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(it.value().qMatrix4x4Setter.setter != nullptr) { |
|
|
|
|
auto setter = it.value().qMatrix4x4Setter; |
|
|
|
|
QMatrix4x4 def = setter.defaultValue ? (this->*(setter.defaultValue))() : QMatrix4x4(); |
|
|
|
|
(this->*(setter.setter))(m_config.readEntry(key.constData(), QVariant(def)).value<QMatrix4x4>()); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
m_loading = false; |
|
|
|
|
@ -572,14 +609,15 @@ void Device::setScrollFactor(qreal factor) |
|
|
|
|
|
|
|
|
|
void Device::setOrientation(Qt::ScreenOrientation orientation) |
|
|
|
|
{ |
|
|
|
|
if (!m_supportsCalibrationMatrix || orientation == m_orientation) { |
|
|
|
|
if (!m_supportsCalibrationMatrix || m_orientation == orientation) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
setOrientedCalibrationMatrix(m_device, m_calibrationMatrix, orientation); |
|
|
|
|
|
|
|
|
|
m_orientation = orientation; |
|
|
|
|
Q_EMIT orientationChanged(); |
|
|
|
|
if (setOrientedCalibrationMatrix(m_device, m_calibrationMatrix, orientation)) { |
|
|
|
|
writeEntry(ConfigKey::Orientation, static_cast<int>(orientation)); |
|
|
|
|
m_orientation = orientation; |
|
|
|
|
Q_EMIT orientationChanged(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Device::setCalibrationMatrix(QMatrix4x4 matrix) { |
|
|
|
|
@ -587,9 +625,12 @@ void Device::setCalibrationMatrix(QMatrix4x4 matrix) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
setOrientedCalibrationMatrix(m_device, matrix, m_orientation); |
|
|
|
|
if(setOrientedCalibrationMatrix(m_device, matrix, m_orientation)) { |
|
|
|
|
writeEntry(ConfigKey::Calibration, QVariant(matrix)); |
|
|
|
|
m_calibrationMatrix = matrix; |
|
|
|
|
Q_EMIT calibrationMatrixChanged(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
m_calibrationMatrix = matrix; |
|
|
|
|
Q_EMIT calibrationMatrixChanged(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -633,3 +674,4 @@ void Device::setLeds(LEDs leds) |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|