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

Change-Id: I5839bded07e23af65ced9491c4f50242f964dd31
This commit is contained in:
Simon Hausmann 2016-01-12 09:01:52 +01:00
commit 6b8c0a5058
56 changed files with 341 additions and 266 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env perl
#############################################################################
##
## Copyright (C) 2015 Intel Corporation
## Copyright (C) 2016 Intel Corporation
## Contact: http://www.qt.io/licensing/
##
## This file is part of the build configuration tools of the Qt Toolkit.
@ -33,40 +33,26 @@
#############################################################################
use strict;
my $syntax = "findclasslist.pl <file (containing private header list)>\n" .
"Replaces \@CLASSLIST\@ with the classes found in the header files\n";
die("Expected exactly one argument") if (@ARGV != 1);
my @headers = ();
# Expand contents of the command-line arguments file
open ARGFILE, "<$ARGV[0]" or die("Could not open arguments file $ARGV[0]: $!");
while (my $line = <ARGFILE>) {
chomp($line);
push @headers, $line;
}
close ARGFILE;
my $syntax = "findclasslist.pl\n" .
"Replaces each \@FILE:filename\@ in stdin with the classes found in that file\n";
$\ = $/;
while (<STDIN>) {
chomp;
unless (/\@CLASSLIST\@/) {
unless (/\@FILE:(.*)\@/) {
print;
next;
}
# Replace @CLASSLIST@ with the class list
for my $header (@headers) {
open HDR, "<$header" or die("Could not open header $header: $!");
my $comment = " /* $header */";
while (my $line = <HDR>) {
# Match a struct or class declaration, but not a forward declaration
$line =~ /^(?:struct|class) (?:Q_.*_EXPORT)? (\w+)(?!;)/ or next;
print $comment if $comment;
printf " *%d%s*;\n", length $1, $1;
$comment = 0;
}
close HDR;
# Replace this line with the class list
open HDR, "<$1" or die("Could not open header $1: $!");
my $comment = " /* $1 */";
while (my $line = <HDR>) {
# Match a struct or class declaration, but not a forward declaration
$line =~ /^(?:struct|class) (?:Q_.*_EXPORT)? (\w+)(?!;)/ or next;
print $comment if $comment;
printf " *%d%s*;\n", length $1, $1;
$comment = 0;
}
close HDR;
}

View File

@ -11,13 +11,6 @@
!exists($$QMAKE_DOCS): error("Cannot find documentation specification file $$QMAKE_DOCS")
load(qt_build_paths)
QMAKE_DOCS_BASE_OUTDIR = $$MODULE_BASE_OUTDIR/doc
QMAKE_DOCS_TARGET = $$replace(QMAKE_DOCS, ^(.*/)?(.*)\\.qdocconf$, \\2)
isEmpty(QMAKE_DOCS_TARGETDIR): QMAKE_DOCS_TARGETDIR = $$QMAKE_DOCS_TARGET
QMAKE_DOCS_OUTPUTDIR = $$QMAKE_DOCS_BASE_OUTDIR/$$QMAKE_DOCS_TARGETDIR
qtver.name = QT_VERSION
qtver.value = $$VERSION
isEmpty(qtver.value): qtver.value = $$MODULE_VERSION
@ -31,6 +24,21 @@ qtdocs.value = $$[QT_INSTALL_DOCS/src]
QT_TOOL_ENV = qtver qtmver qtvertag qtdocs
qtPrepareTool(QDOC, qdoc)
QT_TOOL_ENV =
!build_online_docs: qtPrepareTool(QHELPGENERATOR, qhelpgenerator)
# qtPrepareTool() must be called outside a build pass, as it protects
# against concurrent wrapper creation by omitting it during build passes.
# However, creating the actual targets is reserved to the build passes.
debug_and_release:!build_pass: return()
load(qt_build_paths)
QMAKE_DOCS_BASE_OUTDIR = $$MODULE_BASE_OUTDIR/doc
QMAKE_DOCS_TARGET = $$replace(QMAKE_DOCS, ^(.*/)?(.*)\\.qdocconf$, \\2)
isEmpty(QMAKE_DOCS_TARGETDIR): QMAKE_DOCS_TARGETDIR = $$QMAKE_DOCS_TARGET
QMAKE_DOCS_OUTPUTDIR = $$QMAKE_DOCS_BASE_OUTDIR/$$QMAKE_DOCS_TARGETDIR
QDOC += -outputdir $$shell_quote($$QMAKE_DOCS_OUTPUTDIR)
!build_online_docs: \
QDOC += -installdir $$shell_quote($$[QT_INSTALL_DOCS])
@ -64,7 +72,6 @@ prepare_docs {
}
!build_online_docs {
qtPrepareTool(QHELPGENERATOR, qhelpgenerator)
qch_docs.commands = $$QHELPGENERATOR $$shell_quote($$QMAKE_DOCS_OUTPUTDIR/$${QMAKE_DOCS_TARGET}.qhp) -o $$shell_quote($$QMAKE_DOCS_BASE_OUTDIR/$${QMAKE_DOCS_TARGET}.qch)
inst_html_docs.files = $$QMAKE_DOCS_OUTPUTDIR

View File

@ -29,17 +29,17 @@ QMAKE_EXTRA_TARGETS += docs
contains(TEMPLATE, subdirs) {
for(inst, DOC_TARGETS): \
prepareRecursiveTarget($$inst)
} else:debug_and_release:!build_pass {
sub = $$first(BUILDS)
for(inst, DOC_TARGETS) {
$${inst}.CONFIG = recursive
$${inst}.recurse = $$sub
}
} else {
# apps and libs only generate docs if QMAKE_DOCS is set
!isEmpty(QMAKE_DOCS) {
# backwards compat hack
load(qt_docs)
debug_and_release:!build_pass {
sub = $$first(BUILDS)
for(inst, DOC_TARGETS) {
$${inst}.CONFIG = recursive
$${inst}.recurse = $$sub
}
}
# Apps and libs request docs creation by setting QMAKE_DOCS.
# This is a backwards compat hack - technically, the modules which need it
# are supposed to load(qt_docs) themselves.
!isEmpty(QMAKE_DOCS): load(qt_docs)
}
QMAKE_EXTRA_TARGETS += $$DOC_TARGETS

View File

@ -132,7 +132,6 @@ lib_bundle {
}
mac {
CONFIG += explicitlib
macx-g++ {
QMAKE_CFLAGS += -fconstant-cfstrings
QMAKE_CXXFLAGS += -fconstant-cfstrings
@ -200,7 +199,10 @@ android: CONFIG += qt_android_deps no_linker_version_script
verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };"
} else {
verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API {" \
" qt_private_api_tag*;" "@CLASSLIST@" "};"
" qt_private_api_tag*;"
for(header, SYNCQT.PRIVATE_HEADER_FILES): \
verscript_content += " @FILE:$${_PRO_FILE_PWD_}/$$header@"
verscript_content += "};"
current = Qt_$$QT_MAJOR_VERSION
verscript_content += "$$current { *; };"
@ -214,13 +216,12 @@ android: CONFIG += qt_android_deps no_linker_version_script
else: verscript_content += "$$current {} $$previous;"
}
# Add a post-processing step to replace the @CLASSLIST@
verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < $${verscript}.in $${verscript}.in.args > $@
# Add a post-processing step to replace the @FILE:filename@
verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < $${verscript}.in > $@
verscriptprocess.target = $$verscript
for(header, SYNCQT.PRIVATE_HEADER_FILES): \
verscriptprocess.depends += $${_PRO_FILE_PWD_}/$$header
write_file($${verscript}.in.args, verscriptprocess.depends)|error("Aborting.")
verscriptprocess.depends += $${verscript}.in $${verscript}.in.args
verscriptprocess.depends += $${verscript}.in
QMAKE_EXTRA_TARGETS += verscriptprocess
PRE_TARGETDEPS += $$verscript
verscript = $${verscript}.in
@ -258,19 +259,18 @@ load(qt_targets)
pclib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR
pclib_replace.CONFIG = path
QMAKE_PKGCONFIG_INSTALL_REPLACE += pclib_replace
unix {
CONFIG += create_libtool explicitlib
host_build: \
QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS]
else: \
QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]"
ltlib_replace.match = $$lib_replace.match
!isEmpty(lib_replace.replace): \
ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR
ltlib_replace.CONFIG = path
QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace
}
}
!lib_bundle:unix {
CONFIG += create_libtool
host_build: \
QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS]
else: \
QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]"
ltlib_replace.match = $$lib_replace.match
!isEmpty(lib_replace.replace): \
ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR
ltlib_replace.CONFIG = path
QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace
}
contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE

