Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev

This commit is contained in:
Simon Hausmann 2013-12-23 22:44:13 +01:00 committed by The Qt Project
commit d776937df9
102 changed files with 1007 additions and 333 deletions

5
.gitignore vendored
View File

@ -63,7 +63,7 @@ Makefile*
*.gcov
*.gcda
*.gcno
bin/Qt*.dll
bin/*.dll
bin/assistant*
bin/designer*
bin/dumpcpp*
@ -112,6 +112,7 @@ mkspecs/default
mkspecs/default-host
mkspecs/qconfig.pri
mkspecs/qdevice.pri
mkspecs/qfeatures.pri
moc_*.cpp
qmake/qmake.exe
qmake/Makefile.bak
@ -119,6 +120,7 @@ qmake/qmake_pch.pch
src/corelib/global/qconfig.cpp
src/corelib/global/qconfig.h
src/corelib/global/qconfig.h.qmake
src/corelib/global/qfeatures.h
src/platformsupport/*_interface.*
src/platformsupport/*_adaptor.*
ui_*.h
@ -183,6 +185,7 @@ src/3rdparty/webkit/includes2.txt
# generated files in configure.exe bootstrapping
tools/configure/configure.intermediate.manifest
tools/configure/configure_pch.pch
/configure.exe
# Symlinks generated by configure
tools/qvfb/qvfbhdr.h

View File

@ -44,7 +44,6 @@
int main(int, char **)
{
//We require glxfbconfig, ie. glx 1.3
GLXFBConfig config;
config = 0;

View File

@ -1,4 +1,4 @@
SOURCES = glx.cpp
SOURCES = glxfbconfig.cpp
CONFIG += x11
INCLUDEPATH += $$QMAKE_INCDIR_OPENGL

98
configure vendored
View File

@ -611,8 +611,6 @@ CFG_OPENVG_LC_INCLUDES=no
CFG_OPENVG_SHIVA=auto
CFG_OPENVG_ON_OPENGL=auto
CFG_EGL=auto
CFG_GLX=auto
CFG_SSE=auto
CFG_FONTCONFIG=auto
CFG_FREETYPE=auto
CFG_HARFBUZZ=no
@ -1159,13 +1157,6 @@ while [ "$#" -gt 0 ]; do
libexecdir)
QT_INSTALL_LIBEXECS="$VAL"
;;
sse)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_SSE="$VAL"
else
UNKNOWN_OPT=yes
fi
;;
opengl)
if [ "$VAL" = "auto" ] || [ "$VAL" = "desktop" ] ||
[ "$VAL" = "yes" ] || [ "$VAL" = "no" ] ||
@ -1483,13 +1474,6 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
glx)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_GLX="$VAL"
else
UNKNOWN_OPT=yes
fi
;;
pch)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_PRECOMPILE="$VAL"
@ -4243,6 +4227,9 @@ if [ "${CFG_SSE2}" = "auto" ]; then
fi
# detect sse3 support
if [ "${CFG_SSE2}" = "no" ]; then
CFG_SSE3=no
fi
if [ "${CFG_SSE3}" = "auto" ]; then
if compileTest common/sse3 "sse3"; then
CFG_SSE3=yes
@ -4252,6 +4239,9 @@ if [ "${CFG_SSE3}" = "auto" ]; then
fi
# detect ssse3 support
if [ "${CFG_SSE3}" = "no" ]; then
CFG_SSSE3=no
fi
if [ "${CFG_SSSE3}" = "auto" ]; then
if compileTest common/ssse3 "ssse3"; then
CFG_SSSE3=yes
@ -4261,6 +4251,9 @@ if [ "${CFG_SSSE3}" = "auto" ]; then
fi
# detect sse4.1 support
if [ "${CFG_SSSE3}" = "no" ]; then
CFG_SSE4_1=no
fi
if [ "${CFG_SSE4_1}" = "auto" ]; then
if compileTest common/sse4_1 "sse4_1"; then
CFG_SSE4_1=yes
@ -4270,6 +4263,9 @@ if [ "${CFG_SSE4_1}" = "auto" ]; then
fi
# detect sse4.2 support
if [ "${CFG_SSE4_1}" = "no" ]; then
CFG_SSE4_2=no
fi
if [ "${CFG_SSE4_2}" = "auto" ]; then
if compileTest common/sse4_2 "sse4_2"; then
CFG_SSE4_2=yes
@ -4279,6 +4275,9 @@ if [ "${CFG_SSE4_2}" = "auto" ]; then
fi
# detect avx support
if [ "${CFG_SSE4_2}" = "no" ]; then
CFG_AVX=no
fi
if [ "${CFG_AVX}" = "auto" ]; then
if compileTest common/avx "avx"; then
case "$XQMAKESPEC" in
@ -4929,6 +4928,19 @@ if [ "$XPLATFORM_MINGW" = "yes" ]; then
fi
CFG_OPENGL=no
fi
case "$PLATFORM" in
hpux*)
# HP-UX have buggy glx headers; check if we really need to define the GLXFBConfig struct.
if [ "$CFG_OPENGL" = "desktop" ]; then
compileTest x11/glxfbconfig "OpenGL"
if [ $? != "0" ]; then
QMakeVar add DEFINES QT_DEFINE_GLXFBCONFIG_STRUCT
fi
fi
;;
*)
;;
esac
elif [ "$CFG_OPENGL" = "es2" ]; then
#OpenGL ES 2.x
compileTest unix/opengles2 "OpenGL ES 2.x"
@ -4949,6 +4961,17 @@ if [ "$XPLATFORM_MINGW" = "yes" ]; then
echo " ${XQMAKESPEC}."
exit 1
fi
case "$PLATFORM" in
hpux*)
# HP-UX have buggy glx headers; check if we really need to define the GLXFBConfig struct.
compileTest x11/glxfbconfig "OpenGL"
if [ $? != "0" ]; then
QMakeVar add DEFINES QT_DEFINE_GLXFBCONFIG_STRUCT
fi
;;
*)
;;
esac
fi
fi # X11/MINGW OpenGL
@ -5086,6 +5109,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`"
@ -5131,17 +5159,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"
@ -5313,24 +5330,6 @@ if [ "$CFG_EGL" != "no" ]; then
fi
fi
# GLX Support
if [ "$CFG_GLX" != "no" ]; then
if [ "$CFG_GLX" = "yes" ] && [ "$CFG_OPENGL" = "no" ]; then
echo "GLX support was requested but OpenGL support is disabled."
echo "Either disable GLX support or enable OpenGL support."
exit 101
fi
if compileTest qpa/glx "GLX"; then
CFG_GLX=yes
elif [ "$CFG_GLX" = "yes" ]; then
echo " The GLX functionality test failed; GLX is required by the xcb plugin to manage contexts & surfaces."
exit 1
else
CFG_GLX=no
fi
fi
if [ "$CFG_EGLFS" != "no" ]; then
if [ "$XPLATFORM_QNX" = "no" ]; then
CFG_EGLFS="$CFG_EGL"
@ -5701,13 +5700,6 @@ else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_EGL"
fi
# enable glx
if [ "$CFG_GLX" = "yes" ]; then
QT_CONFIG="$QT_CONFIG glx"
else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_GLX"
fi
# enable eglfs
if [ "$CFG_EGLFS" = "yes" ]; then
QT_CONFIG="$QT_CONFIG eglfs"
@ -6743,8 +6735,6 @@ else
report_support " pkg-config ............. no"
fi
report_support " PulseAudio ............." "$CFG_PULSEAUDIO"
report_support " EGL ...................." "$CFG_EGL"
report_support " GLX ...................." "$CFG_GLX"
report_support " QPA backends:"
report_support " DirectFB ............." "$CFG_DIRECTFB"
report_support " EGLFS ................" "$CFG_EGLFS"

64
dist/changes-5.2.0 vendored
View File

@ -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.

View File

@ -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
}

View File

@ -0,0 +1,10 @@
#
# qmake configuration for linux-clang and libc++
#
include(../linux-clang/qmake.conf)
QMAKE_CXXFLAGS += -stdlib=libc++
QMAKE_LFLAGS += -stdlib=libc++
load(qt_config)

View File

@ -0,0 +1,42 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the qmake spec 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 "../linux-clang/qplatformdefs.h"

View File

@ -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 {

View File

@ -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"

View File

@ -3334,6 +3334,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;
@ -3346,8 +3353,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 + "\"";
}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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".

6
src/angle/src/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
/libGLESv2/renderer/
/compiler/glslang_lex.cpp
/compiler/glslang_tab.cpp
/compiler/glslang_tab.h
/compiler/preprocessor/ExpressionParser.cpp
/compiler/preprocessor/Tokenizer.cpp

View File

@ -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;
}

View File

@ -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

View File

@ -73,10 +73,11 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
// Anomymous pipes do not support asynchronous I/O. Thus we
// create named pipes for redirecting stdout, stderr and stdin.
// The write handle must be non-inheritable for input pipes.
// The read handle must be non-inheritable for output pipes.
SECURITY_ATTRIBUTES secAtt = { sizeof(SECURITY_ATTRIBUTES), 0, false };
secAtt.bInheritHandle = isInputPipe; // The read handle must be non-inheritable for output pipes.
HANDLE hRead;
HANDLE hServer;
wchar_t pipeName[256];
unsigned int attempts = 1000;
forever {
@ -85,19 +86,29 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
_snwprintf(pipeName, sizeof(pipeName) / sizeof(pipeName[0]),
L"\\\\.\\pipe\\qt-%X", qrand());
DWORD dwOpenMode = FILE_FLAG_OVERLAPPED;
DWORD dwOutputBufferSize = 0;
DWORD dwInputBufferSize = 0;
const DWORD dwPipeBufferSize = 1024 * 1024;
if (isInputPipe) {
dwOpenMode |= PIPE_ACCESS_OUTBOUND;
dwOutputBufferSize = dwPipeBufferSize;
} else {
dwOpenMode |= PIPE_ACCESS_INBOUND;
dwInputBufferSize = dwPipeBufferSize;
}
DWORD dwPipeFlags = PIPE_TYPE_BYTE | PIPE_WAIT;
if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
dwPipeFlags |= PIPE_REJECT_REMOTE_CLIENTS;
const DWORD dwPipeBufferSize = 1024 * 1024;
hRead = CreateNamedPipe(pipeName,
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
dwPipeFlags,
1, // only one pipe instance
0, // output buffer size
dwPipeBufferSize, // input buffer size
0,
&secAtt);
if (hRead != INVALID_HANDLE_VALUE)
hServer = CreateNamedPipe(pipeName,
dwOpenMode,
dwPipeFlags,
1, // only one pipe instance
dwOutputBufferSize,
dwInputBufferSize,
0,
&secAtt);
if (hServer != INVALID_HANDLE_VALUE)
break;
DWORD dwError = GetLastError();
if (dwError != ERROR_PIPE_BUSY || !--attempts) {
@ -106,28 +117,31 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
}
}
// The write handle must be non-inheritable for input pipes.
secAtt.bInheritHandle = !isInputPipe;
HANDLE hWrite = INVALID_HANDLE_VALUE;
hWrite = CreateFile(pipeName,
GENERIC_WRITE,
0,
&secAtt,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (hWrite == INVALID_HANDLE_VALUE) {
secAtt.bInheritHandle = TRUE;
const HANDLE hClient = CreateFile(pipeName,
(isInputPipe ? (GENERIC_READ | FILE_WRITE_ATTRIBUTES)
: GENERIC_WRITE),
0,
&secAtt,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (hClient == INVALID_HANDLE_VALUE) {
qErrnoWarning("QProcess: CreateFile failed.");
CloseHandle(hRead);
CloseHandle(hServer);
return;
}
// Wait until connection is in place.
ConnectNamedPipe(hRead, NULL);
ConnectNamedPipe(hServer, NULL);
pipe[0] = hRead;
pipe[1] = hWrite;
if (isInputPipe) {
pipe[0] = hClient;
pipe[1] = hServer;
} else {
pipe[0] = hServer;
pipe[1] = hClient;
}
}
static void duplicateStdWriteChannel(Q_PIPE *pipe, DWORD nStdHandle)

View File

@ -94,9 +94,19 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
static int nextRand(int &v)
{
int r = v % 62;
v /= 62;
if (v < 62)
v = qrand();
return r;
}
static char *q_mkdtemp(char *templateName)
{
#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const size_t length = strlen(templateName);
@ -110,16 +120,11 @@ static char *q_mkdtemp(char *templateName)
int v = qrand();
/* Fill in the random bits. */
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
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);
@ -137,11 +142,17 @@ static char *q_mkdtemp(char *templateName)
}
}
return 0;
#else
return mkdtemp(templateName);
#endif
}
#else // defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
static char *q_mkdtemp(char *templateName)
{
return mkdtemp(templateName);
}
#endif
void QTemporaryDirPrivate::create(const QString &templateName)
{
QByteArray buffer = QFile::encodeName(templateName);

View File

@ -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());

