summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp30
-rw-r--r--src/platformsupport/input/shared/qtouchoutputmapping.cpp12
-rw-r--r--src/platformsupport/input/shared/qtouchoutputmapping_p.h4
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp48
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.h10
5 files changed, 68 insertions, 36 deletions
diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
index 32ec9d5452..d53a317fc5 100644
--- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
+++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
@@ -131,7 +131,8 @@ public:
bool m_typeB;
QTransform m_rotate;
bool m_singleTouch;
- int m_screenIndex;
+ QString m_screenName;
+ QPointer<QScreen> m_screen;
};
QEvdevTouchScreenData::QEvdevTouchScreenData(QEvdevTouchScreenHandler *q_ptr, const QStringList &args)
@@ -141,8 +142,7 @@ QEvdevTouchScreenData::QEvdevTouchScreenData(QEvdevTouchScreenHandler *q_ptr, co
hw_range_x_min(0), hw_range_x_max(0),
hw_range_y_min(0), hw_range_y_max(0),
hw_pressure_min(0), hw_pressure_max(0),
- m_typeB(false), m_singleTouch(false),
- m_screenIndex(-1)
+ m_typeB(false), m_singleTouch(false)
{
m_forceToActiveWindow = args.contains(QLatin1String("force_window"));
}
@@ -301,10 +301,10 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
QTouchOutputMapping mapping;
if (mapping.load()) {
- d->m_screenIndex = mapping.screenIndexForDeviceNode(d->deviceNode);
- if (d->m_screenIndex >= 0)
- qCDebug(qLcEvdevTouch, "evdevtouch: Mapping device %s to screen index %d",
- qPrintable(d->deviceNode), d->m_screenIndex);
+ d->m_screenName = mapping.screenNameForDeviceNode(d->deviceNode);
+ if (!d->m_screenName.isEmpty())
+ qCDebug(qLcEvdevTouch, "evdevtouch: Mapping device %s to screen %s",
+ qPrintable(d->deviceNode), qPrintable(d->m_screenName));
}
registerTouchDevice();
@@ -673,10 +673,18 @@ void QEvdevTouchScreenData::reportPoints()
// geometry in the full virtual desktop space, there is nothing else
// left to do since qguiapp will handle the rest.
QScreen *screen = QGuiApplication::primaryScreen();
- if (m_screenIndex >= 0) {
- const QList<QScreen *> screens = QGuiApplication::screens();
- if (m_screenIndex < screens.count())
- screen = screens.at(m_screenIndex);
+ if (!m_screenName.isEmpty()) {
+ if (!m_screen) {
+ const QList<QScreen *> screens = QGuiApplication::screens();
+ for (QScreen *s : screens) {
+ if (s->name() == m_screenName) {
+ m_screen = s;
+ break;
+ }
+ }
+ }
+ if (m_screen)
+ screen = m_screen;
}
winRect = QHighDpi::toNativePixels(screen->geometry(), screen);
}
diff --git a/src/platformsupport/input/shared/qtouchoutputmapping.cpp b/src/platformsupport/input/shared/qtouchoutputmapping.cpp
index 55c1dc34f4..0a1afd4739 100644
--- a/src/platformsupport/input/shared/qtouchoutputmapping.cpp
+++ b/src/platformsupport/input/shared/qtouchoutputmapping.cpp
@@ -71,21 +71,21 @@ bool QTouchOutputMapping::load()
const QVariantMap output = outputs.at(i).toObject().toVariantMap();
if (!output.contains(QStringLiteral("touchDevice")))
continue;
- if (!output.contains(QStringLiteral("virtualIndex"))) {
- qWarning("evdevtouch: Output %d specifies touchDevice but not virtualIndex, this is wrong", i);
+ if (!output.contains(QStringLiteral("name"))) {
+ qWarning("evdevtouch: Output %d specifies touchDevice but not name, this is wrong", i);
continue;
}
const QString &deviceNode = output.value(QStringLiteral("touchDevice")).toString();
- const int screenIndex = output.value(QStringLiteral("virtualIndex")).toInt();
- m_screenIndexTable.insert(deviceNode, screenIndex);
+ const QString &screenName = output.value(QStringLiteral("name")).toString();
+ m_screenTable.insert(deviceNode, screenName);
}
return true;
}
-int QTouchOutputMapping::screenIndexForDeviceNode(const QString &deviceNode)
+QString QTouchOutputMapping::screenNameForDeviceNode(const QString &deviceNode)
{
- return m_screenIndexTable.value(deviceNode, -1);
+ return m_screenTable.value(deviceNode);
}
QT_END_NAMESPACE
diff --git a/src/platformsupport/input/shared/qtouchoutputmapping_p.h b/src/platformsupport/input/shared/qtouchoutputmapping_p.h
index 74999d93ce..94d4dbc3b1 100644
--- a/src/platformsupport/input/shared/qtouchoutputmapping_p.h
+++ b/src/platformsupport/input/shared/qtouchoutputmapping_p.h
@@ -60,10 +60,10 @@ class QTouchOutputMapping
{
public:
bool load();
- int screenIndexForDeviceNode(const QString &deviceNode);
+ QString screenNameForDeviceNode(const QString &deviceNode);
private:
- QHash<QString, int> m_screenIndexTable;
+ QHash<QString, QString> m_screenTable;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp
index 5944e8d51f..a0574b1b32 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp
@@ -159,7 +159,9 @@ static bool parseModeline(const QByteArray &text, drmModeModeInfoPtr mode)
return true;
}
-QEglFSKmsScreen *QEglFSKmsDevice::createScreenForConnector(drmModeResPtr resources, drmModeConnectorPtr connector, int *virtualIndex)
+QEglFSKmsScreen *QEglFSKmsDevice::createScreenForConnector(drmModeResPtr resources,
+ drmModeConnectorPtr connector,
+ VirtualDesktopInfo *vinfo)
{
const QByteArray connectorName = nameForConnector(connector);
@@ -192,8 +194,16 @@ QEglFSKmsScreen *QEglFSKmsDevice::createScreenForConnector(drmModeResPtr resourc
qWarning("Invalid mode \"%s\" for output %s", mode.constData(), connectorName.constData());
configuration = OutputConfigPreferred;
}
- if (virtualIndex)
- *virtualIndex = userConnectorConfig.value(QStringLiteral("virtualIndex"), INT_MAX).toInt();
+ if (vinfo) {
+ *vinfo = VirtualDesktopInfo();
+ vinfo->virtualIndex = userConnectorConfig.value(QStringLiteral("virtualIndex"), INT_MAX).toInt();
+ if (userConnectorConfig.contains(QStringLiteral("virtualPos"))) {
+ const QByteArray vpos = userConnectorConfig.value(QStringLiteral("virtualPos")).toByteArray();
+ const QByteArrayList vposComp = vpos.split(',');
+ if (vposComp.count() == 2)
+ vinfo->virtualPos = QPoint(vposComp[0].trimmed().toInt(), vposComp[1].trimmed().toInt());
+ }
+ }
const uint32_t crtc_id = resources->crtcs[crtc];
@@ -357,22 +367,24 @@ QEglFSKmsDevice::~QEglFSKmsDevice()
struct OrderedScreen
{
- OrderedScreen() : screen(nullptr), index(-1) { }
- OrderedScreen(QEglFSKmsScreen *screen, int index) : screen(screen), index(index) { }
+ OrderedScreen() : screen(nullptr) { }
+ OrderedScreen(QEglFSKmsScreen *screen, const QEglFSKmsDevice::VirtualDesktopInfo &vinfo)
+ : screen(screen), vinfo(vinfo) { }
QEglFSKmsScreen *screen;
- int index;
+ QEglFSKmsDevice::VirtualDesktopInfo vinfo;
};
QDebug operator<<(QDebug dbg, const OrderedScreen &s)
{
QDebugStateSaver saver(dbg);
- dbg.nospace() << "OrderedScreen(" << s.screen << " : " << s.index << ")";
+ dbg.nospace() << "OrderedScreen(" << s.screen << " : " << s.vinfo.virtualIndex
+ << " / " << s.vinfo.virtualPos << ")";
return dbg;
}
static bool orderedScreenLessThan(const OrderedScreen &a, const OrderedScreen &b)
{
- return a.index < b.index;
+ return a.vinfo.virtualIndex < b.vinfo.virtualIndex;
}
void QEglFSKmsDevice::createScreens()
@@ -390,10 +402,10 @@ void QEglFSKmsDevice::createScreens()
if (!connector)
continue;
- int virtualIndex;
- QEglFSKmsScreen *screen = createScreenForConnector(resources, connector, &virtualIndex);
+ VirtualDesktopInfo vinfo;
+ QEglFSKmsScreen *screen = createScreenForConnector(resources, connector, &vinfo);
if (screen)
- screens.append(OrderedScreen(screen, virtualIndex));
+ screens.append(OrderedScreen(screen, vinfo));
drmModeFreeConnector(connector);
}
@@ -411,11 +423,15 @@ void QEglFSKmsDevice::createScreens()
for (const OrderedScreen &orderedScreen : screens) {
QEglFSKmsScreen *s = orderedScreen.screen;
// set up a horizontal or vertical virtual desktop
- s->setVirtualPosition(pos);
- if (m_integration->virtualDesktopLayout() == QEglFSKmsIntegration::VirtualDesktopLayoutVertical)
- pos.ry() += s->geometry().height();
- else
- pos.rx() += s->geometry().width();
+ if (orderedScreen.vinfo.virtualPos.isNull()) {
+ s->setVirtualPosition(pos);
+ if (m_integration->virtualDesktopLayout() == QEglFSKmsIntegration::VirtualDesktopLayoutVertical)
+ pos.ry() += s->geometry().height();
+ else
+ pos.rx() += s->geometry().width();
+ } else {
+ s->setVirtualPosition(orderedScreen.vinfo.virtualPos);
+ }
qCDebug(qLcEglfsKmsDebug) << "Adding screen" << s << "to QPA with geometry" << s->geometry();
// The order in qguiapp's screens list will match the order set by
// virtualIndex. This is not only handy but also required since for instance
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.h
index 4aad2e0143..3e7ac7e3f0 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.h
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.h
@@ -53,6 +53,12 @@ QT_BEGIN_NAMESPACE
class Q_EGLFS_EXPORT QEglFSKmsDevice
{
public:
+ struct VirtualDesktopInfo {
+ VirtualDesktopInfo() : virtualIndex(0) { }
+ int virtualIndex;
+ QPoint virtualPos;
+ };
+
QEglFSKmsDevice(QEglFSKmsIntegration *integration, const QString &path);
virtual ~QEglFSKmsDevice();
@@ -79,7 +85,9 @@ protected:
quint32 m_connector_allocator;
int crtcForConnector(drmModeResPtr resources, drmModeConnectorPtr connector);
- QEglFSKmsScreen *createScreenForConnector(drmModeResPtr resources, drmModeConnectorPtr connector, int *virtualIndex);
+ QEglFSKmsScreen *createScreenForConnector(drmModeResPtr resources,
+ drmModeConnectorPtr connector,
+ VirtualDesktopInfo *vinfo);
drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name);
static void pageFlipHandler(int fd,