View File

@ -23,6 +23,7 @@ equals(QMAKE_HOST.os, Windows) {
defineReplace(addGnuPath) {
gnuPath = $$1
!isEmpty(gnuPath):!isEmpty(gnutools.name) {
QT_TOOL_NAME = $$1
qtAddToolEnv(gnuPath, gnutools)
silent: gnuPath = @echo generating sources from ${QMAKE_FILE_IN} && $$gnuPath
}

View File

@ -336,7 +336,7 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.9)
set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG)
if (Qt5_POSITION_INDEPENDENT_CODE
AND (CMAKE_VERSION VERSION_LESS 2.8.12
AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\"
AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)))
set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
endif()

View File

@ -152,9 +152,7 @@
to be consistent in pixels-per-point across devices rather than
defining 1 point as 1/72 inch.
\value AA_X11InitThreads Calls \c XInitThreads() as part of the QApplication
construction in order to make Xlib calls thread-safe. This
attribute must be set before QApplication is constructed.
\value AA_X11InitThreads This value is obsolete and has no effect.
\value AA_SynthesizeTouchForUnhandledMouseEvents All mouse events
that are not accepted by the application will be translated

View File

@ -121,7 +121,7 @@ inline QStringList QUrl::allQueryItemValues(const QString &key) const
inline void QUrl::removeQueryItem(const QString &key)
{ QUrlQuery q(*this); q.removeQueryItem(key); setQuery(q); }
inline void QUrl::removeAllQueryItems(const QString &key)
{ QUrlQuery q(*this); q.removeAllQueryItems(key); }
{ QUrlQuery q(*this); q.removeAllQueryItems(key); setQuery(q); }
inline void QUrl::addEncodedQueryItem(const QByteArray &key, const QByteArray &value)
{ QUrlQuery q(*this); q.addQueryItem(fromEncodedComponent_helper(key), fromEncodedComponent_helper(value)); setQuery(q); }
@ -132,7 +132,7 @@ inline QByteArray QUrl::encodedQueryItemValue(const QByteArray &key) const
inline void QUrl::removeEncodedQueryItem(const QByteArray &key)
{ QUrlQuery q(*this); q.removeQueryItem(fromEncodedComponent_helper(key)); setQuery(q); }
inline void QUrl::removeAllEncodedQueryItems(const QByteArray &key)
{ QUrlQuery q(*this); q.removeAllQueryItems(fromEncodedComponent_helper(key)); }
{ QUrlQuery q(*this); q.removeAllQueryItems(fromEncodedComponent_helper(key)); setQuery(q); }
inline void QUrl::setEncodedQueryItems(const QList<QPair<QByteArray, QByteArray> > &qry)
{

View File

@ -3437,7 +3437,7 @@ static int numericCompare(const QVariant::Private *d1, const QVariant::Private *
Q_ASSERT(ok);
qreal r2 = qConvertToRealNumber(d2, &ok);
Q_ASSERT(ok);
if (qFuzzyCompare(r1, r2))
if (r1 == r2 || qFuzzyCompare(r1, r2))
return 0;
return r1 < r2 ? -1 : 1;
}

View File

@ -69,6 +69,30 @@
#ifndef QT_NO_THREAD
QT_BEGIN_NAMESPACE
#ifdef Q_OS_WINRT
inline DWORD qWinRTTlsAlloc() {
return FlsAlloc(0);
}
inline bool qWinRTTlsFree(DWORD dwTlsIndex) {
return FlsFree(dwTlsIndex);
}
inline LPVOID qWinRTTlsGetValue(DWORD dwTlsIndex) {
return FlsGetValue(dwTlsIndex);
}
inline bool qWinRTTlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) {
return FlsSetValue(dwTlsIndex, lpTlsValue);
}
#define TlsAlloc qWinRTTlsAlloc
#define TlsFree qWinRTTlsFree
#define TlsSetValue qWinRTTlsSetValue
#define TlsGetValue qWinRTTlsGetValue
#endif // Q_OS_WINRT
void qt_watch_adopted_thread(const HANDLE adoptedThreadHandle, QThread *qthread);
DWORD WINAPI qt_adopted_thread_watcher_function(LPVOID);

View File