View File

@ -1075,8 +1075,14 @@ int QMetaObjectBuilder::indexOfClassInfo(const QByteArray& name)
\brief The QMetaStringTable class can generate a meta-object string table at runtime.
*/
QMetaStringTable::QMetaStringTable()
: m_index(0) {}
QMetaStringTable::QMetaStringTable(const QByteArray &className)
: m_index(0)
, m_className(className)
{
const int index = enter(m_className);
Q_ASSERT(index == 0);
Q_UNUSED(index);
}
// Enters the given value into the string table (if it hasn't already been
// entered). Returns the index of the string.
@ -1106,30 +1112,45 @@ int QMetaStringTable::blobSize() const
return size;
}
static void writeString(char *out, int i, const QByteArray &str,
const int offsetOfStringdataMember, int &stringdataOffset)
{
int size = str.size();
qptrdiff offset = offsetOfStringdataMember + stringdataOffset
- i * sizeof(QByteArrayData);
const QByteArrayData data =
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset);
memcpy(out + i * sizeof(QByteArrayData), &data, sizeof(QByteArrayData));
memcpy(out + offsetOfStringdataMember + stringdataOffset, str.constData(), size);
out[offsetOfStringdataMember + stringdataOffset + size] = '\0';
stringdataOffset += size + 1;
}
// Writes strings to string data struct.
// The struct consists of an array of QByteArrayData, followed by a char array
// containing the actual strings. This format must match the one produced by
// moc (see generator.cpp).
void QMetaStringTable::writeBlob(char *out)
void QMetaStringTable::writeBlob(char *out) const
{
Q_ASSERT(!(reinterpret_cast<quintptr>(out) & (preferredAlignment()-1)));
int offsetOfStringdataMember = m_entries.size() * sizeof(QByteArrayData);
int stringdataOffset = 0;
for (int i = 0; i < m_entries.size(); ++i) {
const QByteArray &str = m_entries.key(i);
int size = str.size();
qptrdiff offset = offsetOfStringdataMember + stringdataOffset
- i * sizeof(QByteArrayData);
const QByteArrayData data =
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset);
memcpy(out + i * sizeof(QByteArrayData), &data, sizeof(QByteArrayData));
// qt_metacast expects the first string in the string table to be the class name.
writeString(out, /*index*/0, m_className, offsetOfStringdataMember, stringdataOffset);
memcpy(out + offsetOfStringdataMember + stringdataOffset, str.constData(), size);
out[offsetOfStringdataMember + stringdataOffset + size] = '\0';
for (Entries::ConstIterator it = m_entries.constBegin(), end = m_entries.constEnd();
it != end; ++it) {
const int i = it.value();
if (i == 0)
continue;
const QByteArray &str = it.key();
stringdataOffset += size + 1;
writeString(out, i, str, offsetOfStringdataMember, stringdataOffset);
}
}
@ -1270,8 +1291,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Reset the current data position to just past the QMetaObjectPrivate.
dataIndex = MetaObjectPrivateFieldCount;
QMetaStringTable strings;
strings.enter(d->className);
QMetaStringTable strings(d->className);
// Output the class infos,
Q_ASSERT(!buf || dataIndex == pmeta->classInfoData);

