summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/android/androidjniinput.cpp26
-rw-r--r--src/plugins/platforms/android/androidjniinput.h2
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp10
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp5
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp8
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm5
-rw-r--r--src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp3
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.cpp8
-rw-r--r--src/plugins/platforms/windows/qtwindowsglobal.h2
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp14
-rw-r--r--src/plugins/platforms/windows/qwindowscursor.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp18
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h6
-rw-r--r--src/plugins/platforms/windows/qwindowsmime.cpp8
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp2
-rw-r--r--src/plugins/platforms/windows/windows.pri17
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp18
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp16
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h12
-rw-r--r--src/plugins/sqldrivers/.qmake.conf19
-rw-r--r--src/plugins/sqldrivers/configure.json201
-rw-r--r--src/plugins/sqldrivers/configure.pri99
-rw-r--r--src/plugins/sqldrivers/qsqldriverbase.pri3
-rw-r--r--src/plugins/sqldrivers/sqldrivers.pro6
-rw-r--r--src/plugins/sqldrivers/sqlite/sqlite.pro5
27 files changed, 435 insertions, 86 deletions
diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp
index 8372bf6484..32630003d1 100644
--- a/src/plugins/platforms/android/androidjniinput.cpp
+++ b/src/plugins/platforms/android/androidjniinput.cpp
@@ -121,11 +121,11 @@ namespace QtAndroidInput
return m_softwareKeyboardRect;
}
- void updateHandles(int mode, QPoint cursor, QPoint anchor)
+ void updateHandles(int mode, QPoint cursor, QPoint anchor, bool rtl)
{
- QJNIObjectPrivate::callStaticMethod<void>(applicationClass(), "updateHandles", "(IIIII)V",
+ QJNIObjectPrivate::callStaticMethod<void>(applicationClass(), "updateHandles", "(IIIIIZ)V",
mode, cursor.x(), cursor.y(), anchor.x(),
- anchor.y());
+ anchor.y(), rtl);
}
static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y)
@@ -173,6 +173,25 @@ namespace QtAndroidInput
Qt::MouseButtons(Qt::LeftButton));
}
+ static void mouseWheel(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y, jfloat hdelta, jfloat vdelta)
+ {
+ if (m_ignoreMouseEvents)
+ return;
+
+ QPoint globalPos(x,y);
+ QWindow *tlw = m_mouseGrabber.data();
+ if (!tlw)
+ tlw = topLevelWindowAt(globalPos);
+ QPoint localPos = tlw ? (globalPos-tlw->position()) : globalPos;
+ QPoint angleDelta(hdelta * 120, vdelta * 120);
+
+ QWindowSystemInterface::handleWheelEvent(tlw,
+ localPos,
+ globalPos,
+ QPoint(),
+ angleDelta);
+ }
+
static void longPress(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y)
{
QAndroidInputContext *inputContext = QAndroidInputContext::androidInputContext();
@@ -824,6 +843,7 @@ namespace QtAndroidInput
{"mouseDown", "(III)V", (void *)mouseDown},
{"mouseUp", "(III)V", (void *)mouseUp},
{"mouseMove", "(III)V", (void *)mouseMove},
+ {"mouseWheel", "(IIIFF)V", (void *)mouseWheel},
{"longPress", "(III)V", (void *)longPress},
{"isTabletEventSupported", "()Z", (void *)isTabletEventSupported},
{"tabletEvent", "(IIJIIIFFF)V", (void *)tabletEvent},
diff --git a/src/plugins/platforms/android/androidjniinput.h b/src/plugins/platforms/android/androidjniinput.h
index af18a96dc1..c09b426f49 100644
--- a/src/plugins/platforms/android/androidjniinput.h
+++ b/src/plugins/platforms/android/androidjniinput.h
@@ -58,7 +58,7 @@ namespace QtAndroidInput
// Software keyboard support
// cursor/selection handles
- void updateHandles(int handleCount, QPoint cursor = QPoint(), QPoint anchor = QPoint());
+ void updateHandles(int handleCount, QPoint cursor = QPoint(), QPoint anchor = QPoint(), bool rtl = false);
bool registerNatives(JNIEnv *env);
}
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index e47dd91a3e..06bca0354d 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -102,13 +102,6 @@ static QList<QByteArray> m_applicationParams;
pthread_t m_qtAppThread = 0;
static sem_t m_exitSemaphore, m_terminateSemaphore;
-struct SurfaceData
-{
- ~SurfaceData() { delete surface; }
- QJNIObjectPrivate *surface = nullptr;
- AndroidSurfaceClient *client = nullptr;
-};
-
QHash<int, AndroidSurfaceClient *> m_surfaces;
static QMutex m_surfacesMutex;
@@ -142,6 +135,7 @@ namespace QtAndroid
// flush the pending state if necessary.
if (m_androidPlatformIntegration) {
flushPendingApplicationState();
+ m_androidPlatformIntegration->flushPendingUpdates();
} else {
QMutexLocker locker(&m_pendingAppStateMtx);
m_pendingApplicationState = -1;
@@ -627,6 +621,7 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
m_scaledDensity = scaledDensity;
m_density = density;
+ QMutexLocker lock(&m_surfacesMutex);
if (!m_androidPlatformIntegration) {
QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,
desktopHeightPixels,
@@ -691,7 +686,6 @@ static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state
// Don't send timers and sockets events anymore if we are going to hide all windows
QAndroidEventDispatcherStopper::instance()->goingToStop(true);
- QCoreApplication::processEvents();
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(state));
if (state == Qt::ApplicationSuspended)
QAndroidEventDispatcherStopper::instance()->stopAll();
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 4ab8a9d060..279cb338f4 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -537,7 +537,7 @@ void QAndroidInputContext::updateSelectionHandles()
? QHighDpiScaling::factor(window)
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
- QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImEnabled);
+ QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImEnabled | Qt::ImCurrentSelection);
QCoreApplication::sendEvent(m_focusObject, &query);
int cpos = query.value(Qt::ImCursorPosition).toInt();
int anchor = query.value(Qt::ImAnchorPosition).toInt();
@@ -563,7 +563,8 @@ void QAndroidInputContext::updateSelectionHandles()
QPoint leftPoint(leftRect.bottomLeft().toPoint() * pixelDensity);
QPoint righPoint(rightRect.bottomRight().toPoint() * pixelDensity);
- QtAndroidInput::updateHandles(CursorHandleShowSelection, leftPoint, righPoint);
+ QtAndroidInput::updateHandles(CursorHandleShowSelection, leftPoint, righPoint,
+ query.value(Qt::ImCurrentSelection).toString().isRightToLeft());
if (m_cursorHandleShown == CursorHandleShowPopup) {
// make sure the popup does not reappear when the selection menu closes
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index ec09965f45..3088546148 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -433,6 +433,14 @@ void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation cur
m_nativeOrientation = nativeOrientation;
}
+void QAndroidPlatformIntegration::flushPendingUpdates()
+{
+ m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth,
+ m_defaultPhysicalSizeHeight));
+ m_primaryScreen->setSize(QSize(m_defaultScreenWidth, m_defaultScreenHeight));
+ m_primaryScreen->setAvailableGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
+}
+
#ifndef QT_NO_ACCESSIBILITY
QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
{
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h
index 047eaf122e..c795c499bc 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.h
+++ b/src/plugins/platforms/android/qandroidplatformintegration.h
@@ -129,6 +129,8 @@ public:
QTouchDevice *touchDevice() const { return m_touchDevice; }
void setTouchDevice(QTouchDevice *touchDevice) { m_touchDevice = touchDevice; }
+ void flushPendingUpdates();
+
#if QT_CONFIG(vulkan)
QPlatformVulkanInstance *createPlatformVulkanInstance(QVulkanInstance *instance) const override;
#endif
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index f68d34ff9d..e42fbad00e 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -171,7 +171,10 @@ static QTouchDevice *touchDevice = 0;
- (void)dealloc
{
CGImageRelease(m_maskImage);
- [m_trackingArea release];
+ if (m_trackingArea) {
+ [self removeTrackingArea:m_trackingArea];
+ [m_trackingArea release];
+ }
m_maskImage = 0;
[m_inputSource release];
[[NSNotificationCenter defaultCenter] removeObserver:self];
diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
index 8a34f6974f..643ae877d0 100644
--- a/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
+++ b/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
@@ -89,7 +89,8 @@ public:
if (FAILED(hr)) {
success = false;
- qWarning("%s: EndDraw failed: %#x, tag1: %lld, tag2: %lld", __FUNCTION__, hr, tag1, tag2);
+ qWarning("%s: EndDraw failed: %#lx, tag1: %lld, tag2: %lld",
+ __FUNCTION__, long(hr), tag1, tag2);
}
}
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
index d9c3d6ac14..9239facb0c 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
@@ -638,7 +638,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_background(IA2Color *backgr
/**************************************************************\
* IAccessibleEditableText *
**************************************************************/
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
/*!
\internal
@@ -681,7 +681,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::copyText(long startOffset, long
{
QAccessibleInterface *accessible = accessibleInterface();
accessibleDebugClientCalls(accessible);
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
const QString t = textForRange(startOffset, endOffset);
QGuiApplication::clipboard()->setText(t);
return S_OK;
@@ -717,7 +717,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::cutText(long startOffset, long
{
QAccessibleInterface *accessible = accessibleInterface();
accessibleDebugClientCalls(accessible);
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
const QString t = textForRange(startOffset, endOffset);
if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
editableTextIface->deleteText(startOffset, endOffset);
@@ -734,7 +734,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::pasteText(long offset)
{
QAccessibleInterface *accessible = accessibleInterface();
accessibleDebugClientCalls(accessible);
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
const QString txt = QGuiApplication::clipboard()->text();
if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
editableTextIface->insertText(offset, txt);
diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h
index 34fe114d0e..d9c342be27 100644
--- a/src/plugins/platforms/windows/qtwindowsglobal.h
+++ b/src/plugins/platforms/windows/qtwindowsglobal.h
@@ -263,12 +263,10 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI
if ((wParamIn & 0xfff0) == SC_CONTEXTHELP)
return QtWindows::WhatsThisEvent;
break;
-#if !defined(QT_NO_SESSIONMANAGER)
case WM_QUERYENDSESSION:
return QtWindows::QueryEndSessionApplicationEvent;
case WM_ENDSESSION:
return QtWindows::EndSessionApplicationEvent;
-#endif
#if defined(WM_APPCOMMAND)
case WM_APPCOMMAND:
return QtWindows::AppCommandEvent;
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 7f5f9d0768..ddd779bbac 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -53,7 +53,7 @@
#ifndef QT_NO_ACCESSIBILITY
# include "accessible/qwindowsaccessibility.h"
#endif
-#if !defined(QT_NO_SESSIONMANAGER)
+#if QT_CONFIG(sessionmanager)
# include <private/qsessionmanager_p.h>
# include "qwindowssessionmanager.h"
#endif
@@ -249,7 +249,7 @@ struct QWindowsContextPrivate {
QWindowsMimeConverter m_mimeConverter;
QWindowsScreenManager m_screenManager;
QSharedPointer<QWindowCreationContext> m_creationContext;
-#if !defined(QT_NO_TABLETEVENT)
+#if QT_CONFIG(tabletevent)
QScopedPointer<QWindowsTabletSupport> m_tabletSupport;
#endif
const HRESULT m_oleInitializeResult;
@@ -290,7 +290,7 @@ QWindowsContext::QWindowsContext() :
const QByteArray bv = qgetenv("QT_QPA_VERBOSE");
if (!bv.isEmpty())
QLoggingCategory::setFilterRules(QString::fromLocal8Bit(bv));
-#if !defined(QT_NO_TABLETEVENT)
+#if QT_CONFIG(tabletevent)
d->m_tabletSupport.reset(QWindowsTabletSupport::create());
qCDebug(lcQpaTablet) << "Tablet support: " << (d->m_tabletSupport.isNull() ? QStringLiteral("None") : d->m_tabletSupport->description());
#endif
@@ -298,7 +298,7 @@ QWindowsContext::QWindowsContext() :
QWindowsContext::~QWindowsContext()
{
-#if !defined(QT_NO_TABLETEVENT)
+#if QT_CONFIG(tabletevent)
d->m_tabletSupport.reset(); // Destroy internal window before unregistering classes.
#endif
unregisterWindowClasses();
@@ -346,7 +346,7 @@ bool QWindowsContext::initTouch(unsigned integrationOptions)
void QWindowsContext::setTabletAbsoluteRange(int a)
{
-#if !defined(QT_NO_TABLETEVENT)
+#if QT_CONFIG(tabletevent)
if (!d->m_tabletSupport.isNull())
d->m_tabletSupport->setAbsoluteRange(a);
#else
@@ -720,7 +720,7 @@ QWindowsScreenManager &QWindowsContext::screenManager()
QWindowsTabletSupport *QWindowsContext::tabletSupport() const
{
-#if !defined(QT_NO_TABLETEVENT)
+#if QT_CONFIG(tabletevent)
return d->m_tabletSupport.data();
#else
return 0;
@@ -1128,7 +1128,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
platformWindow->clearFlag(QWindowsWindow::WithinDpiChanged);
return true;
}
-#if !defined(QT_NO_SESSIONMANAGER)
+#if QT_CONFIG(sessionmanager)
case QtWindows::QueryEndSessionApplicationEvent: {
QWindowsSessionManager *sessionManager = platformSessionManager();
if (sessionManager->isActive()) { // bogus message from windows
diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp
index b9c320fd8f..e7ba08b719 100644
--- a/src/plugins/platforms/windows/qwindowscursor.cpp
+++ b/src/plugins/platforms/windows/qwindowscursor.cpp
@@ -56,7 +56,7 @@
static bool initResources()
{
-#if !defined (QT_NO_IMAGEFORMAT_PNG)
+#if QT_CONFIG(imageformat_png)
Q_INIT_RESOURCE(cursors);
#endif
return true;
@@ -203,7 +203,7 @@ static QSize systemCursorSize(const QPlatformScreen *screen = Q_NULLPTR)
return primaryScreenCursorSize;
}
-#if defined (QT_NO_IMAGEFORMAT_PNG)
+#if !QT_CONFIG(imageformat_png)
static inline QSize standardCursorSize() { return QSize(32, 32); }
diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp
index a326ccac3e..857db7a65c 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.cpp
+++ b/src/plugins/platforms/windows/qwindowsdrag.cpp
@@ -40,7 +40,7 @@
#include "qwindowsdrag.h"
#include "qwindowscontext.h"
#include "qwindowsscreen.h"
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
# include "qwindowsclipboard.h"
#endif
#include "qwindowsintegration.h"
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index eb7ad5ecd8..a9143a3052 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -51,9 +51,9 @@
#ifndef QT_NO_FREETYPE
# include <QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h>
#endif
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
# include "qwindowsclipboard.h"
-# ifndef QT_NO_DRAGANDDROP
+# if QT_CONFIG(draganddrop)
# include "qwindowsdrag.h"
# endif
#endif
@@ -65,7 +65,7 @@
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qwindowsysteminterface.h>
-#ifndef QT_NO_SESSIONMANAGER
+#if QT_CONFIG(sessionmanager)
# include "qwindowssessionmanager.h"
#endif
#include <QtGui/qtouchdevice.h>
@@ -139,9 +139,9 @@ struct QWindowsIntegrationPrivate
unsigned m_options = 0;
QWindowsContext m_context;
QPlatformFontDatabase *m_fontDatabase = nullptr;
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
QWindowsClipboard m_clipboard;
-# ifndef QT_NO_DRAGANDDROP
+# if QT_CONFIG(draganddrop)
QWindowsDrag m_drag;
# endif
#endif
@@ -258,7 +258,7 @@ QWindowsIntegration::QWindowsIntegration(const QStringList &paramList) :
d(new QWindowsIntegrationPrivate(paramList))
{
m_instance = this;
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
d->m_clipboard.registerViewer();
#endif
d->m_context.screenManager().handleScreenChanges();
@@ -557,12 +557,12 @@ QList<int> QWindowsIntegration::possibleKeys(const QKeyEvent *e) const
return d->m_context.possibleKeys(e);
}
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
QPlatformClipboard * QWindowsIntegration::clipboard() const
{
return &d->m_clipboard;
}
-# ifndef QT_NO_DRAGANDDROP
+# if QT_CONFIG(draganddrop)
QPlatformDrag *QWindowsIntegration::drag() const
{
return &d->m_drag;
@@ -587,7 +587,7 @@ unsigned QWindowsIntegration::options() const
return d->m_options;
}
-#if !defined(QT_NO_SESSIONMANAGER)
+#if QT_CONFIG(sessionmanager)
QPlatformSessionManager *QWindowsIntegration::createPlatformSessionManager(const QString &id, const QString &key) const
{
return new QWindowsSessionManager(id, key);
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index 11320332bb..23f3d9ef4e 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -83,9 +83,9 @@ public:
#endif
QAbstractEventDispatcher *createEventDispatcher() const override;
void initialize() override;
-#ifndef QT_NO_CLIPBOARD
+#if QT_CONFIG(clipboard)
QPlatformClipboard *clipboard() const override;
-# ifndef QT_NO_DRAGANDDROP
+# if QT_CONFIG(draganddrop)
QPlatformDrag *drag() const override;
# endif
#endif // !QT_NO_CLIPBOARD
@@ -111,7 +111,7 @@ public:
void beep() const override;
-#if !defined(QT_NO_SESSIONMANAGER)
+#if QT_CONFIG(sessionmanager)
QPlatformSessionManager *createPlatformSessionManager(const QString &id, const QString &key) const override;
#endif
diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp
index eb53dc921b..b892f1610d 100644
--- a/src/plugins/platforms/windows/qwindowsmime.cpp
+++ b/src/plugins/platforms/windows/qwindowsmime.cpp
@@ -1252,7 +1252,7 @@ bool QBuiltInMimes::convertFromMime(const FORMATETC &formatetc, const QMimeData
r[byteLength+1] = 0;
data = r;
} else {
-#ifndef QT_NO_DRAGANDDROP
+#if QT_CONFIG(draganddrop)
data = QInternalMimeData::renderDataHelper(outFormats.value(getCf(formatetc)), mimeData);
#endif //QT_NO_DRAGANDDROP
}
@@ -1352,7 +1352,7 @@ QLastResortMimes::QLastResortMimes()
bool QLastResortMimes::canConvertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const
{
// really check
-#ifndef QT_NO_DRAGANDDROP
+#if QT_CONFIG(draganddrop)
return formatetc.tymed & TYMED_HGLOBAL
&& (formats.contains(formatetc.cfFormat)
&& QInternalMimeData::hasFormatHelper(formats.value(formatetc.cfFormat), mimeData));
@@ -1366,7 +1366,7 @@ bool QLastResortMimes::canConvertFromMime(const FORMATETC &formatetc, const QMim
bool QLastResortMimes::convertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData, STGMEDIUM * pmedium) const
{
-#ifndef QT_NO_DRAGANDDROP
+#if QT_CONFIG(draganddrop)
return canConvertFromMime(formatetc, mimeData)
&& setData(QInternalMimeData::renderDataHelper(formats.value(getCf(formatetc)), mimeData), pmedium);
#else
@@ -1467,7 +1467,7 @@ QString QLastResortMimes::mimeForFormat(const FORMATETC &formatetc) const
const QString clipFormat = QWindowsMimeConverter::clipboardFormatName(getCf(formatetc));
if (!clipFormat.isEmpty()) {
-#ifndef QT_NO_DRAGANDDROP
+#if QT_CONFIG(draganddrop)
if (QInternalMimeData::canReadData(clipFormat))
format = clipFormat;
else if((formatetc.cfFormat >= 0xC000)){
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 9ac31c45df..1bd7b06c8e 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -1195,7 +1195,7 @@ void QWindowsWindow::setDropSiteEnabled(bool dropEnabled)
if (isDropSiteEnabled() == dropEnabled)
return;
qCDebug(lcQpaMime) << __FUNCTION__ << window() << dropEnabled;
-#if !defined(QT_NO_CLIPBOARD) && !defined(QT_NO_DRAGANDDROP)
+#if QT_CONFIG(clipboard) && QT_CONFIG(draganddrop)
if (dropEnabled) {
Q_ASSERT(m_data.hwnd);
m_dropTarget = new QWindowsOleDropTarget(window());
diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri
index 933cd72a67..3ecd164c74 100644
--- a/src/plugins/platforms/windows/windows.pri
+++ b/src/plugins/platforms/windows/windows.pri
@@ -82,33 +82,28 @@ qtConfig(vulkan) {
HEADERS += $$PWD/qwindowsvulkaninstance.h
}
-!contains( DEFINES, QT_NO_CLIPBOARD ) {
+qtConfig(clipboard) {
SOURCES += $$PWD/qwindowsclipboard.cpp
HEADERS += $$PWD/qwindowsclipboard.h
-}
-
-# drag and drop on windows only works if a clipboard is available
-!contains( DEFINES, QT_NO_DRAGANDDROP ) {
- !win32:SOURCES += $$PWD/qwindowsdrag.cpp
- !win32:HEADERS += $$PWD/qwindowsdrag.h
- win32:!contains( DEFINES, QT_NO_CLIPBOARD ) {
+ # drag and drop on windows only works if a clipboard is available
+ qtConfig(draganddrop) {
HEADERS += $$PWD/qwindowsdrag.h
SOURCES += $$PWD/qwindowsdrag.cpp
}
}
-!contains( DEFINES, QT_NO_TABLETEVENT ) {
+qtConfig(tabletevent) {
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/wintab
HEADERS += $$PWD/qwindowstabletsupport.h
SOURCES += $$PWD/qwindowstabletsupport.cpp
}
-!contains( DEFINES, QT_NO_SESSIONMANAGER ) {
+qtConfig(sessionmanager) {
SOURCES += $$PWD/qwindowssessionmanager.cpp
HEADERS += $$PWD/qwindowssessionmanager.h
}
-!contains( DEFINES, QT_NO_IMAGEFORMAT_PNG ):RESOURCES += $$PWD/cursors.qrc
+qtConfig(imageformat_png):RESOURCES += $$PWD/cursors.qrc
RESOURCES += $$PWD/openglblacklists.qrc
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index da7ce9bb17..94111559b4 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -249,25 +249,9 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const
return xcbWindow;
}
-class QXcbForeignWindow : public QXcbWindow
-{
-public:
- QXcbForeignWindow(QWindow *window, WId nativeHandle)
- : QXcbWindow(window) { m_window = nativeHandle; }
- ~QXcbForeignWindow() {}
- bool isForeignWindow() const override { return true; }
-
-protected:
- // No-ops
- void create() override {}
- void destroy() override {}
-};
-
QPlatformWindow *QXcbIntegration::createForeignWindow(QWindow *window, WId nativeHandle) const
{
- QXcbWindow *xcbWindow = new QXcbForeignWindow(window, nativeHandle);
- xcbWindow->create();
- return xcbWindow;
+ return new QXcbForeignWindow(window, nativeHandle);
}
#ifndef QT_NO_OPENGL
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 0a4e3a5107..9921ed5da5 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -616,13 +616,17 @@ QXcbWindow::~QXcbWindow()
}
destroy();
+}
- if (isForeignWindow()) {
- if (connection()->mouseGrabber() == this)
- connection()->setMouseGrabber(Q_NULLPTR);
- if (connection()->mousePressWindow() == this)
- connection()->setMousePressWindow(Q_NULLPTR);
- }
+QXcbForeignWindow::~QXcbForeignWindow()
+{
+ // Clear window so that destroy() does not affect it
+ m_window = 0;
+
+ if (connection()->mouseGrabber() == this)
+ connection()->setMouseGrabber(nullptr);
+ if (connection()->mousePressWindow() == this)
+ connection()->setMousePressWindow(nullptr);
}
void QXcbWindow::destroy()
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 5e09865d33..b5bf33520f 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -280,6 +280,18 @@ protected:
xcb_cursor_t m_currentBitmapCursor = XCB_CURSOR_NONE;
};
+class QXcbForeignWindow : public QXcbWindow
+{
+public:
+ QXcbForeignWindow(QWindow *window, WId nativeHandle)
+ : QXcbWindow(window) { m_window = nativeHandle; }
+ ~QXcbForeignWindow();
+ bool isForeignWindow() const override { return true; }
+
+protected:
+ void create() override {} // No-op
+};
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QXcbWindow*)
diff --git a/src/plugins/sqldrivers/.qmake.conf b/src/plugins/sqldrivers/.qmake.conf
new file mode 100644
index 0000000000..15ba71a343
--- /dev/null
+++ b/src/plugins/sqldrivers/.qmake.conf
@@ -0,0 +1,19 @@
+# This file detaches this sub-tree from the rest of qtbase,
+# so it can be configured stand-alone.
+# Of course, under normal circumstances, this _is_ part of qtbase,
+# so we have to make some contortions to restore normality.
+
+isEmpty(_QMAKE_CONF_): return() # Pre-scan during spec loading.
+
+SQLDRV_SRC_TREE = $$dirname(_QMAKE_CONF_)
+QTBASE_SRC_TREE = $$section(SQLDRV_SRC_TREE, /, 0, -4)
+
+QTBASE_BLD_TREE = $$shadowed($$QTBASE_SRC_TREE)
+!isEmpty(QTBASE_BLD_TREE):exists($$QTBASE_BLD_TREE/.qmake.cache) {
+ # This tricks qt_build_config.prf and qt_build_paths.prf
+ _QMAKE_CONF_ = $$QTBASE_SRC_TREE/.qmake.conf
+} else {
+ CONFIG += sqldrivers_standalone
+}
+
+include($$QTBASE_SRC_TREE/.qmake.conf)
diff --git a/src/plugins/sqldrivers/configure.json b/src/plugins/sqldrivers/configure.json
new file mode 100644
index 0000000000..5603ceb37b
--- /dev/null
+++ b/src/plugins/sqldrivers/configure.json
@@ -0,0 +1,201 @@
+{
+ "module": "sqldrivers",
+ "depends": [
+ "core"
+ ],
+ "testDir": "../../../config.tests",
+
+ "commandline": {
+ "assignments": {
+ "MYSQL_PATH": "mysql.prefix",
+ "SYBASE": "tds.prefix",
+ "SYBASE_LIBS": "tds.libs"
+ },
+ "options": {
+ "mysql_config": "string",
+ "psql_config": "string",
+ "sqlite": { "type": "enum", "name": "system-sqlite", "values": { "qt": "no", "system": "yes" } },
+ "sql-db2": "boolean",
+ "sql-ibase": "boolean",
+ "sql-mysql": "boolean",
+ "sql-oci": "boolean",
+ "sql-odbc": "boolean",
+ "sql-psql": "boolean",
+ "sql-sqlite": "boolean",
+ "sql-sqlite2": "boolean",
+ "sql-tds": "boolean",
+ "plugin-sql-db2": { "type": "void", "name": "sql-db2" },
+ "plugin-sql-ibase": { "type": "void", "name": "sql-ibase" },
+ "plugin-sql-mysql": { "type": "void", "name": "sql-mysql" },
+ "plugin-sql-oci": { "type": "void", "name": "sql-oci" },
+ "plugin-sql-odbc": { "type": "void", "name": "sql-odbc" },
+ "plugin-sql-psql": { "type": "void", "name": "sql-psql" },
+ "plugin-sql-sqlite": { "type": "void", "name": "sql-sqlite" },
+ "plugin-sql-sqlite2": { "type": "void", "name": "sql-sqlite2" },
+ "plugin-sql-tds": { "type": "void", "name": "sql-tds" }
+ }
+ },
+
+ "libraries": {
+ "db2": {
+ "label": "DB2 (IBM)",
+ "test": "unix/db2",
+ "sources": [
+ { "libs": "-ldb2cli", "condition": "config.win32" },
+ { "libs": "-ldb2", "condition": "!config.win32" }
+ ]
+ },
+ "ibase": {
+ "label": "InterBase",
+ "test": "unix/ibase",
+ "sources": [
+ { "libs": "-lgds32_ms", "condition": "config.win32" },
+ { "libs": "-lgds", "condition": "!config.win32" }
+ ]
+ },
+ "mysql": {
+ "label": "MySQL",
+ "test": "unix/mysql",
+ "sources": [
+ { "type": "mysqlConfig", "query": "--libs_r", "cleanlibs": true },
+ { "type": "mysqlConfig", "query": "--libs", "cleanlibs": true },
+ { "type": "mysqlConfig", "query": "--libs_r", "cleanlibs": false },
+ { "type": "mysqlConfig", "query": "--libs", "cleanlibs": false },
+ { "libs": "-lmysqlclient_r", "condition": "!config.win32" },
+ { "libs": "-llibmysql", "condition": "config.win32" },
+ { "libs": "-lmysqlclient", "condition": "!config.win32" }
+ ]
+ },
+ "psql": {
+ "label": "PostgreSQL",
+ "test": "unix/psql",
+ "sources": [
+ { "type": "pkgConfig", "args": "libpq" },
+ { "type": "psqlConfig" },
+ { "type": "psqlEnv", "libs": "-llibpq -lws2_32 -ladvapi32", "condition": "config.win32" },
+ { "type": "psqlEnv", "libs": "-lpq", "condition": "!config.win32" }
+ ]
+ },
+ "tds": {
+ "label": "TDS (Sybase)",
+ "test": "unix/tds",
+ "sources": [
+ { "type": "sybaseEnv", "libs": "-lNTWDBLIB", "condition": "config.win32" },
+ { "type": "sybaseEnv", "libs": "-lsybdb", "condition": "!config.win32" }
+ ]
+ },
+ "oci": {
+ "label": "OCI (Oracle)",
+ "test": "unix/oci",
+ "sources": [
+ { "libs": "-loci", "condition": "config.win32" },
+ { "libs": "-lclntsh", "condition": "!config.win32" }
+ ]
+ },
+ "odbc": {
+ "label": "ODBC",
+ "test": "unix/odbc",
+ "sources": [
+ { "libs": "-lodbc32", "condition": "config.win32" },
+ { "libs": "-liodbc", "condition": "config.darwin" },
+ { "libs": "-lodbc", "condition": "!config.win32 && !config.darwin" }
+ ]
+ },
+ "sqlite2": {
+ "label": "SQLite (version 2)",
+ "test": "unix/sqlite2",
+ "sources": [
+ "-lsqlite"
+ ]
+ },
+ "sqlite3": {
+ "label": "SQLite (version 3)",
+ "export": "sqlite",
+ "test": "unix/sqlite",
+ "sources": [
+ { "type": "pkgConfig", "args": "sqlite3" },
+ "-lsqlite3"
+ ],
+ "use": [
+ { "lib": "zlib", "condition": "!config.win32 && features.system-zlib" }
+ ]
+ }
+ },
+
+ "tests": {
+ },
+
+ "features": {
+ "sql-db2": {
+ "label": "DB2 (IBM)",
+ "condition": "libs.db2",
+ "output": [ "privateFeature" ]
+ },
+ "sql-ibase": {
+ "label": "InterBase",
+ "condition": "libs.ibase",
+ "output": [ "privateFeature" ]
+ },
+ "sql-mysql": {
+ "label": "MySql",
+ "condition": "libs.mysql",
+ "output": [ "privateFeature" ]
+ },
+ "sql-oci": {
+ "label": "OCI (Oracle)",
+ "condition": "libs.oci",
+ "output": [ "privateFeature" ]
+ },
+ "sql-odbc": {
+ "label": "ODBC",
+ "condition": "features.datestring && libs.odbc",
+ "output": [ "privateFeature" ]
+ },
+ "sql-psql": {
+ "label": "PostgreSQL",
+ "condition": "libs.psql",
+ "output": [ "privateFeature" ]
+ },
+ "sql-sqlite2": {
+ "label": "SQLite2",
+ "condition": "libs.sqlite2",
+ "output": [ "privateFeature" ]
+ },
+ "sql-sqlite": {
+ "label": "SQLite",
+ "condition": "features.datestring",
+ "output": [ "privateFeature" ]
+ },
+ "system-sqlite": {
+ "label": " Using system provided SQLite",
+ "autoDetect": false,
+ "condition": "features.sql-sqlite && libs.sqlite3",
+ "output": [ "privateFeature" ]
+ },
+ "sql-tds": {
+ "label": "TDS (Sybase)",
+ "condition": "features.datestring && libs.tds",
+ "output": [ "privateFeature" ]
+ }
+ },
+
+ "report": [
+ {
+ "type": "warning",
+ "condition": "config.win32 && !config.msvc && features.sql-oci",
+ "message": "Qt does not support compiling the Oracle database driver with
+MinGW, due to lack of such support from Oracle. Consider disabling the
+Oracle driver, as the current build will most likely fail."
+ }
+ ],
+
+ "summary": [
+ {
+ "section": "Qt Sql",
+ "entries": [
+ "sql-db2", "sql-ibase", "sql-mysql", "sql-oci", "sql-odbc", "sql-psql",
+ "sql-sqlite2", "sql-sqlite", "system-sqlite", "sql-tds"
+ ]
+ }
+ ]
+}
diff --git a/src/plugins/sqldrivers/configure.pri b/src/plugins/sqldrivers/configure.pri
new file mode 100644
index 0000000000..9fb957291f
--- /dev/null
+++ b/src/plugins/sqldrivers/configure.pri
@@ -0,0 +1,99 @@
+# custom tests
+
+defineReplace(filterLibraryPath) {
+ str = $${1}
+ for (l, QMAKE_DEFAULT_LIBDIRS): \
+ str -= "-L$$l"
+
+ return($$str)
+}
+
+defineTest(qtConfLibrary_psqlConfig) {
+ pg_config = $$config.input.psql_config
+ isEmpty(pg_config): \
+ pg_config = $$qtConfFindInPath("pg_config")
+ !win32:!isEmpty(pg_config) {
+ qtRunLoggedCommand("$$pg_config --libdir", libdir)|return(false)
+ qtRunLoggedCommand("$$pg_config --includedir", includedir)|return(false)
+ libdir -= $$QMAKE_DEFAULT_LIBDIRS
+ libs =
+ !isEmpty(libdir): libs += "-L$$libdir"
+ libs += "-lpq"
+ $${1}.libs = "$$val_escape(libs)"
+ includedir -= $$QMAKE_DEFAULT_INCDIRS
+ $${1}.includedir = "$$val_escape(includedir)"
+ export($${1}.libs)
+ export($${1}.includedir)
+ return(true)
+ }
+ qtLog("pg_config not found.")
+ return(false)
+}
+
+defineTest(qtConfLibrary_psqlEnv) {
+ # Respect PSQL_LIBS if set
+ PSQL_LIBS = $$getenv(PSQL_LIBS)
+ !isEmpty(PSQL_LIBS) {
+ $${1}.libs = $$PSQL_LIBS
+ export($${1}.libs)
+ } else {
+ !qtConfLibrary_inline($$1): \
+ return(false)
+ }
+ return(true)
+}
+
+defineTest(qtConfLibrary_mysqlConfig) {
+ mysql_config = $$config.input.mysql_config
+ isEmpty(mysql_config): \
+ mysql_config = $$qtConfFindInPath("mysql_config")
+ !isEmpty(mysql_config) {
+ qtRunLoggedCommand("$$mysql_config --version", version)|return(false)
+ version = $$split(version, '.')
+ version = $$first(version)
+ isEmpty(version)|lessThan(version, 4): return(false)]
+
+ # query is either --libs or --libs_r
+ query = $$eval($${1}.query)
+ qtRunLoggedCommand("$$mysql_config $$query", libs)|return(false)
+ qtRunLoggedCommand("$$mysql_config --include", includedir)|return(false)
+ eval(libs = $$libs)
+ libs = $$filterLibraryPath($$libs)
+ # -rdynamic should not be returned by mysql_config, but is on RHEL 6.6
+ libs -= -rdynamic
+ equals($${1}.cleanlibs, true) {
+ for(l, libs) {
+ # Drop all options besides the -L one and the -lmysqlclient one
+ # so we don't unnecessarily link to libs like OpenSSL
+ contains(l, "^(-L|-lmysqlclient).*"): cleanlibs += $$l
+ }
+ libs = $$cleanlibs
+ }
+ $${1}.libs = "$$val_escape(libs)"
+ eval(rawincludedir = $$includedir)
+ rawincludedir ~= s/^-I//g
+ includedir =
+ for (id, rawincludedir): \
+ includedir += $$clean_path($$id)
+ includedir -= $$QMAKE_DEFAULT_INCDIRS
+ $${1}.includedir = "$$val_escape(includedir)"
+ export($${1}.libs)
+ export($${1}.includedir)
+ return(true)
+ }
+ qtLog("mysql_config not found.")
+ return(false)
+}
+
+defineTest(qtConfLibrary_sybaseEnv) {
+ libs =
+ sybase = $$getenv(SYBASE)
+ !isEmpty(sybase): \
+ libs += "-L$${sybase}/lib"
+ libs += $$getenv(SYBASE_LIBS)
+ !isEmpty(libs) {
+ $${1}.libs = "$$val_escape(libs)"
+ export($${1}.libs)
+ }
+ return(true)
+}
diff --git a/src/plugins/sqldrivers/qsqldriverbase.pri b/src/plugins/sqldrivers/qsqldriverbase.pri
index 512c046ec1..4b78fa9454 100644
--- a/src/plugins/sqldrivers/qsqldriverbase.pri
+++ b/src/plugins/sqldrivers/qsqldriverbase.pri
@@ -1,5 +1,8 @@
QT = core core-private sql-private
+# For QMAKE_USE in the parent projects.
+include($$shadowed($$PWD)/qtsqldrivers-config.pri)
+
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
diff --git a/src/plugins/sqldrivers/sqldrivers.pro b/src/plugins/sqldrivers/sqldrivers.pro
index 30fb6019ce..8a9ae46f82 100644
--- a/src/plugins/sqldrivers/sqldrivers.pro
+++ b/src/plugins/sqldrivers/sqldrivers.pro
@@ -1,5 +1,9 @@
TEMPLATE = subdirs
-QT_FOR_CONFIG += sql
+
+sqldrivers_standalone {
+ _QMAKE_CACHE_ = $$shadowed($$SQLDRV_SRC_TREE)/.qmake.conf
+ load(qt_configure)
+}
qtConfig(sql-psql) : SUBDIRS += psql
qtConfig(sql-mysql) : SUBDIRS += mysql
diff --git a/src/plugins/sqldrivers/sqlite/sqlite.pro b/src/plugins/sqldrivers/sqlite/sqlite.pro
index 1066bf7f51..d7e19f97b1 100644
--- a/src/plugins/sqldrivers/sqlite/sqlite.pro
+++ b/src/plugins/sqldrivers/sqlite/sqlite.pro
@@ -1,10 +1,11 @@
TARGET = qsqlite
-QT_FOR_CONFIG += sql-private
-
HEADERS += $$PWD/qsql_sqlite_p.h
SOURCES += $$PWD/qsql_sqlite.cpp $$PWD/smain.cpp
+include($$OUT_PWD/../qtsqldrivers-config.pri)
+QT_FOR_CONFIG += sqldrivers-private
+
qtConfig(system-sqlite) {
QMAKE_USE += sqlite
} else {