diff --git a/src/common/x11wacom.cpp b/src/common/x11wacom.cpp
index e269480..a4d95c8 100644
--- a/src/common/x11wacom.cpp
+++ b/src/common/x11wacom.cpp
@@ -1,157 +1,157 @@
/*
* This file is part of the KDE wacomtablet project. For copyright
* information and license terms see the AUTHORS and COPYING files
* in the top-level directory of this distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "x11wacom.h"
#include "logging.h"
#include "x11input.h"
#include "x11inputdevice.h"
using namespace Wacom;
const TabletArea X11Wacom::getMaximumTabletArea(const QString& deviceName)
{
TabletArea maximumAreaRect;
if (deviceName.isEmpty()) {
qCWarning(COMMON) << QString::fromLatin1("Internal Error: Missing device name parameter!");
return maximumAreaRect;
}
// find the xinput device
X11InputDevice x11Device;
if (!X11Input::findDevice(deviceName, x11Device)) {
qCWarning(COMMON) << QString::fromLatin1("Failed to lookup X11 input device '%1'!").arg(deviceName);
return maximumAreaRect;
}
// get the current property value as backup
static const QString areaProperty = X11Input::PROPERTY_WACOM_TABLET_AREA;
QList previousArea;
if (!x11Device.getLongProperty(areaProperty, previousArea, 4)) {
qCWarning(COMMON) << QString::fromLatin1("Failed to get tablet area property from X11 input device '%1'!").arg(deviceName);
return maximumAreaRect;
}
// reset the area so it turns back to the maximum.. does not seem to be working
QList resetArea;
resetArea.append(-1);
resetArea.append(-1);
resetArea.append(-1);
resetArea.append(-1);
if (!x11Device.setLongProperty(areaProperty, resetArea)) {
qCWarning(COMMON) << QString::fromLatin1("Failed to reset tablet area property on X11 input device '%1'!").arg(deviceName);
return maximumAreaRect;
}
// get the maximum area
QList maximumArea;
if (x11Device.getLongProperty(areaProperty, maximumArea, 4) && maximumArea.size() == 4) {
maximumAreaRect.setX(maximumArea.at(0));
maximumAreaRect.setY(maximumArea.at(1));
- maximumAreaRect.setWidth(maximumArea.at(2));
- maximumAreaRect.setHeight(maximumArea.at(3));
+ maximumAreaRect.setWidth(maximumArea.at(2) - maximumArea.at(0));
+ maximumAreaRect.setHeight(maximumArea.at(3) - maximumArea.at(1));
}
// reset the area back to the previous value
if (!x11Device.setLongProperty(areaProperty, previousArea)) {
qCWarning(COMMON) << QString::fromLatin1("Failed to set tablet area property on X11 input device '%1'!").arg(deviceName);
}
qCDebug(COMMON) << "getMaximumTabletArea result" << maximumAreaRect.toString();
return maximumAreaRect;
}
bool X11Wacom::isScrollDirectionInverted(const QString& deviceName)
{
X11InputDevice device;
if (!X11Input::findDevice(deviceName, device)) {
return false;
}
const auto buttonMap = device.getDeviceButtonMapping();
if (buttonMap.count() == 0 || buttonMap.count() < 5) {
return false;
}
return (buttonMap.at(3) == 5 && buttonMap.at(4) == 4);
}
bool X11Wacom::setCoordinateTransformationMatrix(const QString& deviceName, qreal offsetX, qreal offsetY, qreal width, qreal height)
{
X11InputDevice device;
if (!X11Input::findDevice(deviceName, device)) {
return false;
}
/*
* | width 0 offsetX |
* | 0 height offsetY |
* | 0 0 1 |
*/
QList matrix;
matrix.append(width);
matrix.append(0);
matrix.append(offsetX);
matrix.append(0);
matrix.append(height);
matrix.append(offsetY);
matrix.append(0);
matrix.append(0);
matrix.append(1);
return device.setFloatProperty(X11Input::PROPERTY_TRANSFORM_MATRIX, matrix);
}
bool X11Wacom::setScrollDirection(const QString& deviceName, bool inverted)
{
X11InputDevice device;
if (!X11Input::findDevice(deviceName, device)) {
return false;
}
auto buttonMap = device.getDeviceButtonMapping();
if (buttonMap.count() == 0 || buttonMap.count() < 5) {
return false;
}
if (inverted) {
buttonMap[3] = 5;
buttonMap[4] = 4;
} else {
buttonMap[3] = 4;
buttonMap[4] = 5;
}
return device.setDeviceButtonMapping(buttonMap);
}