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

This commit is contained in:
Simon Hausmann 2016-01-13 07:19:44 +00:00 committed by The Qt Project
commit 9a969182cf
56 changed files with 341 additions and 266 deletions

View File

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

View File

@ -11,13 +11,6 @@
!exists($$QMAKE_DOCS): error("Cannot find documentation specification file $$QMAKE_DOCS") !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.name = QT_VERSION
qtver.value = $$VERSION qtver.value = $$VERSION
isEmpty(qtver.value): qtver.value = $$MODULE_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 QT_TOOL_ENV = qtver qtmver qtvertag qtdocs
qtPrepareTool(QDOC, qdoc) qtPrepareTool(QDOC, qdoc)
QT_TOOL_ENV = 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) QDOC += -outputdir $$shell_quote($$QMAKE_DOCS_OUTPUTDIR)
!build_online_docs: \ !build_online_docs: \
QDOC += -installdir $$shell_quote($$[QT_INSTALL_DOCS]) QDOC += -installdir $$shell_quote($$[QT_INSTALL_DOCS])
@ -64,7 +72,6 @@ prepare_docs {
} }
!build_online_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) 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 inst_html_docs.files = $$QMAKE_DOCS_OUTPUTDIR

View File

@ -29,17 +29,17 @@ QMAKE_EXTRA_TARGETS += docs
contains(TEMPLATE, subdirs) { contains(TEMPLATE, subdirs) {
for(inst, DOC_TARGETS): \ for(inst, DOC_TARGETS): \
prepareRecursiveTarget($$inst) prepareRecursiveTarget($$inst)
} else:debug_and_release:!build_pass {
sub = $$first(BUILDS)
for(inst, DOC_TARGETS) {
$${inst}.CONFIG = recursive
$${inst}.recurse = $$sub
}
} else { } else {
# apps and libs only generate docs if QMAKE_DOCS is set debug_and_release:!build_pass {
!isEmpty(QMAKE_DOCS) { sub = $$first(BUILDS)
# backwards compat hack for(inst, DOC_TARGETS) {
load(qt_docs) $${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 QMAKE_EXTRA_TARGETS += $$DOC_TARGETS

View File

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

View File

@ -23,6 +23,7 @@ equals(QMAKE_HOST.os, Windows) {
defineReplace(addGnuPath) { defineReplace(addGnuPath) {
gnuPath = $$1 gnuPath = $$1
!isEmpty(gnuPath):!isEmpty(gnutools.name) { !isEmpty(gnuPath):!isEmpty(gnutools.name) {
QT_TOOL_NAME = $$1
qtAddToolEnv(gnuPath, gnutools) qtAddToolEnv(gnuPath, gnutools)
silent: gnuPath = @echo generating sources from ${QMAKE_FILE_IN} && $$gnuPath 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) set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG)
if (Qt5_POSITION_INDEPENDENT_CODE if (Qt5_POSITION_INDEPENDENT_CODE
AND (CMAKE_VERSION VERSION_LESS 2.8.12 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))) OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)))
set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE}) set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
endif() endif()

View File

@ -152,9 +152,7 @@
to be consistent in pixels-per-point across devices rather than to be consistent in pixels-per-point across devices rather than
defining 1 point as 1/72 inch. defining 1 point as 1/72 inch.
\value AA_X11InitThreads Calls \c XInitThreads() as part of the QApplication \value AA_X11InitThreads This value is obsolete and has no effect.
construction in order to make Xlib calls thread-safe. This
attribute must be set before QApplication is constructed.
\value AA_SynthesizeTouchForUnhandledMouseEvents All mouse events \value AA_SynthesizeTouchForUnhandledMouseEvents All mouse events
that are not accepted by the application will be translated 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) inline void QUrl::removeQueryItem(const QString &key)
{ QUrlQuery q(*this); q.removeQueryItem(key); setQuery(q); } { QUrlQuery q(*this); q.removeQueryItem(key); setQuery(q); }
inline void QUrl::removeAllQueryItems(const QString &key) 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) inline void QUrl::addEncodedQueryItem(const QByteArray &key, const QByteArray &value)
{ QUrlQuery q(*this); q.addQueryItem(fromEncodedComponent_helper(key), fromEncodedComponent_helper(value)); setQuery(q); } { 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) inline void QUrl::removeEncodedQueryItem(const QByteArray &key)
{ QUrlQuery q(*this); q.removeQueryItem(fromEncodedComponent_helper(key)); setQuery(q); } { QUrlQuery q(*this); q.removeQueryItem(fromEncodedComponent_helper(key)); setQuery(q); }
inline void QUrl::removeAllEncodedQueryItems(const QByteArray &key) 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) 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); Q_ASSERT(ok);
qreal r2 = qConvertToRealNumber(d2, &ok); qreal r2 = qConvertToRealNumber(d2, &ok);
Q_ASSERT(ok); Q_ASSERT(ok);
if (qFuzzyCompare(r1, r2)) if (r1 == r2 || qFuzzyCompare(r1, r2))
return 0; return 0;
return r1 < r2 ? -1 : 1; return r1 < r2 ? -1 : 1;
} }

