summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-12-05 17:42:33 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-12-05 17:42:33 +0100
commit733ace5a7ad5b9e9f93ac87667d7d37fa5f894d5 (patch)
treea88031a8e1ac30986567070728e29ed1366d0962
parenteaff48d3622bbb0e18e79f79aac6d1ac1b7e2760 (diff)
parent835b8213905b315645bc60ff5f2ab99340d075a2 (diff)
Merge remote-tracking branch 'origin/release' into stable
Conflicts: configure mkspecs/macx-ios-clang/features/default_post.prf tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp Change-Id: Iaba97eed2272bccf54289640b8197d40e22f7bf5
-rwxr-xr-xconfigure16
-rw-r--r--dist/changes-5.2.064
-rw-r--r--mkspecs/features/qt_module.prf33
-rw-r--r--mkspecs/macx-ios-clang/features/default_post.prf16
-rw-r--r--qmake/generators/mac/pbuilder_pbx.cpp2
-rw-r--r--qmake/generators/makefile.cpp13
-rw-r--r--qmake/main.cpp9
-rw-r--r--qtbase.pro2
-rw-r--r--src/android/java/res/values/libs.xml2
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java2
-rw-r--r--src/concurrent/qtconcurrentmedian.h9
-rw-r--r--src/corelib/global/qglobal.cpp6
-rw-r--r--src/corelib/kernel/qjni.cpp3
-rw-r--r--src/corelib/kernel/qobject.cpp13
-rw-r--r--src/gui/text/qtextdocument.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm42
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm6
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.h1
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.mm11
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.mm7
-rw-r--r--src/plugins/platforms/ios/qiosglobal.h1
-rw-r--r--src/plugins/platforms/ios/qiosglobal.mm7
-rw-r--r--src/plugins/platforms/ios/qiosinputcontext.mm2
-rw-r--r--src/plugins/platforms/ios/qiosintegration.h2
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.mm9
-rw-r--r--src/plugins/platforms/ios/qioswindow.h2
-rw-r--r--src/plugins/platforms/ios/qioswindow.mm24
-rw-r--r--src/tools/qdoc/generator.cpp16
-rw-r--r--src/tools/qdoc/htmlgenerator.cpp5
-rw-r--r--src/tools/qdoc/htmlgenerator.h1
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp5
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.cpp7
-rw-r--r--src/widgets/kernel/qwidget.cpp5
-rw-r--r--src/widgets/styles/qstyle.cpp2
-rw-r--r--src/widgets/styles/qstyleanimation.cpp15
-rw-r--r--src/widgets/widgets/qcombobox.cpp2
-rw-r--r--src/winmain/winmain.pro9
-rw-r--r--tests/auto/concurrent/concurrent.pro1
-rw-r--r--tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro5
-rw-r--r--tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp87
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp1
-rw-r--r--tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp5
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp1
46 files changed, 381 insertions, 100 deletions
diff --git a/configure b/configure
index d79e5b1a19..ab1f81c2cf 100755
--- a/configure
+++ b/configure
@@ -5068,6 +5068,11 @@ if [ "$CFG_TSLIB" != "no" ]; then
fi
fi
+# Check we actually have X11 :-)
+if compileTest x11/xlib "XLib"; then
+ QT_CONFIG="$QT_CONFIG xlib"
+fi
+
if [ "$CFG_XCB" != "no" ]; then
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then
QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
@@ -5113,17 +5118,6 @@ if [ "$CFG_XCB" != "no" ]; then
fi
fi
- # Check for X11. Eventually we should port everything to XCB,
- # but for now the port is incomplete and Xlib is a requirement.
- if compileTest x11/xlib "XLib"; then
- QT_CONFIG="$QT_CONFIG xlib"
- else
- echo "The test for linking against Xlib failed!"
- echo " You might need to install dependency packages."
- echo " See src/plugins/platforms/xcb/README."
- exit 1
- fi
-
if [ "$CFG_XCB_XLIB" != "no" ]; then
if compileTest qpa/xcb-xlib "xcb-xlib" $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
QT_CONFIG="$QT_CONFIG xcb-xlib"
diff --git a/dist/changes-5.2.0 b/dist/changes-5.2.0
index a51cc91f98..4dd1604fcc 100644
--- a/dist/changes-5.2.0
+++ b/dist/changes-5.2.0
@@ -52,6 +52,29 @@ information about a particular change.
zero delta() in order to indicate beginning and end of transient
scrolling.
+ - Mac OS X framework builds of Qt no longer contain a Unix-like include/
+ directory; all headers are located in the frameworks. This may affect
+ 3rd party build systems not based on qmake or cmake.
+
+****************************************************************************
+* Platform deprecation notice *
+****************************************************************************
+
+ - The support for the old implementation of QAtomicInt and
+ QAtomicPointer is deprecated in Qt 5.2 and will be removed in Qt
+ 5.3. Building with the following compilers or environments will not
+ be possible in Qt 5.3 or the build will suffer greatly in
+ performance, unless support is revived by writing new atomics code.
+ * Green Hills compiler for INTEGRITY
+ * Sun Studio compiler suite for Solaris
+ * IBM Visual Age compiler suite for AIX
+ * Kernel-mode VxWorks
+
+ Developers interested in picking up support should contact the
+ development mailing list at development@qt-project.org for more
+ information. Note that those platforms are currently not tested. Most
+ likely, they have further problems than just the atomics code.
+
****************************************************************************
* Library *
****************************************************************************
@@ -700,3 +723,44 @@ X11
- [QTBUG-31762] Fix position of system tray icon (except Unity)
- [QTBUG-27349] Reintroduced command line argument for positioning
windows (-geometry)
+
+****************************************************************************
+* Tools *
+****************************************************************************
+
+- configure
+
+ * Added option to disable the QtMultimedia WMF backend
+ * [Unix] Added option to build with gcov support
+ * Added -extprefix option to support Qt installing into a different
+ location than the on-device -prefix within the -sysroot.
+ * [QTBUG-33584][Unix] Fixed parsing of -device-option with equal signs.
+
+- cmake config files
+
+ * [QTBUG-33145] Fixed usage of non-QtBase modules with Qt compiled from
+ source tarballs.
+ * [QTBUG-33223] Fixed header file location on multi-arch systems.
+ * Added support for automatic packaging of Qt plugins with cpack.
+
+- qmake
+
+ * [QTBUG-491] Added saner approach to debug/release path rewriting.
+ * Added the parseJson() function.
+ * Added "osx" scope as an alias for "macx". Note that matching on the
+ makespec is generally deprecated - use "linux", "gcc", etc.
+ * Added support for .qmake.stash files which are really *just* caches.
+ * [Xcode] Added support for QMAKE_PRE_LINK and QMAKE_POST_LINK.
+ * [QTBUG-31129] Added installation of PDB files for dlltarget.
+ * [QTBUG-28102] Added support for querying disabled Qt features.
+ * Removed macx-clang-libc++* makespecs. libc++ is now handled automatically.
+ * [QTBUG-32912][MSVS] Fixed moc not being run in case of DBUS_ADAPTORS or
+ DBUS_INTERFACES being present.
+ * [QTBUG-30644] Fixed unsatisfied requires() breaking recursive targets.
+ * [QTBUG-31204] Fixed extra compilers not finding their inputs.
+ * [QTBUG-32885][MSVS] Made it possible to disable debug information.
+ * [QTBUG-33446][MSVS] Fixed generation of VS2010+ solution files.
+ * [QTBUG-32375][MSVS] Fixed output directory of nested projects.
+ * [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+.
+ * [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH.
+ * [MSVS] Fixed sub-project dependency generation.
diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf
index 5068f7028f..11509eeb40 100644
--- a/mkspecs/features/qt_module.prf
+++ b/mkspecs/features/qt_module.prf
@@ -131,30 +131,33 @@ android: CONFIG += qt_android_deps
#install directives
load(qt_installs)
+!isEmpty(_QMAKE_SUPER_CACHE_): \
+ rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
+else: \
+ rplbase = $$MODULE_BASE_OUTDIR
+include_replace.match = $$rplbase/include
+include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
+include_replace.CONFIG = path
+lib_replace.match = $$rplbase/lib
+host_build: \
+ lib_replace.replace = $$[QT_HOST_LIBS]
+else: \
+ lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
+lib_replace.CONFIG = path
+QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
+
unix|win32-g++* {
CONFIG += create_pc
- host_build: \
- QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS]
- else: \
- QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw]
- QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw]
+ QMAKE_PKGCONFIG_LIBDIR = $$lib_replace.replace
+ QMAKE_PKGCONFIG_INCDIR = $$include_replace.replace
QMAKE_PKGCONFIG_CFLAGS = -I${includedir}/$$MODULE_INCNAME
QMAKE_PKGCONFIG_DESTDIR = pkgconfig
- !isEmpty(_QMAKE_SUPER_CACHE_): \
- rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
- else: \
- rplbase = $$MODULE_BASE_OUTDIR
- include_replace.match = $$rplbase/include
- include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
- lib_replace.match = $$rplbase/lib
- lib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR
QMAKE_PKGCONFIG_INSTALL_REPLACE += include_replace lib_replace
- QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
}
unix {
CONFIG += create_libtool explicitlib
- QMAKE_LIBTOOL_LIBDIR = $$QMAKE_PKGCONFIG_LIBDIR
+ QMAKE_LIBTOOL_LIBDIR = $$lib_replace.replace
QMAKE_LIBTOOL_INSTALL_REPLACE += include_replace lib_replace
}
diff --git a/mkspecs/macx-ios-clang/features/default_post.prf b/mkspecs/macx-ios-clang/features/default_post.prf
index 8d46f35201..3428823624 100644
--- a/mkspecs/macx-ios-clang/features/default_post.prf
+++ b/mkspecs/macx-ios-clang/features/default_post.prf
@@ -192,6 +192,22 @@ macx-xcode {
QMAKE_CXXFLAGS += -stdlib=libstdc++
QMAKE_LFLAGS += -stdlib=libstdc++
}
+
+ # Make the default debug information format for debug builds
+ # DWARF instead of DWARF with dSYM. This cuts down build times
+ # for application debug builds significantly, as Xcode doesn't
+ # have to pull out all the DWARF info from our static libraries
+ # and put it into a dSYM file. We don't need that dSYM file in
+ # the first place, since the information is available in the
+ # object files inside the archives (static libraries). The only
+ # unfortunate side effect of this is that the user won't be
+ # able to break on specific lines of main(). This is due to
+ # using ld to rename the main-function, and will go away once
+ # we implement a separate tool to do the symbol renaming.
+ debug_information_format.name = DEBUG_INFORMATION_FORMAT
+ debug_information_format.value = dwarf
+ debug_information_format.build = debug
+ QMAKE_MAC_XCODE_SETTINGS += debug_information_format
}
macx-xcode {
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp
index 2674f31d03..fa4a844a5d 100644
--- a/qmake/generators/mac/pbuilder_pbx.cpp
+++ b/qmake/generators/mac/pbuilder_pbx.cpp
@@ -1140,7 +1140,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
//###
}
- project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key);
+ project->values("QMAKE_PBX_BUILDPHASES").append(phase_key);
t << "\t\t" << phase_key << " = {\n"
<< "\t\t\t" << writeSettings("name", "Copy '" + bundle_data[i] + "' Files to Bundle") << ";\n"
<< "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n"
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 3dd63b4590..946a1ee986 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -3336,6 +3336,13 @@ MakefileGenerator::writePkgConfigFile()
t << endl;
}
+static QString windowsifyPath(const QString &str)
+{
+ // The paths are escaped in prl files, so every slash needs to turn into two backslashes.
+ // Then each backslash needs to be escaped for sed. And another level for C quoting here.
+ return QString(str).replace('/', "\\\\\\\\");
+}
+
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
@@ -3348,8 +3355,12 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
for (int r = 0; r < replace_rules.size(); ++r) {
const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")),
replace = project->first(ProKey(replace_rules.at(r) + ".replace"));
- if (!match.isEmpty() /*&& match != replace*/)
+ if (!match.isEmpty() /*&& match != replace*/) {
ret += " -e " + shellQuote("s," + match + "," + replace + ",g");
+ if (isWindowsShell() && project->first(ProKey(replace_rules.at(r) + ".CONFIG")).contains("path"))
+ ret += " -e " + shellQuote("s," + windowsifyPath(match.toQString())
+ + "," + windowsifyPath(replace.toQString()) + ",gi");
+ }
}
ret += " \"" + src + "\" >\"" + dst + "\"";
}
diff --git a/qmake/main.cpp b/qmake/main.cpp
index 79e3739f56..f5116ba752 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -85,6 +85,7 @@ static int doSed(int argc, char **argv)
return 3;
}
QChar sep = ++j < cmd.length() ? cmd.at(j) : QChar();
+ Qt::CaseSensitivity matchcase = Qt::CaseSensitive;
bool escaped = false;
int phase = 1;
QStringList phases;
@@ -126,12 +127,16 @@ static int doSed(int argc, char **argv)
fprintf(stderr, "Error: sed s command requires three arguments (%d, %c, %s)\n", phase, sep.toLatin1(), qPrintable(curr));
return 3;
}
+ if (curr.contains(QLatin1Char('i'))) {
+ curr.remove(QLatin1Char('i'));
+ matchcase = Qt::CaseInsensitive;
+ }
if (curr != QLatin1String("g")) {
- fprintf(stderr, "Error: sed s command must be used with the g option (only)\n");
+ fprintf(stderr, "Error: sed s command supports only g & i options; g is required\n");
return 3;
}
SedSubst subst;
- subst.from = QRegExp(phases.at(0));
+ subst.from = QRegExp(phases.at(0), matchcase);
subst.to = phases.at(1);
subst.to.replace("\\\\", "\\"); // QString::replace(rx, sub) groks \1, but not \\.
substs << subst;
diff --git a/qtbase.pro b/qtbase.pro
index 9091fba4e0..140a137099 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -181,7 +181,7 @@ mkspecs.path = $$[QT_HOST_DATA]/mkspecs
mkspecs.files = \
$$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$OUT_PWD/mkspecs/qfeatures.pri \
$$files($$PWD/mkspecs/*)
-mkspecs.files -= $$PWD/mkspecs/modules
+mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst
INSTALLS += mkspecs
global_docs.files = $$PWD/doc/global
diff --git a/src/android/java/res/values/libs.xml b/src/android/java/res/values/libs.xml
index 231406d224..797e6bb8c4 100644
--- a/src/android/java/res/values/libs.xml
+++ b/src/android/java/res/values/libs.xml
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<array name="qt_sources">
- <item>https://download.qt-project.org/ministro/android/qt5/latest</item>
+ <item>https://download.qt-project.org/ministro/android/qt5/qt-5.2</item>
</array>
<!-- The following is handled automatically by the deployment tool. It should
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 7c741edfda..a10e58bb87 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -150,7 +150,7 @@ public class QtActivity extends Activity
private ActivityInfo m_activityInfo = null; // activity info object, used to access the libs and the strings
private DexClassLoader m_classLoader = null; // loader object
- private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/latest"}; // Make sure you are using ONLY secure locations
+ private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/qt-5.2"}; // Make sure you are using ONLY secure locations
private String m_repository = "default"; // Overwrites the default Ministro repository
// Possible values:
// * default - Ministro default repository set with "Ministro configuration tool".
diff --git a/src/concurrent/qtconcurrentmedian.h b/src/concurrent/qtconcurrentmedian.h
index b39b3ed32b..ce2afb9c28 100644
--- a/src/concurrent/qtconcurrentmedian.h
+++ b/src/concurrent/qtconcurrentmedian.h
@@ -102,10 +102,19 @@ public:
{
if (dirty) {
dirty = false;
+
+// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800
+// Avoid using std::nth_element for stdlibc++ <= 4.7.3 || (>= 4.8.0 && <= 4.8.2)
+#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20130411 || (__GLIBCXX__ >= 20130322 && __GLIBCXX__ <= 20131016))
+ QVector<T> sorted = values;
+ std::sort(sorted.begin(), sorted.end());
+ currentMedian = sorted.at(bufferSize / 2);
+#else
QVector<T> copy = values;
typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end();
std::nth_element(begin, mid, end);
currentMedian = *mid;
+#endif
}
return currentMedian;
}
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index a648949d26..6644d6d101 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -556,10 +556,8 @@ Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
\typedef qreal
\relates <QtGlobal>
- Typedef for \c double on all platforms except for those using CPUs with
- ARM architectures.
- On ARM-based platforms, \c qreal is a typedef for \c float for performance
- reasons.
+ Typedef for \c double unless Qt is configured with the
+ \c{-qreal float} option.
*/
/*! \typedef uchar
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 4e06d12aee..aaa75c0fb8 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -74,7 +74,8 @@ static jclass getCachedClass(JNIEnv *env, const char *className)
if (!classLoader.isValid())
return 0;
- QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QLatin1String(className));
+ QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QString::fromLatin1(className).replace(QLatin1Char('/'),
+ QLatin1Char('.')));
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;",
stringName.object());
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 7d2410a18a..a65cf517ce 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -2996,6 +2996,10 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
expensive initialization only if something is connected to a
signal.
+ \warning This function is called from the thread which performs the
+ connection, which may be a different thread from the thread in
+ which this object lives.
+
\sa connect(), disconnectNotify()
*/
@@ -3022,6 +3026,15 @@ void QObject::connectNotify(const QMetaMethod &signal)
modularity. However, it might be useful for optimizing access to
expensive resources.
+ \warning This function is called from the thread which performs the
+ disconnection, which may be a different thread from the thread in
+ which this object lives. This function may also be called with a QObject
+ internal mutex locked. It is therefore not allowed to re-enter any
+ of any QObject functions from your reimplementation and if you lock
+ a mutex in your reimplementation, make sure that you don't call QObject
+ functions with that mutex held in other places or it will result in
+ a deadlock.
+
\sa disconnect(), connectNotify()
*/
diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h
index a85e9c86c9..d8f52e9f98 100644
--- a/src/gui/text/qtextdocument.h
+++ b/src/gui/text/qtextdocument.h
@@ -71,6 +71,7 @@ class QTextCursor;
template<typename T> class QVector;
+#ifndef Q_QDOC // Workaround for QTBUG-35230
namespace Qt
{
Q_GUI_EXPORT bool mightBeRichText(const QString&);
@@ -80,6 +81,7 @@ namespace Qt
Q_GUI_EXPORT QTextCodec *codecForHtml(const QByteArray &ba);
#endif
}
+#endif // Q_QDOC
class Q_GUI_EXPORT QAbstractUndoItem
{
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 777d4a871b..8f74a71b1e 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -192,8 +192,6 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
QWindow *window = static_cast<QCocoaWindow *>(surface)->window();
setActiveWindow(window);
- if (![m_context view])
- return false;
[m_context makeCurrentContext];
update();
return true;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 4f5a208f43..c7ec315f04 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -159,8 +159,10 @@ public:
void registerTouch(bool enable);
qreal devicePixelRatio() const;
+ bool isWindowExposable();
void exposeWindow();
void obscureWindow();
+ void updateExposedGeometry();
QWindow *childWindowAt(QPoint windowPoint);
protected:
// NSWindow handling. The QCocoaWindow/QNSView can either be displayed
@@ -202,7 +204,9 @@ public: // for QNSView
bool m_hasModalSession;
bool m_frameStrutEventsEnabled;
+ bool m_geometryUpdateExposeAllowed;
bool m_isExposed;
+ QRect m_exposedGeometry;
int m_registerTouchCount;
bool m_resizableTransientParent;
bool m_overrideBecomeKey;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 1aace958ed..a2ef43db67 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -213,6 +213,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
, m_windowCursor(0)
, m_hasModalSession(false)
, m_frameStrutEventsEnabled(false)
+ , m_geometryUpdateExposeAllowed(false)
, m_isExposed(false)
, m_registerTouchCount(0)
, m_resizableTransientParent(false)
@@ -1084,22 +1085,61 @@ qreal QCocoaWindow::devicePixelRatio() const
}
}
+// Returns whether the window can be expose, which it can
+// if it is on screen and has a valid geometry.
+bool QCocoaWindow::isWindowExposable()
+{
+ QSize size = geometry().size();
+ bool validGeometry = (size.width() > 0 && size.height() > 0);
+ bool validScreen = ([[m_contentView window] screen] != 0);
+ bool nonHiddenSuperView = ![[m_contentView superview] isHidden];
+ return (validGeometry && validScreen && nonHiddenSuperView);
+}
+
+// Exposes the window by posting an expose event to QWindowSystemInterface
void QCocoaWindow::exposeWindow()
{
- if (!m_isExposed && ![[m_contentView superview] isHidden]) {
+ m_geometryUpdateExposeAllowed = true;
+
+ if (!isWindowExposable())
+ return;
+
+ if (!m_isExposed) {
m_isExposed = true;
+ m_exposedGeometry = geometry();
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
}
}
+// Obscures the window by posting an empty expose event to QWindowSystemInterface
void QCocoaWindow::obscureWindow()
{
if (m_isExposed) {
+ m_geometryUpdateExposeAllowed = false;
m_isExposed = false;
QWindowSystemInterface::handleExposeEvent(window(), QRegion());
}
}
+// Updates window geometry by posting an expose event to QWindowSystemInterface
+void QCocoaWindow::updateExposedGeometry()
+{
+ // updateExposedGeometry is not allowed to send the initial expose. If you want
+ // that call exposeWindow();
+ if (!m_geometryUpdateExposeAllowed)
+ return;
+
+ if (!isWindowExposable())
+ return;
+
+ if (m_exposedGeometry == geometry())
+ return;
+
+ m_isExposed = true;
+ m_exposedGeometry = geometry();
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+}
+
QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint)
{
QWindow *targetWindow = window();
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index ca2a15a1cc..403f8dc78a 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -93,6 +93,8 @@ QT_END_NAMESPACE
- (BOOL)hasMask;
- (BOOL)isOpaque;
+- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint;
+
- (void)resetMouseButtons;
- (void)handleMouseEvent:(NSEvent *)theEvent;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 71c4de3b69..1c15c3b561 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -175,7 +175,7 @@ static QTouchDevice *touchDevice = 0;
- (void) globalFrameChanged:(NSNotification*)notification
{
Q_UNUSED(notification);
- QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry());
+ m_platformWindow->updateExposedGeometry();
}
- (void)viewDidMoveToSuperview
@@ -186,7 +186,7 @@ static QTouchDevice *touchDevice = 0;
if ([self superview]) {
m_platformWindow->m_contentViewIsEmbedded = true;
QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry());
- QWindowSystemInterface::handleExposeEvent(m_window, m_platformWindow->geometry());
+ m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
} else {
m_platformWindow->m_contentViewIsEmbedded = false;
@@ -261,7 +261,7 @@ static QTouchDevice *touchDevice = 0;
// Send a geometry change event to Qt, if it's ready to handle events
if (!m_platformWindow->m_inConstructor) {
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
- QWindowSystemInterface::handleExposeEvent(m_window, geometry);
+ m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
}
}
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h
index 06e11fffbb..5717551cc3 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.h
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h
@@ -53,6 +53,7 @@
- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
+- (void)windowDidBecomeKey:(NSNotification *)notification;
- (void)windowDidResize:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
- (void)windowWillMove:(NSNotification *)notification;
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
index 10536bd5f4..c9b3d69381 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
@@ -56,6 +56,17 @@
return self;
}
+- (void)windowDidBecomeKey:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ if (m_cocoaWindow->m_windowUnderMouse) {
+ QPointF windowPoint;
+ QPointF screenPoint;
+ [m_cocoaWindow->m_qtView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
+ QWindowSystemInterface::handleEnterEvent(m_cocoaWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint);
+ }
+}
+
- (void)windowDidResize:(NSNotification *)notification
{
Q_UNUSED(notification);
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index 51eb10d385..f93c6cc3a7 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -206,13 +206,6 @@ namespace
bool debugStackUsage = false;
}
-static int infoPlistValue(NSString* key, int defaultValue)
-{
- static NSBundle *bundle = [NSBundle mainBundle];
- NSNumber* value = [bundle objectForInfoDictionaryKey:key];
- return value ? [value intValue] : defaultValue;
-}
-
extern "C" int __attribute__((weak)) main(int argc, char *argv[])
{
@autoreleasepool {
diff --git a/src/plugins/platforms/ios/qiosglobal.h b/src/plugins/platforms/ios/qiosglobal.h
index 1c76d29389..17184dc21d 100644
--- a/src/plugins/platforms/ios/qiosglobal.h
+++ b/src/plugins/platforms/ios/qiosglobal.h
@@ -61,6 +61,7 @@ QPointF fromCGPoint(const CGPoint &point);
Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation);
UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation);
QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen);
+int infoPlistValue(NSString* key, int defaultValue);
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index d749b8f514..8dd690f301 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -134,5 +134,12 @@ QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen)
: QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width());
}
+int infoPlistValue(NSString* key, int defaultValue)
+{
+ static NSBundle *bundle = [NSBundle mainBundle];
+ NSNumber* value = [bundle objectForInfoDictionaryKey:key];
+ return value ? [value intValue] : defaultValue;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm
index 0e43429015..ea6a0bd4a6 100644
--- a/src/plugins/platforms/ios/qiosinputcontext.mm
+++ b/src/plugins/platforms/ios/qiosinputcontext.mm
@@ -270,7 +270,7 @@ void QIOSInputContext::scrollRootView()
&& m_keyboardListener->m_keyboardVisibleAndDocked
&& m_focusView.window == view.window) {
QRectF cursorRect = qGuiApp->inputMethod()->cursorRectangle();
- cursorRect.translate(qGuiApp->focusWindow()->geometry().topLeft());
+ cursorRect.translate(m_focusView.qwindow->geometry().topLeft());
qreal keyboardY = m_keyboardListener->m_keyboardEndRect.y();
int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y();
const int margin = 20;
diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h
index c655d8d3bf..fdecf70725 100644
--- a/src/plugins/platforms/ios/qiosintegration.h
+++ b/src/plugins/platforms/ios/qiosintegration.h
@@ -74,6 +74,8 @@ public:
QStringList themeNames() const;
QPlatformTheme *createPlatformTheme(const QString &name) const;
+ QPlatformDrag *drag() const Q_DECL_OVERRIDE { return 0; }
+
QAbstractEventDispatcher *createEventDispatcher() const;
QPlatformNativeInterface *nativeInterface() const;
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm
index 2e7e44d32c..0a6a00b753 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.mm
+++ b/src/plugins/platforms/ios/qiosviewcontroller.mm
@@ -101,12 +101,15 @@
- (BOOL)prefersStatusBarHidden
{
+ static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false);
+ if (hiddenFromPlist)
+ return YES;
QWindow *focusWindow = QGuiApplication::focusWindow();
- if (!focusWindow)
+ if (!focusWindow || !focusWindow->handle())
return [UIApplication sharedApplication].statusBarHidden;
- QIOSWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
- return topLevel->window()->windowState() == Qt::WindowFullScreen;
+ QWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
+ return topLevel->windowState() == Qt::WindowFullScreen;
}
@end
diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h
index d36a81180c..8a5eb589d2 100644
--- a/src/plugins/platforms/ios/qioswindow.h
+++ b/src/plugins/platforms/ios/qioswindow.h
@@ -87,7 +87,7 @@ public:
WId winId() const { return WId(m_view); };
- QIOSWindow *topLevelWindow() const;
+ QWindow *topLevelWindow() const;
private:
void applyGeometry(const QRect &rect);
diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm
index 7ab136e8b9..1acd9ee354 100644
--- a/src/plugins/platforms/ios/qioswindow.mm
+++ b/src/plugins/platforms/ios/qioswindow.mm
@@ -108,8 +108,6 @@
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
- [self updateTextInputTraits];
-
if (isQtApplication())
self.hidden = YES;
@@ -330,13 +328,9 @@
- (BOOL)becomeFirstResponder
{
- // On iOS, a QWindow should only have input focus when the input panel is
- // open. This is to stop cursors and focus rects from being drawn when the
- // user cannot type. And since the keyboard will open when a view becomes
- // the first responder, it's now a good time to inform QPA that the QWindow
- // this view backs became active:
+ // Note: QIOSInputContext controls our first responder status based on
+ // whether or not the keyboard should be open or closed.
[self updateTextInputTraits];
- QWindowSystemInterface::handleWindowActivated(m_qioswindow->window());
return [super becomeFirstResponder];
}
@@ -345,7 +339,8 @@
// Resigning first responed status means that the virtual keyboard was closed, or
// some other view became first responder. In either case we clear the focus object to
// avoid blinking cursors in line edits etc:
- static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
+ if (m_qioswindow)
+ static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
return [super resignFirstResponder];
}
@@ -427,8 +422,10 @@
- (QWindow *)qwindow
{
- if ([self isKindOfClass:[QUIView class]])
- return static_cast<QUIView *>(self)->m_qioswindow->window();
+ if ([self isKindOfClass:[QUIView class]]) {
+ if (QIOSWindow *w = static_cast<QUIView *>(self)->m_qioswindow)
+ return w->window();
+ }
return nil;
}
@@ -473,6 +470,7 @@ QIOSWindow::~QIOSWindow()
// cancellation of all touch events.
[m_view touchesCancelled:0 withEvent:0];
+ m_view->m_qioswindow = 0;
[m_view removeFromSuperview];
[m_view release];
}
@@ -637,7 +635,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow)
}
}
-QIOSWindow *QIOSWindow::topLevelWindow() const
+QWindow *QIOSWindow::topLevelWindow() const
{
QWindow *window = this->window();
while (window) {
@@ -651,7 +649,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const
window = parent;
}
- return static_cast<QIOSWindow *>(window->handle());
+ return window;
}
void QIOSWindow::requestActivateWindow()
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp
index 97a980a3fa..3cbba788c8 100644
--- a/src/tools/qdoc/generator.cpp
+++ b/src/tools/qdoc/generator.cpp
@@ -334,14 +334,14 @@ QString Generator::fileBase(const Node *node) const
if (node->isQmlNode()) {
if (!node->qmlModuleName().isEmpty()) {
base.prepend(node->qmlModuleName() + QLatin1Char('-'));
- /*
- To avoid file name conflicts in the html directory,
- we prepend a prefix (by default, "qml-") to the file name of QML
- element doc files.
- */
- if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
- base.prepend(outputPrefix(QLatin1String("QML")));
- }
+ }
+ /*
+ To avoid file name conflicts in the html directory,
+ we prepend a prefix (by default, "qml-") to the file name of QML
+ element doc files.
+ */
+ if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
+ base.prepend(outputPrefix(QLatin1String("QML")));
}
}
else if (node->subType() == Node::QmlModule) {
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp
index 986b4ae261..511dc3240f 100644
--- a/src/tools/qdoc/htmlgenerator.cpp
+++ b/src/tools/qdoc/htmlgenerator.cpp
@@ -269,6 +269,9 @@ QString HtmlGenerator::format()
void HtmlGenerator::generateTree()
{
qdb_->buildCollections();
+ Node* qflags = qdb_->findNodeByNameAndType(QStringList("QFlags"), Node::Class, Node::NoSubType);
+ if (qflags)
+ qflagsHref_ = linkForNode(qflags,0);
if (!runPrepareOnly()) {
Generator::generateTree();
generateCollisionPages();
@@ -3660,7 +3663,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node,
if (enume->flagsType()) {
out() << "<p>The " << protectEnc(enume->flagsType()->name())
<< " type is a typedef for "
- << "<a href=\"qflags.html\">QFlags</a>&lt;"
+ << "<a href=\"" << qflagsHref_ << "\">QFlags</a>&lt;"
<< protectEnc(enume->name())
<< "&gt;. It stores an OR combination of "
<< protectEnc(enume->name())
diff --git a/src/tools/qdoc/htmlgenerator.h b/src/tools/qdoc/htmlgenerator.h
index f2525327e8..ae16f3c54f 100644
--- a/src/tools/qdoc/htmlgenerator.h
+++ b/src/tools/qdoc/htmlgenerator.h
@@ -262,6 +262,7 @@ private:
QString cppclassespage;
QString qmltypespage;
QString buildversion;
+ QString qflagsHref_;
public:
static bool debugging_on;
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 04047d8d0a..2d07e545c8 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -7634,7 +7634,10 @@ QGraphicsObject::~QGraphicsObject()
bool QGraphicsObject::event(QEvent *ev)
{
if (ev->type() == QEvent::StyleAnimationUpdate) {
- update();
+ if (isVisible()) {
+ ev->accept();
+ update();
+ }
return true;
}
return QObject::event(ev);
diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp
index 4abb5e39e5..ccc51120a9 100644
--- a/src/widgets/graphicsview/qgraphicswidget.cpp
+++ b/src/widgets/graphicsview/qgraphicswidget.cpp
@@ -1409,9 +1409,14 @@ bool QGraphicsWidget::event(QEvent *event)
break;
case QEvent::WindowActivate:
case QEvent::WindowDeactivate:
- case QEvent::StyleAnimationUpdate:
update();
break;
+ case QEvent::StyleAnimationUpdate:
+ if (isVisible()) {
+ event->accept();
+ update();
+ }
+ break;
// Taken from QWidget::event
case QEvent::ActivationChange:
case QEvent::EnabledChange:
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index c646255ddb..08e8975f9d 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -8249,7 +8249,10 @@ bool QWidget::event(QEvent *event)
update(static_cast<QUpdateLaterEvent*>(event)->region());
break;
case QEvent::StyleAnimationUpdate:
- update();
+ if (isVisible() && !window()->isMinimized()) {
+ event->accept();
+ update();
+ }
break;
case QEvent::WindowBlocked:
diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp
index 77f869f036..da9b5da2a5 100644
--- a/src/widgets/styles/qstyle.cpp
+++ b/src/widgets/styles/qstyle.cpp
@@ -619,7 +619,7 @@ void QStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, c
void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
const QPixmap &pixmap) const
{
- int scale = pixmap.devicePixelRatio();
+ qreal scale = pixmap.devicePixelRatio();
QRect aligned = alignedRect(QApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
QRect inter = aligned.intersected(rect);
diff --git a/src/widgets/styles/qstyleanimation.cpp b/src/widgets/styles/qstyleanimation.cpp
index 4fb67d90c0..90fb371982 100644
--- a/src/widgets/styles/qstyleanimation.cpp
+++ b/src/widgets/styles/qstyleanimation.cpp
@@ -93,7 +93,10 @@ void QStyleAnimation::setStartTime(const QTime &time)
void QStyleAnimation::updateTarget()
{
QEvent event(QEvent::StyleAnimationUpdate);
+ event.setAccepted(false);
QCoreApplication::sendEvent(target(), &event);
+ if (!event.isAccepted())
+ stop();
}
bool QStyleAnimation::isUpdateNeeded() const
@@ -103,16 +106,8 @@ bool QStyleAnimation::isUpdateNeeded() const
void QStyleAnimation::updateCurrentTime(int)
{
- if (QObject *tgt = target()) {
- if (tgt->isWidgetType()) {
- QWidget *widget = static_cast<QWidget *>(tgt);
- if (!widget->isVisible() || widget->window()->isMinimized())
- stop();
- }
-
- if (isUpdateNeeded())
- updateTarget();
- }
+ if (target() && isUpdateNeeded())
+ updateTarget();
}
QProgressStyleAnimation::QProgressStyleAnimation(int speed, QObject *target) :
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index 37a14d3eb3..2c09f5a8f1 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -3073,7 +3073,7 @@ void QComboBox::wheelEvent(QWheelEvent *e)
newIndex--;
while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
newIndex--;
- } else {
+ } else if (e->delta() < 0) {
newIndex++;
while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
newIndex++;
diff --git a/src/winmain/winmain.pro b/src/winmain/winmain.pro
index 4303c3bc12..b0771caa55 100644
--- a/src/winmain/winmain.pro
+++ b/src/winmain/winmain.pro
@@ -31,8 +31,7 @@ load(qt_targets)
wince*:QMAKE_POST_LINK =
-unix|win32-g++* {
- lib_replace.match = $$[QT_INSTALL_LIBS/get]
- lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
- QMAKE_PRL_INSTALL_REPLACE += lib_replace
-}
+lib_replace.match = $$[QT_INSTALL_LIBS/get]
+lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
+lib_replace.CONFIG = path
+QMAKE_PRL_INSTALL_REPLACE += lib_replace
diff --git a/tests/auto/concurrent/concurrent.pro b/tests/auto/concurrent/concurrent.pro
index 20bad24fc1..e67c51aae3 100644
--- a/tests/auto/concurrent/concurrent.pro
+++ b/tests/auto/concurrent/concurrent.pro
@@ -3,6 +3,7 @@ SUBDIRS=\
qtconcurrentfilter \
qtconcurrentiteratekernel \
qtconcurrentmap \
+ qtconcurrentmedian \
qtconcurrentrun \
qtconcurrentthreadengine
diff --git a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
new file mode 100644
index 0000000000..1eb27d825a
--- /dev/null
+++ b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
@@ -0,0 +1,5 @@
+CONFIG += testcase parallel_test
+TARGET = tst_qtconcurrentmedian
+QT = core testlib concurrent
+SOURCES = tst_qtconcurrentmedian.cpp
+DEFINES += QT_STRICT_ITERATORS
diff --git a/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp b/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp
new file mode 100644
index 0000000000..c9fbc790bd
--- /dev/null
+++ b/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qtconcurrentmedian.h>
+
+#include <QtTest/QtTest>
+
+class tst_QtConcurrentMedian: public QObject
+{
+ Q_OBJECT
+private slots:
+ void median_data();
+ void median();
+};
+
+void tst_QtConcurrentMedian::median_data()
+{
+ QTest::addColumn<QList<int> >("values");
+ QTest::addColumn<int>("expectedMedian");
+
+ QTest::newRow("size=1")
+ << (QList<int>() << 1)
+ << 1;
+
+ QTest::newRow("size=2")
+ << (QList<int>() << 3 << 2)
+ << 3;
+
+ QTest::newRow("size=3")
+ << (QList<int>() << 3 << 1 << 2)
+ << 2;
+
+ QTest::newRow("gcc bug 58800 (nth_element)")
+ << (QList<int>() << 207089 << 202585 << 180067 << 157549 << 211592 << 216096 << 207089)
+ << 207089;
+}
+
+void tst_QtConcurrentMedian::median()
+{
+ QFETCH(QList<int> , values);
+ QFETCH(int, expectedMedian);
+
+ QtConcurrent::Median<int> m(values.size());
+ foreach (int value, values)
+ m.addValue(value);
+ QCOMPARE(m.median(), expectedMedian);
+}
+
+QTEST_MAIN(tst_QtConcurrentMedian)
+#include "tst_qtconcurrentmedian.moc"
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 6c26ddb293..fc1d0e34cb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -4221,6 +4221,7 @@ void tst_QGraphicsItem::cursor()
QCursor cursor = view.viewport()->cursor();
{
+ QTest::mouseMove(view.viewport(), QPoint(100, 50));
QMouseEvent event(QEvent::MouseMove, QPoint(100, 50), Qt::NoButton, 0, 0);
QApplication::sendEvent(view.viewport(), &event);
}
diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
index 6c04e5b39a..e2b2fb9551 100644
--- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
+++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
@@ -1043,13 +1043,14 @@ void tst_QColumnView::dynamicModelChanges()
ColumnView view;
view.setModel(&model);
view.setItemDelegate(&delegate);
+ centerOnScreen(&view);
view.show();
QStandardItem *item = new QStandardItem(QLatin1String("item"));
model.appendRow(item);
- QTest::qWait(200); //let the time for painting to occur
- QCOMPARE(delegate.paintedIndexes.count(), 1);
+ QVERIFY(QTest::qWaitForWindowExposed(&view)); //let the time for painting to occur
+ QTRY_COMPARE(delegate.paintedIndexes.count(), 1);
QCOMPARE(*delegate.paintedIndexes.begin(), model.index(0,0));
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 81ed983d0f..9e181c0676 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -598,6 +598,7 @@ void tst_QMenu::layoutDirection()
centerOnScreen(&win);
QMenu menu(&win);
+ menu.addAction("foo");
menu.move(win.geometry().topRight() + QPoint(50, 0));
menu.show();
QVERIFY(QTest::qWaitForWindowExposed(&menu));