diff options
-rw-r--r-- | src/gui/kernel/qinputdevice.cpp | 23 | ||||
-rw-r--r-- | src/gui/kernel/qinputdevice.h | 5 | ||||
-rw-r--r-- | src/gui/kernel/qinputdevice_p.h | 12 |
3 files changed, 40 insertions, 0 deletions
diff --git a/src/gui/kernel/qinputdevice.cpp b/src/gui/kernel/qinputdevice.cpp index d64f2c4ddc..5c1e433ef5 100644 --- a/src/gui/kernel/qinputdevice.cpp +++ b/src/gui/kernel/qinputdevice.cpp @@ -113,6 +113,29 @@ QInputDevice::QInputDevice(QInputDevicePrivate &d, QObject *parent) } /*! + Returns the region within the \l{QScreen::availableVirtualGeometry}{virtual desktop} + that this device can access. + + For example a \l {QInputDevice::DeviceType::TouchScreen}{TouchScreen} input + device is fixed in place upon a single physical screen, and usually + calibrated so that this area is the same as QScreen::geometry(); whereas a + \l {QInputDevice::DeviceType::Mouse}{Mouse} can probably access all screens + on the virtual desktop. A Wacom graphics tablet may be configured in a way + that it's mapped to all screens, or only to the screen where the user + prefers to create drawings, or to the window in which drawing occurs. + A \l {QInputDevice::DeviceType::Stylus}{Stylus} device that is integrated + with a touchscreen may be physically limited to that screen. + + If the returned rectangle is \l {null}{QRect::isNull()}, it means this device + can access the entire virtual desktop. +*/ +QRect QInputDevice::availableVirtualGeometry() const +{ + Q_D(const QInputDevice); + return d->availableVirtualGeometry; +} + +/*! Returns the device name. This string may be empty. It is however useful on systems that have diff --git a/src/gui/kernel/qinputdevice.h b/src/gui/kernel/qinputdevice.h index 5bff29f897..aa6b3aaf7c 100644 --- a/src/gui/kernel/qinputdevice.h +++ b/src/gui/kernel/qinputdevice.h @@ -58,6 +58,7 @@ class Q_GUI_EXPORT QInputDevice : public QObject Q_PROPERTY(Capabilities capabilities READ capabilities CONSTANT) Q_PROPERTY(qint64 id READ id CONSTANT) Q_PROPERTY(QString seatName READ seatName CONSTANT) + Q_PROPERTY(QRect availableVirtualGeometry READ availableVirtualGeometry NOTIFY availableVirtualGeometryChanged) public: enum class DeviceType : qint16 { @@ -106,12 +107,16 @@ public: bool hasCapability(Capability cap) const; qint64 id() const; QString seatName() const; + QRect availableVirtualGeometry() const; static QList<const QInputDevice *> devices(); static const QInputDevice *primaryKeyboard(const QString& seatName = QString()); bool operator==(const QInputDevice &other) const; +Q_SIGNALS: + void availableVirtualGeometryChanged(QRect area); + protected: QInputDevice(QInputDevicePrivate &d, QObject *parent = nullptr); diff --git a/src/gui/kernel/qinputdevice_p.h b/src/gui/kernel/qinputdevice_p.h index 3115f6bf92..53f379f42c 100644 --- a/src/gui/kernel/qinputdevice_p.h +++ b/src/gui/kernel/qinputdevice_p.h @@ -77,6 +77,7 @@ public: QString name; QString seatName; QString busId; + QRect availableVirtualGeometry; void *extra = nullptr; // The QPA plugin can store arbitrary device-specific data here void *qqExtra = nullptr; // Qt Quick can store arbitrary device-specific data here qint64 id = 0; @@ -89,6 +90,17 @@ public: static bool isRegistered(const QInputDevice *dev); static const QInputDevice *fromId(qint64 id); // window system ID (e.g. xinput id), not QPointingDeviceUniqueId + void setAvailableVirtualGeometry(QRect a) + { + if (a == availableVirtualGeometry) + return; + + availableVirtualGeometry = a; + capabilities |= qint32(QInputDevice::Capability::NormalizedPosition); + Q_Q(QInputDevice); + emit q->availableVirtualGeometryChanged(availableVirtualGeometry); + } + inline static QInputDevicePrivate *get(QInputDevice *q) { return static_cast<QInputDevicePrivate *>(QObjectPrivate::get(q)); |