View File

@ -69,6 +69,30 @@
#ifndef QT_NO_THREAD #ifndef QT_NO_THREAD
QT_BEGIN_NAMESPACE 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); void qt_watch_adopted_thread(const HANDLE adoptedThreadHandle, QThread *qthread);
DWORD WINAPI qt_adopted_thread_watcher_function(LPVOID); 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); Q_ASSERT(week == 52 || week == 53);
} else if (week == 53) { } else if (week == 53) {
// maybe first week of next year // 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) { if (w > 0) {
++year; ++year;
week = w; week = w;

View File

@ -286,8 +286,6 @@ DEFINEFUNC(const char* , dbus_message_get_sender, (DBusMessage *message),
(message), return) (message), return)
DEFINEFUNC(dbus_uint32_t , dbus_message_get_serial, (DBusMessage *message), DEFINEFUNC(dbus_uint32_t , dbus_message_get_serial, (DBusMessage *message),
(message), return) (message), return)
DEFINEFUNC(dbus_uint32_t , dbus_message_get_reply_serial, (DBusMessage *message),
(message), return)
DEFINEFUNC(const char* , dbus_message_get_signature, (DBusMessage *message), DEFINEFUNC(const char* , dbus_message_get_signature, (DBusMessage *message),
(message), return) (message), return)
DEFINEFUNC(int , dbus_message_get_type, (DBusMessage *message), 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, 0, 6, 40, 76, 118, 153, 191, 231,
273, 313, 349, 384, 421, 461, 501, 540, 273, 313, 349, 384, 421, 461, 501, 540,
581, 617, 661, 705, 746, 789, 833, 874, 581, 617, 661, 705, 746, 789, 833, 874,
916, 961, 1005, -1 916, 961, 1005
}; };
static const int errorMessages_count = sizeof errorMessages_indices / 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) 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 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; qDBusDebug() << this << "sending message (no reply):" << message;
emit messageNeedsSending(Q_NULLPTR, msg);
return true; return true;
} }
@ -2018,8 +2018,8 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM
lastError = error; lastError = error;
processFinishedCall(pcall); processFinishedCall(pcall);
} else { } else {
emit messageNeedsSending(pcall, msg, timeout);
qDBusDebug() << this << "sending message:" << message; qDBusDebug() << this << "sending message:" << message;
emit messageNeedsSending(pcall, msg, timeout);
} }
return pcall; return pcall;
} }

View File

@ -188,12 +188,7 @@ DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDB
// check if everything is ok // check if everything is ok
if (marshaller.ok) if (marshaller.ok)
{
QDBusMessage *m = (QDBusMessage*)&message;
q_dbus_message_ref(msg);
m->d_ptr->msg = msg;
return msg; return msg;
}
// not ok; // not ok;
q_dbus_message_unref(msg); q_dbus_message_unref(msg);
@ -322,16 +317,6 @@ QDBusMessage QDBusMessagePrivate::makeLocalReply(const QDBusConnectionPrivate &c
return QDBusMessage(); // failed 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 \class QDBusMessage
\inmodule QtDBus \inmodule QtDBus
@ -647,32 +632,6 @@ QString QDBusMessage::signature() const
return d_ptr->signature; 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 Returns the flag that indicates if this message should see a reply
or not. This is only meaningful for \l {MethodCallMessage}{method 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) msg.type() == QDBusMessage::SignalMessage)
dbg.nospace() << ", path=" << msg.path() dbg.nospace() << ", path=" << msg.path()
<< ", interface=" << msg.interface() << ", interface=" << msg.interface()
<< ", member=" << msg.member() << ", member=" << msg.member();
<< ", serial=" << msg.serial();
if (msg.type() == QDBusMessage::ErrorMessage) if (msg.type() == QDBusMessage::ErrorMessage)
dbg.nospace() << ", error name=" << msg.errorName() dbg.nospace() << ", error name=" << msg.errorName()
<< ", error message=" << msg.errorMessage() << ", 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();
dbg.nospace() << ", signature=" << msg.signature() dbg.nospace() << ", signature=" << msg.signature()
<< ", contents=("; << ", contents=(";
debugVariantList(dbg, msg.arguments()); debugVariantList(dbg, msg.arguments());