View File

@ -323,18 +323,19 @@ private:
class Q_CORE_EXPORT QMetaStringTable
{
public:
QMetaStringTable();
explicit QMetaStringTable(const QByteArray &className);
int enter(const QByteArray &value);
static int preferredAlignment();
int blobSize() const;
void writeBlob(char *out);
void writeBlob(char *out) const;
private:
typedef QHash<QByteArray, int> Entries; // string --> index mapping
Entries m_entries;
int m_index;
QByteArray m_className;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QMetaObjectBuilder::AddMembers)

View File

@ -783,6 +783,10 @@ struct IteratorOwner
{
*ptr = new const_iterator(iterator);
}
static void assign(void **ptr, void * const * src)
{
*ptr = new const_iterator(*static_cast<const_iterator*>(*src));
}
static void advance(void **iterator, int step)
{
@ -804,18 +808,27 @@ struct IteratorOwner
{
return &*it;
}
};
template<typename const_iterator>
struct IteratorOwner<const const_iterator*>
{
static void assign(void **ptr, const const_iterator *iterator )
static bool equal(void * const *it, void * const *other)
{
*ptr = const_cast<const_iterator*>(iterator);
return *static_cast<const_iterator*>(*it) == *static_cast<const_iterator*>(*other);
}
};
template<typename value_type>
struct IteratorOwner<const value_type*>
{
static void assign(void **ptr, const value_type *iterator )
{
*ptr = const_cast<value_type*>(iterator);
}
static void assign(void **ptr, void * const * src)
{
*ptr = static_cast<value_type*>(*src);
}
static void advance(void **iterator, int step)
{
const_iterator *it = static_cast<const_iterator*>(*iterator);
value_type *it = static_cast<value_type*>(*iterator);
std::advance(it, step);
*iterator = it;
}
@ -829,10 +842,15 @@ struct IteratorOwner<const const_iterator*>
return *iterator;
}
static const void *getData(const const_iterator *it)
static const void *getData(const value_type *it)
{
return it;
}
static bool equal(void * const *it, void * const *other)
{
return static_cast<value_type*>(*it) == static_cast<value_type*>(*other);
}
};
enum IteratorCapability
@ -934,7 +952,7 @@ public:
template<class T>
static bool equalIterImpl(void * const *iterator, void * const *other)
{ return *static_cast<typename T::const_iterator*>(*iterator) == *static_cast<typename T::const_iterator*>(*other); }
{ return IteratorOwner<typename T::const_iterator>::equal(iterator, other); }
template<class T>
static VariantData getImpl(void * const *iterator, int metaTypeId, uint flags)
@ -942,7 +960,7 @@ public:
template<class T>
static void copyIterImpl(void **dest, void * const * src)
{ IteratorOwner<typename T::const_iterator>::assign(dest, *static_cast<typename T::const_iterator*>(*src)); }
{ IteratorOwner<typename T::const_iterator>::assign(dest, src); }
public:
template<class T> QSequentialIterableImpl(const T*p)
@ -1118,11 +1136,11 @@ public:
template<class T>
static bool equalIterImpl(void * const *iterator, void * const *other)
{ return *static_cast<typename T::const_iterator*>(*iterator) == *static_cast<typename T::const_iterator*>(*other); }
{ return IteratorOwner<typename T::const_iterator>::equal(iterator, other); }
template<class T>
static void copyIterImpl(void **dest, void * const * src)
{ IteratorOwner<typename T::const_iterator>::assign(dest, *static_cast<typename T::const_iterator*>(*src)); }
{ IteratorOwner<typename T::const_iterator>::assign(dest, src); }
public:
template<class T> QAssociativeIterableImpl(const T*p)
@ -1741,7 +1759,7 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
return id; \
const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
Q_ASSERT(tName); \
const int tNameLen = qstrlen(tName); \
const int tNameLen = int(qstrlen(tName)); \
QByteArray typeName; \
typeName.reserve(int(sizeof(#SINGLE_ARG_TEMPLATE)) + 1 + tNameLen + 1 + 1); \
typeName.append(#SINGLE_ARG_TEMPLATE, int(sizeof(#SINGLE_ARG_TEMPLATE)) - 1) \
@ -1782,8 +1800,8 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE<T, U> > \
const char *uName = QMetaType::typeName(qMetaTypeId<U>()); \
Q_ASSERT(tName); \
Q_ASSERT(uName); \
const int tNameLen = qstrlen(tName); \
const int uNameLen = qstrlen(uName); \
const int tNameLen = int(qstrlen(tName)); \
const int uNameLen = int(qstrlen(uName)); \
QByteArray typeName; \
typeName.reserve(int(sizeof(#DOUBLE_ARG_TEMPLATE)) + 1 + tNameLen + 1 + uNameLen + 1 + 1); \
typeName.append(#DOUBLE_ARG_TEMPLATE, int(sizeof(#DOUBLE_ARG_TEMPLATE)) - 1) \

View File

@ -194,9 +194,15 @@ QMetaObject *QObjectData::dynamicMetaObject() const
QObjectPrivate::QObjectPrivate(int version)
: threadData(0), connectionLists(0), senders(0), currentSender(0), currentChildBeingDeleted(0)
{
#ifdef QT_BUILD_INTERNAL
// Don't check the version parameter in internal builds.
// This allows incompatible versions to be loaded, possibly for testing.
Q_UNUSED(version);
#else
if (version != QObjectPrivateVersion)
qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
version, QObjectPrivateVersion);
#endif
// QObjectData initialization
q_ptr = 0;
@ -3090,6 +3096,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()
*/
@ -3116,6 +3126,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()
*/

View File

@ -199,7 +199,8 @@ QStringList QCommandLineOption::names() const
void QCommandLineOptionPrivate::setNames(const QStringList &nameList)
{
names.clear();
QStringList newNames;
newNames.reserve(nameList.size());
if (nameList.isEmpty())
qWarning("QCommandLineOption: Options must have at least one name");
foreach (const QString &name, nameList) {
@ -214,9 +215,11 @@ void QCommandLineOptionPrivate::setNames(const QStringList &nameList)
else if (name.contains(QLatin1Char('=')))
qWarning("QCommandLineOption: Option names cannot contain a '='");
else
names.append(name);
newNames.append(name);
}
}
// commit
names.swap(newNames);
}
/*!
@ -288,9 +291,13 @@ QString QCommandLineOption::description() const
*/
void QCommandLineOption::setDefaultValue(const QString &defaultValue)
{
d->defaultValues.clear();
if (!defaultValue.isEmpty())
d->defaultValues << defaultValue;
QStringList newDefaultValues;
if (!defaultValue.isEmpty()) {
newDefaultValues.reserve(1);
newDefaultValues << defaultValue;
}
// commit:
d->defaultValues.swap(newDefaultValues);
}
/*!

View File

@ -280,9 +280,9 @@ bool QCommandLineParser::addOption(const QCommandLineOption &option)
*/
QCommandLineOption QCommandLineParser::addVersionOption()
{
d->builtinVersionOption = true;
QCommandLineOption opt(QStringList() << QStringLiteral("v") << QStringLiteral("version"), tr("Displays version information."));
addOption(opt);
d->builtinVersionOption = true;
return opt;
}
@ -300,7 +300,6 @@ QCommandLineOption QCommandLineParser::addVersionOption()
*/
QCommandLineOption QCommandLineParser::addHelpOption()
{
d->builtinHelpOption = true;
QCommandLineOption opt(QStringList()
#ifdef Q_OS_WIN
<< QStringLiteral("?")
@ -308,6 +307,7 @@ QCommandLineOption QCommandLineParser::addHelpOption()
<< QStringLiteral("h")
<< QStringLiteral("help"), tr("Displays this help."));
addOption(opt);
d->builtinHelpOption = true;
return opt;
}

View File

@ -239,11 +239,7 @@ static inline uint qCpuFeatures()
return uint(features);
}
static inline uint qCpuHasFeature(CPUFeatures feature)
{
return qCompilerCpuFeatures & feature || qCpuFeatures() & feature;
}
#define qCpuHasFeature(feature) ((qCompilerCpuFeatures & (feature)) || (qCpuFeatures() & (feature)))
#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)

View File

@ -453,9 +453,9 @@ bool QTimeZonePrivate::isValidId(const QByteArray &olsenId)
// Aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid so we need to accept digits
if (olsenId.contains(' '))
return false;
QList<QByteArray> parts = olsenId.split('\\');
QList<QByteArray> parts = olsenId.split('/');
foreach (const QByteArray &part, parts) {
if (part.size() > 14)
if (part.size() > 14 || part.size() < 1)
return false;
if (part.at(0) == '-')
return false;
@ -466,6 +466,8 @@ bool QTimeZonePrivate::isValidId(const QByteArray &olsenId)
&& !(ch == '_')
&& !(ch >= '0' && ch <= '9')
&& !(ch == '-')
&& !(ch == '+')
&& !(ch == ':')
&& !(ch == '.'))
return false;
}

View File

@ -445,8 +445,7 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
data_size += 2 + mm.inputTypes.count() + mm.outputTypes.count();
idata.resize(data_size + 1);
QMetaStringTable strings;
strings.enter(className.toLatin1());
QMetaStringTable strings(className.toLatin1());
int offset = header->methodData;
int parametersOffset = offset + header->methodCount * 5;

View File

@ -245,6 +245,8 @@ class QImageWriterPrivate
public:
QImageWriterPrivate(QImageWriter *qq);
bool canWriteHelper();
// device
QByteArray format;
QIODevice *device;
@ -282,6 +284,31 @@ QImageWriterPrivate::QImageWriterPrivate(QImageWriter *qq)
q = qq;
}
bool QImageWriterPrivate::canWriteHelper()
{
if (!device) {
imageWriterError = QImageWriter::DeviceError;
errorString = QT_TRANSLATE_NOOP(QImageWriter,
QLatin1String("Device is not set"));
return false;
}
if (!device->isOpen())
device->open(QIODevice::WriteOnly);
if (!device->isWritable()) {
imageWriterError = QImageWriter::DeviceError;
errorString = QT_TRANSLATE_NOOP(QImageWriter,
QLatin1String("Device not writable"));
return false;
}
if (!handler && (handler = createWriteHandlerHelper(device, format)) == 0) {
imageWriterError = QImageWriter::UnsupportedFormatError;
errorString = QT_TRANSLATE_NOOP(QImageWriter,
QLatin1String("Unsupported image format"));
return false;
}
return true;
}
/*!
Constructs an empty QImageWriter object. Before writing, you must
call setFormat() to set an image format, then setDevice() or
@ -561,21 +588,15 @@ void QImageWriter::setText(const QString &key, const QString &text)
*/
bool QImageWriter::canWrite() const
{
if (d->device && !d->handler && (d->handler = createWriteHandlerHelper(d->device, d->format)) == 0) {
d->imageWriterError = QImageWriter::UnsupportedFormatError;
d->errorString = QT_TRANSLATE_NOOP(QImageWriter,
QLatin1String("Unsupported image format"));
return false;
if (QFile *file = qobject_cast<QFile *>(d->device)) {
const bool remove = !file->isOpen() && !file->exists();
const bool result = d->canWriteHelper();
if (!result && remove)
file->remove();
return result;
}
if (d->device && !d->device->isOpen())
d->device->open(QIODevice::WriteOnly);
if (!d->device || !d->device->isWritable()) {
d->imageWriterError = QImageWriter::DeviceError;
d->errorString = QT_TRANSLATE_NOOP(QImageWriter,
QLatin1String("Device not writable"));
return false;
}
return true;
return d->canWriteHelper();
}
/*!

View File

@ -3,8 +3,10 @@ INCLUDEPATH *= $$PWD
HEADERS += $$PWD/qjpeghandler_p.h
SOURCES += $$PWD/qjpeghandler.cpp
contains(QT_CONFIG, system-jpeg) {
if(unix|win32-g++*): LIBS += -ljpeg
else:win32: LIBS += libjpeg.lib
msvc: \
LIBS += libjpeg.lib
else: \
LIBS += -ljpeg
} else {
include($$PWD/../../3rdparty/libjpeg.pri)
}

View File

@ -2555,6 +2555,11 @@ void QGuiApplication::setFont(const QFont &font)
void QGuiApplicationPrivate::notifyLayoutDirectionChange()
{
const QWindowList list = QGuiApplication::topLevelWindows();
for (int i = 0; i < list.size(); ++i) {
QEvent ev(QEvent::ApplicationLayoutDirectionChange);
QCoreApplication::sendEvent(list.at(i), &ev);
}
}
void QGuiApplicationPrivate::notifyActiveWindowChange(QWindow *)

View File

@ -145,6 +145,8 @@ QT_BEGIN_NAMESPACE
\value DialogSnapToDefaultButton (bool) Whether the mouse should snap to the default button when a dialog
becomes visible.
\value ContextMenuOnMouseRelease (bool) Whether the context menu should be shown on mouse release.
\sa themeHint(), QStyle::pixelMetric()
*/
@ -492,6 +494,7 @@ QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint)
case IconPixmapSizes:
return QVariant::fromValue(QList<int>());
case DialogSnapToDefaultButton:
case ContextMenuOnMouseRelease:
return QVariant(false);
case MousePressAndHoldInterval:
return QVariant(800);

View File

@ -107,6 +107,7 @@ public:
IconPixmapSizes,
PasswordMaskCharacter,
DialogSnapToDefaultButton,
ContextMenuOnMouseRelease,
MousePressAndHoldInterval
};

View File

@ -119,37 +119,6 @@ QBezier QBezier::getSubRange(qreal t0, qreal t1) const
return result;
}
static inline int quadraticRoots(qreal a, qreal b, qreal c,
qreal *x1, qreal *x2)
{
if (qFuzzyIsNull(a)) {
if (qFuzzyIsNull(b))
return 0;
*x1 = *x2 = (-c / b);
return 1;
} else {
const qreal det = b * b - 4 * a * c;
if (qFuzzyIsNull(det)) {
*x1 = *x2 = -b / (2 * a);
return 1;
}
if (det > 0) {
if (qFuzzyIsNull(b)) {
*x2 = qSqrt(-c / a);
*x1 = -(*x2);
return 2;
}
const qreal stableA = b / (2 * a);
const qreal stableB = c / (a * stableA * stableA);
const qreal stableC = -1 - qSqrt(1 - stableB);
*x2 = stableA * stableC;
*x1 = (stableA * stableB) / stableC;
return 2;
} else
return 0;
}
}
void QBezier::addToPolygon(QPolygonF *polygon, qreal bezier_flattening_threshold) const
{
QBezier beziers[10];

View File

@ -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
{

View File

@ -1214,6 +1214,8 @@ static const char *certificate_blacklist[] = {
"08:27", "*.EGO.GOV.TR", // Turktrust mis-issued intermediate certificate
"08:64", "e-islem.kktcmerkezbankasi.org", // Turktrust mis-issued intermediate certificate
"03:1d:a7", "AC DG Tr\xC3\xA9sor SSL", // intermediate certificate linking back to ANSSI French National Security Agency
0
};

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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();
}
}

View File

@ -53,6 +53,7 @@
- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
- (void)windowDidBecomeKey:(NSNotification *)notification;
- (void)windowDidResize:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
- (void)windowWillMove:(NSNotification *)notification;

View File

@ -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);

View File

@ -87,6 +87,8 @@ QEglFSIntegration::QEglFSIntegration()
, mScreen(0)
, mInputContext(0)
{
mDisableInputHandlers = qgetenv("QT_QPA_EGLFS_DISABLE_INPUT").toInt();
initResources();
}
@ -176,7 +178,8 @@ void QEglFSIntegration::initialize()
mInputContext = QPlatformInputContextFactory::create();
createInputHandlers();
if (!mDisableInputHandlers)
createInputHandlers();
}
QEglFSScreen *QEglFSIntegration::createScreen() const

