summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2016-07-28 13:20:41 +0200
committerEdward Welbourne <edward.welbourne@qt.io>2016-08-01 18:20:00 +0200
commitf6fc34294f5691da8aa7ab8dc0452c6fa9036b67 (patch)
tree3b8fe9841f88aa81e2f8f2d57cbbca2c4736ca6f /src
parent6f75096afc000991111bb0fd7a7e530ce3518627 (diff)
parent0eb77c3011ee4d6bbc46dd2d40c9324e9bfcbecf (diff)
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts: configure 5.7 now supports clang on android; but dev re-worked configure src/gui/kernel/qevent.h One side renamed a parameter of a constructor; the other added an alternate constructor on the next line. Applied the rename to both for consistency. tests/auto/tools/moc/tst_moc.cpp Each side added a new test at the end. .qmake.conf Ignored 5.7's change to MODULE_VERSION. configure.json No conflict noticed by git; but changes in 5.7 were needed for the re-worked configure to accommodate 5.7's stricter handling of C++11. Change-Id: I9cda53836a32d7bf83828212c7ea00b1de3e09d2
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro3
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-arabic.c6
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp4
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java18
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java18
-rw-r--r--src/corelib/global/qcompilerdetection.h33
-rw-r--r--src/corelib/io/qdatastream.h7
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp6
-rw-r--r--src/corelib/io/qtemporarydir.cpp52
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp7
-rw-r--r--src/corelib/kernel/qjni.cpp300
-rw-r--r--src/corelib/kernel/qjnionload.cpp5
-rw-r--r--src/corelib/kernel/qobject.cpp4
-rw-r--r--src/corelib/kernel/qobjectdefs.h2
-rw-r--r--src/corelib/plugin/qlibrary.cpp9
-rw-r--r--src/corelib/tools/qdatetime.h4
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h12
-rw-r--r--src/corelib/tools/qtimezoneprivate.cpp5
-rw-r--r--src/corelib/tools/qtimezoneprivate_tz.cpp6
-rw-r--r--src/corelib/tools/qvector.h6
-rw-r--r--src/corelib/xml/qxmlstream.cpp4
-rw-r--r--src/gui/image/qimage.cpp44
-rw-r--r--src/gui/image/qpixmap.cpp6
-rw-r--r--src/gui/kernel/qevent.h4
-rw-r--r--src/gui/kernel/qplatformwindow.cpp31
-rw-r--r--src/gui/kernel/qwindow.cpp9
-rw-r--r--src/gui/opengl/qopengldebug.cpp40
-rw-r--r--src/gui/opengl/qopengltexturehelper_p.h16
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject.cpp4
-rw-r--r--src/gui/painting/qbackingstore.cpp15
-rw-r--r--src/gui/text/qfont.cpp8
-rw-r--r--src/gui/text/qfontengine_ft.cpp5
-rw-r--r--src/network/socket/qabstractsocket.cpp13
-rw-r--r--src/platformsupport/fbconvenience/qfbvthandler.cpp18
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp10
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.h2
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp13
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h6
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp5
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.h1
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.mm19
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm14
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp7
-rw-r--r--src/plugins/platforms/windows/qwindowstheme.cpp9
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp10
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp5
-rw-r--r--src/testlib/doc/src/qttestlib-manual.qdoc2
-rw-r--r--src/testlib/qtestcase.cpp2
-rw-r--r--src/tools/moc/moc.cpp5
-rw-r--r--src/widgets/dialogs/qdialog.cpp6
-rw-r--r--src/widgets/itemviews/qabstractitemdelegate.cpp55
-rw-r--r--src/widgets/itemviews/qabstractitemdelegate_p.h3
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp6
-rw-r--r--src/widgets/itemviews/qabstractitemview_p.h5
-rw-r--r--src/widgets/itemviews/qitemdelegate.cpp42
-rw-r--r--src/widgets/itemviews/qstyleditemdelegate.cpp36
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm2
-rw-r--r--src/widgets/styles/qwindowsstyle.cpp47
-rw-r--r--src/widgets/styles/qwindowsstyle_p_p.h2
-rw-r--r--src/widgets/styles/qwindowsvistastyle.cpp22
-rw-r--r--src/widgets/styles/qwindowsxpstyle.cpp15
61 files changed, 651 insertions, 424 deletions
diff --git a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
index 99c32ea672..4fd0823332 100644
--- a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
+++ b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
@@ -23,7 +23,10 @@ win32: DEFINES += HB_NO_WIN1256
android: DEFINES += _POSIX_C_SOURCE=200112L
INCLUDEPATH += $$PWD/include
+
+# Harfbuzz-NG inside Qt uses the Qt atomics (inline code only)
INCLUDEPATH += $$QT.core.includes
+DEFINES += QT_NO_VERSION_TAGGING
SOURCES += \
$$PWD/src/hb-blob.cc \
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c b/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c
index b43ac9c353..966537ffa0 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c
@@ -921,7 +921,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
for (i = 0; i < len; i++) {
hb_uint8 r = *ch >> 8;
- int gpos = data - shapeBuffer;
+ const int gpos = int(data - shapeBuffer);
if (r != 0x06) {
if (r == 0x20) {
@@ -981,7 +981,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
/* qDebug("glyph %d (char %d) is mark!", gpos, i); */
} else {
attributes[gpos].mark = FALSE;
- clusterStart = data - shapeBuffer;
+ clusterStart = int(data - shapeBuffer);
}
attributes[gpos].clusterStart = !attributes[gpos].mark;
attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch);
@@ -992,7 +992,7 @@ static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32
ch++;
logClusters[i] = clusterStart;
}
- *shapedLength = data - shapeBuffer;
+ *shapedLength = int(data - shapeBuffer);
HB_FREE_STACKARRAY(props);
}
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
index f7a4195308..30dde281e8 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
@@ -94,7 +94,7 @@ static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast)
offsetBase = ((size * 10) - markTotalHeight) / 2; // Use offset that just fits
}
- bool rightToLeft = item->item.bidiLevel % 2;
+ const bool rightToLeft = (item->item.bidiLevel % 2) != 0;
int i;
unsigned char lastCmb = 0;
@@ -281,7 +281,7 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
// first char in a run is never (treated as) a mark
int cStart = 0;
- const bool symbolFont = item->face->isSymbolFont;
+ const bool symbolFont = item->face->isSymbolFont != 0;
attributes[0].mark = false;
attributes[0].clusterStart = true;
attributes[0].dontPrint = (!symbolFont && uc[0] == 0x00ad) || HB_IsControlChar(uc[0]);
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 0cfce2c6af..656dbdda45 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -489,11 +489,19 @@ public class QtActivityDelegate
continue;
try {
- @SuppressWarnings("rawtypes")
- Class<?> initClass = classLoader.loadClass(className);
- Object staticInitDataObject = initClass.newInstance(); // create an instance
- Method m = initClass.getMethod("setActivity", Activity.class, Object.class);
- m.invoke(staticInitDataObject, m_activity, this);
+ Class<?> initClass = classLoader.loadClass(className);
+ Object staticInitDataObject = initClass.newInstance(); // create an instance
+ try {
+ Method m = initClass.getMethod("setActivity", Activity.class, Object.class);
+ m.invoke(staticInitDataObject, m_activity, this);
+ } catch (Exception e) {
+ }
+
+ try {
+ Method m = initClass.getMethod("setContext", Context.class);
+ m.invoke(staticInitDataObject, (Context)m_activity);
+ } catch (Exception e) {
+ }
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
index 634658eefb..5ac406c710 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
@@ -120,12 +120,20 @@ public class QtServiceDelegate
for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) {
if (className.length() == 0)
continue;
-
try {
- Class<?> initClass = classLoader.loadClass(className);
- Object staticInitDataObject = initClass.newInstance(); // create an instance
- Method m = initClass.getMethod("setService", Service.class, Object.class);
- m.invoke(staticInitDataObject, m_service, this);
+ Class<?> initClass = classLoader.loadClass(className);
+ Object staticInitDataObject = initClass.newInstance(); // create an instance
+ try {
+ Method m = initClass.getMethod("setService", Service.class, Object.class);
+ m.invoke(staticInitDataObject, m_service, this);
+ } catch (Exception e) {
+ }
+
+ try {
+ Method m = initClass.getMethod("setContext", Context.class);
+ m.invoke(staticInitDataObject, (Context)m_service);
+ } catch (Exception e) {
+ }
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index c5424be035..70c9e97c13 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -557,6 +557,12 @@
* Q_COMPILER_RESTRICTED_VLA variable-length arrays, prior to __cpp_runtime_arrays
*/
+#ifdef __cplusplus
+# if __cplusplus < 201103L && !(defined(Q_CC_MSVC) && Q_CC_MSVC >= 1800)
+# error Qt requires a C++11 compiler and yours does not seem to be that.
+# endif
+#endif
+
#ifdef Q_CC_INTEL
# define Q_COMPILER_RESTRICTED_VLA
# define Q_COMPILER_VARIADIC_MACROS // C++11 feature supported as an extension in other modes, too
@@ -1023,6 +1029,33 @@
// critical definitions. (Reported as Intel Issue ID 6000117277)
# define __USE_CONSTEXPR 1
# define __USE_NOEXCEPT 1
+# elif defined(Q_CC_MSVC) && (defined(Q_CC_CLANG) || defined(Q_CC_INTEL))
+// Clang and the Intel compiler support more C++ features than the Microsoft compiler
+// so make sure we don't enable them if the MS headers aren't properly adapted.
+# ifndef _HAS_CONSTEXPR
+# undef Q_COMPILER_CONSTEXPR
+# endif
+# ifndef _HAS_DECLTYPE
+# undef Q_COMPILER_DECLTYPE
+# endif
+# ifndef _HAS_INITIALIZER_LISTS
+# undef Q_COMPILER_INITIALIZER_LISTS
+# endif
+# ifndef _HAS_NULLPTR_T
+# undef Q_COMPILER_NULLPTR
+# endif
+# ifndef _HAS_RVALUE_REFERENCES
+# undef Q_COMPILER_RVALUE_REFS
+# endif
+# ifndef _HAS_SCOPED_ENUM
+# undef Q_COMPILER_CLASS_ENUM
+# endif
+# ifndef _HAS_TEMPLATE_ALIAS
+# undef Q_COMPILER_TEMPLATE_ALIAS
+# endif
+# ifndef _HAS_VARIADIC_TEMPLATES
+# undef Q_COMPILER_VARIADIC_TEMPLATES
+# endif
# elif defined(_LIBCPP_VERSION)
// libc++ uses __has_feature(cxx_atomic), so disable the feature if the compiler
// doesn't support it. That's required for the Intel compiler 14.x or earlier on OS X, for example.
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h
index 5956f9ac40..ac58677b77 100644
--- a/src/corelib/io/qdatastream.h
+++ b/src/corelib/io/qdatastream.h
@@ -63,6 +63,9 @@ template <class Key, class T> class QMap;
#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
class QDataStreamPrivate;
+namespace QtPrivate {
+class StreamStateSaver;
+}
class Q_CORE_EXPORT QDataStream
{
public:
@@ -193,6 +196,7 @@ private:
Status q_status;
int readBlock(char *data, int len);
+ friend class QtPrivate::StreamStateSaver;
};
namespace QtPrivate {
@@ -202,7 +206,8 @@ class StreamStateSaver
public:
inline StreamStateSaver(QDataStream *s) : stream(s), oldStatus(s->status())
{
- stream->resetStatus();
+ if (!stream->dev || !stream->dev->isTransactionStarted())
+ stream->resetStatus();
}
inline ~StreamStateSaver()
{
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 70c347978e..5c79a745fa 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -378,15 +378,13 @@ qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len)
if (fileHandle == INVALID_HANDLE_VALUE)
return -1;
- qint64 bytesToWrite = DWORD(len); // <- lossy
+ qint64 bytesToWrite = len;
// Writing on Windows fails with ERROR_NO_SYSTEM_RESOURCES when
// the chunks are too large, so we limit the block size to 32MB.
- static const DWORD maxBlockSize = 32 * 1024 * 1024;
-
+ const DWORD blockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024)));
qint64 totalWritten = 0;
do {
- DWORD blockSize = qMin<DWORD>(bytesToWrite, maxBlockSize);
DWORD bytesWritten;
if (!WriteFile(fileHandle, data + totalWritten, blockSize, &bytesWritten, NULL)) {
if (totalWritten == 0) {
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 563913bc12..6e50a8513e 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -51,8 +51,12 @@
#include "qcoreapplication.h"
#endif
+#if !defined(Q_OS_QNX) && !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY)
+# define USE_SYSTEM_MKDTEMP
+#endif
+
#include <stdlib.h> // mkdtemp
-#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY)
+#ifndef USE_SYSTEM_MKDTEMP
#include <private/qfilesystemengine_p.h>
#endif
@@ -98,8 +102,7 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
-#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY)
-
+#ifndef USE_SYSTEM_MKDTEMP
static int nextRand(int &v)
{
int r = v % 62;
@@ -109,30 +112,28 @@ static int nextRand(int &v)
return r;
}
-QPair<QString, bool> q_mkdtemp(char *templateName)
+QPair<QString, bool> q_mkdtemp(QString templateName)
{
- static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ Q_ASSERT(templateName.endsWith(QLatin1String("XXXXXX")));
- const size_t length = strlen(templateName);
+ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- char *XXXXXX = templateName + length - 6;
+ const int length = templateName.size();
- Q_ASSERT((length >= 6u) && strncmp(XXXXXX, "XXXXXX", 6) == 0);
+ QChar *XXXXXX = templateName.data() + length - 6;
for (int i = 0; i < 256; ++i) {
int v = qrand();
/* Fill in the random bits. */
- XXXXXX[0] = letters[nextRand(v)];
- XXXXXX[1] = letters[nextRand(v)];
- XXXXXX[2] = letters[nextRand(v)];
- XXXXXX[3] = letters[nextRand(v)];
- XXXXXX[4] = letters[nextRand(v)];
- XXXXXX[5] = letters[v % 62];
-
- QString templateNameStr = QFile::decodeName(templateName);
-
- QFileSystemEntry fileSystemEntry(templateNameStr);
+ XXXXXX[0] = QLatin1Char(letters[nextRand(v)]);
+ XXXXXX[1] = QLatin1Char(letters[nextRand(v)]);
+ XXXXXX[2] = QLatin1Char(letters[nextRand(v)]);
+ XXXXXX[3] = QLatin1Char(letters[nextRand(v)]);
+ XXXXXX[4] = QLatin1Char(letters[nextRand(v)]);
+ XXXXXX[5] = QLatin1Char(letters[v % 62]);
+
+ QFileSystemEntry fileSystemEntry(templateName);
if (QFileSystemEngine::createDirectory(fileSystemEntry, false)) {
QSystemError error;
QFileSystemEngine::setPermissions(fileSystemEntry,
@@ -141,10 +142,10 @@ QPair<QString, bool> q_mkdtemp(char *templateName)
QFile::ExeOwner, error);
if (error.error() != 0) {
if (!QFileSystemEngine::removeDirectory(fileSystemEntry, false))
- qWarning() << "Unable to remove unused directory" << templateNameStr;
+ qWarning() << "Unable to remove unused directory" << templateName;
continue;
}
- return qMakePair(QFile::decodeName(templateName), true);
+ return qMakePair(templateName, true);
}
# ifdef Q_OS_WIN
const int exists = ERROR_ALREADY_EXISTS;
@@ -159,7 +160,7 @@ QPair<QString, bool> q_mkdtemp(char *templateName)
return qMakePair(qt_error_string(), false);
}
-#else // defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
+#else // !USE_SYSTEM_MKDTEMP
QPair<QString, bool> q_mkdtemp(char *templateName)
{
@@ -167,14 +168,21 @@ QPair<QString, bool> q_mkdtemp(char *templateName)
return qMakePair(ok ? QFile::decodeName(templateName) : qt_error_string(), ok);
}
-#endif
+#endif // USE_SYSTEM_MKDTEMP
void QTemporaryDirPrivate::create(const QString &templateName)
{
+#ifndef USE_SYSTEM_MKDTEMP
+ QString buffer = templateName;
+ if (!buffer.endsWith(QLatin1String("XXXXXX")))
+ buffer += QLatin1String("XXXXXX");
+ const QPair<QString, bool> result = q_mkdtemp(buffer);
+#else // !USE_SYSTEM_MKDTEMP
QByteArray buffer = QFile::encodeName(templateName);
if (!buffer.endsWith("XXXXXX"))
buffer += "XXXXXX";
QPair<QString, bool> result = q_mkdtemp(buffer.data()); // modifies buffer
+#endif // USE_SYSTEM_MKDTEMP
pathOrError = result.first;
success = result.second;
}
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index 9afbb84abf..802962d77d 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -421,7 +421,12 @@ void QEventDispatcherUNIX::unregisterSocketNotifier(QSocketNotifier *notifier)
QSocketNotifier::Type type = notifier->type();
#ifndef QT_NO_DEBUG
if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
- qWarning("QSocketNotifier: socket notifiers cannot be disabled from another thread");
+ qWarning("QSocketNotifier: socket notifier (fd %d) cannot be disabled from another thread.\n"
+ "(Notifier's thread is %s(%p), event dispatcher's thread is %s(%p), current thread is %s(%p))",
+ sockfd,
+ notifier->thread() ? notifier->thread()->metaObject()->className() : "QThread", notifier->thread(),
+ thread() ? thread()->metaObject()->className() : "QThread", thread(),
+ QThread::currentThread() ? QThread::currentThread()->metaObject()->className() : "QThread", QThread::currentThread());
return;
}
#endif
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 260b877291..41d55c8fde 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -476,7 +476,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj)
env->DeleteLocalRef(cls);
}
template <>
-void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig);
@@ -486,7 +486,7 @@ void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *si
}
template <>
-void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -495,7 +495,7 @@ void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig
}
template <>
-jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -507,7 +507,7 @@ jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const
}
template <>
-jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -517,7 +517,7 @@ jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const c
}
template <>
-jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -529,7 +529,7 @@ jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *
}
template <>
-jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -539,7 +539,7 @@ jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *s
}
template <>
-jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -551,7 +551,7 @@ jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *
}
template <>
-jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -561,7 +561,7 @@ jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *s
}
template <>
-jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -573,7 +573,7 @@ jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char
}
template <>
-jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -583,7 +583,7 @@ jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char
}
template <>
-jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -595,7 +595,7 @@ jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *si
}
template <>
-jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -605,7 +605,7 @@ jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig
}
template <>
-jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -617,7 +617,7 @@ jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *
}
template <>
-jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -627,7 +627,7 @@ jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *s
}
template <>
-jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -639,7 +639,7 @@ jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char
}
template <>
-jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -649,7 +649,7 @@ jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char
}
template <>
-jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -661,7 +661,7 @@ jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const ch
}
template <>
-jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, ...) const
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, ...) const
{
va_list args;
va_start(args, sig);
@@ -671,61 +671,61 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const cha
}
template <>
-void QJNIObjectPrivate::callMethod<void>(const char *methodName) const
+Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName) const
{
callMethod<void>(methodName, "()V");
}
template <>
-jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName) const
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName) const
{
return callMethod<jboolean>(methodName, "()Z");
}
template <>
-jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName) const
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName) const
{
return callMethod<jbyte>(methodName, "()B");
}
template <>
-jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName) const
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName) const
{
return callMethod<jchar>(methodName, "()C");
}
template <>
-jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName) const
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName) const
{
return callMethod<jshort>(methodName, "()S");
}
template <>
-jint QJNIObjectPrivate::callMethod<jint>(const char *methodName) const
+Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName) const
{
return callMethod<jint>(methodName, "()I");
}
template <>
-jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName) const
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName) const
{
return callMethod<jlong>(methodName, "()J");
}
template <>
-jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName) const
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName) const
{
return callMethod<jfloat>(methodName, "()F");
}
template <>
-jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const
{
return callMethod<jdouble>(methodName, "()D");
}
template <>
-void QJNIObjectPrivate::callStaticMethodV<void>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -741,7 +741,7 @@ void QJNIObjectPrivate::callStaticMethodV<void>(const char *className,
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -753,7 +753,7 @@ void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
}
template <>
-void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -766,7 +766,7 @@ void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -778,7 +778,7 @@ void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className,
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -797,7 +797,7 @@ jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className,
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -810,7 +810,7 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz,
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -826,7 +826,7 @@ jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz,
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -839,7 +839,7 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className,
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -858,7 +858,7 @@ jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className,
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -871,7 +871,7 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz,
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -887,7 +887,7 @@ jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz,
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -900,7 +900,7 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
}
template <>
-jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className,
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -919,7 +919,7 @@ jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className,
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -932,7 +932,7 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
}
template <>
-jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz,
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -948,7 +948,7 @@ jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz,
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -961,7 +961,7 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
}
template <>
-jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className,
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -980,7 +980,7 @@ jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className,
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -993,7 +993,7 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
}
template <>
-jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz,
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -1009,7 +1009,7 @@ jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz,
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -1022,7 +1022,7 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
}
template <>
-jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className,
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -1041,7 +1041,7 @@ jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className,
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -1054,7 +1054,7 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
}
template <>
-jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz,
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -1070,7 +1070,7 @@ jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz,
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -1083,7 +1083,7 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
}
template <>
-jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className,
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -1102,7 +1102,7 @@ jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className,
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -1115,7 +1115,7 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
}
template <>
-jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz,
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -1131,7 +1131,7 @@ jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz,
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -1144,7 +1144,7 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className,
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -1163,7 +1163,7 @@ jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className,
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -1176,7 +1176,7 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz,
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -1192,7 +1192,7 @@ jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz,
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -1205,7 +1205,7 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className,
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className,
const char *methodName,
const char *sig,
va_list args)
@@ -1224,7 +1224,7 @@ jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className,
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
const char *methodName,
const char *sig,
...)
@@ -1237,7 +1237,7 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz,
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz,
const char *methodName,
const char *sig,
va_list args)
@@ -1253,7 +1253,7 @@ jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz,
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
const char *methodName,
const char *sig,
...)
@@ -1266,109 +1266,109 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName)
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName)
{
callStaticMethod<void>(className, methodName, "()V");
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName)
{
callStaticMethod<void>(clazz, methodName, "()V");
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName)
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName)
{
return callStaticMethod<jboolean>(className, methodName, "()Z");
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName)
{
return callStaticMethod<jboolean>(clazz, methodName, "()Z");
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName)
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName)
{
return callStaticMethod<jbyte>(className, methodName, "()B");
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName)
{
return callStaticMethod<jbyte>(clazz, methodName, "()B");
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName)
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName)
{
return callStaticMethod<jchar>(className, methodName, "()C");
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName)
{
return callStaticMethod<jchar>(clazz, methodName, "()C");
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName)
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName)
{
return callStaticMethod<jshort>(className, methodName, "()S");
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName)
{
return callStaticMethod<jshort>(clazz, methodName, "()S");
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName)
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName)
{
return callStaticMethod<jint>(className, methodName, "()I");
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName)
{
return callStaticMethod<jint>(clazz, methodName, "()I");
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName)
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName)
{
return callStaticMethod<jlong>(className, methodName, "()J");
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName)
{
return callStaticMethod<jlong>(clazz, methodName, "()J");
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName)
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName)
{
return callStaticMethod<jfloat>(className, methodName, "()F");
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName)
{
return callStaticMethod<jfloat>(clazz, methodName, "()F");
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName)
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName)
{
return callStaticMethod<jdouble>(className, methodName, "()D");
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName)
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName)
{
return callStaticMethod<jdouble>(clazz, methodName, "()D");
}
@@ -1403,49 +1403,49 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName,
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jstring>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jstring>(const char *methodName) const
{
return callObjectMethod(methodName, "()Ljava/lang/String;");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbooleanArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbooleanArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[Z");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbyteArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbyteArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[B");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jshortArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jshortArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[S");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jintArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jintArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[I");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jlongArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jlongArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[J");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jfloatArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jfloatArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[F");
}
template <>
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *methodName) const
+Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *methodName) const
{
return callObjectMethod(methodName, "()[D");
}
@@ -1516,7 +1516,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz,
}
template <>
-jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -1528,7 +1528,7 @@ jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const
}
template <>
-jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -1540,7 +1540,7 @@ jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const
}
template <>
-jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const
+Q_CORE_EXPORT jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -1552,7 +1552,7 @@ jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const
}
template <>
-jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const
+Q_CORE_EXPORT jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -1564,7 +1564,7 @@ jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const
}
template <>
-jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const
+Q_CORE_EXPORT jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -1576,7 +1576,7 @@ jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const
}
template <>
-jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const
+Q_CORE_EXPORT jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1588,7 +1588,7 @@ jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const
}
template <>
-jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -1600,7 +1600,7 @@ jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const
}
template <>
-jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1612,7 +1612,7 @@ jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const
}
template <>
-jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -1624,7 +1624,7 @@ jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *f
}
template <>
-jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1639,7 +1639,7 @@ jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, cons
}
template <>
-jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -1651,7 +1651,7 @@ jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldNa
}
template <>
-jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1666,7 +1666,7 @@ jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char
}
template <>
-jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -1678,7 +1678,7 @@ jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldNa
}
template <>
-jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1693,7 +1693,7 @@ jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char
}
template <>
-jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -1705,7 +1705,7 @@ jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *field
}
template <>
-jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1720,7 +1720,7 @@ jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const ch
}
template <>
-jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -1732,7 +1732,7 @@ jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName
}
template <>
-jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1747,7 +1747,7 @@ jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *
}
template <>
-jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1759,7 +1759,7 @@ jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldNa
}
template <>
-jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1774,7 +1774,7 @@ jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char
}
template <>
-jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -1786,7 +1786,7 @@ jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *field
}
template <>
-jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1801,7 +1801,7 @@ jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const ch
}
template <>
-jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fieldName)
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1813,7 +1813,7 @@ jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fie
}
template <>
-jdouble QJNIObjectPrivate::getStaticField<jdouble>(const char *className, const char *fieldName)
+Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(const char *className, const char *fieldName)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -1885,7 +1885,7 @@ QJNIObjectPrivate QJNIObjectPrivate::getStaticObjectField(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Z");
@@ -1895,7 +1895,7 @@ void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value
}
template <>
-void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "B");
@@ -1905,7 +1905,7 @@ void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value)
}
template <>
-void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "C");
@@ -1915,7 +1915,7 @@ void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value)
}
template <>
-void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "S");
@@ -1925,7 +1925,7 @@ void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value)
}
template <>
-void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "I");
@@ -1935,7 +1935,7 @@ void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value)
}
template <>
-void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "J");
@@ -1945,7 +1945,7 @@ void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value)
}
template <>
-void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "F");
@@ -1955,7 +1955,7 @@ void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value)
}
template <>
-void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "D");
@@ -1965,7 +1965,7 @@ void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value)
}
template <>
-void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[Z");
@@ -1975,7 +1975,7 @@ void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanA
}
template <>
-void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[B");
@@ -1985,7 +1985,7 @@ void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray v
}
template <>
-void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[C");
@@ -1995,7 +1995,7 @@ void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray v
}
template <>
-void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[S");
@@ -2005,7 +2005,7 @@ void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray
}
template <>
-void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[I");
@@ -2015,7 +2015,7 @@ void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray val
}
template <>
-void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[J");
@@ -2025,7 +2025,7 @@ void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray v
}
template <>
-void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[F");
@@ -2035,7 +2035,7 @@ void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray
}
template <>
-void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArray value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArray value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[D");
@@ -2045,7 +2045,7 @@ void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArr
}
template <>
-void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value)
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value)
{
QJNIEnvironmentPrivate env;
jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Ljava/lang/String;");
@@ -2055,7 +2055,7 @@ void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value)
}
template <>
-void QJNIObjectPrivate::setField<jobject>(const char *fieldName,
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobject>(const char *fieldName,
const char *sig,
jobject value)
{
@@ -2067,7 +2067,7 @@ void QJNIObjectPrivate::setField<jobject>(const char *fieldName,
}
template <>
-void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName,
+Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName,
const char *sig,
jobjectArray value)
{
@@ -2079,7 +2079,7 @@ void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName,
}
template <>
-void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz,
const char *fieldName,
jboolean value)
{
@@ -2090,7 +2090,7 @@ void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jboolean>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(const char *className,
const char *fieldName,
jboolean value)
{
@@ -2107,7 +2107,7 @@ void QJNIObjectPrivate::setStaticField<jboolean>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz,
const char *fieldName,
jbyte value)
{
@@ -2118,7 +2118,7 @@ void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jbyte>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(const char *className,
const char *fieldName,
jbyte value)
{
@@ -2135,7 +2135,7 @@ void QJNIObjectPrivate::setStaticField<jbyte>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz,
const char *fieldName,
jchar value)
{
@@ -2146,7 +2146,7 @@ void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jchar>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(const char *className,
const char *fieldName,
jchar value)
{
@@ -2163,7 +2163,7 @@ void QJNIObjectPrivate::setStaticField<jchar>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz,
const char *fieldName,
jshort value)
{
@@ -2174,7 +2174,7 @@ void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jshort>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(const char *className,
const char *fieldName,
jshort value)
{
@@ -2191,7 +2191,7 @@ void QJNIObjectPrivate::setStaticField<jshort>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jint>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(jclass clazz,
const char *fieldName,
jint value)
{
@@ -2202,7 +2202,7 @@ void QJNIObjectPrivate::setStaticField<jint>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jint>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(const char *className,
const char *fieldName,
jint value)
{
@@ -2219,7 +2219,7 @@ void QJNIObjectPrivate::setStaticField<jint>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz,
const char *fieldName,
jlong value)
{
@@ -2230,7 +2230,7 @@ void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jlong>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(const char *className,
const char *fieldName,
jlong value)
{
@@ -2247,7 +2247,7 @@ void QJNIObjectPrivate::setStaticField<jlong>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz,
const char *fieldName,
jfloat value)
{
@@ -2258,7 +2258,7 @@ void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jfloat>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(const char *className,
const char *fieldName,
jfloat value)
{
@@ -2275,7 +2275,7 @@ void QJNIObjectPrivate::setStaticField<jfloat>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz,
const char *fieldName,
jdouble value)
{
@@ -2286,7 +2286,7 @@ void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jdouble>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(const char *className,
const char *fieldName,
jdouble value)
{
@@ -2303,7 +2303,7 @@ void QJNIObjectPrivate::setStaticField<jdouble>(const char *className,
}
template <>
-void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz,
const char *fieldName,
const char *sig,
jobject value)
@@ -2315,7 +2315,7 @@ void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz,
}
template <>
-void QJNIObjectPrivate::setStaticField<jobject>(const char *className,
+Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(const char *className,
const char *fieldName,
const char *sig,
jobject value)
diff --git a/src/corelib/kernel/qjnionload.cpp b/src/corelib/kernel/qjnionload.cpp
index f80da36240..c936bf42fd 100644
--- a/src/corelib/kernel/qjnionload.cpp
+++ b/src/corelib/kernel/qjnionload.cpp
@@ -44,6 +44,11 @@ Q_CORE_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
Q_UNUSED(reserved)
+ static bool initialized = false;
+ if (initialized)
+ return JNI_VERSION_1_6;
+ initialized = true;
+
typedef union {
JNIEnv *nenv;
void *venv;
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index c0ebf273fa..c846aada05 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -3693,7 +3693,6 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
continue;
#ifndef QT_NO_THREAD
} else if (c->connectionType == Qt::BlockingQueuedConnection) {
- locker.unlock();
if (receiverInSameThread) {
qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: "
"Sender is %s(%p), receiver is %s(%p)",
@@ -3705,6 +3704,7 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :
new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);
QCoreApplication::postEvent(receiver, ev);
+ locker.unlock();
semaphore.acquire();
locker.relock();
continue;
@@ -4272,7 +4272,7 @@ QDebug operator<<(QDebug dbg, const QObject *o)
\relates QObject
\since 5.5
- This macro registers a single \l{QFlags}{flags types} with the
+ This macro registers a single \l{QFlags}{flags type} with the
meta-object system. It is typically used in a class definition to declare
that values of a given enum can be used as flags and combined using the
bitwise OR operator.
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index f8bebdf617..3660d1c0e1 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -180,6 +180,8 @@ inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306
# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
+#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 510
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override")
#else
# define Q_OBJECT_NO_OVERRIDE_WARNING
#endif
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 886dd20d0e..93a901d614 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -536,8 +536,13 @@ bool QLibraryPrivate::load()
return false;
bool ret = load_sys();
- if (qt_debug_component())
- qDebug() << "loaded library" << fileName;
+ if (qt_debug_component()) {
+ if (ret) {
+ qDebug() << "loaded library" << fileName;
+ } else {
+ qDebug() << qUtf8Printable(errorString);
+ }
+ }
if (ret) {
//when loading a library we add a reference to it so that the QLibraryPrivate won't get deleted
//this allows to unload the library at a later time
diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h
index ec0eaa1edf..ebf9b45570 100644
--- a/src/corelib/tools/qdatetime.h
+++ b/src/corelib/tools/qdatetime.h
@@ -123,8 +123,8 @@ QT_DEPRECATED inline bool setYMD(int y, int m, int d)
static bool isValid(int y, int m, int d);
static bool isLeapYear(int year);
- static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd)
- { return jd >= minJd() && jd <= maxJd() ? QDate(jd) : QDate() ; }
+ static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd_)
+ { return jd_ >= minJd() && jd_ <= maxJd() ? QDate(jd_) : QDate() ; }
Q_DECL_CONSTEXPR inline qint64 toJulianDay() const { return jd; }
private:
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 0f769ffa86..7ce12bc244 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -499,14 +499,14 @@ private:
void deref() Q_DECL_NOTHROW
{ deref(d); }
- static void deref(Data *d) Q_DECL_NOTHROW
+ static void deref(Data *dd) Q_DECL_NOTHROW
{
- if (!d) return;
- if (!d->strongref.deref()) {
- d->destroy();
+ if (!dd) return;
+ if (!dd->strongref.deref()) {
+ dd->destroy();
}
- if (!d->weakref.deref())
- delete d;
+ if (!dd->weakref.deref())
+ delete dd;
}
template <class X>
diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp
index 763d12b702..56da197542 100644
--- a/src/corelib/tools/qtimezoneprivate.cpp
+++ b/src/corelib/tools/qtimezoneprivate.cpp
@@ -656,10 +656,11 @@ QTimeZonePrivate *QUtcTimeZonePrivate::clone()
QTimeZonePrivate::Data QUtcTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
- Data d = invalidData();
+ Data d;
d.abbreviation = m_abbreviation;
d.atMSecsSinceEpoch = forMSecsSinceEpoch;
- d.offsetFromUtc = m_offsetFromUtc;
+ d.standardTimeOffset = d.offsetFromUtc = m_offsetFromUtc;
+ d.daylightTimeOffset = 0;
return d;
}
diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp
index c2630c8593..6e717f2233 100644
--- a/src/corelib/tools/qtimezoneprivate_tz.cpp
+++ b/src/corelib/tools/qtimezoneprivate_tz.cpp
@@ -907,7 +907,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
// If the required time is after the last transition and we have a POSIX rule then use it
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < forMSecsSinceEpoch
- &&!m_posixRule.isEmpty() && forMSecsSinceEpoch >= 0) {
+ && !m_posixRule.isEmpty() && forMSecsSinceEpoch >= 0) {
const int year = QDateTime::fromMSecsSinceEpoch(forMSecsSinceEpoch, Qt::UTC).date().year();
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
@@ -951,7 +951,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSince
{
// If the required time is after the last transition and we have a POSIX rule then use it
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < afterMSecsSinceEpoch
- &&!m_posixRule.isEmpty() && afterMSecsSinceEpoch >= 0) {
+ && !m_posixRule.isEmpty() && afterMSecsSinceEpoch >= 0) {
const int year = QDateTime::fromMSecsSinceEpoch(afterMSecsSinceEpoch, Qt::UTC).date().year();
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
@@ -977,7 +977,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
{
// If the required time is after the last transition and we have a POSIX rule then use it
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < beforeMSecsSinceEpoch
- &&!m_posixRule.isEmpty() && beforeMSecsSinceEpoch > 0) {
+ && !m_posixRule.isEmpty() && beforeMSecsSinceEpoch > 0) {
const int year = QDateTime::fromMSecsSinceEpoch(beforeMSecsSinceEpoch, Qt::UTC).date().year();
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index b68ca87063..4dbf95c315 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -397,7 +397,11 @@ void QVector<T>::reserve(int asize)
{
if (asize > int(d->alloc))
reallocData(d->size, asize);
- if (isDetached())
+ if (isDetached()
+#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
+ && d != Data::unsharableEmpty()
+#endif
+ )
d->capacityReserved = 1;
Q_ASSERT(capacity() >= asize);
}
diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp
index 3949d2c3ac..83b26d50ab 100644
--- a/src/corelib/xml/qxmlstream.cpp
+++ b/src/corelib/xml/qxmlstream.cpp
@@ -1181,6 +1181,10 @@ inline int QXmlStreamReaderPrivate::fastScanLiteralContent()
}
// fall through
default:
+ if (c < 0x20) {
+ putChar(c);
+ return n;
+ }
textBuffer += QChar(c);
++n;
}
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 3abfac1575..bd32ca7bee 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -840,17 +840,6 @@ QImageData *QImageData::create(uchar *data, int width, int height, int bpl, QIm
d->cleanupFunction = cleanupFunction;
d->cleanupInfo = cleanupInfo;
- switch (format) {
- case QImage::Format_Mono:
- case QImage::Format_MonoLSB:
- d->colortable.resize(2);
- d->colortable[0] = QColor(Qt::black).rgba();
- d->colortable[1] = QColor(Qt::white).rgba();
- break;
- default:
- break;
- }
-
return d;
}
@@ -2249,21 +2238,30 @@ QRgb QImage::pixel(int x, int y) const
}
const uchar *s = d->data + y * d->bytes_per_line;
- switch(d->format) {
+
+ int index = -1;
+ switch (d->format) {
case Format_Mono:
- return d->colortable.at((*(s + (x >> 3)) >> (~x & 7)) & 1);
+ index = (*(s + (x >> 3)) >> (~x & 7)) & 1;
+ break;
case Format_MonoLSB:
- return d->colortable.at((*(s + (x >> 3)) >> (x & 7)) & 1);
+ index = (*(s + (x >> 3)) >> (x & 7)) & 1;
+ break;
case Format_Indexed8:
- {
- int index = (int)s[x];
- if (index < d->colortable.size()) {
- return d->colortable.at(index);
- } else {
- qWarning("QImage::pixel: color table index %d out of range.", index);
- return 0;
- }
+ index = s[x];
+ break;
+ default:
+ break;
+ }
+ if (index >= 0) { // Indexed format
+ if (index >= d->colortable.size()) {
+ qWarning("QImage::pixel: color table index %d out of range.", index);
+ return 0;
}
+ return d->colortable.at(index);
+ }
+
+ switch (d->format) {
case Format_RGB32:
return 0xff000000 | reinterpret_cast<const QRgb *>(s)[x];
case Format_ARGB32: // Keep old behaviour.
@@ -4250,6 +4248,8 @@ void QImage::setAlphaChannel(const QImage &alphaChannel)
} else {
const QImage sourceImage = alphaChannel.convertToFormat(QImage::Format_RGB32);
+ if (sourceImage.isNull())
+ return;
const uchar *src_data = sourceImage.d->data;
uchar *dest_data = d->data;
for (int y=0; y<h; ++y) {
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 4ab8160f21..a360debf5b 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -1410,10 +1410,8 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode)
QPixmap using the fromImage(). If this is too expensive an
operation, you can use QBitmap::fromImage() instead.
- The QPixmap class also supports conversion to and from HICON:
- the toWinHICON() function creates a HICON equivalent to the
- QPixmap, and returns the HICON handle. The fromWinHICON()
- function returns a QPixmap that is equivalent to the given icon.
+ To convert a QPixmap to and from HICON you can use the QtWinExtras
+ functions QtWin::toHICON() and QtWin::fromHICON() respectively.
\section1 Pixmap Transformations
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index fb72c561ab..93374b2299 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -537,8 +537,8 @@ public:
};
class Attribute {
public:
- Attribute(AttributeType t, int s, int l, QVariant val) : type(t), start(s), length(l), value(qMove(val)) {}
- Attribute(AttributeType t, int s, int l) : type(t), start(s), length(l), value() {}
+ Attribute(AttributeType typ, int s, int l, QVariant val) : type(typ), start(s), length(l), value(qMove(val)) {}
+ Attribute(AttributeType typ, int s, int l) : type(typ), start(s), length(l), value() {}
AttributeType type;
int start;
diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp
index e45a1d61ba..bcd3e830dd 100644
--- a/src/gui/kernel/qplatformwindow.cpp
+++ b/src/gui/kernel/qplatformwindow.cpp
@@ -581,6 +581,20 @@ void QPlatformWindow::invalidateSurface()
{
}
+static QSize fixInitialSize(QSize size, const QWindow *w,
+ int defaultWidth, int defaultHeight)
+{
+ if (size.width() == 0) {
+ const int minWidth = w->minimumWidth();
+ size.setWidth(minWidth > 0 ? minWidth : defaultWidth);
+ }
+ if (size.height() == 0) {
+ const int minHeight = w->minimumHeight();
+ size.setHeight(minHeight > 0 ? minHeight : defaultHeight);
+ }
+ return size;
+}
+
/*!
Helper function to get initial geometry on windowing systems which do not
do smart positioning and also do not provide a means of centering a
@@ -593,19 +607,18 @@ void QPlatformWindow::invalidateSurface()
QRect QPlatformWindow::initialGeometry(const QWindow *w,
const QRect &initialGeometry, int defaultWidth, int defaultHeight)
{
+ if (!w->isTopLevel()) {
+ const qreal factor = QHighDpiScaling::factor(w);
+ const QSize size = fixInitialSize(QHighDpi::fromNative(initialGeometry.size(), factor),
+ w, defaultWidth, defaultHeight);
+ return QRect(initialGeometry.topLeft(), QHighDpi::toNative(size, factor));
+ }
const QScreen *screen = effectiveScreen(w);
if (!screen)
return initialGeometry;
QRect rect(QHighDpi::fromNativePixels(initialGeometry, w));
- if (rect.width() == 0) {
- const int minWidth = w->minimumWidth();
- rect.setWidth(minWidth > 0 ? minWidth : defaultWidth);
- }
- if (rect.height() == 0) {
- const int minHeight = w->minimumHeight();
- rect.setHeight(minHeight > 0 ? minHeight : defaultHeight);
- }
- if (w->isTopLevel() && qt_window_private(const_cast<QWindow*>(w))->positionAutomatic
+ rect.setSize(fixInitialSize(rect.size(), w, defaultWidth, defaultHeight));
+ if (qt_window_private(const_cast<QWindow*>(w))->positionAutomatic
&& w->type() != Qt::Popup) {
const QRect availableGeometry = screen->availableGeometry();
// Center unless the geometry ( + unknown window frame) is too large for the screen).
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index fa26fd77a3..f061a2bf50 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -402,7 +402,7 @@ void QWindowPrivate::create(bool recursive)
q->parent()->create();
platformWindow = QGuiApplicationPrivate::platformIntegration()->createPlatformWindow(q);
- Q_ASSERT(platformWindow);
+ Q_ASSERT(platformWindow || q->type() == Qt::ForeignWindow);
if (!platformWindow) {
qWarning() << "Failed to create platform window for" << q << "with flags" << q->flags();
@@ -2432,7 +2432,8 @@ QWindow *QWindowPrivate::topLevelWindow() const
This can be used, on platforms which support it, to embed a QWindow inside a
native window, or to embed a native window inside a QWindow.
- If foreign windows are not supported, this function returns 0.
+ If foreign windows are not supported or embedding the native window
+ failed in the platform plugin, this function returns 0.
\note The resulting QWindow should not be used to manipulate the underlying
native window (besides re-parenting), or to observe state changes of the
@@ -2453,6 +2454,10 @@ QWindow *QWindow::fromWinId(WId id)
window->setFlags(Qt::ForeignWindow);
window->setProperty("_q_foreignWinId", QVariant::fromValue(id));
window->create();
+ if (!window->handle()) {
+ delete window;
+ return nullptr;
+ }
return window;
}
diff --git a/src/gui/opengl/qopengldebug.cpp b/src/gui/opengl/qopengldebug.cpp
index 24aa6094dd..f6c3af37dd 100644
--- a/src/gui/opengl/qopengldebug.cpp
+++ b/src/gui/opengl/qopengldebug.cpp
@@ -42,6 +42,7 @@
#include <QtCore/qvarlengtharray.h>
#include <QtGui/qopengl.h>
#include <QtGui/qopenglfunctions.h>
+#include <QtGui/qoffscreensurface.h>
#include "qopengldebug.h"
@@ -1287,8 +1288,41 @@ void QOpenGLDebugLoggerPrivate::controlDebugMessages(QOpenGLDebugMessage::Source
*/
void QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed()
{
+ Q_ASSERT(context);
+
+ // Re-make our context current somehow, otherwise stopLogging will fail.
+
+ // Save the current context and its surface in case we need to set them back
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ QSurface *currentSurface = 0;
+
+ QScopedPointer<QOffscreenSurface> offscreenSurface;
+
+ if (context != currentContext) {
+ // Make our old context current on a temporary surface
+ if (currentContext)
+ currentSurface = currentContext->surface();
+
+ offscreenSurface.reset(new QOffscreenSurface);
+ offscreenSurface->setFormat(context->format());
+ offscreenSurface->create();
+ if (!context->makeCurrent(offscreenSurface.data()))
+ qWarning("QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed(): could not make the owning GL context current for cleanup");
+ }
+
Q_Q(QOpenGLDebugLogger);
q->stopLogging();
+
+ if (offscreenSurface) {
+ // We did change the current context: set it back
+ if (currentContext)
+ currentContext->makeCurrent(currentSurface);
+ else
+ context->doneCurrent();
+ }
+
+ QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
+ context = 0;
initialized = false;
}
@@ -1494,6 +1528,12 @@ void QOpenGLDebugLogger::stopLogging()
if (!d->isLogging)
return;
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ if (!currentContext || currentContext != d->context) {
+ qWarning("QOpenGLDebugLogger::stopLogging(): attempting to stop logging with the wrong OpenGL context current");
+ return;
+ }
+
d->isLogging = false;
d->glDebugMessageCallback(d->oldDebugCallbackFunction, d->oldDebugCallbackParameter);
diff --git a/src/gui/opengl/qopengltexturehelper_p.h b/src/gui/opengl/qopengltexturehelper_p.h
index 77049dced3..00f6f9e5aa 100644
--- a/src/gui/opengl/qopengltexturehelper_p.h
+++ b/src/gui/opengl/qopengltexturehelper_p.h
@@ -76,6 +76,14 @@ QT_BEGIN_NAMESPACE
#define GL_TEXTURE_COMPARE_FUNC 0x884D
#endif
+// use GL_APICALL only on Android + __clang__
+#if !defined(Q_OS_ANDROID) || !defined(__clang__)
+# undef GL_APICALL
+# define GL_APICALL
+#elif !defined(GL_APICALL)
+# define GL_APICALL
+#endif
+
class QOpenGLContext;
class QOpenGLTextureHelper
@@ -754,15 +762,15 @@ private:
// OpenGL 1.3
void (QOPENGLF_APIENTRYP GetCompressedTexImage)(GLenum target, GLint level, GLvoid *img);
void (QOPENGLF_APIENTRYP CompressedTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
void (QOPENGLF_APIENTRYP CompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
void (QOPENGLF_APIENTRYP CompressedTexImage1D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
void (QOPENGLF_APIENTRYP CompressedTexImage3D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture);
+ GL_APICALL void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture);
// OpenGL 3.0
- void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target);
+ GL_APICALL void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target);
// OpenGL 3.2
void (QOPENGLF_APIENTRYP TexImage3DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
diff --git a/src/gui/opengl/qopenglvertexarrayobject.cpp b/src/gui/opengl/qopenglvertexarrayobject.cpp
index 6753064a60..babe52aa83 100644
--- a/src/gui/opengl/qopenglvertexarrayobject.cpp
+++ b/src/gui/opengl/qopenglvertexarrayobject.cpp
@@ -358,9 +358,11 @@ QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
Q_D(QOpenGLVertexArrayObject);
QOpenGLContext *oldContext = 0;
+ QSurface *oldContextSurface = 0;
QScopedPointer<QOffscreenSurface> offscreenSurface;
if (d->context && ctx && d->context != ctx) {
oldContext = ctx;
+ oldContextSurface = ctx->surface();
// Cannot just make the current surface current again with another context.
// The format may be incompatible and some platforms (iOS) may impose
// restrictions on using a window with different contexts. Create an
@@ -380,7 +382,7 @@ QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
destroy();
if (oldContext) {
- if (!oldContext->makeCurrent(oldContext->surface()))
+ if (!oldContext->makeCurrent(oldContextSurface))
qWarning("QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject() failed to restore current context");
}
}
diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp
index 801397751b..e3d18512dd 100644
--- a/src/gui/painting/qbackingstore.cpp
+++ b/src/gui/painting/qbackingstore.cpp
@@ -236,11 +236,16 @@ QSize QBackingStore::size() const
*/
bool QBackingStore::scroll(const QRegion &area, int dx, int dy)
{
- Q_UNUSED(area);
- Q_UNUSED(dx);
- Q_UNUSED(dy);
-
- return d_ptr->platformBackingStore->scroll(QHighDpi::toNativeLocalRegion(area, d_ptr->window), QHighDpi::toNativePixels(dx, d_ptr->window), QHighDpi::toNativePixels(dy, d_ptr->window));
+ // Disable scrolling for non-integer scroll deltas. For this case
+ // the the existing rendered pixels can't be re-used, and we return
+ // false to signal that a repaint is needed.
+ const qreal nativeDx = QHighDpi::toNativePixels(qreal(dx), d_ptr->window);
+ const qreal nativeDy = QHighDpi::toNativePixels(qreal(dy), d_ptr->window);
+ if (qFloor(nativeDx) != nativeDx || qFloor(nativeDy) != nativeDy)
+ return false;
+
+ return d_ptr->platformBackingStore->scroll(QHighDpi::toNativeLocalRegion(area, d_ptr->window),
+ nativeDx, nativeDy);
}
/*!
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 828dbc318c..12631b3a73 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -76,7 +76,9 @@
QT_BEGIN_NAMESPACE
-
+#ifndef QFONTCACHE_DECREASE_TRIGGER_LIMIT
+# define QFONTCACHE_DECREASE_TRIGGER_LIMIT 256
+#endif
bool QFontDef::exactMatch(const QFontDef &other) const
{
@@ -2800,7 +2802,7 @@ void QFontCache::insertEngineData(const QFontDef &def, QFontEngineData *engineDa
engineData->ref.ref();
// Decrease now rather than waiting
- if (total_cost > min_cost * 2)
+ if (total_cost > min_cost * 2 && engineDataCache.size() >= QFONTCACHE_DECREASE_TRIGGER_LIMIT)
decreaseCache();
engineDataCache.insert(def, engineData);
@@ -2849,7 +2851,7 @@ void QFontCache::insertEngine(const Key &key, QFontEngine *engine, bool insertMu
#endif
engine->ref.ref();
// Decrease now rather than waiting
- if (total_cost > min_cost * 2)
+ if (total_cost > min_cost * 2 && engineCache.size() >= QFONTCACHE_DECREASE_TRIGGER_LIMIT)
decreaseCache();
Engine data(engine);
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 26ed81a091..51b1418bc3 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -1849,7 +1849,10 @@ static inline QImage alphaMapFromGlyphData(QFontEngineFT::Glyph *glyph, QFontEng
Q_UNREACHABLE();
};
- return QImage(static_cast<const uchar *>(glyph->data), glyph->width, glyph->height, bytesPerLine, format);
+ QImage img(static_cast<const uchar *>(glyph->data), glyph->width, glyph->height, bytesPerLine, format);
+ if (format == QImage::Format_Mono)
+ img.setColor(1, QColor(Qt::white).rgba()); // Expands color table to 2 items; item 0 set to transparent.
+ return img;
}
QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixelPosition,
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 0615cd1cb3..fbc7088a02 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -2657,9 +2657,8 @@ void QAbstractSocket::setPeerName(const QString &name)
}
/*!
- Closes the I/O device for the socket, disconnects the socket's connection with the
- host, closes the socket, and resets the name, address, port number and underlying
- socket descriptor.
+ Closes the I/O device for the socket and calls disconnectFromHost()
+ to close the socket's connection.
See QIODevice::close() for a description of the actions that occur when an I/O
device is closed.
@@ -2675,13 +2674,6 @@ void QAbstractSocket::close()
QIODevice::close();
if (d->state != UnconnectedState)
disconnectFromHost();
-
- d->localPort = 0;
- d->peerPort = 0;
- d->localAddress.clear();
- d->peerAddress.clear();
- d->peerName.clear();
- d->cachedSocketDescriptor = -1;
}
/*!
@@ -2784,6 +2776,7 @@ void QAbstractSocket::disconnectFromHost()
d->peerPort = 0;
d->localAddress.clear();
d->peerAddress.clear();
+ d->peerName.clear();
d->setWriteChannelCount(0);
#if defined(QABSTRACTSOCKET_DEBUG)
diff --git a/src/platformsupport/fbconvenience/qfbvthandler.cpp b/src/platformsupport/fbconvenience/qfbvthandler.cpp
index 2e5d00c8bd..4c4a01a82e 100644
--- a/src/platformsupport/fbconvenience/qfbvthandler.cpp
+++ b/src/platformsupport/fbconvenience/qfbvthandler.cpp
@@ -116,14 +116,16 @@ QFbVtHandler::QFbVtHandler(QObject *parent)
m_signalNotifier = new QSocketNotifier(m_sigFd[1], QSocketNotifier::Read, this);
connect(m_signalNotifier, &QSocketNotifier::activated, this, &QFbVtHandler::handleSignal);
- struct sigaction sa;
- sa.sa_flags = 0;
- sa.sa_handler = signalHandler;
- sigemptyset(&sa.sa_mask);
- sigaction(SIGINT, &sa, 0); // Ctrl+C
- sigaction(SIGTSTP, &sa, 0); // Ctrl+Z
- sigaction(SIGCONT, &sa, 0);
- sigaction(SIGTERM, &sa, 0); // default signal used by kill
+ if (!qEnvironmentVariableIntValue("QT_QPA_NO_SIGNAL_HANDLER")) {
+ struct sigaction sa;
+ sa.sa_flags = 0;
+ sa.sa_handler = signalHandler;
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGINT, &sa, 0); // Ctrl+C
+ sigaction(SIGTSTP, &sa, 0); // Ctrl+Z
+ sigaction(SIGCONT, &sa, 0);
+ sigaction(SIGTERM, &sa, 0); // default signal used by kill
+ }
#endif
}
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index 3f42f8828a..51ee51a64a 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -91,7 +91,7 @@ void QConnmanEngine::initialize()
this, SLOT(updateServices(ConnmanMapList,QList<QDBusObjectPath>)));
connect(connmanManager,SIGNAL(servicesReady(QStringList)),this,SLOT(servicesReady(QStringList)));
- connect(connmanManager,SIGNAL(scanFinished()),this,SLOT(finishedScan()));
+ connect(connmanManager,SIGNAL(scanFinished(bool)),this,SLOT(finishedScan(bool)));
foreach (const QString &servPath, connmanManager->getServices()) {
addServiceConfiguration(servPath);
@@ -203,11 +203,15 @@ void QConnmanEngine::requestUpdate()
void QConnmanEngine::doRequestUpdate()
{
- connmanManager->requestScan("wifi");
+ bool scanned = connmanManager->requestScan("wifi");
+ if (!scanned)
+ Q_EMIT updateCompleted();
}
-void QConnmanEngine::finishedScan()
+void QConnmanEngine::finishedScan(bool error)
{
+ if (error)
+ Q_EMIT updateCompleted();
}
void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
index 3827ea167f..23c158ac34 100644
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -100,7 +100,7 @@ private Q_SLOTS:
void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed);
void servicesReady(const QStringList &);
- void finishedScan();
+ void finishedScan(bool error);
void changedModem();
void serviceStateChanged(const QString &state);
void configurationChange(QConnmanServiceInterface * service);
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
index 135aad4dec..7fbbe2cd07 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -249,13 +249,16 @@ QStringList QConnmanManagerInterface::getServices()
return servicesList;
}
-void QConnmanManagerInterface::requestScan(const QString &type)
+bool QConnmanManagerInterface::requestScan(const QString &type)
{
+ bool scanned = false;
Q_FOREACH (QConnmanTechnologyInterface *tech, technologiesMap) {
if (tech->type() == type) {
tech->scan();
+ scanned = true;
}
}
+ return scanned;
}
void QConnmanManagerInterface::technologyAdded(const QDBusObjectPath &path, const QVariantMap &)
@@ -265,7 +268,7 @@ void QConnmanManagerInterface::technologyAdded(const QDBusObjectPath &path, cons
QConnmanTechnologyInterface *tech;
tech = new QConnmanTechnologyInterface(path.path(),this);
technologiesMap.insert(path.path(),tech);
- connect(tech,SIGNAL(scanFinished()),this,SIGNAL(scanFinished()));
+ connect(tech,SIGNAL(scanFinished(bool)),this,SIGNAL(scanFinished(bool)));
}
}
@@ -501,7 +504,11 @@ void QConnmanTechnologyInterface::scan()
void QConnmanTechnologyInterface::scanReply(QDBusPendingCallWatcher *call)
{
- Q_EMIT scanFinished();
+ QDBusPendingReply<QVariantMap> props_reply = *call;
+ if (props_reply.isError()) {
+ qDebug() << props_reply.error().message();
+ }
+ Q_EMIT scanFinished(props_reply.isError());
call->deleteLater();
}
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
index 0e774d50c3..d2804ebca6 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h
+++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
@@ -115,7 +115,7 @@ public:
bool getOfflineMode();
QStringList getTechnologies();
QStringList getServices();
- void requestScan(const QString &type);
+ bool requestScan(const QString &type);
QHash<QString, QConnmanTechnologyInterface *> technologiesMap;
@@ -126,7 +126,7 @@ Q_SIGNALS:
void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
void servicesReady(const QStringList &);
- void scanFinished();
+ void scanFinished(bool error);
protected:
void connectNotify(const QMetaMethod &signal);
@@ -211,7 +211,7 @@ public:
Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
- void scanFinished();
+ void scanFinished(bool error);
protected:
void connectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 52f34166eb..6419ba2c51 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -840,6 +840,11 @@ QT_END_NAMESPACE
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/)
{
+ static bool initialized = false;
+ if (initialized)
+ return JNI_VERSION_1_6;
+ initialized = true;
+
QT_USE_NAMESPACE
typedef union {
JNIEnv *nativeEnvironment;
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h
index a4b5cf00d6..a3abacf849 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.h
+++ b/src/plugins/platforms/cocoa/qmacclipboard.h
@@ -75,6 +75,7 @@ private:
uchar mime_type;
mutable QPointer<QMimeData> mime;
mutable bool mac_mime_source;
+ bool resolvingBeforeDestruction;
static OSStatus promiseKeeper(PasteboardRef, PasteboardItemID, CFStringRef, void *);
void clear_helper();
public:
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm
index 70d1170edb..721b0fb4d1 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.mm
+++ b/src/plugins/platforms/cocoa/qmacclipboard.mm
@@ -87,6 +87,7 @@ QMacPasteboard::QMacPasteboard(PasteboardRef p, uchar mt)
mime_type = mt ? mt : uchar(QMacInternalPasteboardMime::MIME_ALL);
paste = p;
CFRetain(paste);
+ resolvingBeforeDestruction = false;
}
QMacPasteboard::QMacPasteboard(uchar mt)
@@ -100,6 +101,7 @@ QMacPasteboard::QMacPasteboard(uchar mt)
} else {
qDebug("PasteBoard: Error creating pasteboard: [%d]", (int)err);
}
+ resolvingBeforeDestruction = false;
}
QMacPasteboard::QMacPasteboard(CFStringRef name, uchar mt)
@@ -113,23 +115,14 @@ QMacPasteboard::QMacPasteboard(CFStringRef name, uchar mt)
} else {
qDebug("PasteBoard: Error creating pasteboard: %s [%d]", QCFString::toQString(name).toLatin1().constData(), (int)err);
}
+ resolvingBeforeDestruction = false;
}
QMacPasteboard::~QMacPasteboard()
{
// commit all promises for paste after exit close
- for (int i = 0; i < promises.count(); ++i) {
- const Promise &promise = promises.at(i);
- // At this point app teardown has started and control is somewhere in the Q[Core]Application
- // destructor. Skip "lazy" promises where the application has not provided data;
- // the application will generally not be in a state to provide it.
- if (promise.dataRequestType == LazyRequest)
- continue;
- QCFString flavor = QCFString(promise.convertor->flavorFor(promise.mime));
- NSInteger pbItemId = promise.itemId;
- promiseKeeper(paste, reinterpret_cast<PasteboardItemID>(pbItemId), flavor, this);
- }
-
+ resolvingBeforeDestruction = true;
+ PasteboardResolvePromises(paste);
if (paste)
CFRelease(paste);
}
@@ -181,7 +174,7 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id,
// to request the data from the application.
QVariant promiseData;
if (promise.dataRequestType == LazyRequest) {
- if (!promise.mimeData.isNull())
+ if (!qpaste->resolvingBeforeDestruction && !promise.mimeData.isNull())
promiseData = promise.mimeData->variantData(promise.mime);
} else {
promiseData = promise.variantData;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index a72cbd010a..500049a504 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -1625,12 +1625,18 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
const bool accepted = [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)];
- // Track keyDown acceptance state for later acceptance of the keyUp.
- if (accepted)
+ // When Qt is used to implement a plugin for a native application we
+ // want to propagate unhandled events to other native views. However,
+ // Qt does not always set the accepted state correctly (in particular
+ // for return key events), so do this for plugin applications only
+ // to prevent incorrect forwarding in the general case.
+ const bool shouldPropagate = QCoreApplication::testAttribute(Qt::AA_PluginApplication) && !accepted;
+
+ // Track keyDown acceptance/forward state for later acceptance of the keyUp.
+ if (!shouldPropagate)
m_acceptedKeyDowns.insert([nsevent keyCode]);
- // Propagate the keyDown to the next responder if Qt did not accept it.
- if (!accepted)
+ if (shouldPropagate)
[super keyDown:nsevent];
}
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 5b8cc7893a..90aa3fef16 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -302,7 +302,12 @@ QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) cons
}
if (window->type() == Qt::ForeignWindow) {
- QWindowsForeignWindow *result = new QWindowsForeignWindow(window, reinterpret_cast<HWND>(window->winId()));
+ const HWND hwnd = reinterpret_cast<HWND>(window->winId());
+ if (!IsWindow(hwnd)) {
+ qWarning("Windows QPA: Invalid foreign window ID %p.");
+ return nullptr;
+ }
+ QWindowsForeignWindow *result = new QWindowsForeignWindow(window, hwnd);
const QRect obtainedGeometry = result->geometry();
QScreen *screen = Q_NULLPTR;
if (const QPlatformScreen *pScreen = result->screenForGeometry(obtainedGeometry))
diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp
index e84033f5e4..2c3ffd45d9 100644
--- a/src/plugins/platforms/windows/qwindowstheme.cpp
+++ b/src/plugins/platforms/windows/qwindowstheme.cpp
@@ -389,8 +389,13 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const
return QVariant(booleanSystemParametersInfo(SPI_GETSNAPTODEFBUTTON, false));
case ContextMenuOnMouseRelease:
return QVariant(true);
- case WheelScrollLines:
- return QVariant(int(dWordSystemParametersInfo(SPI_GETWHEELSCROLLLINES, 3)));
+ case WheelScrollLines: {
+ int result = 3;
+ const DWORD scrollLines = dWordSystemParametersInfo(SPI_GETWHEELSCROLLLINES, DWORD(result));
+ if (scrollLines != DWORD(-1)) // Special value meaning "scroll one screen", unimplemented in Qt.
+ result = int(scrollLines);
+ return QVariant(result);
+ }
default:
break;
}
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 29f0af4621..7289f8de6d 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -1504,7 +1504,7 @@ void QWindowsWindow::handleGeometryChange()
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen());
}
if (testFlag(SynchronousGeometryChangeEvent))
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
qCDebug(lcQpaEvents) << __FUNCTION__ << this << window() << m_data.geometry;
}
@@ -1596,7 +1596,7 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
// Our tests depend on it.
fireExpose(QRegion(qrectFromRECT(ps.rcPaint)), true);
if (!QWindowsContext::instance()->asyncExpose())
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
EndPaint(hwnd, &ps);
return true;
@@ -1656,7 +1656,7 @@ void QWindowsWindow::handleWindowStateChange(Qt::WindowState state)
switch (state) {
case Qt::WindowMinimized:
handleHidden();
- QWindowSystemInterface::flushWindowSystemEvents(); // Tell QQuickWindow to stop rendering now.
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); // Tell QQuickWindow to stop rendering now.
break;
case Qt::WindowMaximized:
case Qt::WindowFullScreen:
@@ -1679,7 +1679,7 @@ void QWindowsWindow::handleWindowStateChange(Qt::WindowState state)
}
}
if (exposeEventsSent && !QWindowsContext::instance()->asyncExpose())
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
}
break;
default:
@@ -1769,7 +1769,7 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
if (!wasSync)
clearFlag(SynchronousGeometryChangeEvent);
QWindowSystemInterface::handleGeometryChange(window(), r);
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
} else if (newState != Qt::WindowMinimized) {
// Restore saved state.
unsigned newStyle = m_savedStyle ? m_savedStyle : style();
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index c5cc2cd790..10c8c8a2d8 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -2195,8 +2195,11 @@ void QXcbWindow::handleButtonPressEvent(int event_x, int event_y, int root_x, in
const bool isWheel = detail >= 4 && detail <= 7;
if (!isWheel && window() != QGuiApplication::focusWindow()) {
QWindow *w = static_cast<QWindowPrivate *>(QObjectPrivate::get(window()))->eventReceiver();
- if (!(w->flags() & Qt::WindowDoesNotAcceptFocus))
+ if (!(w->flags() & (Qt::WindowDoesNotAcceptFocus | Qt::BypassWindowManagerHint))
+ && w->type() != Qt::ToolTip
+ && w->type() != Qt::Popup) {
w->requestActivate();
+ }
}
updateNetWmUserTime(timestamp);
diff --git a/src/testlib/doc/src/qttestlib-manual.qdoc b/src/testlib/doc/src/qttestlib-manual.qdoc
index fc8f3b747e..624c314f6c 100644
--- a/src/testlib/doc/src/qttestlib-manual.qdoc
+++ b/src/testlib/doc/src/qttestlib-manual.qdoc
@@ -254,7 +254,7 @@
\li \c -nocrashhandler \br
Disables the crash handler on Unix platforms.
On Windows, it re-enables the Windows Error Reporting dialog, which is
- turned off by default.
+ turned off by default. This is useful for debugging crashes.
\li \c -platform \e name \br
This command line argument applies to all Qt applications, but might be
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index cfa7d1b8ca..05d1592a60 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -485,7 +485,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml)
" -mousedelay ms : Set default delay for mouse simulation to ms milliseconds\n"
" -maxwarnings n : Sets the maximum amount of messages to output.\n"
" 0 means unlimited, default: 2000\n"
- " -nocrashhandler : Disables the crash handler\n"
+ " -nocrashhandler : Disables the crash handler. Useful for debugging crashes.\n"
"\n"
" Benchmarking options:\n"
#ifdef QTESTLIB_USE_VALGRIND
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index f2efcadad7..87fb1318f9 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
@@ -179,6 +180,8 @@ Type Moc::parseType()
case Q_SLOT_TOKEN:
type.name += lexem();
return type;
+ case NOTOKEN:
+ return type;
default:
prev();
break;
@@ -213,6 +216,8 @@ Type Moc::parseType()
type.name += lexem();
isVoid |= (lookup(0) == VOID);
break;
+ case NOTOKEN:
+ return type;
default:
prev();
;
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index 464a1e139e..8dfcf2c6d6 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -849,8 +849,10 @@ void QDialog::adjustPosition(QWidget* w)
// QTBUG-52735: Manually set the correct target screen since scaling in a
// subsequent call to QWindow::resize() may otherwise use the wrong factor
// if the screen changed notification is still in an event queue.
- if (QWindow *window = windowHandle())
- window->setScreen(QGuiApplication::screens().at(scrn));
+ if (scrn >= 0) {
+ if (QWindow *window = windowHandle())
+ window->setScreen(QGuiApplication::screens().at(scrn));
+ }
move(p);
}
diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp
index 6ed019f4a8..5e3b74f7b7 100644
--- a/src/widgets/itemviews/qabstractitemdelegate.cpp
+++ b/src/widgets/itemviews/qabstractitemdelegate.cpp
@@ -376,6 +376,7 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event,
const QStyleOptionViewItem &option,
const QModelIndex &index)
{
+ Q_D(QAbstractItemDelegate);
Q_UNUSED(option);
if (!event || !view)
@@ -384,9 +385,10 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event,
#ifndef QT_NO_TOOLTIP
case QEvent::ToolTip: {
QHelpEvent *he = static_cast<QHelpEvent*>(event);
- QVariant tooltip = index.data(Qt::ToolTipRole);
- if (tooltip.canConvert<QString>()) {
- QToolTip::showText(he->globalPos(), tooltip.toString(), view);
+ const int precision = inherits("QItemDelegate") ? 10 : 6; // keep in sync with DBL_DIG in qitemdelegate.cpp
+ const QString tooltip = d->textForRole(Qt::ToolTipRole, index.data(Qt::ToolTipRole), option.locale, precision);
+ if (!tooltip.isEmpty()) {
+ QToolTip::showText(he->globalPos(), tooltip, view);
return true;
}
break;}
@@ -398,9 +400,10 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event,
break; }
case QEvent::WhatsThis: {
QHelpEvent *he = static_cast<QHelpEvent*>(event);
- QVariant whatsthis = index.data(Qt::WhatsThisRole);
- if (whatsthis.canConvert<QString>()) {
- QWhatsThis::showText(he->globalPos(), whatsthis.toString(), view);
+ const int precision = inherits("QItemDelegate") ? 10 : 6; // keep in sync with DBL_DIG in qitemdelegate.cpp
+ const QString whatsthis = d->textForRole(Qt::WhatsThisRole, index.data(Qt::WhatsThisRole), option.locale, precision);
+ if (!whatsthis.isEmpty()) {
+ QWhatsThis::showText(he->globalPos(), whatsthis, view);
return true;
}
break ; }
@@ -543,6 +546,46 @@ bool QAbstractItemDelegatePrivate::tryFixup(QWidget *editor)
return true;
}
+QString QAbstractItemDelegatePrivate::textForRole(Qt::ItemDataRole role, const QVariant &value, const QLocale &locale, int precision) const
+{
+ const QLocale::FormatType formatType = (role == Qt::DisplayRole) ? QLocale::ShortFormat : QLocale::LongFormat;
+ QString text;
+ switch (value.userType()) {
+ case QMetaType::Float:
+ text = locale.toString(value.toFloat());
+ break;
+ case QVariant::Double:
+ text = locale.toString(value.toDouble(), 'g', precision);
+ break;
+ case QVariant::Int:
+ case QVariant::LongLong:
+ text = locale.toString(value.toLongLong());
+ break;
+ case QVariant::UInt:
+ case QVariant::ULongLong:
+ text = locale.toString(value.toULongLong());
+ break;
+ case QVariant::Date:
+ text = locale.toString(value.toDate(), formatType);
+ break;
+ case QVariant::Time:
+ text = locale.toString(value.toTime(), formatType);
+ break;
+ case QVariant::DateTime: {
+ const QDateTime dateTime = value.toDateTime();
+ text = locale.toString(dateTime.date(), formatType)
+ + QLatin1Char(' ')
+ + locale.toString(dateTime.time(), formatType);
+ break; }
+ default:
+ text = value.toString();
+ if (role == Qt::DisplayRole)
+ text.replace(QLatin1Char('\n'), QChar::LineSeparator);
+ break;
+ }
+ return text;
+}
+
void QAbstractItemDelegatePrivate::_q_commitDataAndCloseEditor(QWidget *editor)
{
Q_Q(QAbstractItemDelegate);
diff --git a/src/widgets/itemviews/qabstractitemdelegate_p.h b/src/widgets/itemviews/qabstractitemdelegate_p.h
index 04d929a0ac..0b03be63f0 100644
--- a/src/widgets/itemviews/qabstractitemdelegate_p.h
+++ b/src/widgets/itemviews/qabstractitemdelegate_p.h
@@ -59,7 +59,7 @@
QT_BEGIN_NAMESPACE
-class QAbstractItemDelegatePrivate : public QObjectPrivate
+class Q_AUTOTEST_EXPORT QAbstractItemDelegatePrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QAbstractItemDelegate)
public:
@@ -67,6 +67,7 @@ public:
bool editorEventFilter(QObject *object, QEvent *event);
bool tryFixup(QWidget *editor);
+ QString textForRole(Qt::ItemDataRole role, const QVariant &value, const QLocale &locale, int precision = 6) const;
void _q_commitDataAndCloseEditor(QWidget *editor);
};
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 4768c58d1d..221511f38d 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -4325,6 +4325,12 @@ const QEditorInfo & QAbstractItemViewPrivate::editorForIndex(const QModelIndex &
return it.value();
}
+bool QAbstractItemViewPrivate::hasEditor(const QModelIndex &index) const
+{
+ // Search's implicit cast (QModelIndex to QPersistentModelIndex) is slow; use cheap pre-test to avoid when we can.
+ return !indexEditorHash.isEmpty() && indexEditorHash.contains(index);
+}
+
QModelIndex QAbstractItemViewPrivate::indexForEditor(QWidget *editor) const
{
// do not try to search to avoid slow implicit cast from QModelIndex to QPersistentModelIndex
diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h
index 3877969f87..f8ada6df08 100644
--- a/src/widgets/itemviews/qabstractitemview_p.h
+++ b/src/widgets/itemviews/qabstractitemview_p.h
@@ -277,10 +277,7 @@ public:
}
const QEditorInfo &editorForIndex(const QModelIndex &index) const;
- inline bool hasEditor(const QModelIndex &index) const {
- // Search's implicit cast (QModelIndex to QPersistentModelIndex) is slow; use cheap pre-test to avoid when we can.
- return !indexEditorHash.isEmpty() && indexEditorHash.contains(index);
- }
+ bool hasEditor(const QModelIndex &index) const;
QModelIndex indexForEditor(QWidget *editor) const;
void addEditor(const QModelIndex &index, QWidget *editor, bool isStatic);
diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp
index 194bd22493..747d5db782 100644
--- a/src/widgets/itemviews/qitemdelegate.cpp
+++ b/src/widgets/itemviews/qitemdelegate.cpp
@@ -67,6 +67,7 @@
#include <limits.h>
+// keep in sync with QAbstractItemDelegate::helpEvent()
#ifndef DBL_DIG
# define DBL_DIG 10
#endif
@@ -102,7 +103,7 @@ public:
return text;
}
- static QString valueToText(const QVariant &value, const QStyleOptionViewItem &option);
+ QString valueToText(const QVariant &value, const QStyleOptionViewItem &option) const;
QItemEditorFactory *f;
bool clipPainting;
@@ -332,40 +333,9 @@ void QItemDelegate::setClipping(bool clip)
d->clipPainting = clip;
}
-QString QItemDelegatePrivate::valueToText(const QVariant &value, const QStyleOptionViewItem &option)
+QString QItemDelegatePrivate::valueToText(const QVariant &value, const QStyleOptionViewItem &option) const
{
- QString text;
- switch (value.userType()) {
- case QMetaType::Float:
- text = option.locale.toString(value.toFloat(), 'g');
- break;
- case QVariant::Double:
- text = option.locale.toString(value.toDouble(), 'g', DBL_DIG);
- break;
- case QVariant::Int:
- case QVariant::LongLong:
- text = option.locale.toString(value.toLongLong());
- break;
- case QVariant::UInt:
- case QVariant::ULongLong:
- text = option.locale.toString(value.toULongLong());
- break;
- case QVariant::Date:
- text = option.locale.toString(value.toDate(), QLocale::ShortFormat);
- break;
- case QVariant::Time:
- text = option.locale.toString(value.toTime(), QLocale::ShortFormat);
- break;
- case QVariant::DateTime:
- text = option.locale.toString(value.toDateTime().date(), QLocale::ShortFormat);
- text += QLatin1Char(' ');
- text += option.locale.toString(value.toDateTime().time(), QLocale::ShortFormat);
- break;
- default:
- text = replaceNewLine(value.toString());
- break;
- }
- return text;
+ return textForRole(Qt::DisplayRole, value, option.locale, DBL_DIG);
}
/*!
@@ -434,7 +404,7 @@ void QItemDelegate::paint(QPainter *painter,
QRect displayRect;
value = index.data(Qt::DisplayRole);
if (value.isValid() && !value.isNull()) {
- text = QItemDelegatePrivate::valueToText(value, opt);
+ text = d->valueToText(value, opt);
displayRect = textRectangle(painter, d->textLayoutBounds(opt), opt.font, text);
}
@@ -1061,7 +1031,7 @@ QRect QItemDelegate::rect(const QStyleOptionViewItem &option,
return QRect(QPoint(0, 0), option.decorationSize);
case QVariant::String:
default: {
- QString text = QItemDelegatePrivate::valueToText(value, option);
+ const QString text = d->valueToText(value, option);
value = index.data(Qt::FontRole);
QFont fnt = qvariant_cast<QFont>(value).resolve(option.font);
return textRectangle(0, d->textLayoutBounds(option), fnt, text); }
diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp
index 162ef826da..bab8436dce 100644
--- a/src/widgets/itemviews/qstyleditemdelegate.cpp
+++ b/src/widgets/itemviews/qstyleditemdelegate.cpp
@@ -261,41 +261,7 @@ QStyledItemDelegate::~QStyledItemDelegate()
*/
QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale& locale) const
{
- QString text;
- switch (value.userType()) {
- case QMetaType::Float:
- case QVariant::Double:
- text = locale.toString(value.toReal());
- break;
- case QVariant::Int:
- case QVariant::LongLong:
- text = locale.toString(value.toLongLong());
- break;
- case QVariant::UInt:
- case QVariant::ULongLong:
- text = locale.toString(value.toULongLong());
- break;
- case QVariant::Date:
- text = locale.toString(value.toDate(), QLocale::ShortFormat);
- break;
- case QVariant::Time:
- text = locale.toString(value.toTime(), QLocale::ShortFormat);
- break;
- case QVariant::DateTime:
- text = locale.toString(value.toDateTime().date(), QLocale::ShortFormat);
- text += QLatin1Char(' ');
- text += locale.toString(value.toDateTime().time(), QLocale::ShortFormat);
- break;
- default:
- // convert new lines into line separators
- text = value.toString();
- for (int i = 0; i < text.count(); ++i) {
- if (text.at(i) == QLatin1Char('\n'))
- text[i] = QChar::LineSeparator;
- }
- break;
- }
- return text;
+ return d_func()->textForRole(Qt::DisplayRole, value, locale);
}
/*!
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index d28bd644c6..5b455a4e5c 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -1923,7 +1923,7 @@ NSView *QMacStylePrivate::cocoaControl(QCocoaWidget widget) const
}
case QCocoaPushButton: {
NSButton *bc = (NSButton *)bv;
- bc.buttonType = NSMomentaryPushButton;
+ bc.buttonType = NSMomentaryLightButton;
bc.bezelStyle = NSRoundedBezelStyle;
break;
}
diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp
index b41ad4249e..c3a50968e2 100644
--- a/src/widgets/styles/qwindowsstyle.cpp
+++ b/src/widgets/styles/qwindowsstyle.cpp
@@ -64,8 +64,12 @@
#include "qlistview.h"
#include <private/qmath_p.h>
#include <qmath.h>
+#include <QtGui/qscreen.h>
+#include <QtGui/qwindow.h>
#include <qpa/qplatformtheme.h>
+#include <qpa/qplatformscreen.h>
#include <private/qguiapplication_p.h>
+#include <private/qhighdpiscaling_p.h>
#include <private/qstylehelper_p.h>
#include <private/qstyleanimation_p.h>
@@ -360,6 +364,47 @@ int QWindowsStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm)
return QWindowsStylePrivate::InvalidMetric;
}
+static QWindow *windowOf(const QWidget *w)
+{
+ QWindow *result = Q_NULLPTR;
+ if (w) {
+ result = w->windowHandle();
+ if (!result) {
+ if (const QWidget *np = w->nativeParentWidget())
+ result = np->windowHandle();
+ }
+ }
+ return result;
+}
+
+static QScreen *screenOf(const QWidget *w)
+{
+ if (const QWindow *window = windowOf(w))
+ return window->screen();
+ return QGuiApplication::primaryScreen();
+}
+
+// Calculate the overall scale factor to obtain Qt Device Independent
+// Pixels from a native Windows size. Divide by devicePixelRatio
+// and account for secondary screens with differing logical DPI.
+qreal QWindowsStylePrivate::nativeMetricScaleFactor(const QWidget *widget)
+{
+ if (!QHighDpiScaling::isActive())
+ return 1;
+ qreal result = qreal(1) / QWindowsStylePrivate::devicePixelRatio(widget);
+ if (QGuiApplicationPrivate::screen_list.size() > 1) {
+ const QScreen *primaryScreen = QGuiApplication::primaryScreen();
+ const QScreen *screen = screenOf(widget);
+ if (screen != primaryScreen) {
+ const qreal primaryLogicalDpi = primaryScreen->handle()->logicalDpi().first;
+ const qreal logicalDpi = screen->handle()->logicalDpi().first;
+ if (!qFuzzyCompare(primaryLogicalDpi, logicalDpi))
+ result *= logicalDpi / primaryLogicalDpi;
+ }
+ }
+ return result;
+}
+
/*!
\reimp
*/
@@ -367,7 +412,7 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW
{
int ret = QWindowsStylePrivate::pixelMetricFromSystemDp(pm, opt, widget);
if (ret != QWindowsStylePrivate::InvalidMetric)
- return qRound(qreal(ret) / QWindowsStylePrivate::devicePixelRatio(widget));
+ return qRound(qreal(ret) * QWindowsStylePrivate::nativeMetricScaleFactor(widget));
ret = QWindowsStylePrivate::fixedPixelMetric(pm);
if (ret != QWindowsStylePrivate::InvalidMetric)
diff --git a/src/widgets/styles/qwindowsstyle_p_p.h b/src/widgets/styles/qwindowsstyle_p_p.h
index b6a2df9cfc..0c23f4b4a8 100644
--- a/src/widgets/styles/qwindowsstyle_p_p.h
+++ b/src/widgets/styles/qwindowsstyle_p_p.h
@@ -73,6 +73,7 @@ public:
static int fixedPixelMetric(QStyle::PixelMetric pm);
static qreal devicePixelRatio(const QWidget *widget = 0)
{ return widget ? widget->devicePixelRatioF() : QWindowsStylePrivate::appDevicePixelRatio(); }
+ static qreal nativeMetricScaleFactor(const QWidget *widget = Q_NULLPTR);
bool hasSeenAlt(const QWidget *widget) const;
bool altDown() const { return alt_down; }
@@ -105,3 +106,4 @@ QT_END_NAMESPACE
#endif // QT_NO_STYLE_WINDOWS
#endif //QWINDOWSSTYLE_P_P_H
+;
diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp
index 6009b5d1f8..c2cce5770f 100644
--- a/src/widgets/styles/qwindowsvistastyle.cpp
+++ b/src/widgets/styles/qwindowsvistastyle.cpp
@@ -430,7 +430,7 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
XPThemeData themeSize = theme;
themeSize.partId = TVP_HOTGLYPH;
themeSize.stateId = GLPS_OPENED;
- const QSizeF size = themeSize.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
decoration_size = qRound(qMax(size.width(), size.height()));
}
int mid_h = option->rect.x() + option->rect.width() / 2;
@@ -988,7 +988,7 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption
XPThemeData theme(widget, 0, QWindowsXPStylePrivate::ToolBarTheme,
TP_DROPDOWNBUTTON);
if (theme.isValid()) {
- const QSizeF size = theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
if (!size.isEmpty()) {
mbiw = qRound(size.width());
mbih = qRound(size.height());
@@ -1184,8 +1184,8 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption
XPThemeData themeSize = theme;
themeSize.partId = MENU_POPUPCHECK;
themeSize.stateId = 0;
- const QSizeF size = themeSize.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
- const QMarginsF margins = themeSize.margins() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
+ const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
checkcol = qMax(menuitem->maxIconWidth, qRound(gutterWidth + size.width() + margins.left() + margins.right()));
}
QRect rect = option->rect;
@@ -1210,7 +1210,7 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption
if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) {
int yoff = y-2 + h / 2;
- const int separatorSize = 6 / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const int separatorSize = qRound(qreal(6) * QWindowsStylePrivate::nativeMetricScaleFactor(widget));
QPoint p1 = QPoint(x + checkcol, yoff);
QPoint p2 = QPoint(x + w + separatorSize, yoff);
stateId = MBI_HOT;
@@ -1243,8 +1243,8 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption
XPThemeData themeSize = theme;
themeSize.partId = MENU_POPUPCHECK;
themeSize.stateId = 0;
- const QSizeF size = themeSize.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
- const QMarginsF margins = themeSize.margins() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
+ const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
QRect checkRect(0, 0, qRound(size.width() + margins.left() + margins.right()),
qRound(size.height() + margins.bottom() + margins.top()));
checkRect.moveCenter(vCheckRect.center());
@@ -1856,8 +1856,8 @@ QSize QWindowsVistaStyle::sizeFromContents(ContentsType type, const QStyleOption
XPThemeData themeSize = theme;
themeSize.partId = MENU_POPUPCHECK;
themeSize.stateId = 0;
- const QSizeF size = themeSize.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
- const QMarginsF margins = themeSize.margins() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
+ const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
minimumHeight = qMax(qRound(size.height() + margins.bottom() + margins.top()), sz.height());
sz.rwidth() += qRound(size.width() + margins.left() + margins.right());
}
@@ -1959,7 +1959,7 @@ QRect QWindowsVistaStyle::subElementRect(SubElement element, const QStyleOption
int arrowWidth = 13;
int arrowHeight = 5;
if (theme.isValid()) {
- const QSizeF size = theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget);
+ const QSizeF size = theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
if (!size.isEmpty()) {
arrowWidth = qRound(size.width());
arrowHeight = qRound(size.height());
@@ -2440,7 +2440,7 @@ QIcon QWindowsVistaStyle::standardIcon(StandardPixmap standardIcon,
QWindowsXPStylePrivate::ButtonTheme,
BP_COMMANDLINKGLYPH, CMDLGS_NORMAL);
if (theme.isValid()) {
- const QSize size = (theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget)).toSize();
+ const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
QIcon linkGlyph;
QPixmap pm(size);
pm.fill(Qt::transparent);
diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp
index c0ea725b7b..ffedc37edb 100644
--- a/src/widgets/styles/qwindowsxpstyle.cpp
+++ b/src/widgets/styles/qwindowsxpstyle.cpp
@@ -415,7 +415,7 @@ const QPixmap *QWindowsXPStylePrivate::tabBody(QWidget *widget)
{
if (!tabbody) {
XPThemeData theme(0, 0, QWindowsXPStylePrivate::TabTheme, TABP_BODY);
- const QSize size = (theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget)).toSize();
+ const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
tabbody = new QPixmap(size.width(), QApplication::desktop()->screenGeometry().height());
QPainter painter(tabbody);
@@ -3274,7 +3274,7 @@ int QWindowsXPStyle::pixelMetric(PixelMetric pm, const QStyleOption *option, con
int res = QWindowsXPStylePrivate::pixelMetricFromSystemDp(pm, option, widget);
if (res != QWindowsStylePrivate::InvalidMetric)
- return qRound(qreal(res) / QWindowsStylePrivate::devicePixelRatio(widget));
+ return qRound(qreal(res) * QWindowsStylePrivate::nativeMetricScaleFactor(widget));
res = 0;
switch (pm) {
@@ -3420,9 +3420,10 @@ QRect QWindowsXPStyle::subControlRect(ComplexControl cc, const QStyleOptionCompl
const int height = tb->rect.height();
const int width = tb->rect.width();
const int buttonMargin = int(QStyleHelper::dpiScaled(4));
- int buttonHeight = qRound(qreal(GetSystemMetrics(SM_CYSIZE)) / QWindowsStylePrivate::devicePixelRatio(widget))
+ const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(widget);
+ int buttonHeight = qRound(qreal(GetSystemMetrics(SM_CYSIZE)) * factor)
- buttonMargin;
- int buttonWidth = qRound(qreal(GetSystemMetrics(SM_CXSIZE)) / QWindowsStylePrivate::devicePixelRatio(widget))
+ int buttonWidth = qRound(qreal(GetSystemMetrics(SM_CXSIZE)) * factor)
- buttonMargin;
const int delta = buttonWidth + 2;
int controlTop = option->rect.bottom() - buttonHeight - 2;
@@ -3792,7 +3793,7 @@ QPixmap QWindowsXPStyle::standardPixmap(StandardPixmap standardPixmap, const QSt
if (widget && widget->isWindow()) {
XPThemeData theme(widget, 0, QWindowsXPStylePrivate::WindowTheme, WP_SMALLCLOSEBUTTON, CBS_NORMAL);
if (theme.isValid()) {
- const QSize size = (theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget)).toSize();
+ const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
return QIcon(QWindowsStyle::standardPixmap(standardPixmap, option, widget)).pixmap(size);
}
}
@@ -3826,7 +3827,7 @@ QIcon QWindowsXPStyle::standardIcon(StandardPixmap standardIcon,
XPThemeData theme(0, 0, QWindowsXPStylePrivate::WindowTheme,
WP_MAXBUTTON, MAXBS_NORMAL);
if (theme.isValid()) {
- const QSize size = (themeSize.size() / QWindowsXPStylePrivate::devicePixelRatio(widget)).toSize();
+ const QSize size = (themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
QPixmap pm(size);
pm.fill(Qt::transparent);
QPainter p(&pm);
@@ -3860,7 +3861,7 @@ QIcon QWindowsXPStyle::standardIcon(StandardPixmap standardIcon,
XPThemeData theme(0, 0, QWindowsXPStylePrivate::WindowTheme,
WP_SMALLCLOSEBUTTON, CBS_NORMAL);
if (theme.isValid()) {
- const QSize size = (theme.size() / QWindowsXPStylePrivate::devicePixelRatio(widget)).toSize();
+ const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
QPixmap pm(size);
pm.fill(Qt::transparent);
QPainter p(&pm);