View File

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

View File

@ -93,8 +93,6 @@ public:
const QDBusMessage &asSent); const QDBusMessage &asSent);
static QDBusMessage makeLocalReply(const QDBusConnectionPrivate &conn, static QDBusMessage makeLocalReply(const QDBusConnectionPrivate &conn,
const QDBusMessage &asSent); const QDBusMessage &asSent);
uint serial();
uint replySerial();
}; };
QT_END_NAMESPACE 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 (complex_xform || mode == Qt::SmoothTransformation) {
if (d->format < QImage::Format_RGB32 || !hasAlphaChannel()) { if (d->format < QImage::Format_RGB32 || !hasAlphaChannel()) {
switch(d->format) { target_format = qt_alphaVersion(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;
}
} }
} }

View File

@ -161,10 +161,45 @@ inline int qt_depthForFormat(QImage::Format format)
} }
return depth; return depth;
} }
#if defined(_M_ARM) #if defined(_M_ARM)
#pragma optimize("", on) #pragma optimize("", on)
#endif #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 QT_END_NAMESPACE
#endif // QIMAGE_P_H #endif // QIMAGE_P_H

View File

@ -178,20 +178,7 @@ void QRasterPlatformPixmap::fill(const QColor &color)
int alpha = color.alpha(); int alpha = color.alpha();
if (alpha != 255) { if (alpha != 255) {
if (!image.hasAlphaChannel()) { if (!image.hasAlphaChannel()) {
QImage::Format toFormat; QImage::Format toFormat = qt_alphaVersionForPainting(image.format());
#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;
if (!image.isNull() && qt_depthForFormat(image.format()) == qt_depthForFormat(toFormat)) { if (!image.isNull() && qt_depthForFormat(image.format()) == qt_depthForFormat(toFormat)) {
image.detach(); image.detach();
image.d->format = toFormat; image.d->format = toFormat;
@ -314,17 +301,7 @@ void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageC
: QImage::Format_RGB32; : QImage::Format_RGB32;
} else { } else {
QImage::Format opaqueFormat = QNativeImage::systemFormat(); QImage::Format opaqueFormat = QNativeImage::systemFormat();
QImage::Format alphaFormat = QImage::Format_ARGB32_Premultiplied; QImage::Format alphaFormat = qt_alphaVersionForPainting(opaqueFormat);
#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
if (!sourceImage.hasAlphaChannel()) { if (!sourceImage.hasAlphaChannel()) {
format = opaqueFormat; format = opaqueFormat;

View File

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

View File

@ -426,8 +426,8 @@
\value ReuseAddressHint Provides a hint to QAbstractSocket that it should try \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 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 another socket. On Windows and Unix, this is equivalent to the SO_REUSEADDR
socket option. On Unix, this option is ignored. socket option.
\value DefaultForPlatform The default option for the current platform. \value DefaultForPlatform The default option for the current platform.
On Unix and OS X, this is equivalent to (DontShareAddress On Unix and OS X, this is equivalent to (DontShareAddress

View File

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

View File

@ -107,7 +107,7 @@ QIOSIntegration::QIOSIntegration()
m_touchDevice = new QTouchDevice; m_touchDevice = new QTouchDevice;
m_touchDevice->setType(QTouchDevice::TouchScreen); m_touchDevice->setType(QTouchDevice::TouchScreen);
QTouchDevice::Capabilities touchCapabilities = QTouchDevice::Position | QTouchDevice::NormalizedPosition; 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) if (mainScreen.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
touchCapabilities |= QTouchDevice::Pressure; touchCapabilities |= QTouchDevice::Pressure;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -46,6 +46,7 @@
#define EGL_EGLEXT_PROTOTYPES #define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h> #include <EGL/eglext.h>
#include <QOffscreenSurface>
#include <QOpenGLContext> #include <QOpenGLContext>
#include <QtPlatformSupport/private/qeglconvenience_p.h> #include <QtPlatformSupport/private/qeglconvenience_p.h>
@ -54,9 +55,6 @@ QT_BEGIN_NAMESPACE
struct WinRTEGLDisplay struct WinRTEGLDisplay
{ {
WinRTEGLDisplay() { WinRTEGLDisplay() {
eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (Q_UNLIKELY(eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
} }
~WinRTEGLDisplay() { ~WinRTEGLDisplay() {
eglTerminate(eglDisplay); eglTerminate(eglDisplay);
@ -117,9 +115,17 @@ void QWinRTEGLContext::initialize()
if (Q_UNLIKELY(g->eglDisplay == EGL_NO_DISPLAY)) if (Q_UNLIKELY(g->eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError()); qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
if (Q_UNLIKELY(!eglInitialize(g->eglDisplay, nullptr, nullptr))) // eglInitialize checks for EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE
qCritical("Failed to initialize EGL: 0x%x", eglGetError()); // 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); d->eglConfig = q_configFromGLFormat(g->eglDisplay, d->format);
const EGLint flags = d->format.testOption(QSurfaceFormat::DebugContext) const EGLint flags = d->format.testOption(QSurfaceFormat::DebugContext)
@ -142,6 +148,9 @@ bool QWinRTEGLContext::makeCurrent(QPlatformSurface *windowSurface)
Q_D(QWinRTEGLContext); Q_D(QWinRTEGLContext);
Q_ASSERT(windowSurface->surface()->supportsOpenGL()); Q_ASSERT(windowSurface->surface()->supportsOpenGL());
if (windowSurface->surface()->surfaceClass() == QSurface::Offscreen)
return false;
QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface); QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface);
if (window->eglSurface() == EGL_NO_SURFACE) if (window->eglSurface() == EGL_NO_SURFACE)
window->createEglSurface(g->eglDisplay, d->eglConfig); window->createEglSurface(g->eglDisplay, d->eglConfig);

View File

@ -49,6 +49,8 @@
#include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLContext>
#include <qfunctions_winrt.h> #include <qfunctions_winrt.h>
#include <qpa/qplatformoffscreensurface.h>
#include <functional> #include <functional>
#include <wrl.h> #include <wrl.h>
#include <windows.ui.xaml.h> #include <windows.ui.xaml.h>
@ -124,7 +126,7 @@ QWinRTIntegration::QWinRTIntegration() : d_ptr(new QWinRTIntegrationPrivate)
IID_PPV_ARGS(&d->application)); IID_PPV_ARGS(&d->application));
Q_ASSERT_SUCCEEDED(hr); Q_ASSERT_SUCCEEDED(hr);
hr = d->application->add_Suspending(Callback<SuspendHandler>(this, &QWinRTIntegration::onSuspended).Get(), 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); Q_ASSERT_SUCCEEDED(hr);
hr = d->application->add_Resuming(Callback<ResumeHandler>(this, &QWinRTIntegration::onResume).Get(), hr = d->application->add_Resuming(Callback<ResumeHandler>(this, &QWinRTIntegration::onResume).Get(),
&d->applicationTokens[&ICoreApplication::remove_Resuming]); &d->applicationTokens[&ICoreApplication::remove_Resuming]);
@ -180,10 +182,15 @@ QWinRTIntegration::~QWinRTIntegration()
Q_ASSERT_SUCCEEDED(hr); Q_ASSERT_SUCCEEDED(hr);
} }
#endif #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) { for (QHash<CoreApplicationCallbackRemover, EventRegistrationToken>::const_iterator i = d->applicationTokens.begin(); i != d->applicationTokens.end(); ++i) {
hr = (d->application.Get()->*i.key())(i.value()); hr = (d->application.Get()->*i.key())(i.value());
Q_ASSERT_SUCCEEDED(hr); Q_ASSERT_SUCCEEDED(hr);
} }
#endif
destroyScreen(d->mainScreen); destroyScreen(d->mainScreen);
Windows::Foundation::Uninitialize(); Windows::Foundation::Uninitialize();
} }
@ -349,4 +356,14 @@ HRESULT QWinRTIntegration::onResume(IInspectable *, IInspectable *)
return S_OK; 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 QT_END_NAMESPACE

View File

@ -98,6 +98,7 @@ public:
QStringList themeNames() const Q_DECL_OVERRIDE; QStringList themeNames() const Q_DECL_OVERRIDE;
QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE; QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE;
QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE;
private: private:
#ifdef Q_OS_WINPHONE #ifdef Q_OS_WINPHONE
HRESULT onBackButtonPressed(IInspectable *, ABI::Windows::Phone::UI::Input::IBackPressedEventArgs *args); 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); d->visibleWindows.prepend(window);
QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason); QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason);
handleExpose(); handleExpose();
QWindowSystemInterface::flushWindowSystemEvents();
} }
void QWinRTScreen::removeWindow(QWindow *window) void QWinRTScreen::removeWindow(QWindow *window)
@ -796,6 +797,7 @@ void QWinRTScreen::removeWindow(QWindow *window)
if (wasTopWindow) if (wasTopWindow)
QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason); QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason);
handleExpose(); handleExpose();
QWindowSystemInterface::flushWindowSystemEvents();
} }
void QWinRTScreen::raise(QWindow *window) void QWinRTScreen::raise(QWindow *window)

