Merge remote-tracking branch 'origin/stable' into dev

Change-Id: I99af0bef7f1c931533a324ebcfb27c40ee871a5e
This commit is contained in:
Frederik Gladhorn 2014-01-10 18:27:48 +01:00
commit 7917dfbf1c
50 changed files with 423 additions and 284 deletions

View File

@ -7,7 +7,7 @@ for(ever) {
libvar = LIBS$$pkgsfx
for(PKGCONFIG_LIB, $$list($$unique($$pkgvar))) {
# don't proceed if the .pro asks for a package we don't have!
!packagesExist($$PKGCONFIG_LIB):error("Package $$PKGCONFIG_LIB not found")
!packagesExist($$PKGCONFIG_LIB): error("$$PKGCONFIG_LIB development package not found")
PKGCONFIG_CFLAGS = $$system($$PKG_CONFIG --cflags $$PKGCONFIG_LIB)

View File

@ -42,12 +42,7 @@ equals(TEMPLATE, app):contains(QT, gui(-private)?) {
!isEmpty(QMAKE_PRE_LINK): \
QMAKE_PRE_LINK += ";"
QMAKE_PRE_LINK += \
"for f in $(find $${objects_dir} -name '*.o'); do" \
"(nm $f | grep -q 'T _main' && cp $f $f.original" \
"&& ld -r -alias _main _qt_main -unexported_symbol _main $f.original -o $f)" \
"|| true" \
"; done"
QMAKE_PRE_LINK += $$QMAKESPEC/rename_main.sh $${objects_dir}
}
}

View File

@ -0,0 +1,63 @@
#!/bin/bash
#############################################################################
##
## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
## Contact: http://www.qt-project.org/legal
##
## This file is the build configuration utility 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$
##
#############################################################################
if [ $# -eq 0 ]; then
echo "usage: $0 <path to object files>"
else
for f in $(find $1 -name '*.o'); do
# Skip object files without the _main symbol
nm $f | grep -q 'T _main$' || continue
echo "Found main() in ${f#$1/}"
strings -t d - $f | grep '_main\(\.eh\)\?$' | while read match; do
offset=$(echo $match | cut -d ' ' -f 1)
symbol=$(echo $match | cut -d ' ' -f 2)
echo " Renaming '$symbol' at offset $offset to '${symbol/main/qtmn}'"
# In-place rename the string (keeping the same length)
printf '_qtmn' | dd of=$f bs=1 seek=$offset conv=notrunc >/dev/null 2>&1
done
done
fi

View File

@ -154,8 +154,10 @@ DotNET which_dotnet_version(const QByteArray &preferredVersion = QByteArray())
const QString productPath = installPaths.value(dotNetCombo[i].version);
if (productPath.isEmpty())
continue;
if (path.startsWith(productPath, Qt::CaseInsensitive))
return dotNetCombo[i].version;
if (path.startsWith(productPath, Qt::CaseInsensitive)) {
current_version = dotNetCombo[i].version;
return current_version;
}
}
}

View File

