From 1e39b39ddb478719682948bed329e891b26d7bf6 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 18 Jun 2020 16:51:02 +0200 Subject: [PATCH] xcb: remove multi-connection code path This code was introduced in 2011 as an experimental feature and have been untested/unmaintained ever since. It's time to remove it for the following reasons: - It has never been documented in QGuiApplication under "Supported Command Line Options". The intended command line was: ./app -platform xcb:address:display - I am not aware of other toolkits that would provide this functionality - connecting to several X displays simultaneously. - XCB plugin respects the "-display" command line and DISPLAY envvar which should be sufficient. So the "workaround" to get your window on 2 X displays is: ./app -display :0 ./app -display :1 - There are no JIRA bugs where users would complain that this feature does not work. AFAICT it has not worked for years. Almost all functions care only about the "default" connection, and don't attempt to support multi-connection. - This will stop confusing people who want to contribute to the XCB plugin. [ChangeLog][Platform Specific Changes][X11] Connecting to multiple X servers simultaneously within the same application is no longer supported. Task-number: QTBUG-52408 Change-Id: I61ce23480702bb89b02c6028fa0986fe63481978 Reviewed-by: Volker Hilsheimer --- .../xcb_egl/qxcbeglnativeinterfacehandler.cpp | 2 +- src/plugins/platforms/xcb/qxcbintegration.cpp | 55 +++++++------------ src/plugins/platforms/xcb/qxcbintegration.h | 6 +- src/plugins/platforms/xcb/qxcbmain.cpp | 2 +- .../platforms/xcb/qxcbnativeinterface.cpp | 50 ++++++++--------- 5 files changed, 51 insertions(+), 64 deletions(-) diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.cpp index c0e3f820fe..1eecfa8a26 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.cpp @@ -107,7 +107,7 @@ QPlatformNativeInterface::NativeResourceForWindowFunction QXcbEglNativeInterface void *QXcbEglNativeInterfaceHandler::eglDisplay() { QXcbIntegration *integration = QXcbIntegration::instance(); - QXcbEglIntegration *eglIntegration = static_cast(integration->defaultConnection()->glIntegration()); + QXcbEglIntegration *eglIntegration = static_cast(integration->connection()->glIntegration()); return eglIntegration->eglDisplay(); } diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index cec25ef47b..e49ca5225c 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -137,6 +137,8 @@ QXcbIntegration::QXcbIntegration(const QStringList ¶meters, int &argc, char , m_canGrab(true) , m_defaultVisualId(UINT_MAX) { + Q_UNUSED(parameters); + m_instance = this; qApp->setAttribute(Qt::AA_CompressHighFrequencyEvents, true); @@ -196,40 +198,27 @@ QXcbIntegration::QXcbIntegration(const QStringList ¶meters, int &argc, char if (canNotGrabEnv) m_canGrab = false; - const int numParameters = parameters.size(); - m_connections.reserve(1 + numParameters / 2); - - auto conn = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName); - if (!conn->isConnected()) { - delete conn; + m_connection = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName); + if (!m_connection->isConnected()) { + delete m_connection; + m_connection = nullptr; return; } - m_connections << conn; - - // ### Qt 6 (QTBUG-52408) remove this multi-connection code path - for (int i = 0; i < numParameters - 1; i += 2) { - qCDebug(lcQpaXcb) << "connecting to additional display: " << parameters.at(i) << parameters.at(i+1); - QString display = parameters.at(i) + QLatin1Char(':') + parameters.at(i+1); - conn = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, display.toLatin1().constData()); - if (conn->isConnected()) - m_connections << conn; - else - delete conn; - } m_fontDatabase.reset(new QGenericUnixFontDatabase()); #if QT_CONFIG(xcb_native_painting) if (nativePaintingEnabled()) { qCDebug(lcQpaXcb, "QXCB USING NATIVE PAINTING"); - qt_xcb_native_x11_info_init(defaultConnection()); + qt_xcb_native_x11_info_init(connection()); } #endif } QXcbIntegration::~QXcbIntegration() { - qDeleteAll(m_connections); + delete m_connection; + m_connection = nullptr; m_instance = nullptr; } @@ -249,7 +238,7 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const const bool isTrayIconWindow = QXcbWindow::isTrayIconWindow(window);; if (window->type() != Qt::Desktop && !isTrayIconWindow) { if (window->supportsOpenGL()) { - glIntegration = defaultConnection()->glIntegration(); + glIntegration = connection()->glIntegration(); if (glIntegration) { QXcbWindow *xcbWindow = glIntegration->createWindow(window); xcbWindow->create(); @@ -324,7 +313,7 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const case OpenGL: case ThreadedOpenGL: { - if (const auto *integration = defaultConnection()->glIntegration()) + if (const auto *integration = connection()->glIntegration()) return cap != ThreadedOpenGL || integration->supportsThreadedOpenGL(); return false; } @@ -339,8 +328,8 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const case SwitchableWidgetComposition: { - return m_connections.at(0)->glIntegration() - && m_connections.at(0)->glIntegration()->supportsSwitchableWidgetComposition(); + return m_connection->glIntegration() + && m_connection->glIntegration()->supportsSwitchableWidgetComposition(); } default: return QPlatformIntegration::hasCapability(cap); @@ -349,7 +338,7 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const QAbstractEventDispatcher *QXcbIntegration::createEventDispatcher() const { - return QXcbEventDispatcher::createEventDispatcher(defaultConnection()); + return QXcbEventDispatcher::createEventDispatcher(connection()); } void QXcbIntegration::initialize() @@ -364,7 +353,7 @@ void QXcbIntegration::initialize() if (!m_inputContext && icStr != defaultInputContext && icStr != QLatin1String("none")) m_inputContext.reset(QPlatformInputContextFactory::create(defaultInputContext)); - defaultConnection()->keyboard()->initialize(); + connection()->keyboard()->initialize(); } void QXcbIntegration::moveToScreen(QWindow *window, int screen) @@ -386,7 +375,7 @@ QPlatformNativeInterface * QXcbIntegration::nativeInterface() const #ifndef QT_NO_CLIPBOARD QPlatformClipboard *QXcbIntegration::clipboard() const { - return m_connections.at(0)->clipboard(); + return m_connection->clipboard(); } #endif @@ -402,7 +391,7 @@ QPlatformDrag *QXcbIntegration::drag() const return simpleDrag; } - return m_connections.at(0)->drag(); + return m_connection->drag(); } #endif @@ -433,12 +422,12 @@ QPlatformServices *QXcbIntegration::services() const Qt::KeyboardModifiers QXcbIntegration::queryKeyboardModifiers() const { - return m_connections.at(0)->queryKeyboardModifiers(); + return m_connection->queryKeyboardModifiers(); } QList QXcbIntegration::possibleKeys(const QKeyEvent *e) const { - return m_connections.at(0)->keyboard()->possibleKeys(e); + return m_connection->keyboard()->possibleKeys(e); } QStringList QXcbIntegration::themeNames() const @@ -469,7 +458,7 @@ QVariant QXcbIntegration::styleHint(QPlatformIntegration::StyleHint hint) const // The default (in QPlatformTheme::defaultThemeHint) is 10 pixels, but // on a high-resolution screen it makes sense to increase it. qreal dpi = 100.0; - if (const QXcbScreen *screen = defaultConnection()->primaryScreen()) { + if (const QXcbScreen *screen = connection()->primaryScreen()) { if (screen->logicalDpi().first > dpi) dpi = screen->logicalDpi().first; if (screen->logicalDpi().second > dpi) @@ -540,9 +529,7 @@ QPlatformSessionManager *QXcbIntegration::createPlatformSessionManager(const QSt void QXcbIntegration::sync() { - for (int i = 0; i < m_connections.size(); i++) { - m_connections.at(i)->sync(); - } + m_connection->sync(); } // For QApplication::beep() diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index 571726c354..a67e79e0b8 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -102,8 +102,8 @@ public: QPlatformTheme *createPlatformTheme(const QString &name) const override; QVariant styleHint(StyleHint hint) const override; - bool hasDefaultConnection() const { return !m_connections.isEmpty(); } - QXcbConnection *defaultConnection() const { return m_connections.first(); } + bool hasConnection() const { return m_connection; } + QXcbConnection *connection() const { return m_connection; } QByteArray wmClass() const; @@ -124,7 +124,7 @@ public: static QXcbIntegration *instance() { return m_instance; } private: - QList m_connections; + QXcbConnection *m_connection = nullptr; QScopedPointer m_fontDatabase; QScopedPointer m_nativeInterface; diff --git a/src/plugins/platforms/xcb/qxcbmain.cpp b/src/plugins/platforms/xcb/qxcbmain.cpp index c1e37f3704..1fb5f4a841 100644 --- a/src/plugins/platforms/xcb/qxcbmain.cpp +++ b/src/plugins/platforms/xcb/qxcbmain.cpp @@ -54,7 +54,7 @@ QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const { if (!system.compare(QLatin1String("xcb"), Qt::CaseInsensitive)) { auto xcbIntegration = new QXcbIntegration(parameters, argc, argv); - if (!xcbIntegration->hasDefaultConnection()) { + if (!xcbIntegration->hasConnection()) { delete xcbIntegration; return nullptr; } diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index 30fa6864ac..fba62c57b5 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -362,27 +362,27 @@ void *QXcbNativeInterface::getTimestamp(const QXcbScreen *screen) void *QXcbNativeInterface::startupId() { QXcbIntegration* integration = QXcbIntegration::instance(); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) - return reinterpret_cast(const_cast(defaultConnection->startupId().constData())); + QXcbConnection *connection = integration->connection(); + if (connection) + return reinterpret_cast(const_cast(connection->startupId().constData())); return nullptr; } void *QXcbNativeInterface::x11Screen() { QXcbIntegration *integration = QXcbIntegration::instance(); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) - return reinterpret_cast(defaultConnection->primaryScreenNumber()); + QXcbConnection *connection = integration->connection(); + if (connection) + return reinterpret_cast(connection->primaryScreenNumber()); return nullptr; } void *QXcbNativeInterface::rootWindow() { QXcbIntegration *integration = QXcbIntegration::instance(); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) - return reinterpret_cast(defaultConnection->rootWindow()); + QXcbConnection *connection = integration->connection(); + if (connection) + return reinterpret_cast(connection->rootWindow()); return nullptr; } @@ -390,9 +390,9 @@ void *QXcbNativeInterface::display() { #if QT_CONFIG(xcb_xlib) QXcbIntegration *integration = QXcbIntegration::instance(); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) - return defaultConnection->xlib_display(); + QXcbConnection *connection = integration->connection(); + if (connection) + return connection->xlib_display(); #endif return nullptr; } @@ -400,17 +400,17 @@ void *QXcbNativeInterface::display() void *QXcbNativeInterface::connection() { QXcbIntegration *integration = QXcbIntegration::instance(); - return integration->defaultConnection()->xcb_connection(); + return integration->connection()->xcb_connection(); } void *QXcbNativeInterface::atspiBus() { QXcbIntegration *integration = static_cast(QGuiApplicationPrivate::platformIntegration()); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) { - auto atspiBusAtom = defaultConnection->atom(QXcbAtom::AT_SPI_BUS); - auto reply = Q_XCB_REPLY(xcb_get_property, defaultConnection->xcb_connection(), - false, defaultConnection->rootWindow(), + QXcbConnection *connection = integration->connection(); + if (connection) { + auto atspiBusAtom = connection->atom(QXcbAtom::AT_SPI_BUS); + auto reply = Q_XCB_REPLY(xcb_get_property, connection->xcb_connection(), + false, connection->rootWindow(), atspiBusAtom, XCB_ATOM_STRING, 0, 128); if (!reply) return nullptr; @@ -440,29 +440,29 @@ void QXcbNativeInterface::setAppUserTime(QScreen* screen, xcb_timestamp_t time) qint32 QXcbNativeInterface::generatePeekerId() { QXcbIntegration *integration = QXcbIntegration::instance(); - return integration->defaultConnection()->eventQueue()->generatePeekerId(); + return integration->connection()->eventQueue()->generatePeekerId(); } bool QXcbNativeInterface::removePeekerId(qint32 peekerId) { QXcbIntegration *integration = QXcbIntegration::instance(); - return integration->defaultConnection()->eventQueue()->removePeekerId(peekerId); + return integration->connection()->eventQueue()->removePeekerId(peekerId); } bool QXcbNativeInterface::peekEventQueue(QXcbEventQueue::PeekerCallback peeker, void *peekerData, QXcbEventQueue::PeekOptions option, qint32 peekerId) { QXcbIntegration *integration = QXcbIntegration::instance(); - return integration->defaultConnection()->eventQueue()->peekEventQueue(peeker, peekerData, option, peekerId); + return integration->connection()->eventQueue()->peekEventQueue(peeker, peekerData, option, peekerId); } void QXcbNativeInterface::setStartupId(const char *data) { QByteArray startupId(data); QXcbIntegration *integration = QXcbIntegration::instance(); - QXcbConnection *defaultConnection = integration->defaultConnection(); - if (defaultConnection) - defaultConnection->setStartupId(startupId); + QXcbConnection *connection = integration->connection(); + if (connection) + connection->setStartupId(startupId); } QXcbScreen *QXcbNativeInterface::qPlatformScreenForWindow(QWindow *window) @@ -671,7 +671,7 @@ QString QXcbNativeInterface::dumpConnectionNativeWindows(const QXcbConnection *c QString QXcbNativeInterface::dumpNativeWindows(WId root) const { - return dumpConnectionNativeWindows(QXcbIntegration::instance()->defaultConnection(), root); + return dumpConnectionNativeWindows(QXcbIntegration::instance()->connection(), root); } QT_END_NAMESPACE