View File

@ -51,6 +51,7 @@
#include <qscreen.h> #include <qscreen.h>
#include <QtGui/private/qhighdpiscaling_p.h> #include <QtGui/private/qhighdpiscaling_p.h>
#include <qpa/qplatformgraphicsbuffer.h> #include <qpa/qplatformgraphicsbuffer.h>
#include <private/qimage_p.h>
#include <algorithm> #include <algorithm>
QT_BEGIN_NAMESPACE 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"; 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_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); m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage);
} }

View File

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

View File

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

View File

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

View File

@ -203,7 +203,7 @@ int QDesktopWidget::screenNumber(const QWidget *w) const
return primaryScreen(); return primaryScreen();
// If there is more than one virtual desktop // 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 // Find the root widget, get a QScreen from it and use the
// virtual siblings for checking the window position. // virtual siblings for checking the window position.
const QWidget *root = w; const QWidget *root = w;

View File

@ -432,7 +432,7 @@ void QCompletionEngine::filter(const QStringList& parts)
QModelIndex parent; QModelIndex parent;
for (int i = 0; i < curParts.count() - 1; i++) { 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; int emi = filter(part, parent, -1).exactMatchIndex;
if (emi == -1) if (emi == -1)
return; 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 // 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 // When filtering is disabled, we show all the items under this parent
curParent = parent; curParent = parent;
if (curParts.last().isEmpty()) if (curParts.constLast().isEmpty())
curMatch = QMatchData(QIndexMapper(0, model->rowCount(curParent) - 1), -1, false); curMatch = QMatchData(QIndexMapper(0, model->rowCount(curParent) - 1), -1, false);
else 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; curRow = curMatch.isValid() ? 0 : -1;
} }