View File

@ -97,6 +97,7 @@ private:
QScopedPointer<QPlatformServices> mServices;
QEglFSScreen *mScreen;
QPlatformInputContext *mInputContext;
bool mDisableInputHandlers;
};
QT_END_NAMESPACE

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -87,7 +87,7 @@ public:
WId winId() const { return WId(m_view); };
QIOSWindow *topLevelWindow() const;
QWindow *topLevelWindow() const;
private:
void applyGeometry(const QRect &rect);

View File

@ -108,8 +108,6 @@
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
[self updateTextInputTraits];
if (isQtApplication())
self.hidden = YES;
@ -206,11 +204,12 @@
- (void)displayLayer:(CALayer *)layer
{
QRect geometry = fromCGRect(layer.frame).toRect();
Q_ASSERT(m_qioswindow->geometry() == geometry);
QSize bounds = fromCGRect(layer.bounds).toRect().size();
Q_ASSERT(m_qioswindow->geometry().size() == bounds);
Q_ASSERT(self.hidden == !m_qioswindow->window()->isVisible());
QRegion region = self.hidden ? QRegion() : QRect(QPoint(), geometry.size());
QRegion region = self.hidden ? QRegion() : QRect(QPoint(), bounds);
QWindowSystemInterface::handleExposeEvent(m_qioswindow->window(), region);
QWindowSystemInterface::flushWindowSystemEvents();
}
@ -330,13 +329,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 +340,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 +423,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 +471,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 +636,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow)
}
}
QIOSWindow *QIOSWindow::topLevelWindow() const
QWindow *QIOSWindow::topLevelWindow() const
{
QWindow *window = this->window();
while (window) {
@ -651,7 +650,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const
window = parent;
}
return static_cast<QIOSWindow *>(window->handle());
return window;
}
void QIOSWindow::requestActivateWindow()