@ -585,7 +585,7 @@ int QDate::weekNumber(int *yearNumber) const
Q_ASSERT(week == 52 || week == 53);
} else if (week == 53) {
// maybe first week of next year
int w = (yday - 365 - (QDate::isLeapYear(year + 1) ? 1 : 0) - wday + 10) / 7;
int w = (yday - 365 - (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7;
if (w > 0) {
++year;
week = w;

View File

@ -286,8 +286,6 @@ DEFINEFUNC(const char* , dbus_message_get_sender, (DBusMessage *message),
(message), return)
DEFINEFUNC(dbus_uint32_t , dbus_message_get_serial, (DBusMessage *message),
(message), return)
DEFINEFUNC(dbus_uint32_t , dbus_message_get_reply_serial, (DBusMessage *message),
(message), return)
DEFINEFUNC(const char* , dbus_message_get_signature, (DBusMessage *message),
(message), return)
DEFINEFUNC(int , dbus_message_get_type, (DBusMessage *message),

View File

@ -130,11 +130,11 @@ static const int errorMessages_indices[] = {
0, 6, 40, 76, 118, 153, 191, 231,
273, 313, 349, 384, 421, 461, 501, 540,
581, 617, 661, 705, 746, 789, 833, 874,
916, 961, 1005, -1
916, 961, 1005
};
static const int errorMessages_count = sizeof errorMessages_indices /
sizeof errorMessages_indices[0] - 1;
sizeof errorMessages_indices[0];
static inline const char *get(QDBusError::ErrorType code)
{

View File

@ -1818,8 +1818,8 @@ bool QDBusConnectionPrivate::send(const QDBusMessage& message)
}
q_dbus_message_set_no_reply(msg, true); // the reply would not be delivered to anything
emit messageNeedsSending(Q_NULLPTR, msg);
qDBusDebug() << this << "sending message (no reply):" << message;
emit messageNeedsSending(Q_NULLPTR, msg);
return true;
}
@ -2018,8 +2018,8 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM
lastError = error;
processFinishedCall(pcall);
} else {
emit messageNeedsSending(pcall, msg, timeout);
qDBusDebug() << this << "sending message:" << message;
emit messageNeedsSending(pcall, msg, timeout);
}
return pcall;
}

View File

@ -188,12 +188,7 @@ DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDB
// check if everything is ok
if (marshaller.ok)
{
QDBusMessage *m = (QDBusMessage*)&message;
q_dbus_message_ref(msg);
m->d_ptr->msg = msg;
return msg;
}
// not ok;
q_dbus_message_unref(msg);
@ -322,16 +317,6 @@ QDBusMessage QDBusMessagePrivate::makeLocalReply(const QDBusConnectionPrivate &c
return QDBusMessage(); // failed
}
uint QDBusMessagePrivate::serial()
{
return msg ? q_dbus_message_get_serial(msg) : reply ? q_dbus_message_get_serial(reply) : 0;
}
uint QDBusMessagePrivate::replySerial()
{
return msg ? q_dbus_message_get_reply_serial(msg) : reply ? q_dbus_message_get_reply_serial(reply) : 0;
}
/*!
\class QDBusMessage
\inmodule QtDBus
@ -647,32 +632,6 @@ QString QDBusMessage::signature() const
return d_ptr->signature;
}
/*!
Returns the serial of the message or 0 if undefined.
The serial number is a unique identifier of a message coming from a
given connection.
The serial is set to a non zero value after the message has been sent
over a D-Bus connection.
*/
uint QDBusMessage::serial() const
{
return d_ptr->serial();
}
/*!
Returns the serial of the message this is a reply to or 0 if undefined.
The serial number is a unique identifier of a message coming from a
given connection and D-Bus messages of 'method return' or 'error' type
use them to match the reply to the method call message.
*/
uint QDBusMessage::replySerial() const
{
return d_ptr->replySerial();
}
/*!
Returns the flag that indicates if this message should see a reply
or not. This is only meaningful for \l {MethodCallMessage}{method
@ -861,16 +820,10 @@ QDebug operator<<(QDebug dbg, const QDBusMessage &msg)
msg.type() == QDBusMessage::SignalMessage)
dbg.nospace() << ", path=" << msg.path()
<< ", interface=" << msg.interface()
<< ", member=" << msg.member()
<< ", serial=" << msg.serial();
<< ", member=" << msg.member();
if (msg.type() == QDBusMessage::ErrorMessage)
dbg.nospace() << ", error name=" << msg.errorName()
<< ", error message=" << msg.errorMessage()
<< ", serial=" << msg.serial()
<< ", reply serial=" << msg.replySerial();
else if (msg.type() == QDBusMessage::ReplyMessage)
dbg.nospace() << ", serial=" << msg.serial()
<< ", reply serial=" << msg.replySerial();
<< ", error message=" << msg.errorMessage();
dbg.nospace() << ", signature=" << msg.signature()
<< ", contents=(";
debugVariantList(dbg, msg.arguments());

View File

@ -104,8 +104,6 @@ public:
QString errorMessage() const;
MessageType type() const;
QString signature() const;
uint serial() const;
uint replySerial() const;
bool isReplyRequired() const;

View File

@ -93,8 +93,6 @@ public:
const QDBusMessage &asSent);
static QDBusMessage makeLocalReply(const QDBusConnectionPrivate &conn,
const QDBusMessage &asSent);
uint serial();
uint replySerial();
};
QT_END_NAMESPACE

View File

@ -4623,32 +4623,7 @@ QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode
if (complex_xform || mode == Qt::SmoothTransformation) {
if (d->format < QImage::Format_RGB32 || !hasAlphaChannel()) {
switch(d->format) {
case QImage::Format_RGB16:
target_format = Format_ARGB8565_Premultiplied;
break;
case QImage::Format_RGB555:
target_format = Format_ARGB8555_Premultiplied;
break;
case QImage::Format_RGB666:
target_format = Format_ARGB6666_Premultiplied;
break;
case QImage::Format_RGB444:
target_format = Format_ARGB4444_Premultiplied;
break;
case QImage::Format_RGBX8888:
target_format = Format_RGBA8888_Premultiplied;
break;
case QImage::Format_BGR30:
target_format = Format_A2BGR30_Premultiplied;
break;
case QImage::Format_RGB30:
target_format = Format_A2RGB30_Premultiplied;
break;
default:
target_format = Format_ARGB32_Premultiplied;
break;
}
target_format = qt_alphaVersion(d->format);
}
}

View File

@ -161,10 +161,45 @@ inline int qt_depthForFormat(QImage::Format format)
}
return depth;
}
#if defined(_M_ARM)
#pragma optimize("", on)
#endif
inline QImage::Format qt_alphaVersion(QImage::Format format)
{
switch (format) {
case QImage::Format_RGB16:
return QImage::Format_ARGB8565_Premultiplied;
case QImage::Format_RGB555:
return QImage::Format_ARGB8555_Premultiplied;
case QImage::Format_RGB666:
return QImage::Format_ARGB6666_Premultiplied;
case QImage::Format_RGB444:
return QImage::Format_ARGB4444_Premultiplied;
case QImage::Format_RGBX8888:
return QImage::Format_RGBA8888_Premultiplied;
case QImage::Format_BGR30:
return QImage::Format_A2BGR30_Premultiplied;
case QImage::Format_RGB30:
return QImage::Format_A2RGB30_Premultiplied;
default:
break;
}
return QImage::Format_ARGB32_Premultiplied;
}
inline QImage::Format qt_alphaVersionForPainting(QImage::Format format)
{
QImage::Format toFormat = qt_alphaVersion(format);
#if defined(__ARM_NEON__) || defined(__SSE2__)
// If we are switching depth anyway and we have optimized ARGB32PM routines, upgrade to that.
if (qt_depthForFormat(format) != qt_depthForFormat(toFormat))
toFormat = QImage::Format_ARGB32_Premultiplied;
#endif
return toFormat;
}
QT_END_NAMESPACE
#endif // QIMAGE_P_H

View File

@ -178,20 +178,7 @@ void QRasterPlatformPixmap::fill(const QColor &color)
int alpha = color.alpha();
if (alpha != 255) {
if (!image.hasAlphaChannel()) {
QImage::Format toFormat;
#if !(defined(__ARM_NEON__) || defined(__SSE2__))
if (image.format() == QImage::Format_RGB16)
toFormat = QImage::Format_ARGB8565_Premultiplied;
else if (image.format() == QImage::Format_RGB666)
toFormat = QImage::Format_ARGB6666_Premultiplied;
else if (image.format() == QImage::Format_RGB555)
toFormat = QImage::Format_ARGB8555_Premultiplied;
else if (image.format() == QImage::Format_RGB444)
toFormat = QImage::Format_ARGB4444_Premultiplied;
else
#endif
toFormat = QImage::Format_ARGB32_Premultiplied;
QImage::Format toFormat = qt_alphaVersionForPainting(image.format());
if (!image.isNull() && qt_depthForFormat(image.format()) == qt_depthForFormat(toFormat)) {
image.detach();
image.d->format = toFormat;
@ -314,17 +301,7 @@ void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageC
: QImage::Format_RGB32;
} else {
QImage::Format opaqueFormat = QNativeImage::systemFormat();
QImage::Format alphaFormat = QImage::Format_ARGB32_Premultiplied;
#if !defined(__ARM_NEON__) && !defined(__SSE2__)
switch (opaqueFormat) {
case QImage::Format_RGB16:
alphaFormat = QImage::Format_ARGB8565_Premultiplied;
break;
default: // We don't care about the others...
break;
}
#endif
QImage::Format alphaFormat = qt_alphaVersionForPainting(opaqueFormat);
if (!sourceImage.hasAlphaChannel()) {
format = opaqueFormat;

View File

@ -4193,7 +4193,7 @@ protected:
void QGradientCache::generateGradientColorTable(const QGradient& gradient, QRgba64 *colorTable, int size, int opacity) const
{
QGradientStops stops = gradient.stops();
const QGradientStops stops = gradient.stops();
int stopCount = stops.count();
Q_ASSERT(stopCount > 0);

View File

@ -426,8 +426,8 @@
\value ReuseAddressHint Provides a hint to QAbstractSocket that it should try
to rebind the service even if the address and port are already bound by
another socket. On Windows, this is equivalent to the SO_REUSEADDR
socket option. On Unix, this option is ignored.
another socket. On Windows and Unix, this is equivalent to the SO_REUSEADDR
socket option.
\value DefaultForPlatform The default option for the current platform.
On Unix and OS X, this is equivalent to (DontShareAddress

View File

@ -1,5 +1,7 @@
mac {
HEADERS += $$PWD/qmacmime_p.h
OBJECTIVE_SOURCES += $$PWD/qmacmime.mm
osx: LIBS_PRIVATE += -framework AppKit
}

View File

@ -107,7 +107,7 @@ QIOSIntegration::QIOSIntegration()
m_touchDevice = new QTouchDevice;
m_touchDevice->setType(QTouchDevice::TouchScreen);
QTouchDevice::Capabilities touchCapabilities = QTouchDevice::Position | QTouchDevice::NormalizedPosition;
if ([mainScreen respondsToSelector:@selector(traitCollection)]) {
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) {
if (mainScreen.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
touchCapabilities |= QTouchDevice::Pressure;
}

View File

@ -286,10 +286,14 @@
QTouchDevice *touchDevice = QIOSIntegration::instance()->touchDevice();
QTouchDevice::Capabilities touchCapabilities = touchDevice->capabilities();
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
touchCapabilities |= QTouchDevice::Pressure;
else
touchCapabilities &= ~QTouchDevice::Pressure;
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
touchCapabilities |= QTouchDevice::Pressure;
else
touchCapabilities &= ~QTouchDevice::Pressure;
}
touchDevice->setCapabilities(touchCapabilities);
}

View File

@ -1,6 +1,6 @@
{
"name": "Qt built-in GPU driver blacklist",
"version": "5.5",
"version": "5.6",
"entries": [
{
"id": 1,

View File

@ -405,14 +405,29 @@ void QWindowsContext::setTabletAbsoluteRange(int a)
#endif
}
int QWindowsContext::processDpiAwareness()
{
#ifndef Q_OS_WINCE
int result;
if (QWindowsContext::shcoredll.getProcessDpiAwareness
&& SUCCEEDED(QWindowsContext::shcoredll.getProcessDpiAwareness(NULL, &result))) {
return result;
}
#endif // !Q_OS_WINCE
return -1;
}
void QWindowsContext::setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiAwareness)
{
#ifndef Q_OS_WINCE
qCDebug(lcQpaWindows) << __FUNCTION__ << dpiAwareness;
if (QWindowsContext::shcoredll.isValid()) {
const HRESULT hr = QWindowsContext::shcoredll.setProcessDpiAwareness(dpiAwareness);
if (FAILED(hr))
qWarning() << "SetProcessDpiAwareness failed:" << QWindowsContext::comErrorString(hr);
if (FAILED(hr)) {
qWarning().noquote().nospace() << "SetProcessDpiAwareness("
<< dpiAwareness << ") failed: " << QWindowsContext::comErrorString(hr)
<< ", using " << QWindowsContext::processDpiAwareness();
}
} else {
if (dpiAwareness != QtWindows::ProcessDpiUnaware && QWindowsContext::user32dll.setProcessDPIAware) {
if (!QWindowsContext::user32dll.setProcessDPIAware())

View File

@ -148,7 +148,7 @@ struct QWindowsShcoreDLL {
void init();
inline bool isValid() const { return getProcessDpiAwareness && setProcessDpiAwareness && getDpiForMonitor; }
typedef HRESULT (WINAPI *GetProcessDpiAwareness)(HANDLE,int);
typedef HRESULT (WINAPI *GetProcessDpiAwareness)(HANDLE,int *);
typedef HRESULT (WINAPI *SetProcessDpiAwareness)(int);
typedef HRESULT (WINAPI *GetDpiForMonitor)(HMONITOR,int,UINT *,UINT *);
@ -219,6 +219,7 @@ public:
void setTabletAbsoluteRange(int a);
void setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiAwareness);
static int processDpiAwareness();
// Returns a combination of SystemInfoFlags
unsigned systemInfo() const;

View File

@ -224,7 +224,8 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
m_context.setProcessDpiAwareness(dpiAwareness);
qCDebug(lcQpaWindows)
<< __FUNCTION__ << "DpiAwareness=" << dpiAwareness;
<< __FUNCTION__ << "DpiAwareness=" << dpiAwareness
<< "effective process DPI awareness=" << QWindowsContext::processDpiAwareness();
}
dpiAwarenessSet = true;
}

View File

@ -46,6 +46,7 @@
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
#include <QOffscreenSurface>
#include <QOpenGLContext>
#include <QtPlatformSupport/private/qeglconvenience_p.h>
@ -54,9 +55,6 @@ QT_BEGIN_NAMESPACE
struct WinRTEGLDisplay
{
WinRTEGLDisplay() {
eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (Q_UNLIKELY(eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
}
~WinRTEGLDisplay() {
eglTerminate(eglDisplay);
@ -117,9 +115,17 @@ void QWinRTEGLContext::initialize()
if (Q_UNLIKELY(g->eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
if (Q_UNLIKELY(!eglInitialize(g->eglDisplay, nullptr, nullptr)))
qCritical("Failed to initialize EGL: 0x%x", eglGetError());
// eglInitialize checks for EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE
// which adds a suspending handler. This needs to be added from the Xaml
// thread itself, otherwise it will not be invoked. add_Suspending does
// not return an error unfortunately, so it silently fails and causes
// applications to not quit when the system wants to terminate the app
// after suspend.
hr = QEventDispatcherWinRT::runOnXamlThread([]() {
if (!eglInitialize(g->eglDisplay, nullptr, nullptr))
qCritical("Failed to initialize EGL: 0x%x", eglGetError());
return S_OK;
});
d->eglConfig = q_configFromGLFormat(g->eglDisplay, d->format);
const EGLint flags = d->format.testOption(QSurfaceFormat::DebugContext)
@ -142,6 +148,9 @@ bool QWinRTEGLContext::makeCurrent(QPlatformSurface *windowSurface)
Q_D(QWinRTEGLContext);
Q_ASSERT(windowSurface->surface()->supportsOpenGL());
if (windowSurface->surface()->surfaceClass() == QSurface::Offscreen)
return false;
QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface);
if (window->eglSurface() == EGL_NO_SURFACE)
window->createEglSurface(g->eglDisplay, d->eglConfig);

View File

@ -49,6 +49,8 @@
#include <QtGui/QOpenGLContext>
#include <qfunctions_winrt.h>
#include <qpa/qplatformoffscreensurface.h>
#include <functional>
#include <wrl.h>
#include <windows.ui.xaml.h>
@ -124,7 +126,7 @@ QWinRTIntegration::QWinRTIntegration() : d_ptr(new QWinRTIntegrationPrivate)
IID_PPV_ARGS(&d->application));
Q_ASSERT_SUCCEEDED(hr);
hr = d->application->add_Suspending(Callback<SuspendHandler>(this, &QWinRTIntegration::onSuspended).Get(),
&d->applicationTokens[&ICoreApplication::remove_Resuming]);
&d->applicationTokens[&ICoreApplication::remove_Suspending]);
Q_ASSERT_SUCCEEDED(hr);
hr = d->application->add_Resuming(Callback<ResumeHandler>(this, &QWinRTIntegration::onResume).Get(),
&d->applicationTokens[&ICoreApplication::remove_Resuming]);
@ -180,10 +182,15 @@ QWinRTIntegration::~QWinRTIntegration()
Q_ASSERT_SUCCEEDED(hr);
}
#endif
// Do not execute this on Windows Phone as the application is already
// shutting down and trying to unregister suspending/resume handler will
// cause exceptions and assert in debug mode
#ifndef Q_OS_WINPHONE
for (QHash<CoreApplicationCallbackRemover, EventRegistrationToken>::const_iterator i = d->applicationTokens.begin(); i != d->applicationTokens.end(); ++i) {
hr = (d->application.Get()->*i.key())(i.value());
Q_ASSERT_SUCCEEDED(hr);
}
#endif
destroyScreen(d->mainScreen);
Windows::Foundation::Uninitialize();
}
@ -349,4 +356,14 @@ HRESULT QWinRTIntegration::onResume(IInspectable *, IInspectable *)
return S_OK;
}
QPlatformOffscreenSurface *QWinRTIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const
{
// This is only used for shutdown of applications.
// In case we do not return an empty surface the scenegraph will try
// to create a new native window during application exit causing crashes
// or assertions.
return new QPlatformOffscreenSurface(surface);
}
QT_END_NAMESPACE

View File

@ -98,6 +98,7 @@ public:
QStringList themeNames() const Q_DECL_OVERRIDE;
QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE;
QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE;
private:
#ifdef Q_OS_WINPHONE
HRESULT onBackButtonPressed(IInspectable *, ABI::Windows::Phone::UI::Input::IBackPressedEventArgs *args);

View File

@ -779,6 +779,7 @@ void QWinRTScreen::addWindow(QWindow *window)
d->visibleWindows.prepend(window);
QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason);
handleExpose();
QWindowSystemInterface::flushWindowSystemEvents();
}
void QWinRTScreen::removeWindow(QWindow *window)
@ -796,6 +797,7 @@ void QWinRTScreen::removeWindow(QWindow *window)
if (wasTopWindow)
QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason);
handleExpose();
QWindowSystemInterface::flushWindowSystemEvents();
}
void QWinRTScreen::raise(QWindow *window)

View File

@ -51,6 +51,7 @@
#include <qscreen.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#include <qpa/qplatformgraphicsbuffer.h>
#include <private/qimage_p.h>
#include <algorithm>
QT_BEGIN_NAMESPACE
@ -172,6 +173,9 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
qWarning() << "QXcbBackingStore: Error while marking the shared memory segment to be destroyed";
}
if (QImage::toPixelFormat(format).alphaUsage() == QPixelFormat::IgnoresAlpha)
format = qt_alphaVersionForPainting(format);
m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format);
m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage);
}

View File

@ -70,7 +70,7 @@ QXcbVirtualDesktop::~QXcbVirtualDesktop()
QXcbScreen *QXcbVirtualDesktop::screenAt(const QPoint &pos) const
{
foreach (QXcbScreen *screen, connection()->screens()) {
if (screen->virtualDesktop() == this && screen->nativeGeometry().contains(pos))
if (screen->virtualDesktop() == this && screen->geometry().contains(pos))
return screen;
}
return Q_NULLPTR;
@ -198,17 +198,15 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe
} else if (xineramaScreenInfo) {
m_geometry = QRect(xineramaScreenInfo->x_org, xineramaScreenInfo->y_org,
xineramaScreenInfo->width, xineramaScreenInfo->height);
m_nativeGeometry = m_geometry;
m_availableGeometry = m_geometry & m_virtualDesktop->workArea();
m_sizeMillimeters = sizeInMillimeters(m_geometry.size(), virtualDpi());
if (xineramaScreenIdx > -1)
m_outputName += QLatin1Char('-') + QString::number(xineramaScreenIdx);
}
if (m_geometry.isEmpty()) {
if (m_geometry.isEmpty())
m_geometry = QRect(QPoint(), m_virtualSize);
m_nativeGeometry = QRect(QPoint(), m_virtualSize);
}
if (m_availableGeometry.isEmpty())
m_availableGeometry = m_geometry;
@ -557,7 +555,6 @@ void QXcbScreen::updateGeometry(const QRect &geom, uint8_t rotation)
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
m_pixelDensity = qRound(dpi/96);
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
m_nativeGeometry = QRect(xGeometry.topLeft(), xGeometry.size());
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
}
@ -828,9 +825,7 @@ QDebug operator<<(QDebug debug, const QXcbScreen *screen)
debug << ", screenNumber=" << screen->screenNumber();
debug << ", virtualSize=" << screen->virtualSize().width() << 'x' << screen->virtualSize().height() << " (";
formatSizeF(debug, screen->virtualSize());
debug << "), nativeGeometry=";
formatRect(debug, screen->nativeGeometry());
debug << ", orientation=" << screen->orientation();
debug << "), orientation=" << screen->orientation();
debug << ", depth=" << screen->depth();
debug << ", refreshRate=" << screen->refreshRate();
debug << ", root=" << hex << screen->root();

View File

@ -114,7 +114,6 @@ public:
QWindow *topLevelAt(const QPoint &point) const Q_DECL_OVERRIDE;
QRect geometry() const Q_DECL_OVERRIDE { return m_geometry; }
QRect nativeGeometry() const { return m_nativeGeometry; }
QRect availableGeometry() const Q_DECL_OVERRIDE {return m_availableGeometry;}
int depth() const Q_DECL_OVERRIDE { return screen()->root_depth; }
QImage::Format format() const Q_DECL_OVERRIDE;
@ -186,7 +185,6 @@ private:
QSizeF m_outputSizeMillimeters;
QSizeF m_sizeMillimeters;
QRect m_geometry;
QRect m_nativeGeometry;
QRect m_availableGeometry;
QSize m_virtualSize;
QSizeF m_virtualSizeMillimeters;

View File

@ -167,7 +167,6 @@ public:
virtual void create();
virtual void destroy();
QXcbScreen *screenForNativeGeometry(const QRect &newGeometry) const;
public Q_SLOTS:
void updateSyncRequestCounter();

View File

@ -203,7 +203,7 @@ int QDesktopWidget::screenNumber(const QWidget *w) const
return primaryScreen();
// If there is more than one virtual desktop
if (screens.count() != screens.first()->virtualSiblings().count()) {
if (screens.count() != screens.constFirst()->virtualSiblings().count()) {
// Find the root widget, get a QScreen from it and use the
// virtual siblings for checking the window position.
const QWidget *root = w;

View File

@ -432,7 +432,7 @@ void QCompletionEngine::filter(const QStringList& parts)
QModelIndex parent;
for (int i = 0; i < curParts.count() - 1; i++) {
QString part = curParts[i];
QString part = curParts.at(i);
int emi = filter(part, parent, -1).exactMatchIndex;
if (emi == -1)
return;
@ -442,10 +442,10 @@ void QCompletionEngine::filter(const QStringList& parts)
// Note that we set the curParent to a valid parent, even if we have no matches
// When filtering is disabled, we show all the items under this parent
curParent = parent;
if (curParts.last().isEmpty())
if (curParts.constLast().isEmpty())
curMatch = QMatchData(QIndexMapper(0, model->rowCount(curParent) - 1), -1, false);
else
curMatch = filter(curParts.last(), curParent, 1); // build at least one
curMatch = filter(curParts.constLast(), curParent, 1); // build at least one
curRow = curMatch.isValid() ? 0 : -1;
}

View File

@ -261,7 +261,7 @@ void QDialogButtonBoxPrivate::layoutButtons()
if (center)
buttonLayout->addStretch();
QList<QAbstractButton *> acceptRoleList = buttonLists[QPlatformDialogHelper::AcceptRole];
const QList<QAbstractButton *> &acceptRoleList = buttonLists[QPlatformDialogHelper::AcceptRole];
while (*currentLayout != QPlatformDialogHelper::EOL) {
int role = (*currentLayout & ~QPlatformDialogHelper::Reverse);

View File

@ -8,6 +8,8 @@ find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
add_executable(test_interface_exe WIN32 main.cpp mainwindow.cpp)
# No need to specify include directories, compile definitions, the PIC flag, or to

View File

@ -9,5 +9,5 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
add_subdirectory(subdir1)
add_executable(exe1 "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")
include_directories(${Qt5Core_INCLUDE_DIRS})
add_executable(exe1 main.cpp)
target_link_libraries(exe1 Qt5::Core)

View File

@ -2,4 +2,4 @@
find_package(Qt5Core REQUIRED)
add_executable(exe2 "${CMAKE_CURRENT_SOURCE_DIR}/../main.cpp")
include_directories(${Qt5Core_INCLUDE_DIRS})
target_link_libraries(exe2 Qt5::Core)

View File

@ -11,3 +11,4 @@ add_definitions(${Qt5Core_DEFINITIONS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
add_executable(myobject main.cpp)
target_link_libraries(myobject Qt5::Core)

View File

@ -12,5 +12,7 @@ add_executable(three three.cpp)
find_package(Qt5Core)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
qt5_use_modules(two Test)
qt5_use_modules(three Gui Test)

View File

@ -1736,12 +1736,16 @@ void tst_QVariant::compareNumbers_data() const
QTest::newRow("float3") << qVariantFromValue(0.f) << qVariantFromValue(-1.f) << +1;
QTest::newRow("float4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.f) << -1;
QTest::newRow("float5") << qVariantFromValue(0.f) << qVariantFromValue(-float(qInf())) << +1;
QTest::newRow("float6") << qVariantFromValue(-float(qInf())) << qVariantFromValue(-float(qInf())) << 0;
QTest::newRow("float7") << qVariantFromValue(float(qInf())) << qVariantFromValue(float(qInf())) << 0;
QTest::newRow("double1") << qVariantFromValue(0.) << qVariantFromValue(0.) << 0;
QTest::newRow("double2") << qVariantFromValue(-1.) << qVariantFromValue(0.) << -1;
QTest::newRow("double3") << qVariantFromValue(0.) << qVariantFromValue(-1.) << +1;
QTest::newRow("double4") << qVariantFromValue(-qInf()) << qVariantFromValue(0.) << -1;
QTest::newRow("double5") << qVariantFromValue(0.) << qVariantFromValue(-qInf()) << +1;
QTest::newRow("double6") << qVariantFromValue(-double(qInf())) << qVariantFromValue(-qInf()) << 0;
QTest::newRow("double7") << qVariantFromValue(qInf()) << qVariantFromValue(qInf()) << 0;
// mixed comparisons
// fp + fp
@ -1750,6 +1754,8 @@ void tst_QVariant::compareNumbers_data() const
QTest::newRow("float+double3") << qVariantFromValue(0.f) << qVariantFromValue(-1.) << +1;
QTest::newRow("float+double4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.) << -1;
QTest::newRow("float+double5") << qVariantFromValue(0.f) << qVariantFromValue(-qInf()) << +1;
QTest::newRow("float+double6") << qVariantFromValue(-float(qInf())) << qVariantFromValue(qInf()) << 0;
QTest::newRow("float+double7") << qVariantFromValue(float(qInf())) << qVariantFromValue(qInf()) << 0;
// fp + int
QTest::newRow("float+int1") << qVariantFromValue(0.f) << qVariantFromValue(0) << 0;
@ -1760,6 +1766,7 @@ void tst_QVariant::compareNumbers_data() const
QTest::newRow("double+int3") << qVariantFromValue(0.) << qVariantFromValue(-1) << +1;
QTest::newRow("float+int4") << qVariantFromValue(1.5f) << qVariantFromValue(1) << +1;
QTest::newRow("double+int4") << qVariantFromValue(1.5) << qVariantFromValue(1) << +1;
QTest::newRow("double+int5") << qVariantFromValue(qInf()) << qVariantFromValue(1) << +1;
// fp + uint
QTest::newRow("float+uint1") << qVariantFromValue(0.f) << qVariantFromValue(0U) << 0;

View File

@ -392,16 +392,37 @@ void tst_QDate::weekNumber_data()
QTest::addColumn<int>("month");
QTest::addColumn<int>("day");
//next we fill it with data
QTest::newRow( "data0" ) << 10 << 2002 << 2002 << 3 << 8;
QTest::newRow( "data1" ) << 10 << 2002 << 2002 << 3 << 8;
QTest::newRow( "data2" ) << 52 << 1999 << 2000 << 1 << 1;
QTest::newRow( "data3" ) << 52 << 1999 << 1999 << 12 << 31;
QTest::newRow( "data4" ) << 1 << 2001 << 2001 << 1 << 1;
QTest::newRow( "data5" ) << 53 << 1998 << 1998 << 12 << 31;
QTest::newRow( "data6" ) << 1 << 1985 << 1984 << 12 << 31;
QTest::newRow( "data7" ) << 52 << 2006 << 2006 << 12 << 31;
QTest::newRow( "data8" ) << 53 << 2004 << 2005 << 1 << 1;
enum { Thursday = 4 };
bool wasLastYearLong = false; // 1999 was not a long (53-week) year
bool isLongYear;
// full 400-year cycle for Jan 1, 4 and Dec 28, 31
for (int yr = 2000; yr < 2400; ++yr, wasLastYearLong = isLongYear) {
QByteArray yrstr = QByteArray::number(yr);
int wday = QDate(yr, 1, 1).dayOfWeek();
// the year is 53-week long if Jan 1 is Thursday or, if it's a leap year, a Wednesday
isLongYear = (wday == Thursday) || (QDate::isLeapYear(yr) && wday == Thursday - 1);
// Jan 4 is always on week 1
QTest::newRow(yrstr + "-01-04") << 1 << yr << yr << 1 << 4;
// Dec 28 is always on the last week
QTest::newRow(yrstr + "-12-28") << (52 + isLongYear) << yr << yr << 12 << 28;
// Jan 1 is on either on week 1 or on the last week of the previous year
QTest::newRow(yrstr + "-01-01")
<< (wday <= Thursday ? 1 : 52 + wasLastYearLong)
<< (wday <= Thursday ? yr : yr - 1)
<< yr << 1 << 1;
// Dec 31 is either on the last week or week 1 of the next year
wday = QDate(yr, 12, 31).dayOfWeek();
QTest::newRow(yrstr + "-12-31")
<< (wday >= Thursday ? 52 + isLongYear : 1)
<< (wday >= Thursday ? yr : yr + 1)
<< yr << 12 << 31;
}
}
void tst_QDate::weekNumber()

View File

@ -68,6 +68,7 @@ private slots:
void timeSpec();
void toTime_t_data();
void toTime_t();
void daylightSavingsTimeChange_data();
void daylightSavingsTimeChange();
void springForward_data();
void springForward();
@ -1563,36 +1564,47 @@ void tst_QDateTime::toTime_t()
}
}
void tst_QDateTime::daylightSavingsTimeChange_data()
{
QTest::addColumn<QDate>("inDST");
QTest::addColumn<QDate>("outDST");
QTest::newRow("Autumn") << QDate(2006, 8, 1) << QDate(2006, 12, 1);
QTest::newRow("Spring") << QDate(2006, 5, 1) << QDate(2006, 2, 1);
}
void tst_QDateTime::daylightSavingsTimeChange()
{
// This is a regression test for an old bug where starting with a date in
// DST and then moving to a date outside it (or vice-versa) caused 1-hour
// jumps in time when addSecs() was called.
// This has grown from a regression test for an old bug where starting with
// a date in DST and then moving to a date outside it (or vice-versa) caused
// 1-hour jumps in time when addSecs() was called.
//
// The bug was caused by QDateTime knowing more than it lets show.
// Internally, if it knows, QDateTime stores a flag indicating if the time is
// DST or not. If it doesn't, it sets to "LocalUnknown". The problem happened
// because some functions did not reset the flag when moving in or out of DST.
// WARNING: This test only works if there's a Daylight Savings Time change
// in the current locale between 2006-11-06 and 2006-10-16
// This is true for Central European Time
// WARNING: This only tests anything if there's a Daylight Savings Time change
// in the current locale between inDST and outDST.
// This is true for Central European Time and may be elsewhere.
if (!europeanTimeZone)
QSKIP("Not tested with timezone other than Central European (CET/CEST)");
QFETCH(QDate, inDST);
QFETCH(QDate, outDST);
QDateTime dt = QDateTime(QDate(2006, 11, 6), QTime(0, 0, 0), Qt::LocalTime);
dt.setDate(QDate(2006, 10, 16));
// First with simple construction
QDateTime dt = QDateTime(outDST, QTime(0, 0, 0), Qt::LocalTime);
int outDSTsecs = dt.toTime_t();
dt.setDate(inDST);
dt = dt.addSecs(1);
QCOMPARE(dt.date(), QDate(2006, 10, 16));
QCOMPARE(dt.time(), QTime(0, 0, 1));
QCOMPARE(dt, QDateTime(inDST, QTime(0, 0, 1)));
// now using fromTime_t
dt = QDateTime::fromTime_t(1162767600); // 2006-11-06 00:00:00 +0100
dt.setDate(QDate(2006, 10, 16));
dt = dt.addSecs (1);
QCOMPARE(dt.date(), QDate(2006, 10, 16));
QCOMPARE(dt.time(), QTime(0, 0, 1));
dt = QDateTime::fromTime_t(outDSTsecs);
QCOMPARE(dt, QDateTime(outDST, QTime(0, 0, 0)));
dt.setDate(inDST);
dt = dt.addSecs(60);
QCOMPARE(dt, QDateTime(inDST, QTime(0, 1, 0)));
}
void tst_QDateTime::springForward_data()

View File

@ -71,7 +71,6 @@ void tst_QDBusConnection::noConnection()
QVERIFY(con.callWithCallback(msg, &spy, SLOT(asyncReply)) == 0);
QDBusMessage reply = con.call(msg);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
QDBusReply<void> voidreply(reply);
@ -153,7 +152,6 @@ void tst_QDBusConnection::send()
QDBusMessage reply = con.call(msg);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.arguments().count(), 1);
QCOMPARE(reply.arguments().at(0).typeName(), "QStringList");
QVERIFY(reply.arguments().at(0).toStringList().contains(con.baseService()));
@ -173,7 +171,6 @@ void tst_QDBusConnection::sendWithGui()
QDBusMessage reply = con.call(msg, QDBus::BlockWithGui);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.arguments().count(), 1);
QCOMPARE(reply.arguments().at(0).typeName(), "QStringList");
QVERIFY(reply.arguments().at(0).toStringList().contains(con.baseService()));
@ -843,7 +840,6 @@ void tst_QDBusConnection::callSelf()
QString(), "test3");
msg << 44;
reply = connection.call(msg);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.arguments().value(0).toInt(), 45);
}
@ -911,7 +907,6 @@ void tst_QDBusConnection::callSelfByAnotherName()
QString(), "test0");
QDBusMessage reply = con.call(msg, QDBus::Block, 1000);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
}
@ -927,7 +922,6 @@ void tst_QDBusConnection::multipleInterfacesInQObject()
QDBusMessage msg = QDBusMessage::createMethodCall(con.baseService(), "/p1",
"local.BaseObject", "anotherMethod");
QDBusMessage reply = con.call(msg, QDBus::Block);
QCOMPARE(msg.serial(), reply.replySerial());
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
QCOMPARE(reply.arguments().count(), 0);
}
@ -1208,7 +1202,6 @@ void tst_QDBusConnection::callVirtualObjectLocal()
QDBusMessage message = QDBusMessage::createMethodCall(con.baseService(), path, QString(), "hello");
QDBusMessage reply = con.call(message, QDBus::Block, 5000);
QCOMPARE(message.serial(), reply.replySerial());
QCOMPARE(obj.callCount, 1);
QCOMPARE(obj.lastMessage.service(), con.baseService());
QCOMPARE(obj.lastMessage.interface(), QString());

View File

@ -3,6 +3,8 @@ SOURCES += ../tst_qclipboard.cpp
TARGET = ../tst_qclipboard
QT += testlib
osx: LIBS += -framework AppKit
win32 {
CONFIG(debug, debug|release) {
TARGET = ../../debug/tst_qclipboard

View File

@ -805,7 +805,6 @@ void tst_QGLThreads::painterOnFboInThread()
int main(int argc, char **argv)
{
QApplication::setAttribute(Qt::AA_X11InitThreads);
QApplication app(argc, argv);
QTEST_DISABLE_KEYPAD_NAVIGATION \

View File

@ -6,4 +6,6 @@ HEADERS += guitest.h
QT = core-private widgets-private testlib
osx: LIBS += -framework ApplicationServices
requires(mac)

View File

@ -3,3 +3,4 @@ TARGET = tst_qlineedit
QT += gui-private core-private widgets widgets-private testlib
SOURCES += tst_qlineedit.cpp
osx: LIBS += -framework AppKit

View File

@ -9,3 +9,4 @@ INCLUDEPATH += ../
HEADERS +=
SOURCES += tst_qplaintextedit.cpp
osx: LIBS += -framework AppKit

View File

@ -4,3 +4,5 @@ TARGET = tst_qtextedit
QT += widgets widgets-private gui-private core-private testlib
SOURCES += tst_qtextedit.cpp
osx: LIBS += -framework AppKit

View File

@ -48,9 +48,10 @@
namespace QtDiag {
struct DumpContext {
DumpContext() : indentation(0) {}
DumpContext() : indentation(0), parent(0) {}
int indentation;
HWND parent;
QSharedPointer<QTextStream> stream;
};
@ -64,11 +65,19 @@ static void formatNativeWindow(HWND hwnd, QTextStream &str)
RECT rect;
if (GetWindowRect(hwnd, &rect)) {
str << ' ' << (rect.right - rect.left) << 'x' << (rect.bottom - rect.top)
<< '+' << rect.left << '+' << rect.top;
<< forcesign << rect.left << rect.top << noforcesign;
}
if (IsWindowVisible(hwnd))
str << " [visible]";
wchar_t buf[512];
if (GetWindowText(hwnd, buf, sizeof(buf)/sizeof(buf[0])) && buf[0])
str << " title=\"" << QString::fromWCharArray(buf) << "\"/";
else
str << ' ';
if (GetClassName(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
str << '"' << QString::fromWCharArray(buf) << '"';
str << hex << showbase;
if (const LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE)) {
str << " style=" << style;
@ -121,13 +130,31 @@ static void formatNativeWindow(HWND hwnd, QTextStream &str)
debugWinStyle(str, exStyle, WS_EX_COMPOSITED)
debugWinStyle(str, exStyle, WS_EX_NOACTIVATE)
}
if (const ULONG_PTR classStyle = GetClassLongPtr(hwnd, GCL_STYLE)) {
str << " classStyle=" << classStyle;
debugWinStyle(str, classStyle, CS_BYTEALIGNCLIENT)
debugWinStyle(str, classStyle, CS_BYTEALIGNWINDOW)
debugWinStyle(str, classStyle, CS_CLASSDC)
debugWinStyle(str, classStyle, CS_DBLCLKS)
debugWinStyle(str, classStyle, CS_DROPSHADOW)
debugWinStyle(str, classStyle, CS_GLOBALCLASS)
debugWinStyle(str, classStyle, CS_HREDRAW)
debugWinStyle(str, classStyle, CS_NOCLOSE)
debugWinStyle(str, classStyle, CS_OWNDC)
debugWinStyle(str, classStyle, CS_PARENTDC)
debugWinStyle(str, classStyle, CS_SAVEBITS)
debugWinStyle(str, classStyle, CS_VREDRAW)
}
if (const ULONG_PTR wndProc = GetClassLongPtr(hwnd, GCLP_WNDPROC))
str << " wndProc=" << wndProc;
str << noshowbase << dec;
wchar_t buf[512];
if (GetWindowText(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
str << " title=\"" << QString::fromWCharArray(buf) << '"';
if (GetClassName(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
str << " class=\"" << QString::fromWCharArray(buf) << '"';
if (GetWindowModuleFileName(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
str << " module=\"" << QString::fromWCharArray(buf) << '"';
str << '\n';
}
@ -135,7 +162,11 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc);
BOOL CALLBACK dumpWindowEnumChildProc(HWND hwnd, LPARAM lParam)
{
dumpNativeWindowRecursion(hwnd, reinterpret_cast<DumpContext *>(lParam));
DumpContext *dumpContext = reinterpret_cast<DumpContext *>(lParam);
// EnumChildWindows enumerates grand children as well, skip these to
// get the hierarchical formatting right.
if (GetAncestor(hwnd, GA_PARENT) == dumpContext->parent)
dumpNativeWindowRecursion(hwnd, dumpContext);
return TRUE;
}
@ -145,6 +176,7 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc)
formatNativeWindow(hwnd, *dc->stream);
DumpContext nextLevel = *dc;
nextLevel.indentation += 2;
nextLevel.parent = hwnd;
EnumChildWindows(hwnd, dumpWindowEnumChildProc, reinterpret_cast<LPARAM>(&nextLevel));
}