View File

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

View File

@ -8,6 +8,8 @@ find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR 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) add_executable(test_interface_exe WIN32 main.cpp mainwindow.cpp)
# No need to specify include directories, compile definitions, the PIC flag, or to # 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_subdirectory(subdir1)
add_executable(exe1 "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp") add_executable(exe1 main.cpp)
include_directories(${Qt5Core_INCLUDE_DIRS}) target_link_libraries(exe1 Qt5::Core)

View File

@ -2,4 +2,4 @@
find_package(Qt5Core REQUIRED) find_package(Qt5Core REQUIRED)
add_executable(exe2 "${CMAKE_CURRENT_SOURCE_DIR}/../main.cpp") 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}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
add_executable(myobject main.cpp) 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) find_package(Qt5Core)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
qt5_use_modules(two Test) qt5_use_modules(two Test)
qt5_use_modules(three Gui 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("float3") << qVariantFromValue(0.f) << qVariantFromValue(-1.f) << +1;
QTest::newRow("float4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.f) << -1; QTest::newRow("float4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.f) << -1;
QTest::newRow("float5") << qVariantFromValue(0.f) << qVariantFromValue(-float(qInf())) << +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("double1") << qVariantFromValue(0.) << qVariantFromValue(0.) << 0;
QTest::newRow("double2") << qVariantFromValue(-1.) << qVariantFromValue(0.) << -1; QTest::newRow("double2") << qVariantFromValue(-1.) << qVariantFromValue(0.) << -1;
QTest::newRow("double3") << qVariantFromValue(0.) << qVariantFromValue(-1.) << +1; QTest::newRow("double3") << qVariantFromValue(0.) << qVariantFromValue(-1.) << +1;
QTest::newRow("double4") << qVariantFromValue(-qInf()) << qVariantFromValue(0.) << -1; QTest::newRow("double4") << qVariantFromValue(-qInf()) << qVariantFromValue(0.) << -1;
QTest::newRow("double5") << qVariantFromValue(0.) << qVariantFromValue(-qInf()) << +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 // mixed comparisons
// fp + fp // 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+double3") << qVariantFromValue(0.f) << qVariantFromValue(-1.) << +1;
QTest::newRow("float+double4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.) << -1; QTest::newRow("float+double4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.) << -1;
QTest::newRow("float+double5") << qVariantFromValue(0.f) << qVariantFromValue(-qInf()) << +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 // fp + int
QTest::newRow("float+int1") << qVariantFromValue(0.f) << qVariantFromValue(0) << 0; 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("double+int3") << qVariantFromValue(0.) << qVariantFromValue(-1) << +1;
QTest::newRow("float+int4") << qVariantFromValue(1.5f) << 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+int4") << qVariantFromValue(1.5) << qVariantFromValue(1) << +1;
QTest::newRow("double+int5") << qVariantFromValue(qInf()) << qVariantFromValue(1) << +1;
// fp + uint // fp + uint
QTest::newRow("float+uint1") << qVariantFromValue(0.f) << qVariantFromValue(0U) << 0; 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>("month");
QTest::addColumn<int>("day"); QTest::addColumn<int>("day");
//next we fill it with data enum { Thursday = 4 };
QTest::newRow( "data0" ) << 10 << 2002 << 2002 << 3 << 8; bool wasLastYearLong = false; // 1999 was not a long (53-week) year
QTest::newRow( "data1" ) << 10 << 2002 << 2002 << 3 << 8; bool isLongYear;
QTest::newRow( "data2" ) << 52 << 1999 << 2000 << 1 << 1;
QTest::newRow( "data3" ) << 52 << 1999 << 1999 << 12 << 31; // full 400-year cycle for Jan 1, 4 and Dec 28, 31
QTest::newRow( "data4" ) << 1 << 2001 << 2001 << 1 << 1; for (int yr = 2000; yr < 2400; ++yr, wasLastYearLong = isLongYear) {
QTest::newRow( "data5" ) << 53 << 1998 << 1998 << 12 << 31; QByteArray yrstr = QByteArray::number(yr);
QTest::newRow( "data6" ) << 1 << 1985 << 1984 << 12 << 31; int wday = QDate(yr, 1, 1).dayOfWeek();
QTest::newRow( "data7" ) << 52 << 2006 << 2006 << 12 << 31;
QTest::newRow( "data8" ) << 53 << 2004 << 2005 << 1 << 1; // 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() void tst_QDate::weekNumber()

View File

@ -68,6 +68,7 @@ private slots:
void timeSpec(); void timeSpec();
void toTime_t_data(); void toTime_t_data();
void toTime_t(); void toTime_t();
void daylightSavingsTimeChange_data();
void daylightSavingsTimeChange(); void daylightSavingsTimeChange();
void springForward_data(); void springForward_data();
void springForward(); 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() void tst_QDateTime::daylightSavingsTimeChange()
{ {
// This is a regression test for an old bug where starting with a date in // This has grown from a regression test for an old bug where starting with
// DST and then moving to a date outside it (or vice-versa) caused 1-hour // a date in DST and then moving to a date outside it (or vice-versa) caused
// jumps in time when addSecs() was called. // 1-hour jumps in time when addSecs() was called.
// //
// The bug was caused by QDateTime knowing more than it lets show. // 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 // 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 // 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. // 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 // WARNING: This only tests anything if there's a Daylight Savings Time change
// in the current locale between 2006-11-06 and 2006-10-16 // in the current locale between inDST and outDST.
// This is true for Central European Time // This is true for Central European Time and may be elsewhere.
if (!europeanTimeZone) QFETCH(QDate, inDST);
QSKIP("Not tested with timezone other than Central European (CET/CEST)"); QFETCH(QDate, outDST);
QDateTime dt = QDateTime(QDate(2006, 11, 6), QTime(0, 0, 0), Qt::LocalTime); // First with simple construction
dt.setDate(QDate(2006, 10, 16)); QDateTime dt = QDateTime(outDST, QTime(0, 0, 0), Qt::LocalTime);
int outDSTsecs = dt.toTime_t();
dt.setDate(inDST);
dt = dt.addSecs(1); dt = dt.addSecs(1);
QCOMPARE(dt.date(), QDate(2006, 10, 16)); QCOMPARE(dt, QDateTime(inDST, QTime(0, 0, 1)));
QCOMPARE(dt.time(), QTime(0, 0, 1));
// now using fromTime_t // now using fromTime_t
dt = QDateTime::fromTime_t(1162767600); // 2006-11-06 00:00:00 +0100 dt = QDateTime::fromTime_t(outDSTsecs);
dt.setDate(QDate(2006, 10, 16)); QCOMPARE(dt, QDateTime(outDST, QTime(0, 0, 0)));
dt = dt.addSecs (1);
QCOMPARE(dt.date(), QDate(2006, 10, 16)); dt.setDate(inDST);
QCOMPARE(dt.time(), QTime(0, 0, 1)); dt = dt.addSecs(60);
QCOMPARE(dt, QDateTime(inDST, QTime(0, 1, 0)));
} }
void tst_QDateTime::springForward_data() void tst_QDateTime::springForward_data()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,3 +9,4 @@ INCLUDEPATH += ../
HEADERS += HEADERS +=
SOURCES += tst_qplaintextedit.cpp 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 QT += widgets widgets-private gui-private core-private testlib
SOURCES += tst_qtextedit.cpp SOURCES += tst_qtextedit.cpp
osx: LIBS += -framework AppKit

View File

@ -48,9 +48,10 @@
namespace QtDiag { namespace QtDiag {
struct DumpContext { struct DumpContext {
DumpContext() : indentation(0) {} DumpContext() : indentation(0), parent(0) {}
int indentation; int indentation;
HWND parent;
QSharedPointer<QTextStream> stream; QSharedPointer<QTextStream> stream;
}; };
@ -64,11 +65,19 @@ static void formatNativeWindow(HWND hwnd, QTextStream &str)
RECT rect; RECT rect;
if (GetWindowRect(hwnd, &rect)) { if (GetWindowRect(hwnd, &rect)) {
str << ' ' << (rect.right - rect.left) << 'x' << (rect.bottom - rect.top) str << ' ' << (rect.right - rect.left) << 'x' << (rect.bottom - rect.top)
<< '+' << rect.left << '+' << rect.top; << forcesign << rect.left << rect.top << noforcesign;
} }
if (IsWindowVisible(hwnd)) if (IsWindowVisible(hwnd))
str << " [visible]"; 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; str << hex << showbase;
if (const LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE)) { if (const LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE)) {
str << " style=" << 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_COMPOSITED)
debugWinStyle(str, exStyle, WS_EX_NOACTIVATE) 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; str << noshowbase << dec;
wchar_t buf[512]; if (GetWindowModuleFileName(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
if (GetWindowText(hwnd, buf, sizeof(buf)/sizeof(buf[0]))) str << " module=\"" << QString::fromWCharArray(buf) << '"';
str << " title=\"" << QString::fromWCharArray(buf) << '"';
if (GetClassName(hwnd, buf, sizeof(buf)/sizeof(buf[0])))
str << " class=\"" << QString::fromWCharArray(buf) << '"';
str << '\n'; str << '\n';
} }
@ -135,7 +162,11 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc);
BOOL CALLBACK dumpWindowEnumChildProc(HWND hwnd, LPARAM lParam) 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; return TRUE;
} }
@ -145,6 +176,7 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc)
formatNativeWindow(hwnd, *dc->stream); formatNativeWindow(hwnd, *dc->stream);
DumpContext nextLevel = *dc; DumpContext nextLevel = *dc;
nextLevel.indentation += 2; nextLevel.indentation += 2;
nextLevel.parent = hwnd;
EnumChildWindows(hwnd, dumpWindowEnumChildProc, reinterpret_cast<LPARAM>(&nextLevel)); EnumChildWindows(hwnd, dumpWindowEnumChildProc, reinterpret_cast<LPARAM>(&nextLevel));
} }