diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-06-08 18:42:22 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-07-06 10:09:02 +0000 |
commit | 546e44d473d6fece9a8996415456ac494ea3a046 (patch) | |
tree | 58381f7306665fa16ad49b6a7240b1c744eb3c57 | |
parent | 8dd6957cd7a1d86714b32b97dffe603a8636848a (diff) |
Add QInputDevice::availableVirtualGeometry()
This property tells what part of the virtual desktop the input device
can access.
This is not a one-to-one mapping with a QScreen, because a Wacom tablet
might be configured to access a whole desktop, a whole screen, or an
area corresponding to the drawing area of one window; a mouse normally
can access the whole desktop (so QScreen::virtualGeometry() would be
identical to QInputDevice::availableVirtualGeometry()); a touchscreen
normally is mapped to one screen but could be mapped differently; etc.
It's possible to find the intersection of the rectangular area with the
screen(s) that it overlaps, though.
Task-number: QTBUG-78839
Change-Id: I9040e20fb5a3dec8a9a0dd827735826c4c1eea38
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-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)); |