Merge remote-tracking branch 'origin/5.14' into 5.15
Conflicts: src/corelib/tools/qlinkedlist.h src/plugins/platforms/wasm/qwasmintegration.cpp src/plugins/platforms/wasm/qwasmscreen.cpp Change-Id: Iefca7f9f4966bdc20e7052aca736874861055738
This commit is contained in:
commit
b9585277e7
@ -165,8 +165,6 @@ Build options:
|
||||
-reduce-exports ...... Reduce amount of exported symbols [auto]
|
||||
-reduce-relocations .. Reduce amount of relocations [auto] (Unix only)
|
||||
|
||||
-relocatable ......... Enable the Qt installation to be relocated [auto]
|
||||
|
||||
-plugin-manifests .... Embed manifests into plugins [no] (Windows only)
|
||||
-static-runtime ...... With -static, use static runtime [no] (Windows only)
|
||||
|
||||
|
@ -1408,6 +1408,7 @@
|
||||
},
|
||||
"relocatable": {
|
||||
"label": "Relocatable",
|
||||
"purpose": "Enable the Qt installation to be relocated.",
|
||||
"autoDetect": "features.shared",
|
||||
"condition": "features.dlopen || config.win32 || !features.shared",
|
||||
"output": [ "privateFeature" ]
|
||||
|
@ -246,11 +246,7 @@
|
||||
|
||||
\section1 Other Code Editor Features
|
||||
|
||||
It is possible to implement parenthesis matching with
|
||||
QSyntaxHighlighter. The "Matching Parentheses with
|
||||
QSyntaxHighlighter" article in Qt Quarterly 31
|
||||
(\l{http://doc.qt.io/archives/qq/}) implements this. We also have
|
||||
the \l{Code Editor Example}, which shows how to implement line
|
||||
The \l{Code Editor Example} shows how to implement line
|
||||
numbers and how to highlight the current line.
|
||||
|
||||
*/
|
||||
|
@ -3,7 +3,9 @@ defineReplace(qtEmccRecommendedVersion) {
|
||||
}
|
||||
|
||||
defineReplace(qtSystemEmccVersion) {
|
||||
E_VERSION = $$system("emcc -v 2>&1 | perl -alne $$shell_quote($_ = $F[9]; s/://; print;) ")
|
||||
EMCC = $$system("emcc -v 2>&1", lines)
|
||||
EMCC_LINE = $$find(EMCC, "^.*\b(emcc)\b.*$")
|
||||
E_VERSION = $$section(EMCC_LINE, " ", 9,9)
|
||||
return ($${E_VERSION})
|
||||
}
|
||||
|
||||
|
@ -960,6 +960,10 @@
|
||||
default is used.
|
||||
\row \li thread \li Thread support is enabled. This is enabled when CONFIG
|
||||
includes \c qt, which is the default.
|
||||
\row \li utf8_source \li Specifies that the project's source files use the
|
||||
UTF-8 encoding. By default, the compiler default is used.
|
||||
\row \li hide_symbols \li Set the default visibility of symbols in the binary
|
||||
to hidden. By default, the compiler default is used.
|
||||
\row \li c99 \li C99 support is enabled. This option has no effect if
|
||||
the compiler does not support C99, or can't select the C standard.
|
||||
By default, the compiler default is used.
|
||||
|
@ -558,6 +558,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
t << destdir_d << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS") << ' '
|
||||
<< incr_deps << " $(SUBLIBS) " << target_deps << ' ' << depVar("POST_TARGETDEPS");
|
||||
} else {
|
||||
ProStringList &cmd = project->values("QMAKE_LINK_SHLIB_CMD");
|
||||
cmd[0] = cmd.at(0).toQString().replace(QLatin1String("$(OBJECTS)"), objectParts.second);
|
||||
t << destdir_d << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS")
|
||||
<< " $(OBJECTS) $(SUBLIBS) $(OBJCOMP) " << target_deps
|
||||
<< ' ' << depVar("POST_TARGETDEPS");
|
||||
|
@ -736,6 +736,18 @@ QString Win32MakefileGenerator::defaultInstall(const QString &t)
|
||||
if(targetdir.right(1) != Option::dir_sep)
|
||||
targetdir += Option::dir_sep;
|
||||
|
||||
const ProStringList &targets = project->values(ProKey(t + ".targets"));
|
||||
for (int i = 0; i < targets.size(); ++i) {
|
||||
QString src = targets.at(i).toQString(),
|
||||
dst = escapeFilePath(filePrefixRoot(root, targetdir + src.section('/', -1)));
|
||||
if (!ret.isEmpty())
|
||||
ret += "\n\t";
|
||||
ret += "$(QINSTALL) " + escapeFilePath(Option::fixPathToTargetOS(src, false)) + ' ' + dst;
|
||||
if (!uninst.isEmpty())
|
||||
uninst.append("\n\t");
|
||||
uninst.append("-$(DEL_FILE) " + dst);
|
||||
}
|
||||
|
||||
if(t == "target" && project->first("TEMPLATE") == "lib") {
|
||||
if(project->isActiveConfig("create_prl") && !project->isActiveConfig("no_install_prl") &&
|
||||
!project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
|
||||
@ -744,6 +756,8 @@ QString Win32MakefileGenerator::defaultInstall(const QString &t)
|
||||
if(slsh != -1)
|
||||
dst_prl = dst_prl.right(dst_prl.length() - slsh - 1);
|
||||
dst_prl = filePrefixRoot(root, targetdir + dst_prl);
|
||||
if (!ret.isEmpty())
|
||||
ret += "\n\t";
|
||||
ret += installMetaFile(ProKey("QMAKE_PRL_INSTALL_REPLACE"), project->first("QMAKE_INTERNAL_PRL_FILE").toQString(), dst_prl);
|
||||
if(!uninst.isEmpty())
|
||||
uninst.append("\n\t");
|
||||
|
@ -930,6 +930,7 @@ QString QUtf32::convertToUnicode(const char *chars, int len, QTextCodec::Convert
|
||||
tuple[num++] = *chars++;
|
||||
if (num == 4) {
|
||||
if (!headerdone) {
|
||||
headerdone = true;
|
||||
if (endian == DetectEndianness) {
|
||||
if (tuple[0] == 0xff && tuple[1] == 0xfe && tuple[2] == 0 && tuple[3] == 0 && endian != BigEndianness) {
|
||||
endian = LittleEndianness;
|
||||
|
@ -4192,7 +4192,7 @@ static bool isIp6(const QString &text)
|
||||
|
||||
/*!
|
||||
Returns a valid URL from a user supplied \a userInput string if one can be
|
||||
deducted. In the case that is not possible, an invalid QUrl() is returned.
|
||||
deduced. In the case that is not possible, an invalid QUrl() is returned.
|
||||
|
||||
This overload takes a \a workingDirectory path, in order to be able to
|
||||
handle relative paths. This is especially useful when handling command
|
||||
|
@ -3055,12 +3055,8 @@ bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &
|
||||
Returns \c true if the item in the column indicated by the given \a source_column
|
||||
and \a source_parent should be included in the model; otherwise returns \c false.
|
||||
|
||||
The default implementation returns \c true if the value held by the relevant item
|
||||
matches the filter string, wildcard string or regular expression.
|
||||
|
||||
\note By default, the Qt::DisplayRole is used to determine if the column
|
||||
should be accepted or not. This can be changed by setting the \l
|
||||
filterRole property.
|
||||
\note The default implementation always returns \c true. You must reimplement this
|
||||
method to get the described behavior.
|
||||
|
||||
\sa filterAcceptsRow(), setFilterFixedString(), setFilterRegExp(), setFilterWildcard()
|
||||
*/
|
||||
|
@ -72,7 +72,7 @@ HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch)
|
||||
|
||||
void (*HB_Library_Resolve(const char *library, int version, const char *symbol))()
|
||||
{
|
||||
#if !QT_CONFIG(library)
|
||||
#if !QT_CONFIG(library) || defined(Q_OS_WASM)
|
||||
Q_UNUSED(library);
|
||||
Q_UNUSED(version);
|
||||
Q_UNUSED(symbol);
|
||||
|
@ -1124,7 +1124,7 @@ int QStringView::toWCharArray(wchar_t *array) const
|
||||
if (sizeof(wchar_t) == sizeof(QChar)) {
|
||||
if (auto src = data())
|
||||
memcpy(array, src, sizeof(QChar) * size());
|
||||
return size();
|
||||
return int(size()); // ### q6sizetype
|
||||
} else {
|
||||
return QString::toUcs4_helper(reinterpret_cast<const ushort *>(data()), int(size()),
|
||||
reinterpret_cast<uint *>(array));
|
||||
|
@ -70,14 +70,14 @@ QT_WARNING_DISABLE_DEPRECATED
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
struct QT_DEPRECATED_VERSION_5_15 Q_CORE_EXPORT QLinkedListData
|
||||
struct QT_DEPRECATED_VERSION_5_15 QLinkedListData
|
||||
{
|
||||
QLinkedListData *n, *p;
|
||||
QtPrivate::RefCount ref;
|
||||
int size;
|
||||
uint sharable : 1;
|
||||
|
||||
static const QLinkedListData shared_null;
|
||||
Q_CORE_EXPORT static const QLinkedListData shared_null;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -610,7 +610,7 @@ static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOME
|
||||
\li \c {dialogs=[xp|none]}, \c xp uses XP-style native dialogs and
|
||||
\c none disables them.
|
||||
|
||||
\li \c {dpiawareness=[0|1|2} Sets the DPI awareness of the process
|
||||
\li \c {dpiawareness=[0|1|2]} Sets the DPI awareness of the process
|
||||
(see \l{High DPI Displays}, since Qt 5.4).
|
||||
\li \c {fontengine=freetype}, uses the FreeType font engine.
|
||||
\li \c {menus=[native|none]}, controls the use of native menus.
|
||||
|
@ -3264,6 +3264,7 @@ const uint qt_inv_premul_factor[256] = {
|
||||
/*!
|
||||
\namespace QColorConstants
|
||||
\inmodule QtGui
|
||||
\since 5.14
|
||||
|
||||
\brief The QColorConstants namespace contains QColor predefined constants.
|
||||
|
||||
|
@ -44,13 +44,20 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace
|
||||
{
|
||||
QVector<QShaderNode> copyOutputNodes(const QVector<QShaderNode> &nodes)
|
||||
QVector<QShaderNode> copyOutputNodes(const QVector<QShaderNode> &nodes, const QVector<QShaderGraph::Edge> &edges)
|
||||
{
|
||||
auto res = QVector<QShaderNode>();
|
||||
std::copy_if(nodes.cbegin(), nodes.cend(),
|
||||
std::back_inserter(res),
|
||||
[] (const QShaderNode &node) {
|
||||
return node.type() == QShaderNode::Output;
|
||||
[&edges] (const QShaderNode &node) {
|
||||
return node.type() == QShaderNode::Output ||
|
||||
(node.type() == QShaderNode::Function &&
|
||||
!std::any_of(edges.cbegin(),
|
||||
edges.cend(),
|
||||
[&node] (const QShaderGraph::Edge &edge) {
|
||||
return edge.sourceNodeUuid ==
|
||||
node.uuid();
|
||||
}));
|
||||
});
|
||||
return res;
|
||||
}
|
||||
@ -210,8 +217,8 @@ QVector<QShaderGraph::Statement> QShaderGraph::createStatements(const QStringLis
|
||||
|
||||
auto result = QVector<Statement>();
|
||||
QVector<Edge> currentEdges = enabledEdges;
|
||||
QVector<QUuid> currentUuids = [enabledNodes] {
|
||||
const QVector<QShaderNode> inputs = copyOutputNodes(enabledNodes);
|
||||
QVector<QUuid> currentUuids = [enabledNodes, enabledEdges] {
|
||||
const QVector<QShaderNode> inputs = copyOutputNodes(enabledNodes, enabledEdges);
|
||||
auto res = QVector<QUuid>();
|
||||
std::transform(inputs.cbegin(), inputs.cend(),
|
||||
std::back_inserter(res),
|
||||
|
@ -1099,6 +1099,7 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
|
||||
|
||||
if (reply) {
|
||||
reply->d_func()->errorString = errorString;
|
||||
reply->d_func()->httpErrorCode = errorCode;
|
||||
emit reply->finishedWithError(errorCode, errorString);
|
||||
reply = nullptr;
|
||||
if (protocolHandler)
|
||||
|
@ -158,6 +158,11 @@ QString QHttpNetworkReply::errorString() const
|
||||
return d_func()->errorString;
|
||||
}
|
||||
|
||||
QNetworkReply::NetworkError QHttpNetworkReply::errorCode() const
|
||||
{
|
||||
return d_func()->httpErrorCode;
|
||||
}
|
||||
|
||||
QString QHttpNetworkReply::reasonPhrase() const
|
||||
{
|
||||
return d_func()->reasonPhrase;
|
||||
|
@ -115,6 +115,8 @@ public:
|
||||
QString errorString() const;
|
||||
void setErrorString(const QString &error);
|
||||
|
||||
QNetworkReply::NetworkError errorCode() const;
|
||||
|
||||
QString reasonPhrase() const;
|
||||
|
||||
qint64 bytesAvailable() const;
|
||||
@ -259,6 +261,7 @@ public:
|
||||
qint64 removedContentLength;
|
||||
QPointer<QHttpNetworkConnection> connection;
|
||||
QPointer<QHttpNetworkConnectionChannel> connectionChannel;
|
||||
QNetworkReply::NetworkError httpErrorCode = QNetworkReply::NoError;
|
||||
|
||||
bool autoDecompress;
|
||||
|
||||
|
@ -428,6 +428,12 @@ void QHttpThreadDelegate::startRequest()
|
||||
|
||||
connect(httpReply, SIGNAL(cacheCredentials(QHttpNetworkRequest,QAuthenticator*)),
|
||||
this, SLOT(cacheCredentialsSlot(QHttpNetworkRequest,QAuthenticator*)));
|
||||
if (httpReply->errorCode() != QNetworkReply::NoError) {
|
||||
if (synchronous)
|
||||
synchronousFinishedWithErrorSlot(httpReply->errorCode(), httpReply->errorString());
|
||||
else
|
||||
finishedWithErrorSlot(httpReply->errorCode(), httpReply->errorString());
|
||||
}
|
||||
}
|
||||
|
||||
// This gets called from the user thread or by the synchronous HTTP timeout timer
|
||||
|
@ -1477,7 +1477,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
|
||||
// immediately set 'networkAccessible' even before we start
|
||||
// the monitor.
|
||||
#ifdef QT_NO_BEARERMANAGEMENT
|
||||
if (d->networkAccessible
|
||||
if (!d->networkAccessible
|
||||
#else
|
||||
if (d->networkAccessible == NotAccessible
|
||||
#endif // QT_NO_BEARERMANAGEMENT
|
||||
|
@ -163,11 +163,14 @@ private:
|
||||
ComPtr<QNetworkConnectionEvents> connectionEvents;
|
||||
// We can assume we have access to internet/subnet when this class is created because
|
||||
// connection has already been established to the peer:
|
||||
NLM_CONNECTIVITY connectivity =
|
||||
NLM_CONNECTIVITY(NLM_CONNECTIVITY_IPV4_INTERNET | NLM_CONNECTIVITY_IPV6_INTERNET
|
||||
| NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_SUBNET);
|
||||
NLM_CONNECTIVITY connectivity = NLM_CONNECTIVITY(
|
||||
NLM_CONNECTIVITY_IPV4_INTERNET | NLM_CONNECTIVITY_IPV6_INTERNET
|
||||
| NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_SUBNET
|
||||
| NLM_CONNECTIVITY_IPV4_LOCALNETWORK | NLM_CONNECTIVITY_IPV6_LOCALNETWORK
|
||||
| NLM_CONNECTIVITY_IPV4_NOTRAFFIC | NLM_CONNECTIVITY_IPV6_NOTRAFFIC);
|
||||
|
||||
bool sameSubnet = false;
|
||||
bool isLinkLocal = false;
|
||||
bool monitoring = false;
|
||||
bool comInitFailed = false;
|
||||
bool remoteIsIPv6 = false;
|
||||
@ -370,6 +373,7 @@ bool QNetworkConnectionMonitorPrivate::setTargets(const QHostAddress &local,
|
||||
return false;
|
||||
}
|
||||
sameSubnet = remote.isInSubnet(local, it->prefixLength());
|
||||
isLinkLocal = remote.isLinkLocal() && local.isLinkLocal();
|
||||
remoteIsIPv6 = remote.protocol() == QAbstractSocket::IPv6Protocol;
|
||||
|
||||
return connectionEvents->setTarget(iface);
|
||||
@ -461,9 +465,28 @@ void QNetworkConnectionMonitor::stopMonitoring()
|
||||
bool QNetworkConnectionMonitor::isReachable()
|
||||
{
|
||||
Q_D(QNetworkConnectionMonitor);
|
||||
NLM_CONNECTIVITY required = d->sameSubnet
|
||||
? (d->remoteIsIPv6 ? NLM_CONNECTIVITY_IPV6_SUBNET : NLM_CONNECTIVITY_IPV4_SUBNET)
|
||||
: (d->remoteIsIPv6 ? NLM_CONNECTIVITY_IPV6_INTERNET : NLM_CONNECTIVITY_IPV4_INTERNET);
|
||||
|
||||
const NLM_CONNECTIVITY RequiredSameSubnetIPv6 =
|
||||
NLM_CONNECTIVITY(NLM_CONNECTIVITY_IPV6_SUBNET | NLM_CONNECTIVITY_IPV6_LOCALNETWORK
|
||||
| NLM_CONNECTIVITY_IPV6_INTERNET);
|
||||
const NLM_CONNECTIVITY RequiredSameSubnetIPv4 =
|
||||
NLM_CONNECTIVITY(NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV4_LOCALNETWORK
|
||||
| NLM_CONNECTIVITY_IPV4_INTERNET);
|
||||
|
||||
NLM_CONNECTIVITY required;
|
||||
if (d->isLinkLocal) {
|
||||
required = NLM_CONNECTIVITY(
|
||||
d->remoteIsIPv6 ? NLM_CONNECTIVITY_IPV6_NOTRAFFIC | RequiredSameSubnetIPv6
|
||||
: NLM_CONNECTIVITY_IPV4_NOTRAFFIC | RequiredSameSubnetIPv4);
|
||||
} else if (d->sameSubnet) {
|
||||
required =
|
||||
NLM_CONNECTIVITY(d->remoteIsIPv6 ? RequiredSameSubnetIPv6 : RequiredSameSubnetIPv4);
|
||||
|
||||
} else {
|
||||
required = NLM_CONNECTIVITY(d->remoteIsIPv6 ? NLM_CONNECTIVITY_IPV6_INTERNET
|
||||
: NLM_CONNECTIVITY_IPV4_INTERNET);
|
||||
}
|
||||
|
||||
return d_func()->connectivity & required;
|
||||
}
|
||||
|
||||
@ -695,7 +718,8 @@ bool QNetworkStatusMonitor::isNetworkAccessible()
|
||||
{
|
||||
return d_func()->connectivity
|
||||
& (NLM_CONNECTIVITY_IPV4_INTERNET | NLM_CONNECTIVITY_IPV6_INTERNET
|
||||
| NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_SUBNET);
|
||||
| NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_SUBNET
|
||||
| NLM_CONNECTIVITY_IPV4_LOCALNETWORK | NLM_CONNECTIVITY_IPV6_LOCALNETWORK);
|
||||
}
|
||||
|
||||
bool QNetworkStatusMonitor::isEnabled()
|
||||
|
@ -590,7 +590,8 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
|
||||
// local address of the socket which bound on both IPv4 and IPv6 interfaces.
|
||||
// This address does not match to any special address and should not be used
|
||||
// to send the data. So, replace it with QHostAddress::Any.
|
||||
if (socketProtocol == QAbstractSocket::IPv6Protocol) {
|
||||
const uchar ipv6MappedNet[] = {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
|
||||
if (localAddress.isInSubnet(QHostAddress(ipv6MappedNet), 128 - 32)) {
|
||||
bool ok = false;
|
||||
const quint32 localIPv4 = localAddress.toIPv4Address(&ok);
|
||||
if (ok && localIPv4 == INADDR_ANY) {
|
||||
|
@ -383,4 +383,21 @@ __CRT_UUID_DECL(IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f,0x8a, 0x86,0xa
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __IExpandCollapseProvider_INTERFACE_DEFINED__
|
||||
#define __IExpandCollapseProvider_INTERFACE_DEFINED__
|
||||
DEFINE_GUID(IID_IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c,0x32, 0xec,0xb4,0x5c,0x59,0xad,0x24);
|
||||
MIDL_INTERFACE("d847d3a5-cab0-4a98-8c32-ecb45c59ad24")
|
||||
IExpandCollapseProvider : public IUnknown
|
||||
{
|
||||
public:
|
||||
virtual HRESULT STDMETHODCALLTYPE Expand() = 0;
|
||||
virtual HRESULT STDMETHODCALLTYPE Collapse() = 0;
|
||||
virtual HRESULT STDMETHODCALLTYPE get_ExpandCollapseState(__RPC__out enum ExpandCollapseState *pRetVal) = 0;
|
||||
};
|
||||
#ifdef __CRT_UUID_DECL
|
||||
__CRT_UUID_DECL(IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c,0x32, 0xec,0xb4,0x5c,0x59,0xad,0x24)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -155,6 +155,13 @@ enum WindowInteractionState {
|
||||
WindowInteractionState_NotResponding = 4
|
||||
};
|
||||
|
||||
enum ExpandCollapseState {
|
||||
ExpandCollapseState_Collapsed = 0,
|
||||
ExpandCollapseState_Expanded = 1,
|
||||
ExpandCollapseState_PartiallyExpanded = 2,
|
||||
ExpandCollapseState_LeafNode = 3
|
||||
};
|
||||
|
||||
struct UiaRect {
|
||||
double left;
|
||||
double top;
|
||||
|
@ -574,7 +574,8 @@ void QCALayerBackingStore::flush(QWindow *flushedWindow, const QRegion ®ion,
|
||||
|
||||
qCInfo(lcQpaBackingStore) << "Flushing" << subImage
|
||||
<< "to" << flushedView.layer << "of subview" << flushedView;
|
||||
QCFType<CGImageRef> cgImage = subImage.toCGImage();
|
||||
QCFType<CGImageRef> cgImage = CGImageCreateCopyWithColorSpace(
|
||||
QCFType<CGImageRef>(subImage.toCGImage()), colorSpace());
|
||||
flushedView.layer.contents = (__bridge id)static_cast<CGImageRef>(cgImage);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,120 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2020 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtGui/qtguiglobal.h>
|
||||
#if QT_CONFIG(accessibility)
|
||||
|
||||
#include "qwindowsuiaexpandcollapseprovider.h"
|
||||
#include "qwindowsuiautils.h"
|
||||
#include "qwindowscontext.h"
|
||||
|
||||
#include <QtGui/qaccessible.h>
|
||||
#include <QtCore/qloggingcategory.h>
|
||||
#include <QtCore/qstring.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
using namespace QWindowsUiAutomation;
|
||||
|
||||
|
||||
QWindowsUiaExpandCollapseProvider::QWindowsUiaExpandCollapseProvider(QAccessible::Id id) :
|
||||
QWindowsUiaBaseProvider(id)
|
||||
{
|
||||
}
|
||||
|
||||
QWindowsUiaExpandCollapseProvider::~QWindowsUiaExpandCollapseProvider() = default;
|
||||
|
||||
HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::Expand()
|
||||
{
|
||||
qCDebug(lcQpaUiAutomation) << __FUNCTION__;
|
||||
|
||||
QAccessibleInterface *accessible = accessibleInterface();
|
||||
if (!accessible)
|
||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||
|
||||
QAccessibleActionInterface *actionInterface = accessible->actionInterface();
|
||||
if (!actionInterface)
|
||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||
|
||||
if (accessible->childCount() > 0 && accessible->child(0)->state().invisible)
|
||||
actionInterface->doAction(QAccessibleActionInterface::showMenuAction());
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::Collapse()
|
||||
{
|
||||
qCDebug(lcQpaUiAutomation) << __FUNCTION__;
|
||||
|
||||
QAccessibleInterface *accessible = accessibleInterface();
|
||||
if (!accessible)
|
||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||
|
||||
QAccessibleActionInterface *actionInterface = accessible->actionInterface();
|
||||
if (!actionInterface)
|
||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||
|
||||
if (accessible->childCount() > 0 && !accessible->child(0)->state().invisible)
|
||||
actionInterface->doAction(QAccessibleActionInterface::showMenuAction());
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::get_ExpandCollapseState(__RPC__out ExpandCollapseState *pRetVal)
|
||||
{
|
||||
qCDebug(lcQpaUiAutomation) << __FUNCTION__;
|
||||
|
||||
if (!pRetVal)
|
||||
return E_INVALIDARG;
|
||||
*pRetVal = ExpandCollapseState_LeafNode;
|
||||
|
||||
QAccessibleInterface *accessible = accessibleInterface();
|
||||
if (!accessible)
|
||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||
|
||||
if (accessible->childCount() > 0)
|
||||
*pRetVal = accessible->child(0)->state().invisible ?
|
||||
ExpandCollapseState_Collapsed : ExpandCollapseState_Expanded;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_CONFIG(accessibility)
|
@ -0,0 +1,69 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2020 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWINDOWSUIAEXPANDCOLLAPSEPROVIDER_H
|
||||
#define QWINDOWSUIAEXPANDCOLLAPSEPROVIDER_H
|
||||
|
||||
#include <QtGui/qtguiglobal.h>
|
||||
#if QT_CONFIG(accessibility)
|
||||
|
||||
#include "qwindowsuiabaseprovider.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
// Implements the Expand/Collapse control pattern provider. Used for menu items with submenus.
|
||||
class QWindowsUiaExpandCollapseProvider : public QWindowsUiaBaseProvider,
|
||||
public QWindowsComBase<IExpandCollapseProvider>
|
||||
{
|
||||
Q_DISABLE_COPY_MOVE(QWindowsUiaExpandCollapseProvider)
|
||||
public:
|
||||
explicit QWindowsUiaExpandCollapseProvider(QAccessible::Id id);
|
||||
virtual ~QWindowsUiaExpandCollapseProvider() override;
|
||||
|
||||
// IExpandCollapseProvider
|
||||
HRESULT STDMETHODCALLTYPE Expand() override;
|
||||
HRESULT STDMETHODCALLTYPE Collapse() override;
|
||||
HRESULT STDMETHODCALLTYPE get_ExpandCollapseState(__RPC__out ExpandCollapseState *pRetVal) override;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_CONFIG(accessibility)
|
||||
|
||||
#endif // QWINDOWSUIAEXPANDCOLLAPSEPROVIDER_H
|
@ -53,6 +53,7 @@
|
||||
#include "qwindowsuiagridprovider.h"
|
||||
#include "qwindowsuiagriditemprovider.h"
|
||||
#include "qwindowsuiawindowprovider.h"
|
||||
#include "qwindowsuiaexpandcollapseprovider.h"
|
||||
#include "qwindowscombase.h"
|
||||
#include "qwindowscontext.h"
|
||||
#include "qwindowsuiautils.h"
|
||||
@ -341,6 +342,14 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
|
||||
*pRetVal = new QWindowsUiaInvokeProvider(id());
|
||||
}
|
||||
break;
|
||||
case UIA_ExpandCollapsePatternId:
|
||||
// Menu items with submenus.
|
||||
if (accessible->role() == QAccessible::MenuItem
|
||||
&& accessible->childCount() > 0
|
||||
&& accessible->child(0)->role() == QAccessible::PopupMenu) {
|
||||
*pRetVal = new QWindowsUiaExpandCollapseProvider(id());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ SOURCES += \
|
||||
$$PWD/qwindowsuiagridprovider.cpp \
|
||||
$$PWD/qwindowsuiagriditemprovider.cpp \
|
||||
$$PWD/qwindowsuiawindowprovider.cpp \
|
||||
$$PWD/qwindowsuiaexpandcollapseprovider.cpp \
|
||||
$$PWD/qwindowsuiautils.cpp
|
||||
|
||||
HEADERS += \
|
||||
@ -39,6 +40,7 @@ HEADERS += \
|
||||
$$PWD/qwindowsuiagridprovider.h \
|
||||
$$PWD/qwindowsuiagriditemprovider.h \
|
||||
$$PWD/qwindowsuiawindowprovider.h \
|
||||
$$PWD/qwindowsuiaexpandcollapseprovider.h \
|
||||
$$PWD/qwindowsuiautils.h
|
||||
|
||||
mingw: QMAKE_USE *= uuid
|
||||
|
@ -665,7 +665,9 @@ QImage::Format QXcbScreen::format() const
|
||||
bool needsRgbSwap;
|
||||
qt_xcb_imageFormatForVisual(connection(), screen()->root_depth, visualForId(screen()->root_visual), &format, &needsRgbSwap);
|
||||
// We are ignoring needsRgbSwap here and just assumes the backing-store will handle it.
|
||||
return format;
|
||||
if (format != QImage::Format_Invalid)
|
||||
return format;
|
||||
return QImage::Format_RGB32;
|
||||
}
|
||||
|
||||
int QXcbScreen::forcedDpi() const
|
||||
|
@ -705,15 +705,6 @@ void QAbstractItemView::setModel(QAbstractItemModel *model)
|
||||
}
|
||||
d->model = (model ? model : QAbstractItemModelPrivate::staticEmptyModel());
|
||||
|
||||
// These asserts do basic sanity checking of the model
|
||||
Q_ASSERT_X(d->model->index(0,0) == d->model->index(0,0),
|
||||
"QAbstractItemView::setModel",
|
||||
"A model should return the exact same index "
|
||||
"(including its internal id/pointer) when asked for it twice in a row.");
|
||||
Q_ASSERT_X(!d->model->index(0,0).parent().isValid(),
|
||||
"QAbstractItemView::setModel",
|
||||
"The parent of a top level index should be invalid");
|
||||
|
||||
if (d->model != QAbstractItemModelPrivate::staticEmptyModel()) {
|
||||
connect(d->model, SIGNAL(destroyed()),
|
||||
this, SLOT(_q_modelDestroyed()));
|
||||
|
@ -4706,6 +4706,12 @@ void tst_QString::fromUcs4()
|
||||
s = QString::fromUcs4(U"\u221212\U000020AC\U00010000");
|
||||
QCOMPARE(s, QString::fromUtf8("\342\210\222" "12" "\342\202\254" "\360\220\200\200"));
|
||||
#endif
|
||||
|
||||
// QTBUG-62011: don't mistake ZWNBS for BOM
|
||||
// Start with one BOM, to ensure we use the right endianness:
|
||||
const uint text[] = { 0xfeff, 97, 0xfeff, 98, 0xfeff, 99, 0xfeff, 100 };
|
||||
s = QString::fromUcs4(text, 8);
|
||||
QCOMPARE(s, QStringView(u"a\xfeff" u"b\xfeff" u"c\xfeff" "d"));
|
||||
}
|
||||
|
||||
void tst_QString::toUcs4()
|
||||
|
@ -114,6 +114,7 @@ private slots:
|
||||
void shouldSurviveCyclesDuringGraphSerialization();
|
||||
void shouldDealWithEdgesJumpingOverLayers();
|
||||
void shouldGenerateDifferentStatementsDependingOnActiveLayers();
|
||||
void shouldDealWithBranchesWithoutOutput();
|
||||
};
|
||||
|
||||
void tst_QShaderGraph::shouldHaveEdgeDefaultState()
|
||||
@ -774,6 +775,50 @@ void tst_QShaderGraph::shouldGenerateDifferentStatementsDependingOnActiveLayers(
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QShaderGraph::shouldDealWithBranchesWithoutOutput()
|
||||
{
|
||||
// GIVEN
|
||||
const auto input = createNode({
|
||||
createPort(QShaderNodePort::Output, "input")
|
||||
});
|
||||
const auto output = createNode({
|
||||
createPort(QShaderNodePort::Input, "output")
|
||||
});
|
||||
const auto danglingFunction = createNode({
|
||||
createPort(QShaderNodePort::Input, "functionInput"),
|
||||
createPort(QShaderNodePort::Output, "unbound")
|
||||
});
|
||||
const auto function = createNode({
|
||||
createPort(QShaderNodePort::Input, "functionInput"),
|
||||
createPort(QShaderNodePort::Output, "functionOutput")
|
||||
});
|
||||
|
||||
const auto graph = [=] {
|
||||
auto res = QShaderGraph();
|
||||
res.addNode(input);
|
||||
res.addNode(function);
|
||||
res.addNode(danglingFunction);
|
||||
res.addNode(output);
|
||||
res.addEdge(createEdge(input.uuid(), "input", function.uuid(), "functionInput"));
|
||||
res.addEdge(createEdge(input.uuid(), "input", danglingFunction.uuid(), "functionInput"));
|
||||
res.addEdge(createEdge(function.uuid(), "functionOutput", output.uuid(), "output"));
|
||||
return res;
|
||||
}();
|
||||
|
||||
// WHEN
|
||||
const auto statements = graph.createStatements();
|
||||
|
||||
// THEN
|
||||
// Note that no edge leads to the unbound input
|
||||
const auto expected = QVector<QShaderGraph::Statement>()
|
||||
<< createStatement(input, {}, {0})
|
||||
<< createStatement(function, {0}, {1})
|
||||
<< createStatement(output, {1}, {})
|
||||
<< createStatement(danglingFunction, {0}, {2});
|
||||
dumpStatementsIfNeeded(statements, expected);
|
||||
QCOMPARE(statements, expected);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QShaderGraph)
|
||||
|
||||
#include "tst_qshadergraph.moc"
|
||||
|
@ -134,6 +134,22 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool canBindToLowPorts()
|
||||
{
|
||||
#ifdef Q_OS_UNIX
|
||||
if (geteuid() == 0)
|
||||
return true;
|
||||
if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave)
|
||||
return true;
|
||||
// ### Which versions of iOS, watchOS and such does Apple's opening of
|
||||
// all ports apply to?
|
||||
return false;
|
||||
#else
|
||||
// Windows
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef QT_NETWORK_LIB
|
||||
static bool verifyTestNetworkSettings()
|
||||
|
@ -529,12 +529,11 @@ void tst_PlatformSocketEngine::tooManySockets()
|
||||
//---------------------------------------------------------------------------
|
||||
void tst_PlatformSocketEngine::bind()
|
||||
{
|
||||
#if !defined Q_OS_WIN
|
||||
PLATFORMSOCKETENGINE binder;
|
||||
QVERIFY(binder.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
|
||||
QVERIFY(!binder.bind(QHostAddress::AnyIPv4, 82));
|
||||
QCOMPARE(binder.error(), QAbstractSocket::SocketAccessError);
|
||||
#endif
|
||||
QCOMPARE(binder.bind(QHostAddress::AnyIPv4, 82), QtNetworkSettings::canBindToLowPorts());
|
||||
if (!QtNetworkSettings::canBindToLowPorts())
|
||||
QCOMPARE(binder.error(), QAbstractSocket::SocketAccessError);
|
||||
|
||||
PLATFORMSOCKETENGINE binder2;
|
||||
QVERIFY(binder2.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
|
||||
@ -546,6 +545,12 @@ void tst_PlatformSocketEngine::bind()
|
||||
QCOMPARE(binder3.error(), QAbstractSocket::AddressInUseError);
|
||||
|
||||
if (QtNetworkSettings::hasIPv6()) {
|
||||
PLATFORMSOCKETENGINE binder;
|
||||
QVERIFY(binder.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv6Protocol));
|
||||
QCOMPARE(binder.bind(QHostAddress::AnyIPv6, 82), QtNetworkSettings::canBindToLowPorts());
|
||||
if (!QtNetworkSettings::canBindToLowPorts())
|
||||
QCOMPARE(binder.error(), QAbstractSocket::SocketAccessError);
|
||||
|
||||
PLATFORMSOCKETENGINE binder4;
|
||||
QVERIFY(binder4.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv6Protocol));
|
||||
QVERIFY(binder4.bind(QHostAddress::AnyIPv6, 31180));
|
||||
|
@ -1,10 +1,3 @@
|
||||
[bind]
|
||||
windows-10 msvc-2015
|
||||
windows-7sp1
|
||||
[bind:[::]]
|
||||
windows
|
||||
[bind:[::]:randomport]
|
||||
windows
|
||||
[timeoutConnect:ip]
|
||||
windows
|
||||
# QTBUG-66247
|
||||
|
@ -523,7 +523,7 @@ void tst_QTcpSocket::bind_data()
|
||||
continue; // link-local bind will fail, at least on Linux, so skip it.
|
||||
|
||||
QString ip(entry.ip().toString());
|
||||
QTest::newRow(ip.toLatin1().constData()) << ip << 0 << true << ip;
|
||||
QTest::addRow("%s:0", ip.toLatin1().constData()) << ip << 0 << true << ip;
|
||||
|
||||
if (!testIpv6 && entry.ip().protocol() == QAbstractSocket::IPv6Protocol)
|
||||
testIpv6 = true;
|
||||
@ -531,9 +531,9 @@ void tst_QTcpSocket::bind_data()
|
||||
}
|
||||
|
||||
// test binding to localhost
|
||||
QTest::newRow("0.0.0.0") << "0.0.0.0" << 0 << true << "0.0.0.0";
|
||||
QTest::newRow("0.0.0.0:0") << "0.0.0.0" << 0 << true << "0.0.0.0";
|
||||
if (testIpv6)
|
||||
QTest::newRow("[::]") << "::" << 0 << true << "::";
|
||||
QTest::newRow("[::]:0") << "::" << 0 << true << "::";
|
||||
|
||||
// and binding with a port number...
|
||||
// Since we want to test that we got the port number we asked for, we need a random port number.
|
||||
@ -551,16 +551,16 @@ void tst_QTcpSocket::bind_data()
|
||||
knownBad << "198.51.100.1";
|
||||
knownBad << "2001:0DB8::1";
|
||||
foreach (const QString &badAddress, knownBad) {
|
||||
QTest::newRow(badAddress.toLatin1().constData()) << badAddress << 0 << false << QString();
|
||||
QTest::addRow("%s:0", badAddress.toLatin1().constData()) << badAddress << 0 << false << QString();
|
||||
}
|
||||
|
||||
#ifdef Q_OS_UNIX
|
||||
// try to bind to a privileged ports
|
||||
// we should fail if we're not root (unless the ports are in use!)
|
||||
QTest::newRow("127.0.0.1:1") << "127.0.0.1" << 1 << !geteuid() << (geteuid() ? QString() : "127.0.0.1");
|
||||
QTest::newRow("127.0.0.1:1") << "127.0.0.1" << 1 << QtNetworkSettings::canBindToLowPorts()
|
||||
<< (QtNetworkSettings::canBindToLowPorts() ? "127.0.0.1" : QString());
|
||||
if (testIpv6)
|
||||
QTest::newRow("[::]:1") << "::" << 1 << !geteuid() << (geteuid() ? QString() : "::");
|
||||
#endif
|
||||
QTest::newRow("[::]:1") << "::" << 1 << QtNetworkSettings::canBindToLowPorts()
|
||||
<< (QtNetworkSettings::canBindToLowPorts() ? "::" : QString());
|
||||
}
|
||||
|
||||
void tst_QTcpSocket::bind()
|
||||
@ -585,7 +585,7 @@ void tst_QTcpSocket::bind()
|
||||
|
||||
if (successExpected) {
|
||||
bool randomPort = port == -1;
|
||||
int attemptsLeft = 5; // only used with randomPort
|
||||
int attemptsLeft = 5; // only used with randomPort or Windows
|
||||
do {
|
||||
if (randomPort) {
|
||||
// try to get a random port number
|
||||
|
Loading…
Reference in New Issue
Block a user