XCB: fix leaked QXcbScrollingDevicePrivate
==1585319== 1,112 (720 direct, 392 indirect) bytes in 2 blocks are definitely lost in loss record 110 of 123 ==1585319== at 0x483EF2F: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1585319== by 0x7D01D6C: QXcbConnection::xi2SetupSlavePointerDevice(void*, bool, QPointingDevice*)::{lambda()#1}::operator()() const (qxcbconnection_xi2.cpp:262) ==1585319== by 0x7D025C2: QXcbConnection::xi2SetupSlavePointerDevice(void*, bool, QPointingDevice*) (qxcbconnection_xi2.cpp:316) ==1585319== by 0x7D03D2D: QXcbConnection::xi2SetupDevices() (qxcbconnection_xi2.cpp:499) ==1585319== by 0x7CE81A3: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (qxcbconnection.cpp:105) ==1585319== by 0x7D27BEA: QXcbIntegration::QXcbIntegration(QList<QString> const&, int&, char**) (qxcbintegration.cpp:199) ==1585319== by 0x7C9D282: QXcbIntegrationPlugin::create(QString const&, QList<QString> const&, int&, char**) (qxcbmain.cpp:56) ==1585319== by 0x4B516DE: QPlatformIntegration* qLoadPlugin<QPlatformIntegration, QPlatformIntegrationPlugin, QList<QString> const&, int&, char**&>(QFactoryLoader const*, QString const&, QList<QString> const&, int&, char**&) (qfactoryloader_p.h:108) ==1585319== by 0x4B512A9: QPlatformIntegrationFactory::create(QString const&, QList<QString> const&, int&, char**, QString const&) (qplatformintegrationfactory.cpp:71) ==1585319== by 0x4B074EC: init_platform(QString const&, QString const&, QString const&, int&, char**) (qguiapplication.cpp:1209) ==1585319== by 0x4B0A646: QGuiApplicationPrivate::createPlatformIntegration() (qguiapplication.cpp:1491) ==1585319== by 0x4B0A7C9: QGuiApplicationPrivate::createEventDispatcher() (qguiapplication.cpp:1508) ==1585319== by 0x568853F: QCoreApplicationPrivate::init() (qcoreapplication.cpp:847) ==1585319== by 0x4B0A89F: QGuiApplicationPrivate::init() (qguiapplication.cpp:1532) ==1585319== by 0x4B05D16: QGuiApplication::QGuiApplication(int&, char**, int) (qguiapplication.cpp:653) ==1585319== by 0x451613: main (tst_qmetatype.cpp:2141) Fixes: QTBUG-95468 Pick-to: 6.3 6.2 Change-Id: I7e0b82c2d2fe464082d8fffd1696c0122c3b35b7 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
parent
50b34661fa
commit
3116eddb68
@ -296,7 +296,7 @@ private:
|
||||
QSizeF size; // device size in mm
|
||||
bool providesTouchOrientation = false;
|
||||
};
|
||||
TouchDeviceData *populateTouchDevices(void *info, QXcbScrollingDevicePrivate *scrollingDeviceP);
|
||||
TouchDeviceData *populateTouchDevices(void *info, QXcbScrollingDevicePrivate *scrollingDeviceP, bool *used = nullptr);
|
||||
TouchDeviceData *touchDeviceForId(int id);
|
||||
void xi2HandleEvent(xcb_ge_event_t *event);
|
||||
void xi2HandleGesturePinchEvent(void *event);
|
||||
|
@ -280,6 +280,7 @@ void QXcbConnection::xi2SetupSlavePointerDevice(void *info, bool removeExisting,
|
||||
TabletData tabletData;
|
||||
#endif
|
||||
QXcbScrollingDevicePrivate *scrollingDeviceP = nullptr;
|
||||
bool used = false;
|
||||
auto scrollingDevice = [&]() {
|
||||
if (!scrollingDeviceP)
|
||||
scrollingDeviceP = new QXcbScrollingDevicePrivate(name, deviceInfo->deviceid,
|
||||
@ -439,7 +440,7 @@ void QXcbConnection::xi2SetupSlavePointerDevice(void *info, bool removeExisting,
|
||||
}
|
||||
|
||||
if (!isTablet) {
|
||||
TouchDeviceData *dev = populateTouchDevices(deviceInfo, scrollingDeviceP);
|
||||
TouchDeviceData *dev = populateTouchDevices(deviceInfo, scrollingDeviceP, &used);
|
||||
if (dev && lcQpaXInputDevices().isDebugEnabled()) {
|
||||
if (dev->qtTouchDevice->type() == QInputDevice::DeviceType::TouchScreen)
|
||||
qCDebug(lcQpaXInputDevices, " it's a touchscreen with type %d capabilities 0x%X max touch points %d",
|
||||
@ -462,6 +463,7 @@ void QXcbConnection::xi2SetupSlavePointerDevice(void *info, bool removeExisting,
|
||||
if (master)
|
||||
scrollingDeviceP->seatName = master->seatName();
|
||||
QWindowSystemInterface::registerInputDevice(new QXcbScrollingDevice(*scrollingDeviceP, master));
|
||||
used = true;
|
||||
} else {
|
||||
QWindowSystemInterface::registerInputDevice(new QPointingDevice(
|
||||
name, deviceInfo->deviceid,
|
||||
@ -469,6 +471,11 @@ void QXcbConnection::xi2SetupSlavePointerDevice(void *info, bool removeExisting,
|
||||
caps, 1, buttonCount, (master ? master->seatName() : QString()), QPointingDeviceUniqueId(), master));
|
||||
}
|
||||
}
|
||||
|
||||
if (!used && scrollingDeviceP) {
|
||||
QXcbScrollingDevice *holder = new QXcbScrollingDevice(*scrollingDeviceP, master);
|
||||
holder->deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
void QXcbConnection::xi2SetupDevices()
|
||||
@ -549,7 +556,7 @@ QXcbConnection::TouchDeviceData *QXcbConnection::touchDeviceForId(int id)
|
||||
return dev;
|
||||
}
|
||||
|
||||
QXcbConnection::TouchDeviceData *QXcbConnection::populateTouchDevices(void *info, QXcbScrollingDevicePrivate *scrollingDeviceP)
|
||||
QXcbConnection::TouchDeviceData *QXcbConnection::populateTouchDevices(void *info, QXcbScrollingDevicePrivate *scrollingDeviceP, bool *used)
|
||||
{
|
||||
auto *deviceInfo = reinterpret_cast<xcb_input_xi_device_info_t *>(info);
|
||||
QPointingDevice::Capabilities caps;
|
||||
@ -654,6 +661,7 @@ QXcbConnection::TouchDeviceData *QXcbConnection::populateTouchDevices(void *info
|
||||
dev.qtTouchDevice = new QXcbScrollingDevice(*scrollingDeviceP, master);
|
||||
if (Q_UNLIKELY(!caps.testFlag(QInputDevice::Capability::Scroll)))
|
||||
qCDebug(lcQpaXInputDevices) << "unexpectedly missing RelVert/HorizWheel atoms for touchpad with scroll capability" << dev.qtTouchDevice;
|
||||
*used = true;
|
||||
} else {
|
||||
dev.qtTouchDevice = new QPointingDevice(QString::fromUtf8(xcb_input_xi_device_info_name(deviceInfo),
|
||||
xcb_input_xi_device_info_name_length(deviceInfo)),
|
||||
|
Loading…
Reference in New Issue
Block a user