summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-08-31 13:10:18 +0200
committerLiang Qi <liang.qi@qt.io>2017-08-31 14:31:31 +0200
commit112a4af10741409b3d8503cb77852a777b607ce0 (patch)
treefa99f0f37fc1505522fe9368e95484c7732ccda8 /src/plugins/platforms
parent29ef0d2bccd1874e20de94485ee05777c3a95c5d (diff)
parente938150412d22e61926fe16791158805b71268bb (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: examples/examples.pro qmake/library/qmakebuiltins.cpp src/corelib/global/qglobal.cpp Re-apply b525ec2 to qrandom.cpp(code movement in 030782e) src/corelib/global/qnamespace.qdoc src/corelib/global/qrandom.cpp src/gui/kernel/qwindow.cpp Re-apply a3d59c7 to QWindowPrivate::setVisible() (code movement in d7a9e08) src/network/ssl/qsslkey_openssl.cpp src/plugins/platforms/android/androidjniinput.cpp src/plugins/platforms/xcb/qxcbconnection.cpp src/plugins/platforms/xcb/qxcbconnection_xi2.cpp src/widgets/widgets/qmenu.cpp tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp Change-Id: If7ab427804408877a93cbe02079fca58e568bfd3
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/android/extract.cpp1
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp3
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm12
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoaprintersupport.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaprintersupport.mm4
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm4
-rw-r--r--src/plugins/platforms/cocoa/qprintengine_mac.mm8
-rw-r--r--src/plugins/platforms/cocoa/qprintengine_mac_p.h2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp2
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.h9
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.mm139
-rw-r--r--src/plugins/platforms/ios/qiosintegration.mm5
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp4
-rw-r--r--src/plugins/platforms/winrt/winrt.pro2
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp20
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h1
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp17
19 files changed, 79 insertions, 159 deletions
diff --git a/src/plugins/platforms/android/extract.cpp b/src/plugins/platforms/android/extract.cpp
index e6636e37d4..2f2ffa7126 100644
--- a/src/plugins/platforms/android/extract.cpp
+++ b/src/plugins/platforms/android/extract.cpp
@@ -43,6 +43,7 @@
#include <android/log.h>
#include <extract.h>
#include <alloca.h>
+#include <stdlib.h>
#define LOG_TAG "extractSyleInfo"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 279cb338f4..7fa809f3f8 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -303,7 +303,7 @@ static jboolean paste(JNIEnv */*env*/, jobject /*thiz*/)
return JNI_FALSE;
#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL
- qDebug("@@@");
+ qDebug("@@@ PASTE");
#endif
return m_androidInputContext->paste();
}
@@ -1138,6 +1138,7 @@ jboolean QAndroidInputContext::copyURL()
jboolean QAndroidInputContext::paste()
{
+ finishComposingText();
m_cursorHandleShown = CursorHandleNotShown;
sendShortcut(QKeySequence::Paste);
return JNI_TRUE;
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 874d3fc24b..bf9ba4eccf 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -400,8 +400,18 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
// [NSApp run], which is the normal code path for cocoa applications.
if (NSModalSession session = d->currentModalSession()) {
QBoolBlocker execGuard(d->currentExecIsNSAppRun, false);
- while ([NSApp runModalSession:session] == NSModalResponseContinue && !d->interrupt)
+ while ([NSApp runModalSession:session] == NSModalResponseContinue && !d->interrupt) {
qt_mac_waitForMoreEvents(NSModalPanelRunLoopMode);
+ if (session != d->currentModalSessionCached) {
+ // It's possible to release the current modal session
+ // while we are in this loop, for example, by closing all
+ // windows from a slot via QApplication::closeAllWindows.
+ // In this case we cannot use 'session' anymore. A warning
+ // from Cocoa is: "Use of freed session detected. Do not
+ // call runModalSession: after calling endModalSesion:."
+ break;
+ }
+ }
if (!d->interrupt && session == d->currentModalSessionCached) {
// Someone called [NSApp stopModal:] from outside the event
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index 77a531f25d..eeb4c01791 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -426,6 +426,7 @@ void QCocoaMenu::scheduleUpdate()
void QCocoaMenu::timerEvent(QTimerEvent *e)
{
if (e->timerId() == m_updateTimer) {
+ killTimer(m_updateTimer);
m_updateTimer = 0;
[m_nativeMenu update];
}
diff --git a/src/plugins/platforms/cocoa/qcocoaprintersupport.h b/src/plugins/platforms/cocoa/qcocoaprintersupport.h
index 371212dae2..a07bf0ec1b 100644
--- a/src/plugins/platforms/cocoa/qcocoaprintersupport.h
+++ b/src/plugins/platforms/cocoa/qcocoaprintersupport.h
@@ -53,7 +53,7 @@ public:
QCocoaPrinterSupport();
~QCocoaPrinterSupport();
- QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode) Q_DECL_OVERRIDE;
+ QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode, const QString &deviceId = QString()) Q_DECL_OVERRIDE;
QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode) Q_DECL_OVERRIDE;
QPrintDevice createPrintDevice(const QString &id) Q_DECL_OVERRIDE;
diff --git a/src/plugins/platforms/cocoa/qcocoaprintersupport.mm b/src/plugins/platforms/cocoa/qcocoaprintersupport.mm
index c2f7d5b022..d7eaa469fb 100644
--- a/src/plugins/platforms/cocoa/qcocoaprintersupport.mm
+++ b/src/plugins/platforms/cocoa/qcocoaprintersupport.mm
@@ -54,9 +54,9 @@ QCocoaPrinterSupport::QCocoaPrinterSupport()
QCocoaPrinterSupport::~QCocoaPrinterSupport()
{ }
-QPrintEngine *QCocoaPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode printerMode)
+QPrintEngine *QCocoaPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode printerMode, const QString &deviceId)
{
- return new QMacPrintEngine(printerMode);
+ return new QMacPrintEngine(printerMode, deviceId);
}
QPaintEngine *QCocoaPrinterSupport::createPaintEngine(QPrintEngine *printEngine, QPrinter::PrinterMode printerMode)
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 414c6b7fe7..dcf8cf677a 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -126,9 +126,11 @@ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper));
- (void)otherMouseUp:(NSEvent *)theEvent;
- (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent;
+#ifndef QT_NO_TABLETEVENT
- (bool)handleTabletEvent: (NSEvent *)theEvent;
- (void)tabletPoint: (NSEvent *)theEvent;
- (void)tabletProximity: (NSEvent *)theEvent;
+#endif
- (int) convertKeyCode : (QChar)keyCode;
+ (Qt::KeyboardModifiers) convertKeyModifiers : (ulong)modifierFlags;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 8d3cb6cc05..924173b4c5 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -511,10 +511,12 @@ static QTouchDevice *touchDevice = 0;
if (!m_platformWindow)
return;
+#ifndef QT_NO_TABLETEVENT
// Tablet events may come in via the mouse event handlers,
// check if this is a valid tablet event first.
if ([self handleTabletEvent: theEvent])
return;
+#endif
QPointF qtWindowPoint;
QPointF qtScreenPoint;
@@ -902,6 +904,7 @@ static QTouchDevice *touchDevice = 0;
m_platformWindow->m_enterLeaveTargetWindow = 0;
}
+#ifndef QT_NO_TABLETEVENT
struct QCocoaTabletDeviceData
{
QTabletEvent::TabletDevice device;
@@ -1072,6 +1075,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
QWindowSystemInterface::handleTabletLeaveProximityEvent(timestamp, deviceData.device, deviceData.pointerType, deviceData.uid);
}
}
+#endif
- (bool)shouldSendSingleTouch
{
diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm
index 8098c5e829..c39af870d4 100644
--- a/src/plugins/platforms/cocoa/qprintengine_mac.mm
+++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm
@@ -51,11 +51,15 @@ QT_BEGIN_NAMESPACE
extern QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits);
-QMacPrintEngine::QMacPrintEngine(QPrinter::PrinterMode mode) : QPaintEngine(*(new QMacPrintEnginePrivate))
+QMacPrintEngine::QMacPrintEngine(QPrinter::PrinterMode mode, const QString &deviceId)
+ : QPaintEngine(*(new QMacPrintEnginePrivate))
{
Q_D(QMacPrintEngine);
d->mode = mode;
- d->m_printDevice.reset(new QCocoaPrintDevice(QCocoaPrinterSupport().defaultPrintDeviceId()));
+ QString id = deviceId;
+ if (id.isEmpty())
+ id = QCocoaPrinterSupport().defaultPrintDeviceId();
+ d->m_printDevice.reset(new QCocoaPrintDevice(id));
d->m_pageLayout.setPageSize(d->m_printDevice->defaultPageSize());
d->initialize();
}
diff --git a/src/plugins/platforms/cocoa/qprintengine_mac_p.h b/src/plugins/platforms/cocoa/qprintengine_mac_p.h
index ee98275b63..2d46a250d5 100644
--- a/src/plugins/platforms/cocoa/qprintengine_mac_p.h
+++ b/src/plugins/platforms/cocoa/qprintengine_mac_p.h
@@ -78,7 +78,7 @@ class QMacPrintEngine : public QPaintEngine, public QPrintEngine
{
Q_DECLARE_PRIVATE(QMacPrintEngine)
public:
- QMacPrintEngine(QPrinter::PrinterMode mode);
+ QMacPrintEngine(QPrinter::PrinterMode mode, const QString &deviceId);
Qt::HANDLE handle() const;
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
index a3868fdb1d..800118362d 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
@@ -240,6 +240,8 @@ void QEglFSKmsGbmCursor::setPos(const QPoint &pos)
m_pos = pos;
else
qWarning("Failed to move cursor on screen %s: %d", kmsScreen->name().toLatin1().constData(), ret);
+
+ kmsScreen->handleCursorMove(pos);
}
}
diff --git a/src/plugins/platforms/ios/qiosbackingstore.h b/src/plugins/platforms/ios/qiosbackingstore.h
index 1c072c0935..3954347471 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.h
+++ b/src/plugins/platforms/ios/qiosbackingstore.h
@@ -54,19 +54,10 @@ public:
QIOSBackingStore(QWindow *window);
~QIOSBackingStore();
- QPaintDevice *paintDevice() Q_DECL_OVERRIDE;
-
- void beginPaint(const QRegion &) Q_DECL_OVERRIDE;
- void endPaint() Q_DECL_OVERRIDE;
-
void flush(QWindow *window, const QRegion &region, const QPoint &offset) Q_DECL_OVERRIDE;
- void resize(const QSize &size, const QRegion &staticContents) Q_DECL_OVERRIDE;
-
- void makeCurrent();
private:
QOpenGLContext *m_context;
- QOpenGLPaintDevice *m_glDevice;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosbackingstore.mm b/src/plugins/platforms/ios/qiosbackingstore.mm
index 96be28af81..74229684e3 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.mm
+++ b/src/plugins/platforms/ios/qiosbackingstore.mm
@@ -41,79 +41,31 @@
#include "qioswindow.h"
#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLPaintDevice>
-#include <QtGui/QOpenGLFramebufferObject>
-#include <QtGui/QOffscreenSurface>
-#include <QtGui/qpainter.h>
#include <QtGui/private/qwindow_p.h>
#include <QtDebug>
QT_BEGIN_NAMESPACE
-class QIOSPaintDevice : public QOpenGLPaintDevice
-{
-public:
- QIOSPaintDevice(QIOSBackingStore *backingStore) : m_backingStore(backingStore) { }
- void ensureActiveTarget() Q_DECL_OVERRIDE;
-
-private:
- QIOSBackingStore *m_backingStore;
-};
-
-void QIOSPaintDevice::ensureActiveTarget()
-{
- m_backingStore->makeCurrent();
-}
-
/*!
\class QIOSBackingStore
- \brief The QPlatformBackingStore on iOS.
-
QBackingStore enables the use of QPainter to paint on a QWindow, as opposed
to rendering to a QWindow through the use of OpenGL with QOpenGLContext.
-
- Historically, the iOS port initially implemented the backing store by using
- an QOpenGLPaintDevice as its paint device, triggering the use of the OpenGL
- paint engine for QPainter based drawing. This was due to raster drawing
- operations being too slow when not being NEON-optimized, and got the port
- up and running quickly.
-
- As of 3e892e4a97, released in Qt 5.7, the backing store now uses a QImage,
- for its paint device, giving normal raster-based QPainter operations, and
- enabling features such as antialiased drawing.
-
- To account for regressions in performance, the old code path is still
- available by setting the surface type of the QWindow to OpenGLSurface.
- This surface type is normally used when rendering though QOpenGLContext,
- but will in the case of QIOSBackingStore trigger the old OpenGL based
- painter.
-
- This fallback path is not too intrusive, as the QImage based path still
- uses OpenGL to composite the image at flush() time using composeAndFlush.
*/
QIOSBackingStore::QIOSBackingStore(QWindow *window)
: QRasterBackingStore(window)
, m_context(new QOpenGLContext)
- , m_glDevice(nullptr)
{
- QSurfaceFormat fmt = window->requestedFormat();
-
- // Due to sharing QIOSContext redirects our makeCurrent on window() attempts to
- // the global share context. Hence it is essential to have a compatible format.
- fmt.setDepthBufferSize(QSurfaceFormat::defaultFormat().depthBufferSize());
- fmt.setStencilBufferSize(QSurfaceFormat::defaultFormat().stencilBufferSize());
-
- if (fmt.depthBufferSize() == 0)
- qWarning("No depth in default format, expect rendering errors");
-
// We use the surface both for raster operations and for GL drawing (when
// we blit the raster image), so the type needs to cover both use cases.
if (window->surfaceType() == QSurface::RasterSurface)
window->setSurfaceType(QSurface::RasterGLSurface);
- m_context->setFormat(fmt);
+ Q_ASSERT_X(window->surfaceType() != QSurface::OpenGLSurface, "QIOSBackingStore",
+ "QBackingStore on iOS can only be used with raster-enabled surfaces.");
+
+ m_context->setFormat(window->requestedFormat());
m_context->setScreen(window->screen());
Q_ASSERT(QOpenGLContext::globalShareContext());
m_context->setShareContext(QOpenGLContext::globalShareContext());
@@ -122,54 +74,12 @@ QIOSBackingStore::QIOSBackingStore(QWindow *window)
QIOSBackingStore::~QIOSBackingStore()
{
- if (window()->surfaceType() == QSurface::RasterGLSurface) {
- // We're using composeAndFlush from QPlatformBackingStore, which
- // need to clean up any textures in its destructor, so make the
- // context current and keep it alive until QPlatformBackingStore
- // has cleaned up everything.
- makeCurrent();
- m_context->deleteLater();
- } else {
- delete m_context;
- }
-
- delete m_glDevice;
-}
-
-void QIOSBackingStore::makeCurrent()
-{
- if (!m_context->makeCurrent(window()))
- qWarning("QIOSBackingStore: makeCurrent() failed");
-}
-
-void QIOSBackingStore::beginPaint(const QRegion &region)
-{
- makeCurrent();
-
- if (!m_glDevice)
- m_glDevice = new QIOSPaintDevice(this);
-
- if (window()->surfaceType() == QSurface::RasterGLSurface)
- QRasterBackingStore::beginPaint(region);
-}
-
-void QIOSBackingStore::endPaint()
-{
-}
-
-QPaintDevice *QIOSBackingStore::paintDevice()
-{
- Q_ASSERT(m_glDevice);
-
- // Keep paint device size and device pixel ratio in sync with window
- qreal devicePixelRatio = window()->devicePixelRatio();
- m_glDevice->setSize(window()->size() * devicePixelRatio);
- m_glDevice->setDevicePixelRatio(devicePixelRatio);
-
- if (window()->surfaceType() == QSurface::RasterGLSurface)
- return QRasterBackingStore::paintDevice();
- else
- return m_glDevice;
+ // We're using composeAndFlush from QPlatformBackingStore, which
+ // need to clean up any textures in its destructor, so make the
+ // context current and keep it alive until QPlatformBackingStore
+ // has cleaned up everything.
+ m_context->makeCurrent(window());
+ m_context->deleteLater();
}
void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
@@ -187,33 +97,8 @@ void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoin
return;
}
- if (window->surfaceType() == QSurface::RasterGLSurface) {
- static QPlatformTextureList emptyTextureList;
- composeAndFlush(window, region, offset, &emptyTextureList, m_context, false);
- } else {
- m_context->makeCurrent(window);
- m_context->swapBuffers(window);
- }
-}
-
-void QIOSBackingStore::resize(const QSize &size, const QRegion &staticContents)
-{
- Q_UNUSED(staticContents);
-
- if (window()->surfaceType() == QSurface::OpenGLSurface) {
- // Resizing the backing store would in this case mean resizing the QWindow,
- // as we use an QOpenGLPaintDevice that we target at the window. That's
- // probably not what the user intended, so we ignore resizes of the backing
- // store and always keep the paint device's size in sync with the window
- // size in beginPaint().
-
- if (size != window()->size() && !window()->inherits("QWidgetWindow"))
- qWarning("QIOSBackingStore needs to have the same size as its window");
-
- return;
- }
-
- QRasterBackingStore::resize(size, staticContents);
+ static QPlatformTextureList emptyTextureList;
+ composeAndFlush(window, region, offset, &emptyTextureList, m_context, false);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm
index 5c42828885..482f996943 100644
--- a/src/plugins/platforms/ios/qiosintegration.mm
+++ b/src/plugins/platforms/ios/qiosintegration.mm
@@ -97,11 +97,6 @@ QIOSIntegration::QIOSIntegration()
// The backingstore needs a global share context in order to support composition in
// QPlatformBackingStore.
qApp->setAttribute(Qt::AA_ShareOpenGLContexts, true);
- // And that context must match the format used for the backingstore's context.
- QSurfaceFormat fmt = QSurfaceFormat::defaultFormat();
- fmt.setDepthBufferSize(16);
- fmt.setStencilBufferSize(8);
- QSurfaceFormat::setDefaultFormat(fmt);
// Set current directory to app bundle folder
QDir::setCurrent(QString::fromUtf8([[[NSBundle mainBundle] bundlePath] UTF8String]));
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 3e445f0f7f..3f417fde27 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -896,8 +896,10 @@ void QWindowsBaseWindow::hide_sys() // Normal hide, do not activate other window
void QWindowsBaseWindow::raise_sys()
{
qCDebug(lcQpaWindows) << __FUNCTION__ << this << window();
- if ((window()->flags() & (Qt::WindowStaysOnTopHint | Qt::WindowStaysOnBottomHint)) == 0)
+ if (window()->type() == Qt::Popup
+ || (window()->flags() & (Qt::WindowStaysOnTopHint | Qt::WindowStaysOnBottomHint)) == 0) {
SetWindowPos(handle(), HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+ }
}
void QWindowsBaseWindow::lower_sys()
diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro
index 02a848b03f..042b270cff 100644
--- a/src/plugins/platforms/winrt/winrt.pro
+++ b/src/plugins/platforms/winrt/winrt.pro
@@ -8,7 +8,7 @@ QT += \
DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__
-LIBS += $$QMAKE_LIBS_CORE -ld3d11
+LIBS += -lws2_32 -ld3d11
SOURCES = \
main.cpp \
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 23bb5c6410..536c709dbe 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -556,9 +556,10 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
m_connection = xcb_connect(m_displayName.constData(), &m_primaryScreenNumber);
#endif // QT_CONFIG(xcb_xlib)
- if (Q_UNLIKELY(!m_connection || xcb_connection_has_error(m_connection)))
- qFatal("QXcbConnection: Could not connect to display %s", m_displayName.constData());
-
+ if (Q_UNLIKELY(!m_connection || xcb_connection_has_error(m_connection))) {
+ qCWarning(lcQpaScreen, "QXcbConnection: Could not connect to display %s", m_displayName.constData());
+ return;
+ }
m_reader = new QXcbEventReader(this);
m_reader->start();
@@ -648,7 +649,7 @@ QXcbConnection::~QXcbConnection()
#ifndef QT_NO_DRAGANDDROP
delete m_drag;
#endif
- if (m_reader->isRunning()) {
+ if (m_reader && m_reader->isRunning()) {
sendConnectionEvent(QXcbAtom::_QT_CLOSE_CONNECTION);
m_reader->wait();
}
@@ -665,15 +666,22 @@ QXcbConnection::~QXcbConnection()
delete m_glIntegration;
+ if (isConnected()) {
#if QT_CONFIG(xcb_xlib)
- XCloseDisplay(static_cast<Display *>(m_xlib_display));
+ XCloseDisplay(static_cast<Display *>(m_xlib_display));
#else
- xcb_disconnect(xcb_connection());
+ xcb_disconnect(xcb_connection());
#endif
+ }
delete m_keyboard;
}
+bool QXcbConnection::isConnected() const
+{
+ return m_connection && !xcb_connection_has_error(m_connection);
+}
+
QXcbScreen *QXcbConnection::primaryScreen() const
{
if (!m_screens.isEmpty()) {
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index a37ce5f5a6..999dc0630c 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -391,6 +391,7 @@ public:
~QXcbConnection();
QXcbConnection *connection() const { return const_cast<QXcbConnection *>(this); }
+ bool isConnected() const;
const QList<QXcbVirtualDesktop *> &virtualDesktops() const { return m_virtualDesktops; }
const QList<QXcbScreen *> &screens() const { return m_screens; }
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index c8efe2fce8..72d31060db 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -188,12 +188,25 @@ QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char
const int numParameters = parameters.size();
m_connections.reserve(1 + numParameters / 2);
- m_connections << new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName);
+ auto conn = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName);
+ if (conn->isConnected())
+ m_connections << conn;
+ else
+ delete conn;
for (int i = 0; i < numParameters - 1; i += 2) {
qCDebug(lcQpaScreen) << "connecting to additional display: " << parameters.at(i) << parameters.at(i+1);
QString display = parameters.at(i) + QLatin1Char(':') + parameters.at(i+1);
- m_connections << new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, display.toLatin1().constData());
+ conn = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, display.toLatin1().constData());
+ if (conn->isConnected())
+ m_connections << conn;
+ else
+ delete conn;
+ }
+
+ if (m_connections.isEmpty()) {
+ qCritical("Could not connect to any X display.");
+ exit(1);
}
m_fontDatabase.reset(new QGenericUnixFontDatabase());