From 67cc8fea106c35c7ca75bf476667d07b3bbf3257 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 19 Feb 2018 11:07:43 +0100 Subject: XCB: Do not create instance of QPlatformIntegration for invalid displays Extract a static factory for QXcbConnection objects and pass potential connection errors to qxcbmain.cpp, which will then return 0. Task-number: QTBUG-68859 Change-Id: I9c0faf82462a78a576360c19bef251ad1d034d84 Reviewed-by: Gatis Paeglis --- src/plugins/platforms/xcb/qxcbconnection.cpp | 58 +++++++++++++++++++++------- 1 file changed, 43 insertions(+), 15 deletions(-) (limited to 'src/plugins/platforms/xcb/qxcbconnection.cpp') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index c14f3f3703..6fe1a121d8 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -544,31 +544,59 @@ void QXcbConnection::initializeScreens() } } -QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGrabServer, xcb_visualid_t defaultVisualId, const char *displayName) - : m_canGrabServer(canGrabServer) - , m_defaultVisualId(defaultVisualId) - , m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY")) - , m_nativeInterface(nativeInterface) -{ +QXcbConnection *QXcbConnection::create(QXcbNativeInterface *nativeInterface, bool canGrabServer, + xcb_visualid_t defaultVisualId, + const char *displayNameIn) +{ + const QByteArray displayName = displayNameIn ? QByteArray(displayNameIn) : qgetenv("DISPLAY"); + int primaryScreenNumber = 0; + void *xlibDisplay = nullptr; + xcb_connection_t *connection = nullptr; #if QT_CONFIG(xcb_xlib) - Display *dpy = XOpenDisplay(m_displayName.constData()); + Display *dpy = XOpenDisplay(displayName.constData()); if (dpy) { - m_primaryScreenNumber = DefaultScreen(dpy); - m_connection = XGetXCBConnection(dpy); + primaryScreenNumber = DefaultScreen(dpy); + connection = XGetXCBConnection(dpy); XSetEventQueueOwner(dpy, XCBOwnsEventQueue); XSetErrorHandler(nullErrorHandler); XSetIOErrorHandler(ioErrorHandler); - m_xlib_display = dpy; + xlibDisplay = dpy; } #else - m_connection = xcb_connect(m_displayName.constData(), &m_primaryScreenNumber); + connection = xcb_connect(displayName.constData(), &primaryScreenNumber); #endif // QT_CONFIG(xcb_xlib) - - if (Q_UNLIKELY(!m_connection || xcb_connection_has_error(m_connection))) { - qCWarning(lcQpaScreen, "QXcbConnection: Could not connect to display %s", m_displayName.constData()); - return; + if (Q_UNLIKELY(connection == nullptr)) { + qWarning("QXcbConnection: Could not connect to display \"%s\"", displayName.constData()); + return nullptr; + } + if (Q_UNLIKELY(xcb_connection_has_error(connection))) { +#if QT_CONFIG(xcb_xlib) + XCloseDisplay(static_cast(xlibDisplay)); +#else + xcb_disconnect(connection); +#endif + qWarning("QXcbConnection: Errors occurred connecting to display \"%s\"", displayName.constData()); + return nullptr; } + return new QXcbConnection(connection, primaryScreenNumber, nativeInterface, + canGrabServer, defaultVisualId, displayName, xlibDisplay); +} + +QXcbConnection::QXcbConnection(xcb_connection_t *c, int primaryScreenNumber, + QXcbNativeInterface *nativeInterface, bool canGrabServer, + xcb_visualid_t defaultVisualId, const QByteArray &displayName, + void *xlibDisplay) + : m_connection(c) + , m_canGrabServer(canGrabServer) + , m_defaultVisualId(defaultVisualId) + , m_primaryScreenNumber(primaryScreenNumber) + , m_displayName(displayName) + , m_nativeInterface(nativeInterface) +#if QT_CONFIG(xcb_xlib) + , m_xlib_display(xlibDisplay) +#endif +{ m_reader = new QXcbEventReader(this); m_reader->start(); -- cgit v1.2.3