diff --git a/src/backends/libinput/connection.cpp b/src/backends/libinput/connection.cpp index 96ee0c3ad6..fab8a22b9e 100644 --- a/src/backends/libinput/connection.cpp +++ b/src/backends/libinput/connection.cpp @@ -511,16 +511,19 @@ void Connection::processEvents() if (workspace()) { #ifndef KWIN_BUILD_TESTING - Output *output = tte->device()->output(); - if (!output && workspace()->activeWindow()) { - output = workspace()->activeWindow()->output(); - } - if (!output) { - output = workspace()->activeOutput(); + QPointF globalPos; + if (tte->device()->isMapToWorkspace()) { + globalPos = workspace()->geometry().topLeft() + tte->transformedPosition(workspace()->geometry().size()); + } else { + Output *output = tte->device()->output(); + if (!output && workspace()->activeWindow()) { + output = workspace()->activeWindow()->output(); + } + if (!output) { + output = workspace()->activeOutput(); + } + globalPos = devicePointToGlobalPosition(tte->transformedPosition(output->modeSize()), output); } - const QPointF globalPos = - devicePointToGlobalPosition(tte->transformedPosition(output->modeSize()), - output); #else const QPointF globalPos; #endif diff --git a/src/backends/libinput/device.cpp b/src/backends/libinput/device.cpp index faac6a9f93..334f42ff8a 100644 --- a/src/backends/libinput/device.cpp +++ b/src/backends/libinput/device.cpp @@ -99,6 +99,7 @@ enum class ConfigKey { Calibration, OutputName, OutputArea, + MapToWorkspace }; struct ConfigDataBase @@ -206,6 +207,7 @@ static const QMap> s_configData{ {ConfigKey::Calibration, std::make_shared>()}, {ConfigKey::OutputName, std::make_shared>(QByteArrayLiteral("OutputName"), &Device::setOutputName, &Device::defaultOutputName)}, {ConfigKey::OutputArea, std::make_shared>(QByteArrayLiteral("OutputArea"), &Device::setOutputArea, &Device::defaultOutputArea)}, + {ConfigKey::MapToWorkspace, std::make_shared>(QByteArrayLiteral("MapToWorkspace"), &Device::setMapToWorkspace, &Device::defaultMapToWorkspace)}, }; namespace @@ -711,6 +713,15 @@ void Device::setOutputArea(const QRectF &outputArea) Q_EMIT outputAreaChanged(); } } + +void Device::setMapToWorkspace(bool mapToWorkspace) +{ + if (m_mapToWorkspace != mapToWorkspace) { + m_mapToWorkspace = mapToWorkspace; + writeEntry(ConfigKey::MapToWorkspace, m_mapToWorkspace); + Q_EMIT mapToWorkspaceChanged(); + } +} } } diff --git a/src/backends/libinput/device.h b/src/backends/libinput/device.h index 05e0338acb..d064352bb3 100644 --- a/src/backends/libinput/device.h +++ b/src/backends/libinput/device.h @@ -141,6 +141,8 @@ class KWIN_EXPORT Device : public InputDevice Q_PROPERTY(bool supportsOutputArea READ supportsOutputArea CONSTANT) Q_PROPERTY(QRectF defaultOutputArea READ defaultOutputArea CONSTANT) Q_PROPERTY(QRectF outputArea READ outputArea WRITE setOutputArea NOTIFY outputAreaChanged) + Q_PROPERTY(bool defaultMapToWorkspace READ defaultMapToWorkspace CONSTANT) + Q_PROPERTY(bool mapToWorkspace READ isMapToWorkspace WRITE setMapToWorkspace NOTIFY mapToWorkspaceChanged) public: explicit Device(libinput_device *device, QObject *parent = nullptr); @@ -628,6 +630,18 @@ public: QRectF outputArea() const; void setOutputArea(const QRectF &outputArea); + bool defaultMapToWorkspace() const + { + return defaultValue("MapToWorkspace", false); + } + + bool isMapToWorkspace() const + { + return m_mapToWorkspace; + } + + void setMapToWorkspace(bool mapToWorkspace); + /** * Gets the Device for @p native. @c null if there is no Device for @p native. */ @@ -653,6 +667,7 @@ Q_SIGNALS: void scrollFactorChanged(); void clickMethodChanged(); void outputAreaChanged(); + void mapToWorkspaceChanged(); private: template @@ -740,6 +755,7 @@ private: LEDs m_leds; QRectF m_outputArea = QRectF(0, 0, 1, 1); + bool m_mapToWorkspace = false; }; }