View File

@ -586,15 +586,17 @@ static HGLRC createContext(const QOpenGLStaticContext &staticContext,
attributes[attribIndex++] = WGL_CONTEXT_MINOR_VERSION_ARB;
attributes[attribIndex++] = minorVersion;
}
int flags = 0;
if (format.testOption(QSurfaceFormat::DebugContext))
flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
if (requestedVersion >= 0x0300) {
attributes[attribIndex++] = WGL_CONTEXT_FLAGS_ARB;
attributes[attribIndex] = 0;
if (!format.testOption(QSurfaceFormat::DeprecatedFunctions))
attributes[attribIndex] |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
if (format.testOption(QSurfaceFormat::DebugContext))
attributes[attribIndex] |= WGL_CONTEXT_DEBUG_BIT_ARB;
attribIndex++;
flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
}
attributes[attribIndex++] = WGL_CONTEXT_FLAGS_ARB;
attributes[attribIndex++] = flags;
if (requestedVersion >= 0x0302) {
switch (format.profile()) {
case QSurfaceFormat::NoProfile:

View File

@ -383,6 +383,8 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const
}
case DialogSnapToDefaultButton:
return QVariant(booleanSystemParametersInfo(SPI_GETSNAPTODEFBUTTON, false));
case ContextMenuOnMouseRelease:
return QVariant(true);
default:
break;
}

View File