@ -1118,28 +1118,7 @@ bool QMakeEvaluator::prepareProject(const QString &inDir)
}
no_cache:
// Look for mkspecs/ in source and build. First to win determines the root.
QString sdir = inDir;
QString dir = m_outputDir;
while (dir != m_buildRoot) {
if ((dir != sdir && QFileInfo(sdir, QLatin1String("mkspecs")).isDir())
|| QFileInfo(dir, QLatin1String("mkspecs")).isDir()) {
if (dir != sdir)
m_sourceRoot = sdir;
m_buildRoot = dir;
break;
}
if (dir == superdir)
break;
QFileInfo qsdfi(sdir);
QFileInfo qdfi(dir);
if (qsdfi.isRoot() || qdfi.isRoot())
break;
sdir = qsdfi.path();
dir = qdfi.path();
}
dir = m_outputDir;
forever {
QString stashfile = dir + QLatin1String("/.qmake.stash");
if (dir == (!superdir.isEmpty() ? superdir : m_buildRoot) || m_vfs->exists(stashfile)) {

View File

@ -107,6 +107,7 @@
# define zcfree z_zcfree
# define zlibCompileFlags z_zlibCompileFlags
# define zlibVersion z_zlibVersion
# define z_errmsg z_z_errmsg
/* all zlib typedefs in zlib.h and zconf.h */
# define Byte z_Byte

View File

@ -242,49 +242,55 @@ public class QtActivityDelegate
int imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
int inputType = android.text.InputType.TYPE_CLASS_TEXT;
if ((inputHints & ImhMultiLine) != 0) {
inputType = android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE;
imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
if (((inputHints & ImhNoAutoUppercase) != 0 || (inputHints & ImhPreferUppercase) != 0)
&& (inputHints & ImhLowercaseOnly) == 0) {
initialCapsMode = android.text.TextUtils.CAP_MODE_SENTENCES;
}
if ((inputHints & ImhUppercaseOnly) != 0)
initialCapsMode = android.text.TextUtils.CAP_MODE_CHARACTERS;
if ((inputHints & ImhHiddenText) != 0)
inputType = android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
if ((inputHints & ImhPreferNumbers) != 0)
if ((inputHints & (ImhPreferNumbers | ImhDigitsOnly | ImhFormattedNumbersOnly)) != 0) {
inputType = android.text.InputType.TYPE_CLASS_NUMBER;
if ((inputHints & ImhFormattedNumbersOnly) != 0) {
inputType |= (android.text.InputType.TYPE_NUMBER_FLAG_DECIMAL
| android.text.InputType.TYPE_NUMBER_FLAG_SIGNED);
}
if ((inputHints & ImhDigitsOnly) != 0)
inputType = android.text.InputType.TYPE_CLASS_NUMBER;
if ((inputHints & ImhFormattedNumbersOnly) != 0) {
inputType = android.text.InputType.TYPE_CLASS_NUMBER
| android.text.InputType.TYPE_NUMBER_FLAG_DECIMAL
| android.text.InputType.TYPE_NUMBER_FLAG_SIGNED;
}
if ((inputHints & ImhDialableCharactersOnly) != 0)
if (Build.VERSION.SDK_INT > 10 && (inputHints & ImhHiddenText) != 0)
inputType |= 0x10;
} else if ((inputHints & ImhDialableCharactersOnly) != 0) {
inputType = android.text.InputType.TYPE_CLASS_PHONE;
} else if ((inputHints & (ImhDate | ImhTime)) != 0) {
inputType = android.text.InputType.TYPE_CLASS_DATETIME;
if ((inputHints & ImhDate) != 0)
inputType |= android.text.InputType.TYPE_DATETIME_VARIATION_DATE;
if ((inputHints & ImhTime) != 0)
inputType |= android.text.InputType.TYPE_DATETIME_VARIATION_TIME;
} else { // CLASS_TEXT
if ((inputHints & ImhHiddenText) != 0) {
inputType |= android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
} else if ((inputHints & (ImhNoAutoUppercase | ImhNoPredictiveText | ImhSensitiveData)) != 0) {
inputType |= android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
}
if ((inputHints & ImhEmailCharactersOnly) != 0)
inputType = android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
if ((inputHints & ImhEmailCharactersOnly) != 0)
inputType |= android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
if ((inputHints & ImhUrlCharactersOnly) != 0) {
inputType = android.text.InputType.TYPE_TEXT_VARIATION_URI;
imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO;
if ((inputHints & ImhUrlCharactersOnly) != 0) {
inputType |= android.text.InputType.TYPE_TEXT_VARIATION_URI;
imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO;
}
if ((inputHints & ImhMultiLine) != 0)
inputType |= android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE;
if ((inputHints & ImhUppercaseOnly) != 0) {
initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
} else if ((inputHints & ImhLowercaseOnly) == 0 && (inputHints & ImhNoAutoUppercase) == 0) {
initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES;
inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
}
if ((inputHints & ImhNoPredictiveText) != 0 || (inputHints & ImhSensitiveData) != 0)
inputType |= android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
}
if ((inputHints & ImhNoPredictiveText) != 0) {
//android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | android.text.InputType.TYPE_CLASS_TEXT;
inputType = android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
}
if ((inputHints & ImhMultiLine) != 0)
imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION;
m_editText.setInitialCapsMode(initialCapsMode);
m_editText.setImeOptions(imeOptions);

View File

@ -40,7 +40,7 @@
****************************************************************************/
#ifndef CP949CODETBL_P_H
#define CP494CODETBL_P_H
#define CP949CODETBL_P_H
//
// W A R N I N G
@ -645,4 +645,4 @@ static const unsigned short cp949_icode_to_unicode[] = {
0xd7a2, 0xd7a3
};
#endif // CP494CODETBL_P_H
#endif // CP949CODETBL_P_H

View File

@ -716,13 +716,13 @@ typedef void (*QFunctionPointer)();
# define Q_UNIMPLEMENTED() qWarning("%s:%d: %s: Unimplemented code.", __FILE__, __LINE__, Q_FUNC_INFO)
#endif
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
@ -731,7 +731,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
/*!
\internal
*/
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
{
return qAbs(d) <= 0.000000000001;
@ -740,7 +740,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
/*!
\internal
*/
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
{
return qAbs(f) <= 0.00001f;
@ -751,7 +751,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
check whether the actual value is 0 or close to 0, but whether
it is binary 0, disregarding sign.
*/
static inline bool qIsNull(double d) Q_REQUIRED_RESULT;
static inline bool qIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED;
static inline bool qIsNull(double d)
{
union U {
@ -768,7 +768,7 @@ static inline bool qIsNull(double d)
check whether the actual value is 0 or close to 0, but whether
it is binary 0, disregarding sign.
*/
static inline bool qIsNull(float f) Q_REQUIRED_RESULT;
static inline bool qIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED;
static inline bool qIsNull(float f)
{
union U {

View File

@ -210,14 +210,17 @@
#ifdef Q_OS_DARWIN
# include <Availability.h>
# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
# undef __MAC_OS_X_VERSION_MIN_REQUIRED
# define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
# endif
# include <AvailabilityMacros.h>
# if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
# undef MAC_OS_X_VERSION_MIN_REQUIRED
# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
#
# ifdef Q_OS_OSX
# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
# undef __MAC_OS_X_VERSION_MIN_REQUIRED
# define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
# endif
# if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
# undef MAC_OS_X_VERSION_MIN_REQUIRED
# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
# endif
# endif
#
# // Numerical checks are preferred to named checks, but to be safe

View File

@ -214,7 +214,7 @@ Q_DECLARE_TYPEINFO_BODY(QFlags<T>, Q_PRIMITIVE_TYPE);
#define Q_DECLARE_SHARED_STL(TYPE) \
QT_END_NAMESPACE \
namespace std { \
template<> inline void swap<QT_PREPEND_NAMESPACE(TYPE)>(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
template<> inline void swap< QT_PREPEND_NAMESPACE(TYPE) >(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
{ value1.swap(value2); } \
} \
QT_BEGIN_NAMESPACE

View File

@ -256,7 +256,8 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
*/
bool hasMetaData = false;
long pos = 0;
const char pattern[] = "QTMETADATA ";
char pattern[] = "qTMETADATA ";
pattern[0] = 'Q'; // Ensure the pattern "QTMETADATA" is not found in this library should QPluginLoader ever encounter it.
const ulong plen = qstrlen(pattern);
#if defined (Q_OF_ELF) && defined(Q_CC_GNU)
int r = QElfParser().parse(filedata, fdlen, library, lib, &pos, &fdlen);

View File

@ -1075,7 +1075,7 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
sl = accel;
}
}
#else
#endif
int i = 0;
int lastI = 0;
while ((i = sl.indexOf(QLatin1Char('+'), i + 1)) != -1) {
@ -1110,7 +1110,6 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
}
lastI = i + 1;
}
#endif
int p = accel.lastIndexOf(QLatin1Char('+'), str.length() - 2); // -2 so that Ctrl++ works
if(p > 0)

View File

@ -201,10 +201,12 @@ static inline qint64 qCross(const QPodPoint &u, const QPodPoint &v)
return qint64(u.x) * qint64(v.y) - qint64(u.y) * qint64(v.x);
}
#ifdef Q_TRIANGULATOR_DEBUG
static inline qint64 qDot(const QPodPoint &u, const QPodPoint &v)
{
return qint64(u.x) * qint64(v.x) + qint64(u.y) * qint64(v.y);
}
#endif
// Return positive value if 'p' is to the right of the line 'v1'->'v2', negative if left of the
// line and zero if exactly on the line.
@ -249,13 +251,6 @@ static inline QIntersectionPoint qIntersectionPoint(const QPodPoint &point)
return p;
}
static inline QIntersectionPoint qIntersectionPoint(int x, int y)
{
// upperLeft = (x, y), xOffset = 0/1, yOffset = 0/1.
QIntersectionPoint p = {{x, y}, {0, 1}, {0, 1}};
return p;
}
static QIntersectionPoint qIntersectionPoint(const QPodPoint &u1, const QPodPoint &u2, const QPodPoint &v1, const QPodPoint &v2)
{
QIntersectionPoint result = {{0, 0}, {0, 0}, {0, 0}};

View File

@ -71,7 +71,7 @@ static const struct {
{125, 176}, // B6
{88, 125}, // B7
{62, 88}, // B8
{33, 62}, // B9
{44, 62}, // B9
{163, 229}, // C5E
{105, 241}, // US Common
{110, 220}, // DLE
@ -133,7 +133,7 @@ QPagedPaintDevice::~QPagedPaintDevice()
\value B6 125 x 176 mm
\value B7 88 x 125 mm
\value B8 62 x 88 mm
\value B9 33 x 62 mm
\value B9 44 x 62 mm
\value B10 31 x 44 mm
\value C5E 163 x 229 mm
\value Comm10E 105 x 241 mm, U.S. Common 10 Envelope

View File

@ -1486,7 +1486,6 @@ QPdfEnginePrivate::QPdfEnginePrivate()
leftMargin(10), topMargin(10), rightMargin(10), bottomMargin(10) // ~3.5 mm
{
resolution = 1200;
postscript = false;
currentObject = 1;
currentPage = 0;
stroker.stream = 0;
@ -1520,7 +1519,6 @@ bool QPdfEngine::begin(QPaintDevice *pdev)
d->ownsDevice = true;
}
d->postscript = false;
d->currentObject = 1;
d->currentPage = new QPdfPage;
@ -2506,8 +2504,8 @@ void QPdfEnginePrivate::drawTextItem(const QPointF &p, const QTextItemInt &ti)
QFontEngine::FaceId face_id = fe->faceId();
bool noEmbed = false;
if (face_id.filename.isEmpty()
|| (!postscript && ((fe->fsType & 0x200) /* bitmap embedding only */
|| (fe->fsType == 2) /* no embedding allowed */))) {
|| fe->fsType & 0x200 /* bitmap embedding only */
|| fe->fsType == 2 /* no embedding allowed */) {
*currentPage << "Q\n";
q->QPaintEngine::drawTextItem(p, ti);
*currentPage << "q\n";

View File

@ -250,7 +250,6 @@ public:
void newPage();
bool postscript;
int currentObject;
QPdfPage* currentPage;

View File

@ -209,6 +209,8 @@ void QPdfWriter::setMargins(const Margins &m)
{
Q_D(QPdfWriter);
QPagedPaintDevice::setMargins(m);
const qreal multiplier = 72./25.4;
d->engine->d_func()->leftMargin = m.left*multiplier;
d->engine->d_func()->rightMargin = m.right*multiplier;

View File

@ -2975,6 +2975,10 @@ bool QGLContext::areSharing(const QGLContext *context1, const QGLContext *contex
Returns \c true if the paint device of this context is a pixmap;
otherwise returns \c false.
Since Qt 5 the paint device is never actually a pixmap. renderPixmap() is
however still simulated using framebuffer objects and readbacks, and this
function will return \c true in this case.
*/
/*!
@ -3143,7 +3147,7 @@ QGLFormat QGLContext::requestedFormat() const
bool QGLContext::deviceIsPixmap() const
{
Q_D(const QGLContext);
return d->paintDevice->devType() == QInternal::Pixmap;
return !d->readback_target_size.isEmpty();
}
@ -3885,7 +3889,9 @@ void QGLWidget::setFormat(const QGLFormat &format)
void QGLWidget::updateGL()
{
if (updatesEnabled() && testAttribute(Qt::WA_Mapped))
Q_D(QGLWidget);
const bool targetIsOffscreen = !d->glcx->d_ptr->readback_target_size.isEmpty();
if (updatesEnabled() && (testAttribute(Qt::WA_Mapped) || targetIsOffscreen))
glDraw();
}
@ -4041,20 +4047,28 @@ void QGLWidget::paintEvent(QPaintEvent *)
You can use this method on both visible and invisible QGLWidget objects.
This method will create a pixmap and a temporary QGLContext to
render on the pixmap. It will then call initializeGL(),
resizeGL(), and paintGL() on this context. Finally, the widget's
original GL context is restored.
Internally the function renders into a framebuffer object and performs pixel
readback. This has a performance penalty, meaning that this function is not
suitable to be called at a high frequency.
The size of the pixmap will be \a w pixels wide and \a h pixels
high unless one of these parameters is 0 (the default), in which
case the pixmap will have the same size as the widget.
After creating and binding the framebuffer object, the function will call
initializeGL(), resizeGL(), and paintGL(). On the next normal update
initializeGL() and resizeGL() will be triggered again since the size of the
destination pixmap and the QGLWidget's size may differ.
If \a useContext is true, this method will try to be more
efficient by using the existing GL context to render the pixmap.
The default is false. Only use true if you understand the risks.
Note that under Windows a temporary context has to be created
and usage of the \e useContext parameter is not supported.
The size of the pixmap will be \a w pixels wide and \a h pixels high unless
one of these parameters is 0 (the default), in which case the pixmap will
have the same size as the widget.
Care must be taken when using framebuffer objects in paintGL() in
combination with this function. To switch back to the default framebuffer,
use QGLFramebufferObject::bindDefault(). Binding FBO 0 is wrong since
renderPixmap() uses a custom framebuffer instead of the one provided by the
windowing system.
\a useContext is ignored. Historically this parameter enabled the usage of
the existing GL context. This is not supported anymore since additional
contexts are never created.
Overlays are not rendered onto the pixmap.
@ -4069,43 +4083,31 @@ void QGLWidget::paintEvent(QPaintEvent *)
QPixmap QGLWidget::renderPixmap(int w, int h, bool useContext)
{
Q_UNUSED(useContext);
Q_D(QGLWidget);
QSize sz = size();
if ((w > 0) && (h > 0))
sz = QSize(w, h);
QPixmap pm(sz);
d->glcx->doneCurrent();
bool success = true;
if (useContext && isValid() && d->renderCxPm(&pm))
return pm;
QGLFormat fmt = d->glcx->requestedFormat();
fmt.setDirectRendering(false); // Direct is unlikely to work
fmt.setDoubleBuffer(false); // We don't need dbl buf
QGLContext* ocx = d->glcx;
ocx->doneCurrent();
d->glcx = new QGLContext(fmt, &pm);
d->glcx->create();
if (d->glcx->isValid())
QPixmap pm;
if (d->glcx->isValid()) {
d->glcx->makeCurrent();
QGLFramebufferObject fbo(sz, QGLFramebufferObject::CombinedDepthStencil);
fbo.bind();
d->glcx->setInitialized(false);
uint prevDefaultFbo = d->glcx->d_ptr->default_fbo;
d->glcx->d_ptr->default_fbo = fbo.handle();
d->glcx->d_ptr->readback_target_size = sz;
updateGL();
else
success = false;
delete d->glcx;
d->glcx = ocx;
ocx->makeCurrent();
if (success) {
return pm;
fbo.release();
pm = QPixmap::fromImage(fbo.toImage());
d->glcx->d_ptr->default_fbo = prevDefaultFbo;
d->glcx->setInitialized(false);
d->glcx->d_ptr->readback_target_size = QSize();
}
return QPixmap();
return pm;
}
/*!
@ -4164,14 +4166,23 @@ void QGLWidget::glDraw()
if (d->glcx->deviceIsPixmap())
glDrawBuffer(GL_FRONT);
#endif
QSize readback_target_size = d->glcx->d_ptr->readback_target_size;
if (!d->glcx->initialized()) {
glInit();
const qreal scaleFactor = (window() && window()->windowHandle()) ?
window()->windowHandle()->devicePixelRatio() : 1.0;
resizeGL(d->glcx->device()->width() * scaleFactor, d->glcx->device()->height() * scaleFactor); // New context needs this "resize"
int w, h;
if (readback_target_size.isEmpty()) {
w = d->glcx->device()->width() * scaleFactor;
h = d->glcx->device()->height() * scaleFactor;
} else {
w = readback_target_size.width();
h = readback_target_size.height();
}
resizeGL(w, h); // New context needs this "resize"
}
paintGL();
if (doubleBuffer()) {
if (doubleBuffer() && readback_target_size.isEmpty()) {
if (d->autoSwap)
swapBuffers();
} else {

View File

@ -270,6 +270,7 @@ public:
uint workaround_brokenAlphaTexSubImage_init : 1;
QPaintDevice *paintDevice;
QSize readback_target_size;
QColor transpColor;
QGLContext *q_ptr;
QGLFormat::OpenGLVersionFlags version_flags;

View File

@ -138,6 +138,9 @@ bool QGLContext::chooseContext(const QGLContext* shareContext)
{
Q_D(QGLContext);
if(!d->paintDevice || d->paintDevice->devType() != QInternal::Widget) {
// Unlike in Qt 4, the only possible target is a widget backed by an OpenGL-based
// QWindow. Pixmaps in particular are not supported anymore as paint devices since
// starting from Qt 5 QPixmap is raster-backed on almost all platforms.
d->valid = false;
}else {
QWidget *widget = static_cast<QWidget *>(d->paintDevice);

View File

@ -130,8 +130,10 @@ QStringList QDeviceDiscovery::scanConnectedDevices()
udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
if (m_types & Device_Touchscreen)
udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHSCREEN", "1");
if (m_types & Device_Keyboard)
if (m_types & Device_Keyboard) {
udev_enumerate_add_match_property(ue, "ID_INPUT_KEYBOARD", "1");
udev_enumerate_add_match_property(ue, "ID_INPUT_KEY", "1");
}
if (m_types & Device_Tablet)
udev_enumerate_add_match_property(ue, "ID_INPUT_TABLET", "1");
@ -242,6 +244,9 @@ bool QDeviceDiscovery::checkDeviceType(udev_device *dev)
}
}
if ((m_types & Device_Keyboard) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_KEY"), "1") == 0 ))
return true;
if ((m_types & Device_Mouse) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_MOUSE"), "1") == 0))
return true;

View File

@ -71,22 +71,22 @@ static inline void bindApi(const QSurfaceFormat &format)
QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display,
EGLenum eglApi)
: m_eglDisplay(display)
, m_eglApi(eglApi)
, m_eglConfig(q_configFromGLFormat(display, format))
, m_swapInterval(-1)
, m_swapIntervalEnvChecked(false)
, m_swapIntervalFromEnv(-1)
{
init(format, share);
Q_UNUSED(eglApi);
}
QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display,
EGLConfig config, EGLenum eglApi)
: m_eglDisplay(display)
, m_eglApi(eglApi)
, m_eglConfig(config)
{
init(format, share);
Q_UNUSED(eglApi);
}
void QEGLPlatformContext::init(const QSurfaceFormat &format, QPlatformOpenGLContext *share)

View File

@ -77,7 +77,6 @@ private:
EGLContext m_eglContext;
EGLContext m_shareContext;
EGLDisplay m_eglDisplay;
EGLenum m_eglApi;
EGLConfig m_eglConfig;
QSurfaceFormat m_format;
int m_swapInterval;

View File

@ -103,7 +103,8 @@ void QBasicFontDatabase::populateFontDatabase()
QDir dir(fontpath);
dir.setNameFilters(QStringList() << QLatin1String("*.ttf")
<< QLatin1String("*.ttc") << QLatin1String("*.pfa")
<< QLatin1String("*.pfb"));
<< QLatin1String("*.pfb")
<< QLatin1String("*.otf"));
dir.refresh();
for (int i = 0; i < int(dir.count()); ++i) {
const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i]));

View File

@ -48,13 +48,14 @@
#include <QThread>
#include <qpa/qwindowsysteminterface.h>
#if !defined(QT_NO_MTDEV)
struct mtdev;
#endif
QT_BEGIN_NAMESPACE
class QSocketNotifier;
class QEvdevTouchScreenData;
#if !defined(QT_NO_MTDEV)
struct mtdev;
#endif
class QEvdevTouchScreenHandler : public QObject
{

View File

@ -228,8 +228,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale)
{
QFile aliases(systemComposeDir() + QLatin1String("/locale.alias"));
QByteArray fullLocaleName;
if (aliases.exists()) {
aliases.open(QIODevice::ReadOnly);
if (aliases.open(QIODevice::ReadOnly)) {
while (!aliases.atEnd()) {
char l[1024];
int read = aliases.readLine(l, sizeof(l));
@ -268,8 +267,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale)
bool TableGenerator::processFile(QString composeFileName)
{
QFile composeFile(composeFileName);
if (composeFile.exists()) {
composeFile.open(QIODevice::ReadOnly);
if (composeFile.open(QIODevice::ReadOnly)) {
parseComposeFile(&composeFile);
return true;
}

View File

@ -246,7 +246,7 @@ enum SetJumpResult
// user our main wrapper. Since the symbol is weak, it will not
// get used or cause a clash in the normal Qt application usecase,
// where we rename main to qt_main.
extern "C" int __attribute__((weak)) qt_main(int argc, char *argv[])
extern "C" int __attribute__((weak)) qtmn(int argc, char *argv[])
{
Q_UNUSED(argc);
Q_UNUSED(argv);
@ -265,7 +265,7 @@ static void __attribute__((noinline, noreturn)) user_main_trampoline()
strcpy(argv[i], [arg cStringUsingEncoding:[NSString defaultCStringEncoding]]);
}
int exitCode = qt_main(argc, argv);
int exitCode = qtmn(argc, argv);
delete[] argv;
qEventDispatcherDebug() << "Returned from main with exit code " << exitCode;

View File

@ -1633,8 +1633,8 @@ void QWindowsFileDialogHelper::selectFile(const QUrl &fileName)
if (QWindowsContext::verboseDialogs)
qDebug("%s %s" , __FUNCTION__, qPrintable(fileName.toString()));
if (QWindowsNativeFileDialogBase *nfd = nativeFileDialog())
nfd->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists
if (hasNativeDialog()) // Might be invoked from the QFileDialog constructor.
nativeFileDialog()->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists
}
QList<QUrl> QWindowsFileDialogHelper::selectedFiles() const

View File

@ -280,8 +280,12 @@ void QXcbWindow::create()
if (parent()) {
xcb_parent_id = static_cast<QXcbWindow *>(parent())->xcb_window();
m_embedded = parent()->window()->type() == Qt::ForeignWindow;
}
QSurfaceFormat parentFormat = parent()->window()->requestedFormat();
if (window()->surfaceType() != QSurface::OpenGLSurface && parentFormat.hasAlpha()) {
window()->setFormat(parentFormat);
}
}
m_format = window()->requestedFormat();
#if (defined(XCB_USE_GLX) || defined(XCB_USE_EGL)) && defined(XCB_USE_XLIB)

View File

@ -419,12 +419,11 @@ void QGtk2FileDialogHelper::applyOptions()
if (!nameFilters.isEmpty())
setNameFilters(nameFilters);
const QString initialDirectory = opts->initialDirectory().toLocalFile();
if (!initialDirectory.isEmpty())
setDirectory(initialDirectory);
if (opts->initialDirectory().isLocalFile())
setDirectory(opts->initialDirectory());
foreach (const QUrl &filename, opts->initiallySelectedFiles())
selectFile(filename.toLocalFile());
selectFile(filename);
const QString initialNameFilter = opts->initiallySelectedNameFilter();
if (!initialNameFilter.isEmpty())

View File

@ -472,58 +472,68 @@ void QPageSetupWidget::selectPdfPsPrinter(const QPrinter *p)
// Updates size/preview after the combobox has been changed.
void QPageSetupWidget::_q_paperSizeChanged()
{
QVariant val = widget.paperSize->itemData(widget.paperSize->currentIndex());
int index = m_printer->pageSize();
if (val.type() == QVariant::Int) {
index = val.toInt();
}
if (m_blockSignals) return;
m_blockSignals = true;
QPrinter::PaperSize size = QPrinter::PaperSize(index);
QPrinter::Orientation orientation = widget.portrait->isChecked()
? QPrinter::Portrait
: QPrinter::Landscape;
bool custom = false;
QVariant val = widget.paperSize->itemData(widget.paperSize->currentIndex());
QPrinter::Orientation orientation = widget.portrait->isChecked() ? QPrinter::Portrait : QPrinter::Landscape;
bool custom = size == QPrinter::Custom;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
custom = custom && m_cups && (m_printer->paperName() == QLatin1String("Custom"));
if (m_cups) {
// OutputFormat == NativeFormat, data is QString Cups paper name
QByteArray cupsPageSize = val.toByteArray();
custom = (cupsPageSize == QByteArrayLiteral("Custom"));
#ifndef QT_NO_CUPS
if (!custom) {
QCUPSSupport cups;
cups.setCurrentPrinter(m_printer->printerName());
m_paperSize = sizeForOrientation(orientation, cups.paperRect(cupsPageSize).size());
}
#endif
} else {
// OutputFormat == PdfFormat, data is QPrinter::PageSize
QPrinter::PaperSize size = QPrinter::PaperSize(val.toInt());
custom = size == QPrinter::Custom;
if (!custom)
m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1);
}
if (custom) {
// Convert input custom size Units to Points
m_paperSize = QSizeF(widget.paperWidth->value() * m_currentMultiplier,
widget.paperHeight->value() * m_currentMultiplier);
} else {
// Display standard size Points as Units
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
widget.paperHeight->setValue(m_paperSize.height() / m_currentMultiplier);
}
m_pagePreview->setPaperSize(m_paperSize);
widget.paperWidth->setEnabled(custom);
widget.paperHeight->setEnabled(custom);
widget.widthLabel->setEnabled(custom);
widget.heightLabel->setEnabled(custom);
if (custom) {
m_paperSize.setWidth( widget.paperWidth->value() * m_currentMultiplier);
m_paperSize.setHeight( widget.paperHeight->value() * m_currentMultiplier);
m_pagePreview->setPaperSize(m_paperSize);
} else {
Q_ASSERT(m_printer);
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (m_cups && QCUPSSupport::isAvailable()) { // combobox is filled with cups based data
QCUPSSupport cups;
QByteArray cupsPageSize = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray();
m_paperSize = cups.paperRect(cupsPageSize).size();
if (orientation == QPrinter::Landscape)
m_paperSize = QSizeF(m_paperSize.height(), m_paperSize.width()); // swap
}
else
#endif
m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1);
m_pagePreview->setPaperSize(m_paperSize);
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
widget.paperHeight->setValue(m_paperSize.height() / m_currentMultiplier);
}
m_blockSignals = false;
}
void QPageSetupWidget::_q_pageOrientationChanged()
{
if (QPrinter::PaperSize(widget.paperSize->currentIndex()) == QPrinter::Custom) {
bool custom = false;
QVariant val = widget.paperSize->itemData(widget.paperSize->currentIndex());
if (m_cups) {
// OutputFormat == NativeFormat, data is QString Cups paper name
QByteArray cupsPageSize = val.toByteArray();
custom = (cupsPageSize == QByteArrayLiteral("Custom"));
} else {
// OutputFormat == PdfFormat, data is QPrinter::PageSize
QPrinter::PaperSize size = QPrinter::PaperSize(val.toInt());
custom = size == QPrinter::Custom;
}
if (custom) {
double tmp = widget.paperWidth->value();
widget.paperWidth->setValue(widget.paperHeight->value());
widget.paperHeight->setValue(tmp);

View File

@ -94,7 +94,7 @@ private:
qreal m_topMargin;
qreal m_rightMargin;
qreal m_bottomMargin;
QSizeF m_paperSize;
QSizeF m_paperSize; // In QPrinter::Point
qreal m_currentMultiplier;
bool m_blockSignals;
bool m_cups;

View File

@ -929,7 +929,7 @@ void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked()
if (!propertiesDialog)
setupPrinterProperties();
propertiesDialog->exec();
if (propertiesDialog->result() == QDialog::Rejected) {
if (!propertiesDialogShown && propertiesDialog->result() == QDialog::Rejected) {
// If properties dialog was rejected the dialog is deleted and
// the properties are set to defaults when printer is setup
delete propertiesDialog;

View File

@ -92,7 +92,7 @@ static const float qt_paperSizes[][2] = {
{125, 176}, // B6
{88, 125}, // B7
{62, 88}, // B8
{33, 62}, // B9
{44, 62}, // B9
{163, 229}, // C5E
{105, 241}, // US Common
{110, 220}, // DLE
@ -448,7 +448,7 @@ void QPrinterPrivate::setProperty(QPrintEngine::PrintEnginePropertyKey key, cons
\value B6 125 x 176 mm
\value B7 88 x 125 mm
\value B8 62 x 88 mm
\value B9 33 x 62 mm
\value B9 44 x 62 mm
\value B10 31 x 44 mm
\value C5E 163 x 229 mm
\value Comm10E 105 x 241 mm, U.S. Common 10 Envelope

View File

@ -515,16 +515,18 @@ void QBenchmarkPerfEventsMeasurer::start()
{
initPerf();
// pid == 0 -> attach to the current process
// cpu == -1 -> monitor on all CPUs
// group_fd == -1 -> this is the group leader
// flags == 0 -> reserved, must be zero
fd = perf_event_open(&attr, 0, -1, -1, 0);
if (fd == -1) {
perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open");
exit(1);
} else {
::fcntl(fd, F_SETFD, FD_CLOEXEC);
// pid == 0 -> attach to the current process
// cpu == -1 -> monitor on all CPUs
// group_fd == -1 -> this is the group leader
// flags == 0 -> reserved, must be zero
fd = perf_event_open(&attr, 0, -1, -1, 0);
if (fd == -1) {
perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open");
exit(1);
} else {
::fcntl(fd, F_SETFD, FD_CLOEXEC);
}
}
// enable the counter

View File

@ -58,6 +58,8 @@
QT_BEGIN_NAMESPACE
Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, const QMessageLogContext &context, const QString& msg);
static void saveCoverageTool(const char * appname, bool testfailed, bool installedTestCoverage)
{
#ifdef __COVERAGESCANNER__
@ -267,7 +269,7 @@ namespace QTest {
return false;
}
static void messageHandler(QtMsgType type, const QMessageLogContext & /*context*/, const QString &message)
static void messageHandler(QtMsgType type, const QMessageLogContext & context, const QString &message)
{
static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(QTest::maxWarnings);
@ -282,6 +284,9 @@ namespace QTest {
// the message is expected, so just swallow it.
return;
msg = qMessageFormatString(type, context, message).toLocal8Bit();
msg.chop(1); // remove trailing newline
if (type != QtFatalMsg) {
if (counter.load() <= 0)
return;

View File

@ -1,3 +1,8 @@
!force_bootstrap {
load(qfeatures)
requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
}
option(host_build)
QT = core xml

View File

@ -1004,7 +1004,11 @@ void QFileDialog::setDirectory(const QString &directory)
QDir QFileDialog::directory() const
{
Q_D(const QFileDialog);
return QDir(d->nativeDialogInUse ? d->directory_sys().toLocalFile() : d->rootPath());
if (d->nativeDialogInUse) {
QString dir = d->directory_sys().toLocalFile();
return QDir(dir.isEmpty() ? d->options->initialDirectory().toLocalFile() : dir);
}
return d->rootPath();
}
/*!

View File

@ -279,13 +279,12 @@ static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidge
// (and reaches this point), then the menu item itself has been disabled.
// This occurs at the QPA level on Mac, were we disable all the Cocoa menus
// when showing a modal window.
Q_UNUSED(menu);
continue;
#else
if (a->shortcut().count() <= 1)
continue;
#endif
QAction *a = menu->menuAction();
if (correctActionContext(context, a, active_window))
return true;
#endif
} else
#endif
if (correctWidgetContext(context, w, active_window))

View File

@ -118,11 +118,12 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
win->resize(q->size());
win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0));
if (q->testAttribute(Qt::WA_TranslucentBackground)) {
QSurfaceFormat format;
QSurfaceFormat format = win->requestedFormat();
if ((flags & Qt::Window) && win->surfaceType() != QSurface::OpenGLSurface
&& q->testAttribute(Qt::WA_TranslucentBackground)) {
format.setAlphaBufferSize(8);
win->setFormat(format);
}
win->setFormat(format);
if (QWidget *nativeParent = q->nativeParentWidget()) {
if (nativeParent->windowHandle()) {

View File

@ -66,15 +66,6 @@ QT_BEGIN_NAMESPACE
extern QRegion qt_dirtyRegion(QWidget *);
/*
A version of QRect::intersects() that does not normalize the rects.
*/
static inline bool qRectIntersects(const QRect &r1, const QRect &r2)
{
return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right())
&& qMax(r1.top(), r2.top()) <= qMin(r1.bottom(), r2.bottom()));
}
/**
* Flushes the contents of the \a backingStore into the screen area of \a widget.
* \a tlwOffset is the position of the top level widget relative to the window surface.

View File

@ -86,7 +86,7 @@ void QRubberBand::initStyleOption(QStyleOptionRubberBand *option) const
return;
option->initFrom(this);
option->shape = d_func()->shape;
#ifndef Q_WS_MAC
#ifndef Q_OS_MAC
option->opaque = true;
#else
option->opaque = windowFlags() & RUBBERBAND_WINDOW_TYPE;

View File

@ -44,6 +44,7 @@
#include "qbuffer.h"
#include "qregexp.h"
#include "qmap.h"
#include "qhash.h"
#include "qstack.h"
#include <qdebug.h>
@ -424,6 +425,10 @@ private:
int stringValueLen;
QString emptyStr;
QHash<QString, int> literalEntitySizes;
// The entity at (QMap<QString,) referenced the entities at (QMap<QString,) (int>) times.
QHash<QString, QHash<QString, int> > referencesToOtherEntities;
QHash<QString, int> expandedSizes;
// The limit to the amount of times the DTD parsing functions can be called
// for the DTD currently being parsed.
static const int dtdRecursionLimit = 2;
@ -3444,6 +3449,10 @@ bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental)
{
Q_D(QXmlSimpleReader);
d->literalEntitySizes.clear();
d->referencesToOtherEntities.clear();
d->expandedSizes.clear();
if (incremental) {
d->initIncrementalParsing();
} else {
@ -6659,43 +6668,63 @@ bool QXmlSimpleReaderPrivate::parseChoiceSeq()
bool QXmlSimpleReaderPrivate::isExpandedEntityValueTooLarge(QString *errorMessage)
{
QMap<QString, int> literalEntitySizes;
// The entity at (QMap<QString,) referenced the entities at (QMap<QString,) (int>) times.
QMap<QString, QMap<QString, int> > referencesToOtherEntities;
QMap<QString, int> expandedSizes;
QString entityNameBuffer;
// For every entity, check how many times all entity names were referenced in its value.
foreach (QString toSearch, entities.keys()) {
// The amount of characters that weren't entity names, but literals, like 'X'.
QString leftOvers = entities.value(toSearch);
// How many times was entityName referenced by toSearch?
foreach (QString entityName, entities.keys()) {
for (int i = 0; i < leftOvers.size() && i != -1; ) {
i = leftOvers.indexOf(QString::fromLatin1("&%1;").arg(entityName), i);
if (i != -1) {
leftOvers.remove(i, entityName.size() + 2);
// The entityName we're currently trying to find was matched in this string; increase our count.
++referencesToOtherEntities[toSearch][entityName];
for (QMap<QString,QString>::const_iterator toSearchIt = entities.constBegin();
toSearchIt != entities.constEnd();
++toSearchIt) {
const QString &toSearch = toSearchIt.key();
// Don't check the same entities twice.
if (!literalEntitySizes.contains(toSearch)) {
// The amount of characters that weren't entity names, but literals, like 'X'.
QString leftOvers = entities.value(toSearch);
// How many times was entityName referenced by toSearch?
for (QMap<QString,QString>::const_iterator referencedIt = entities.constBegin();
referencedIt != entities.constEnd();
++referencedIt) {
const QString &entityName = referencedIt.key();
for (int i = 0; i < leftOvers.size() && i != -1; ) {
entityNameBuffer = QLatin1Char('&') + entityName + QLatin1Char(';');
i = leftOvers.indexOf(entityNameBuffer, i);
if (i != -1) {
leftOvers.remove(i, entityName.size() + 2);
// The entityName we're currently trying to find was matched in this string; increase our count.
++referencesToOtherEntities[toSearch][entityName];
}
}
}
literalEntitySizes[toSearch] = leftOvers.size();
}
literalEntitySizes[toSearch] = leftOvers.size();
}
foreach (QString entity, referencesToOtherEntities.keys()) {
expandedSizes[entity] = literalEntitySizes[entity];
foreach (QString referenceTo, referencesToOtherEntities.value(entity).keys()) {
const int references = referencesToOtherEntities.value(entity).value(referenceTo);
// The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size.
expandedSizes[entity] += expandedSizes[referenceTo] * references + literalEntitySizes[referenceTo] * references;
}
for (QHash<QString, QHash<QString, int> >::const_iterator entityIt = referencesToOtherEntities.constBegin();
entityIt != referencesToOtherEntities.constEnd();
++entityIt) {
const QString &entity = entityIt.key();
if (expandedSizes[entity] > entityCharacterLimit) {
if (errorMessage) {
*errorMessage = QString::fromLatin1("The XML entity \"%1\" expands too a string that is too large to process (%2 characters > %3).");
*errorMessage = (*errorMessage).arg(entity).arg(expandedSizes[entity]).arg(entityCharacterLimit);
QHash<QString, int>::iterator expandedIt = expandedSizes.find(entity);
if (expandedIt == expandedSizes.end()) {
expandedIt = expandedSizes.insert(entity, literalEntitySizes.value(entity));
for (QHash<QString, int>::const_iterator referenceIt = entityIt->constBegin();
referenceIt != entityIt->constEnd();
++referenceIt) {
const QString &referenceTo = referenceIt.key();
const int references = referencesToOtherEntities.value(entity).value(referenceTo);
// The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size.
*expandedIt += expandedSizes.value(referenceTo) * references + literalEntitySizes.value(referenceTo) * references;
}
if (*expandedIt > entityCharacterLimit) {
if (errorMessage) {
*errorMessage = QString::fromLatin1("The XML entity \"%1\" expands to a string that is too large to process (%2 characters > %3).")
.arg(entity, *expandedIt, entityCharacterLimit);
}
return true;
}
return true;
}
}
return false;

View File

@ -259,14 +259,14 @@ void tst_QPauseAnimation::pauseResume()
animation.pause();
QVERIFY(animation.state() == QAbstractAnimation::Paused);
animation.start();
QTest::qWait(300);
QVERIFY(animation.state() == QAbstractAnimation::Stopped);
QTRY_COMPARE(animation.state(), QAbstractAnimation::Stopped);
#ifdef Q_OS_WIN
if (animation.m_updateCurrentTimeCount != 3)
QEXPECT_FAIL("", winTimerError, Abort);
#endif
QCOMPARE(animation.m_updateCurrentTimeCount, 3);
QVERIFY2(animation.m_updateCurrentTimeCount >= 3, qPrintable(
QString::fromLatin1("animation.m_updateCurrentTimeCount = %1").arg(animation.m_updateCurrentTimeCount)));
}
void tst_QPauseAnimation::sequentialPauseGroup()

View File

@ -64,6 +64,7 @@ public:
static QString str( int y, int month, int d, int h, int min, int s );
static QDateTime dt( const QString& str );
public slots:
void initTestCase();
void init();
private slots:
void ctor();
@ -153,6 +154,7 @@ private slots:
void invalid() const;
private:
enum { LocalTimeIsUtc = 0, LocalTimeAheadOfUtc = 1, LocalTimeBehindUtc = -1} localTimeType;
bool europeanTimeZone;
QDate defDate() const { return QDate(1900, 1, 1); }
QTime defTime() const { return QTime(0, 0, 0); }
@ -172,6 +174,42 @@ tst_QDateTime::tst_QDateTime()
uint x1 = QDateTime(QDate(1990, 1, 1), QTime()).toTime_t();
uint x2 = QDateTime(QDate(1990, 6, 1), QTime()).toTime_t();
europeanTimeZone = (x1 == 631148400 && x2 == 644191200);
QDateTime dt1 = QDateTime::fromTime_t(0);
QDateTime dt2 = QDateTime::fromTime_t(181 * 86400); // six months later, Jul 1
if (dt1.date().year() < 1970 || dt2.date().month() < 7) {
localTimeType = LocalTimeBehindUtc;
} else if (dt1.time().hour() > 0 || dt1.date().day() > 1) {
localTimeType = LocalTimeAheadOfUtc;
} else if (dt2.time().hour() > 0 || dt2.date().day() > 1) {
localTimeType = LocalTimeAheadOfUtc;
} else {
localTimeType = LocalTimeIsUtc;
}
}
void tst_QDateTime::initTestCase()
{
// Never construct a message like this in an i18n context...
const char *typemsg1, *typemsg2 = "and therefore not";
switch (localTimeType) {
case LocalTimeIsUtc:
typemsg1 = "exactly";
break;
case LocalTimeBehindUtc:
typemsg1 = "behind";
break;
case LocalTimeAheadOfUtc:
typemsg1 = "ahead of";
typemsg2 = europeanTimeZone ? "and is" : "but isn't";
break;
}
qDebug() << "Current local time detected to be"
<< typemsg1
<< "UTC"
<< typemsg2
<< "the Central European timezone";
}
void tst_QDateTime::init()
@ -613,8 +651,10 @@ void tst_QDateTime::fromMSecsSinceEpoch()
QDateTime dtUtc = QDateTime::fromMSecsSinceEpoch(msecs, Qt::UTC);
QDateTime dtOffset = QDateTime::fromMSecsSinceEpoch(msecs, Qt::OffsetFromUTC, 60*60);
// LocalTime will overflow for max
if (msecs != std::numeric_limits<qint64>::max())
// LocalTime will overflow for min or max, depending on whether you're
// East or West of Greenwich. The test passes at GMT.
if (localTimeType == LocalTimeIsUtc
|| msecs != std::numeric_limits<qint64>::max() * localTimeType)
QCOMPARE(dtLocal, utc);
QCOMPARE(dtUtc, utc);

View File

@ -606,11 +606,6 @@ void tst_QKeySequence::parseString()
QFETCH( QString, strSequence );
QFETCH( QKeySequence, keycode );
#ifdef Q_OS_MAC
QEXPECT_FAIL("Win+A", "QTBUG-24406 - This test fails on OSX", Abort);
QEXPECT_FAIL("Simon+G", "QTBUG-24406 - This test fails on OSX", Abort);
#endif
QCOMPARE( QKeySequence(strSequence).toString(), keycode.toString() );
QVERIFY( QKeySequence(strSequence) == keycode );
}

View File

@ -1380,12 +1380,13 @@ void tst_QGL::glWidgetRenderPixmap()
{
RenderPixmapWidget *w = new RenderPixmapWidget;
QPixmap pm = w->renderPixmap(100, 100, false);
QSize pmSize = QSize(100, 100);
QPixmap pm = w->renderPixmap(pmSize.width(), pmSize.height(), false);
delete w;
QImage fb = pm.toImage().convertToFormat(QImage::Format_RGB32);
QImage reference(fb.size(), QImage::Format_RGB32);
QImage reference(pmSize, QImage::Format_RGB32);
reference.fill(0xffff0000);
QFUZZY_COMPARE_IMAGES(fb, reference);
@ -2011,6 +2012,7 @@ void tst_QGL::textureCleanup()
QGLWidget w;
w.resize(200,200);
w.show();
QTest::qWaitForWindowExposed(&w);
w.makeCurrent();
// Test pixmaps which have been loaded via QPixmapCache are removed from the texture cache

View File

@ -1019,10 +1019,6 @@ private:
void tst_QMenu::QTBUG_10735_crashWithDialog()
{
#ifdef Q_OS_MAC
QSKIP("Test currently hangs on Mac OS X, see QTBUG-23677");
#endif
MyMenu menu;
QTimer::singleShot(1000, &menu, SLOT(activateLastAction()));

View File

@ -566,7 +566,7 @@ void tst_QPushButton::sizeHint_data()
QTest::newRow("gtk") << QString::fromLatin1("gtk");
#endif
#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC)
QTest::newRow("mac") << QString::fromLatin1("mac");
QTest::newRow("macintosh") << QString::fromLatin1("macintosh");
#endif
#if !defined(QT_NO_STYLE_FUSION)
QTest::newRow("fusion") << QString::fromLatin1("fusion");
@ -589,11 +589,6 @@ void tst_QPushButton::sizeHint()
{
QFETCH(QString, stylename);
#ifdef Q_OS_MAC
if (stylename == "mac")
QSKIP("QStyleFactory cannot create the Mac style, see QTBUG-23680");
#endif
QStyle *style = QStyleFactory::create(stylename);
if (!style)
QFAIL(qPrintable(QString::fromLatin1("Cannot create style: %1").arg(stylename)));