diff options
Diffstat (limited to 'src')
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); |