@ -1170,8 +1170,13 @@ void QWindowsWindow::show_sys() const
if (type == Qt::Popup || type == Qt::ToolTip || type == Qt::Tool)
sm = SW_SHOWNOACTIVATE;
if (w->windowState() & Qt::WindowMaximized)
setFlag(WithinMaximize); // QTBUG-8361
ShowWindow(m_data.hwnd, sm);
clearFlag(WithinMaximize);
if (fakedMaximize) {
setStyle(style() & ~WS_MAXIMIZEBOX);
SetWindowPos(m_data.hwnd, 0, 0, 0, 0, 0,
@ -1582,8 +1587,11 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
setFlag(FrameDirty);
if ((oldState == Qt::WindowMaximized) != (newState == Qt::WindowMaximized)) {
if (visible && !(newState == Qt::WindowMinimized))
if (visible && !(newState == Qt::WindowMinimized)) {
setFlag(WithinMaximize);
ShowWindow(m_data.hwnd, (newState == Qt::WindowMaximized) ? SW_MAXIMIZE : SW_SHOWNOACTIVATE);
clearFlag(WithinMaximize);
}
}
if ((oldState == Qt::WindowFullScreen) != (newState == Qt::WindowFullScreen)) {
@ -1903,6 +1911,25 @@ void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const
{
const QWindowsGeometryHint hint(window(), m_data.customMargins);
hint.applyToMinMaxInfo(m_data.hwnd, mmi);
if ((testFlag(WithinMaximize) || (window()->windowState() == Qt::WindowMinimized))
&& (m_data.flags & Qt::FramelessWindowHint)) {
// This block fixes QTBUG-8361: Frameless windows shouldn't cover the
// taskbar when maximized
if (const QScreen *screen = effectiveScreen(window())) {
mmi->ptMaxSize.y = screen->availableGeometry().height();
// Width, because you can have the taskbar on the sides too.
mmi->ptMaxSize.x = screen->availableGeometry().width();
// If you have the taskbar on top, or on the left you don't want it at (0,0):
mmi->ptMaxPosition.x = screen->availableGeometry().x();
mmi->ptMaxPosition.y = screen->availableGeometry().y();
} else {
qWarning() << "Invalid screen";
}
}
if (QWindowsContext::verboseWindows)
qDebug() << __FUNCTION__ << window() << *mmi;
}

View File

@ -136,7 +136,8 @@ public:
TouchRegistered = 0x4000,
AlertState = 0x8000,
Exposed = 0x10000,
WithinCreate = 0x20000
WithinCreate = 0x20000,
WithinMaximize = 0x40000
};
struct WindowData

View File

@ -81,7 +81,7 @@ contains(QT_CONFIG, xcb-sm) {
}
contains(QT_CONFIG, opengl) {
contains(QT_CONFIG, xcb-xlib):contains(QT_CONFIG, glx) {
contains(QT_CONFIG, xcb-xlib):!contains(QT_CONFIG, opengles2) {
DEFINES += XCB_USE_GLX
HEADERS += qglxintegration.h
SOURCES += qglxintegration.cpp

View File

@ -457,9 +457,6 @@ void QPageSetupWidget::selectPrinter()
unitChanged(widget.unit->currentIndex());
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
// setup printer here the first time
setupPrinter();
}
void QPageSetupWidget::selectPdfPsPrinter(const QPrinter *p)

View File

@ -106,7 +106,6 @@ Q_SIGNALS:
private:
#if defined (Q_OS_UNIX) && !defined(Q_OS_MAC)
Q_PRIVATE_SLOT(d_func(), void _q_chbPrintLastFirstToggled(bool))
Q_PRIVATE_SLOT(d_func(), void _q_togglePageSetCombo(bool))
Q_PRIVATE_SLOT(d_func(), void _q_collapseOrExpandDialog())
# if !defined(QT_NO_MESSAGEBOX)

View File

@ -203,7 +203,6 @@ public:
void selectPrinter(const QPrinter::OutputFormat outputFormat);
void _q_chbPrintLastFirstToggled(bool);
void _q_togglePageSetCombo(bool);
#ifndef QT_NO_MESSAGEBOX
void _q_checkFields();
@ -363,9 +362,6 @@ void QPrintDialogPrivate::init()
#endif
QObject::connect(buttons, SIGNAL(rejected()), q, SLOT(reject()));
QObject::connect(options.reverse, SIGNAL(toggled(bool)),
q, SLOT(_q_chbPrintLastFirstToggled(bool)));
QObject::connect(options.printSelection, SIGNAL(toggled(bool)),
q, SLOT(_q_togglePageSetCombo(bool)));
@ -416,6 +412,10 @@ void QPrintDialogPrivate::applyPrinterProperties()
void QPrintDialogPrivate::setupPrinter()
{
// First setup the requested OutputFormat, Printer and Page Size first
top->d->setupPrinter();
// Then setup Print Job options
Q_Q(QPrintDialog);
QPrinter* p = q->printer();
@ -429,6 +429,7 @@ void QPrintDialogPrivate::setupPrinter()
}
p->setColorMode(options.color->isChecked() ? QPrinter::Color : QPrinter::GrayScale);
p->setPageOrder(options.reverse->isChecked() ? QPrinter::LastPageFirst : QPrinter::FirstPageFirst);
// print range
if (options.printAll->isChecked()) {
@ -482,17 +483,6 @@ void QPrintDialogPrivate::setupPrinter()
// copies
p->setCopyCount(options.copies->value());
p->setCollateCopies(options.collate->isChecked());
top->d->setupPrinter();
}
void QPrintDialogPrivate::_q_chbPrintLastFirstToggled(bool checked)
{
Q_Q(QPrintDialog);
if (checked)
q->printer()->setPageOrder(QPrinter::LastPageFirst);
else
q->printer()->setPageOrder(QPrinter::FirstPageFirst);
}
void QPrintDialogPrivate::_q_togglePageSetCombo(bool checked)

View File

@ -1448,6 +1448,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
d->devMode->dmPaperLength = qRound(sizeMM.height() * 10.0);
d->devMode->dmPaperWidth = qRound(sizeMM.width() * 10.0);
}
d->doReinit();
break;
}
@ -1941,8 +1942,9 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h
void QWin32PrintEnginePrivate::updateCustomPaperSize()
{
const uint paperSize = devMode->dmPaperSize;
has_custom_paper_size = true;
has_custom_paper_size = false;
if (paperSize > 0 && mapDevmodePaperSize(paperSize) == QPrinter::Custom) {
has_custom_paper_size = true;
const QList<QPair<QSizeF, int> > paperSizes = printerPaperSizes(name);
for (int i=0; i<paperSizes.size(); i++) {
if ((uint)paperSizes.at(i).second == paperSize) {

View File

@ -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) {

View File

@ -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())

View File

@ -262,6 +262,7 @@ private:
QString cppclassespage;
QString qmltypespage;
QString buildversion;
QString qflagsHref_;
public:
static bool debugging_on;

View File

@ -874,7 +874,7 @@ QGroupBox::title {
subcontrol-position: top center; /* position at the top center */
padding: 0 3px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #FFOECE, stop: 1 #FFFFFF);
stop: 0 #FF0ECE, stop: 1 #FFFFFF);
}
//! [114]

View File

@ -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);

View File

@ -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:

View File

@ -1888,14 +1888,29 @@ bool QApplication::event(QEvent *e)
\obsolete
*/
// ### FIXME: topLevelWindows does not contain QWidgets without a parent
// until create_sys is called. So we have to override the
// QGuiApplication::notifyLayoutDirectionChange
// to do the right thing.
void QApplicationPrivate::notifyLayoutDirectionChange()
{
QWidgetList list = QApplication::topLevelWidgets();
const QWidgetList list = QApplication::topLevelWidgets();
QWindowList windowList = QGuiApplication::topLevelWindows();
// send to all top-level QWidgets
for (int i = 0; i < list.size(); ++i) {
QWidget *w = list.at(i);
windowList.removeAll(w->windowHandle());
QEvent ev(QEvent::ApplicationLayoutDirectionChange);
QCoreApplication::sendEvent(w, &ev);
}
// in case there are any plain QWindows in this QApplication-using
// application, also send the notification to them
for (int i = 0; i < windowList.size(); ++i) {
QEvent ev(QEvent::ApplicationLayoutDirectionChange);
QCoreApplication::sendEvent(windowList.at(i), &ev);
}
}
/*!

View File

@ -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:

View File

@ -148,10 +148,12 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
QBackingStore *store = q->backingStore();
if (!store) {
if (win && q->windowType() != Qt::Desktop)
q->setBackingStore(new QBackingStore(win));
else
if (win && q->windowType() != Qt::Desktop) {
if (q->isTopLevel())
q->setBackingStore(new QBackingStore(win));
} else {
q->setAttribute(Qt::WA_PaintOnScreen, true);
}
}
setWindowModified_helper();

View File

@ -49,6 +49,7 @@
#endif
#include <private/qwidgetbackingstore_p.h>
#include <qpa/qwindowsysteminterface_p.h>
#include <qpa/qplatformtheme.h>
#include <private/qgesturemanager_p.h>
QT_BEGIN_NAMESPACE
@ -354,6 +355,9 @@ void QWidgetWindow::handleNonClientAreaMouseEvent(QMouseEvent *e)
void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
{
static const QEvent::Type contextMenuTrigger =
QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::ContextMenuOnMouseRelease).toBool() ?
QEvent::MouseButtonRelease : QEvent::MouseButtonPress;
if (qApp->d_func()->inPopupMode()) {
QWidget *activePopupWidget = qApp->activePopupWidget();
QWidget *popup = activePopupWidget;
@ -438,7 +442,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
}
qt_replay_popup_mouse_event = false;
#ifndef QT_NO_CONTEXTMENU
} else if (event->type() == QEvent::MouseButtonPress
} else if (event->type() == contextMenuTrigger
&& event->button() == Qt::RightButton
&& (openPopupCount == oldOpenPopupCount)) {
QWidget *popupEvent = popup;
@ -487,7 +491,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
qt_last_mouse_receiver);
#ifndef QT_NO_CONTEXTMENU
if (event->type() == QEvent::MouseButtonPress && event->button() == Qt::RightButton) {
if (event->type() == contextMenuTrigger && event->button() == Qt::RightButton) {
QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers());
QGuiApplication::sendSpontaneousEvent(receiver, &e);
}

View File

@ -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);

View File

@ -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) :

View File

@ -5271,7 +5271,7 @@ QRect QStyleSheetStyle::subControlRect(ComplexControl cc, const QStyleOptionComp
QRenderRule downRule = renderRule(w, opt, PseudoElement_SpinBoxDownButton);
bool ruleMatch = rule.hasBox() || !rule.hasNativeBorder();
bool upRuleMatch = upRule.hasGeometry() || upRule.hasPosition();
bool downRuleMatch = downRule.hasGeometry() || upRule.hasPosition();
bool downRuleMatch = downRule.hasGeometry() || downRule.hasPosition();
if (ruleMatch || upRuleMatch || downRuleMatch) {
switch (sc) {
case SC_SpinBoxFrame:

View File

@ -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++;

View File

@ -1042,7 +1042,7 @@ QVariant QSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
if (max != min && (copy.isEmpty()
|| (min < 0 && copy == QLatin1String("-"))
|| (min >= 0 && copy == QLatin1String("+")))) {
|| (max >= 0 && copy == QLatin1String("+")))) {
state = QValidator::Intermediate;
QSBDEBUG() << __FILE__ << __LINE__<< "num is set to" << num;
} else if (copy.startsWith(QLatin1Char('-')) && min >= 0) {

View File

@ -2158,11 +2158,14 @@ QMenu *QWidgetTextControl::createStandardContextMenu(const QPointF &pos, QWidget
setActionIcon(a, QStringLiteral("edit-redo"));
menu->addSeparator();
#ifndef QT_NO_CLIPBOARD
a = menu->addAction(tr("Cu&t") + ACCEL_KEY(QKeySequence::Cut), this, SLOT(cut()));
a->setEnabled(d->cursor.hasSelection());
setActionIcon(a, QStringLiteral("edit-cut"));
#endif
}
#ifndef QT_NO_CLIPBOARD
if (showTextSelectionActions) {
a = menu->addAction(tr("&Copy") + ACCEL_KEY(QKeySequence::Copy), this, SLOT(copy()));
a->setEnabled(d->cursor.hasSelection());
@ -2175,9 +2178,10 @@ QMenu *QWidgetTextControl::createStandardContextMenu(const QPointF &pos, QWidget
a = menu->addAction(tr("Copy &Link Location"), this, SLOT(_q_copyLink()));
a->setEnabled(!d->linkToCopy.isEmpty());
}
#endif // QT_NO_CLIPBOARD
if (d->interactionFlags & Qt::TextEditable) {
#if !defined(QT_NO_CLIPBOARD)
#ifndef QT_NO_CLIPBOARD
a = menu->addAction(tr("&Paste") + ACCEL_KEY(QKeySequence::Paste), this, SLOT(paste()));
a->setEnabled(canPaste());
setActionIcon(a, QStringLiteral("edit-paste"));

View File

@ -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

View File

@ -3,6 +3,7 @@ SUBDIRS=\
qtconcurrentfilter \
qtconcurrentiteratekernel \
qtconcurrentmap \
qtconcurrentmedian \
qtconcurrentrun \
qtconcurrentthreadengine

View File

@ -0,0 +1,5 @@
CONFIG += testcase parallel_test
TARGET = tst_qtconcurrentmedian
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmedian.cpp
DEFINES += QT_STRICT_ITERATORS

View File

@ -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"

View File

@ -8,7 +8,11 @@ SUBDIRS += testProcessSpacesArgs/nospace.pro \
testProcessSpacesArgs/twospaces.pro \
testSpaceInName
win32:!wince*:SUBDIRS+=testProcessEchoGui
win32:!wince* {
SUBDIRS += \
testProcessEchoGui \
testSetNamedPipeHandleState
}
test.depends += $$SUBDIRS
SUBDIRS += test

View File

@ -0,0 +1,50 @@
/****************************************************************************
**
** 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 <windows.h>
int main()
{
DWORD mode = PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT;
if (SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL))
return 0;
return GetLastError();
}

View File

@ -0,0 +1,4 @@
SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./

View File

@ -93,6 +93,7 @@ private slots:
void echoTest2();
#ifdef Q_OS_WIN
void echoTestGui();
void testSetNamedPipeHandleState();
void batFiles_data();
void batFiles();
#endif
@ -538,7 +539,6 @@ void tst_QProcess::echoTest2()
#endif
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
//Batch files are not supported on Winfows CE
// Reading and writing to a process is not supported on Qt/CE
//-----------------------------------------------------------------------------
void tst_QProcess::echoTestGui()
@ -556,11 +556,22 @@ void tst_QProcess::echoTestGui()
QCOMPARE(process.readAllStandardOutput(), QByteArray("Hello"));
QCOMPARE(process.readAllStandardError(), QByteArray("Hello"));
}
void tst_QProcess::testSetNamedPipeHandleState()
{
QProcess process;
process.setProcessChannelMode(QProcess::SeparateChannels);
process.start("testSetNamedPipeHandleState/testSetNamedPipeHandleState");
QVERIFY2(process.waitForStarted(5000), qPrintable(process.errorString()));
QVERIFY(process.waitForFinished(5000));
QCOMPARE(process.exitCode(), 0);
QCOMPARE(process.exitStatus(), QProcess::NormalExit);
}
#endif // !Q_OS_WINCE && Q_OS_WIN
//-----------------------------------------------------------------------------
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
//Batch files are not supported on Winfows CE
// Batch files are not supported on Windows CE
void tst_QProcess::batFiles_data()
{
QTest::addColumn<QString>("batFile");

View File

@ -75,6 +75,8 @@ private slots:
void usage_connect();
void usage_templateConnect();
void classNameFirstInStringData();
private:
static bool checkForSideEffects
(const QMetaObjectBuilder& builder,
@ -1694,6 +1696,20 @@ void tst_QMetaObjectBuilder::usage_templateConnect()
QVERIFY(!con);
}
void tst_QMetaObjectBuilder::classNameFirstInStringData()
{
QMetaObjectBuilder builder;
builder.addMetaObject(&SomethingOfEverything::staticMetaObject);
builder.setClassName(QByteArrayLiteral("TestClass"));
QMetaObject *mo = builder.toMetaObject();
QByteArrayDataPtr header;
header.ptr = const_cast<QByteArrayData*>(mo->d.stringdata);
QCOMPARE(QByteArray(header), QByteArrayLiteral("TestClass"));
free(mo);
}
QTEST_MAIN(tst_QMetaObjectBuilder)
#include "tst_qmetaobjectbuilder.moc"

View File

@ -69,6 +69,7 @@ private slots:
void testUnknownOptionErrorHandling();
void testDoubleDash_data();
void testDoubleDash();
void testDefaultValue();
void testProcessNotCalled();
void testEmptyArgsList();
void testMissingOptionValue();
@ -322,6 +323,17 @@ void tst_QCommandLineParser::testDoubleDash()
QCOMPARE(parser.unknownOptionNames(), QStringList());
}
void tst_QCommandLineParser::testDefaultValue()
{
QCommandLineOption opt(QStringLiteral("name"), QStringLiteral("desc"),
QStringLiteral("valueName"), QStringLiteral("default"));
QCOMPARE(opt.defaultValues(), QStringList(QStringLiteral("default")));
opt.setDefaultValue(QStringLiteral(""));
QCOMPARE(opt.defaultValues(), QStringList());
opt.setDefaultValue(QStringLiteral("default"));
QCOMPARE(opt.defaultValues(), QStringList(QStringLiteral("default")));
}
void tst_QCommandLineParser::testProcessNotCalled()
{
QCoreApplication app(empty_argc, empty_argv);

View File

@ -56,6 +56,7 @@ private slots:
void createTest();
void nullTest();
void dataStreamTest();
void isTimeZoneIdAvailable();
void availableTimeZoneIds();
void stressTest();
void windowsId();
@ -347,6 +348,36 @@ void tst_QTimeZone::dataStreamTest()
QCOMPARE(tz2.id(), tz1.id());
}
void tst_QTimeZone::isTimeZoneIdAvailable()
{
QList<QByteArray> available = QTimeZone::availableTimeZoneIds();
foreach (const QByteArray &id, available)
QVERIFY(QTimeZone::isTimeZoneIdAvailable(id));
// a-z, A-Z, 0-9, '.', '-', '_' are valid chars
// Can't start with '-'
// Parts separated by '/', each part min 1 and max of 14 chars
QCOMPARE(QTimeZonePrivate::isValidId("az"), true);
QCOMPARE(QTimeZonePrivate::isValidId("AZ"), true);
QCOMPARE(QTimeZonePrivate::isValidId("09"), true);
QCOMPARE(QTimeZonePrivate::isValidId("a/z"), true);
QCOMPARE(QTimeZonePrivate::isValidId("a.z"), true);
QCOMPARE(QTimeZonePrivate::isValidId("a-z"), true);
QCOMPARE(QTimeZonePrivate::isValidId("a_z"), true);
QCOMPARE(QTimeZonePrivate::isValidId(".z"), true);
QCOMPARE(QTimeZonePrivate::isValidId("_z"), true);
QCOMPARE(QTimeZonePrivate::isValidId("12345678901234"), true);
QCOMPARE(QTimeZonePrivate::isValidId("12345678901234/12345678901234"), true);
QCOMPARE(QTimeZonePrivate::isValidId("a z"), false);
QCOMPARE(QTimeZonePrivate::isValidId("a\\z"), false);
QCOMPARE(QTimeZonePrivate::isValidId("a,z"), false);
QCOMPARE(QTimeZonePrivate::isValidId("/z"), false);
QCOMPARE(QTimeZonePrivate::isValidId("-z"), false);
QCOMPARE(QTimeZonePrivate::isValidId("123456789012345"), false);
QCOMPARE(QTimeZonePrivate::isValidId("123456789012345/12345678901234"), false);
QCOMPARE(QTimeZonePrivate::isValidId("12345678901234/123456789012345"), false);
}
void tst_QTimeZone::availableTimeZoneIds()
{
if (debug) {

View File

@ -50,6 +50,7 @@
#include <QImageWriter>
#include <QPainter>
#include <QSet>
#include <QTemporaryDir>
#ifdef Q_OS_UNIX // for geteuid()
# include <sys/types.h>
@ -84,6 +85,7 @@ private slots:
void supportedMimeTypes();
void writeToInvalidDevice();
void testCanWrite();
void supportsOption_data();
void supportsOption();
@ -402,6 +404,28 @@ void tst_QImageWriter::writeToInvalidDevice()
}
}
void tst_QImageWriter::testCanWrite()
{
{
// device is not set
QImageWriter writer;
QVERIFY(!writer.canWrite());
QCOMPARE(writer.error(), QImageWriter::DeviceError);
}
{
// check if canWrite won't leave an empty file
QTemporaryDir dir;
QVERIFY(dir.isValid());
QString fileName(dir.path() + QLatin1String("/001.garble"));
QVERIFY(!QFileInfo(fileName).exists());
QImageWriter writer(fileName);
QVERIFY(!writer.canWrite());
QCOMPARE(writer.error(), QImageWriter::UnsupportedFormatError);
QVERIFY(!QFileInfo(fileName).exists());
}
}
void tst_QImageWriter::supportsOption_data()
{
QTest::addColumn<QString>("fileName");

View File

@ -48,6 +48,7 @@
#include <qudpsocket.h>
#include <qhostaddress.h>
#include <qhostinfo.h>
#include <qtcpsocket.h>
#include <qmap.h>
#include <QNetworkProxy>
#include <QNetworkInterface>
@ -144,12 +145,26 @@ tst_QUdpSocket::~tst_QUdpSocket()
void tst_QUdpSocket::initTestCase_data()
{
// hack: we only enable the Socks5 over UDP tests on the old
// test server, because they fail on the new one. See QTBUG-35490
bool newTestServer = true;
QTcpSocket socket;
socket.connectToHost(QtNetworkSettings::serverName(), 22);
if (socket.waitForConnected(10000)) {
socket.waitForReadyRead(5000);
QByteArray ba = socket.readAll();
if (ba.startsWith("SSH-2.0-OpenSSH_5.8p1"))
newTestServer = false;
socket.disconnectFromHost();
}
QTest::addColumn<bool>("setProxy");
QTest::addColumn<int>("proxyType");
QTest::newRow("WithoutProxy") << false << 0;
#ifndef QT_NO_SOCKS5
QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
if (!newTestServer)
QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
#endif
#ifndef QT_NO_BEARERMANAGEMENT

View File

@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDbDCCAlSgAwIBAgIDAx2nMA0GCSqGSIb3DQEBBQUAMEsxCzAJBgNVBAYTAkZS
MQ4wDAYDVQQKEwVER1RQRTEsMCoGA1UEAxMjQUMgREdUUEUgU2lnbmF0dXJlIEF1
dGhlbnRpZmljYXRpb24wHhcNMTMwNzE4MTAwNTI4WhcNMTQwNzE4MTAwNTI4WjA+
MQswCQYDVQQGEwJGUjETMBEGA1UECgwKREcgVHLDqXNvcjEaMBgGA1UEAwwRQUMg
REcgVHLDqXNvciBTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI
0WFSUyY+MmtFkqFjTefoFyDgh9b1C/2YvSIvT8oCH62JWT5rpeTCZwaXbqWcjaNf
zggqaFsokqfhBif43HNHNtNJmvKE32VcuLB0SpsLR/1VeTd9F99C1JeHVa+nelum
OHEfouX8rRFrxNXNIYTVeiENT8Y2YqRb/XAril9g7i674uFzLiNR/t/N/F8Exujv
9U8m8rmgud/+tG9WDRaDJwoj3ZFCOnL5qLnSUEcS6TzWpozLmC2JVO5GZKGGd7qC
9FjdBkVilkbVIEGSrYvz2Uz2v5IGqMBIQaFL/kSYWxGTaedTOk2drFEApp9AEPTf
v1NwCWBfegsGQrHUROM3AgMBAAGjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQQwHQYD
VR0OBBYEFAAMW8lJqJW0DtAv5p3Mjogxvh9lMB8GA1UdIwQYMBaAFOnbkI/9W5nk
FTvwYlyn5A1Y6IeZMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA
tDfGHkHOLW2d9fiMtwtkEwDauISJLJyCjoRmawzmQbIZXq7HaLliVfE0sdfKUm0i
Q0im1/CpnJLPoTeKyBHvNu1ubLc2m+9dabAYhF3pVdKC+gNaAzBXZ9Gt0p1CLk1l
f8Hg+R10HN2IPCv7V/crz2Ga+c234P3pfwYW8+Nd7alGCuvqot6UYXOlheF7zWUk
Hn6z6tvY+9oMDHKSUAthhA/FB50JgJU89zyTv1egY3ldKwvYBW3W3yNZdTHbPyNs
PJdhqA55mDNsteE5YTp1PyySDb1MSVrbxDEruoH6ZE99Hob4Ih8Amn7MHZatGClE
CgjXWFZ2Gxa7OUCaQpcH8g==
-----END CERTIFICATE-----

View File

@ -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);
}

View File

@ -1289,7 +1289,7 @@ void tst_QAbstractItemView::task200665_itemEntered()
QSignalSpy spy(&view, SIGNAL(entered(QModelIndex)));
view.verticalScrollBar()->setValue(view.verticalScrollBar()->maximum());
QCOMPARE(spy.count(), 1);
QTRY_COMPARE(spy.count(), 1);
}
void tst_QAbstractItemView::task257481_emptyEditor()

View File

@ -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));

View File

@ -4573,7 +4573,6 @@ void tst_QWidget::setGeometry_win()
RECT rt;
::GetWindowRect(winHandleOf(&widget), &rt);
QVERIFY(rt.left <= 0);
QEXPECT_FAIL("", "QTBUG-26424", Continue);
QVERIFY(rt.top <= 0);
}
#endif // defined (Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)

View File

@ -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));

View File

@ -143,6 +143,8 @@ private slots:
void taskQTBUG_5008_textFromValueAndValidate();
void lineEditReturnPressed();
void positiveSign();
void setGroupSeparatorShown_data();
void setGroupSeparatorShown();
@ -1118,6 +1120,21 @@ void tst_QSpinBox::lineEditReturnPressed()
QCOMPARE(spyCurrentChanged.count(), 1);
}
void tst_QSpinBox::positiveSign()
{
QSpinBox spinBox;
spinBox.setRange(-20, 20);
spinBox.setValue(-20);
spinBox.show();
QVERIFY(QTest::qWaitForWindowActive(&spinBox));
QTest::keyClick(&spinBox, Qt::Key_End, Qt::ShiftModifier);
QTest::keyClick(&spinBox, Qt::Key_Plus, Qt::ShiftModifier);
QTest::keyClick(&spinBox, Qt::Key_2);
QTest::keyClick(&spinBox, Qt::Key_0);
QCOMPARE(spinBox.text(), QLatin1String("+20"));
}
void tst_QSpinBox::setGroupSeparatorShown_data()
{
QTest::addColumn<QLocale::Language>("lang");

Some files were not shown because too many files have changed in this diff Show More