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

This commit is contained in:
Liang Qi 2016-02-11 12:57:10 +00:00 committed by The Qt Project
commit 321658d288
105 changed files with 875 additions and 960 deletions

View File

@ -0,0 +1,39 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://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 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <dlfcn.h>
int main(int, char **)
{
dlopen(0, 0);
}

View File

@ -0,0 +1,3 @@
SOURCES = libdl.cpp
CONFIG -= qt dylib
LIBS += -ldl

6
configure vendored
View File

@ -4829,6 +4829,12 @@ if [ "$CFG_LIBPNG" = "auto" ]; then
fi
fi
# detect dl
if ! compileTest unix/libdl "libdl"; then
QMakeVar add DEFINES QT_NO_DYNAMIC_LIBRARY
QMAKE_CONFIG="$QMAKE_CONFIG no-libdl"
fi
if [ "$CFG_EGLFS" = "yes" ]; then
if [ "$CFG_EGL" = "no" ]; then
echo "The EGLFS plugin requires EGL support and cannot be built"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -103,7 +103,6 @@ Dialog::Dialog(QWidget *parent)
QHBoxLayout *horizontalLayout = new QHBoxLayout(this);
QGroupBox *groupBox = new QGroupBox(QGuiApplication::applicationDisplayName(), this);
horizontalLayout->addWidget(groupBox);
horizontalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
verticalLayout = new QVBoxLayout(groupBox);
} else {
verticalLayout = new QVBoxLayout(this);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 656 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1492,21 +1492,21 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
if (plist_in_file.open(QIODevice::ReadOnly)) {
QTextStream plist_in(&plist_in_file);
QString plist_in_text = plist_in.readAll();
plist_in_text.replace("@ICON@",
plist_in_text.replace(QLatin1String("@ICON@"),
(project->isEmpty("ICON") ? QString("") : project->first("ICON").toQString().section(Option::dir_sep, -1)));
if (project->first("TEMPLATE") == "app") {
plist_in_text.replace("@EXECUTABLE@", project->first("QMAKE_ORIG_TARGET").toQString());
plist_in_text.replace(QLatin1String("@EXECUTABLE@"), project->first("QMAKE_ORIG_TARGET").toQString());
} else {
plist_in_text.replace("@LIBRARY@", project->first("QMAKE_ORIG_TARGET").toQString());
plist_in_text.replace(QLatin1String("@LIBRARY@"), project->first("QMAKE_ORIG_TARGET").toQString());
}
QString bundlePrefix = project->first("QMAKE_TARGET_BUNDLE_PREFIX").toQString();
if (bundlePrefix.isEmpty())
bundlePrefix = "com.yourcompany";
plist_in_text.replace("@BUNDLEIDENTIFIER@", bundlePrefix + '.' + QLatin1String("${PRODUCT_NAME:rfc1034identifier}"));
plist_in_text.replace(QLatin1String("@BUNDLEIDENTIFIER@"), bundlePrefix + '.' + QLatin1String("${PRODUCT_NAME:rfc1034identifier}"));
if (!project->values("VERSION").isEmpty()) {
plist_in_text.replace("@SHORT_VERSION@", project->first("VER_MAJ") + "." + project->first("VER_MIN"));
plist_in_text.replace(QLatin1String("@SHORT_VERSION@"), project->first("VER_MAJ") + "." + project->first("VER_MIN"));
}
plist_in_text.replace("@TYPEINFO@",
plist_in_text.replace(QLatin1String("@TYPEINFO@"),
(project->isEmpty("QMAKE_PKGINFO_TYPEINFO")
? QString::fromLatin1("????") : project->first("QMAKE_PKGINFO_TYPEINFO").left(4).toQString()));
QFile plist_out_file(Option::output_dir + "/Info.plist");
@ -1709,9 +1709,9 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
QTextStream defaultSchemeStream(&defaultSchemeFile);
QString schemeData = defaultSchemeStream.readAll();
schemeData.replace("@QMAKE_ORIG_TARGET@", target);
schemeData.replace("@TARGET_PBX_KEY@", keyFor(pbx_dir + "QMAKE_PBX_TARGET"));
schemeData.replace("@TEST_BUNDLE_PBX_KEY@", keyFor("QMAKE_TEST_BUNDLE_REFERENCE"));
schemeData.replace(QLatin1String("@QMAKE_ORIG_TARGET@"), target);
schemeData.replace(QLatin1String("@TARGET_PBX_KEY@"), keyFor(pbx_dir + "QMAKE_PBX_TARGET"));
schemeData.replace(QLatin1String("@TEST_BUNDLE_PBX_KEY@"), keyFor("QMAKE_TEST_BUNDLE_REFERENCE"));
QTextStream outputSchemeStream(&outputSchemeFile);
outputSchemeStream << schemeData;

View File

@ -1131,8 +1131,8 @@ MakefileGenerator::writeObj(QTextStream &t, const char *src)
ProStringList::ConstIterator oit = objl.begin();
ProStringList::ConstIterator sit = srcl.begin();
QString stringSrc("$src");
QString stringObj("$obj");
QLatin1String stringSrc("$src");
QLatin1String stringObj("$obj");
for(;sit != srcl.end() && oit != objl.end(); ++oit, ++sit) {
if((*sit).isEmpty())
continue;
@ -2283,7 +2283,7 @@ MakefileGenerator::writeHeader(QTextStream &t)
t << "# Project: " << fileFixify(project->projectFile()) << endl;
t << "# Template: " << var("TEMPLATE") << endl;
if(!project->isActiveConfig("build_pass"))
t << "# Command: " << build_args().replace("$(QMAKE)", var("QMAKE_QMAKE")) << endl;
t << "# Command: " << build_args().replace(QLatin1String("$(QMAKE)"), var("QMAKE_QMAKE")) << endl;
t << "#############################################################################\n";
t << endl;
QString ofile = Option::fixPathToTargetOS(Option::output.fileName());
@ -3184,7 +3184,7 @@ MakefileGenerator::pkgConfigFixPath(QString path) const
{
QString prefix = pkgConfigPrefix();
if(path.startsWith(prefix))
path.replace(prefix, "${prefix}");
path.replace(prefix, QLatin1String("${prefix}"));
return path;
}
@ -3336,7 +3336,7 @@ static QString windowsifyPath(const QString &str)
{
// The paths are escaped in prl files, so every slash needs to turn into two backslashes.
// Then each backslash needs to be escaped for sed. And another level for C quoting here.
return QString(str).replace('/', "\\\\\\\\");
return QString(str).replace('/', QLatin1String("\\\\\\\\"));
}
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
@ -3365,8 +3365,7 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
QString MakefileGenerator::shellQuote(const QString &str)
{
return isWindowsShell() ? QMakeInternal::IoUtils::shellQuoteWin(str)
: QMakeInternal::IoUtils::shellQuoteUnix(str);
return isWindowsShell() ? IoUtils::shellQuoteWin(str) : IoUtils::shellQuoteUnix(str);
}
QT_END_NAMESPACE

View File

@ -173,12 +173,12 @@ UnixMakefileGenerator::init()
pchBaseName += project->first("QMAKE_ORIG_TARGET").toQString();
// replace place holders
pchFlags.replace("${QMAKE_PCH_INPUT}",
pchFlags.replace(QLatin1String("${QMAKE_PCH_INPUT}"),
escapeFilePath(project->first("PRECOMPILED_HEADER").toQString()));
pchFlags.replace("${QMAKE_PCH_OUTPUT_BASE}", escapeFilePath(pchBaseName));
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT_BASE}"), escapeFilePath(pchBaseName));
if (project->isActiveConfig("icc_pch_style")) {
// icc style
pchFlags.replace("${QMAKE_PCH_OUTPUT}",
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"),
escapeFilePath(pchBaseName + project->first("QMAKE_PCH_OUTPUT_EXT")));
} else {
// gcc style (including clang_pch_style)
@ -192,7 +192,7 @@ UnixMakefileGenerator::init()
ProString language = project->first(ProKey("QMAKE_LANGUAGE_" + compiler));
if (!language.isEmpty()) {
pchFlags.replace("${QMAKE_PCH_OUTPUT}",
pchFlags.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"),
escapeFilePath(pchBaseName + language + headerSuffix));
}
}

View File

@ -532,7 +532,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
<< "ld -r -o " << incr_target_dir_f << ' ' << link_deps << endl;
//communicated below
ProStringList &cmd = project->values("QMAKE_LINK_SHLIB_CMD");
cmd[0] = cmd.at(0).toQString().replace("$(OBJECTS) ", "$(INCREMENTAL_OBJECTS)"); //ick
cmd[0] = cmd.at(0).toQString().replace(QLatin1String("$(OBJECTS) "), QLatin1String("$(INCREMENTAL_OBJECTS)")); //ick
cmd.append(incr_target_dir_f);
deps.prepend(incr_target_dir_d + ' ');
incr_deps = "$(INCREMENTAL_OBJECTS)";
@ -700,7 +700,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << destdir_d << "$(TARGET): " << depVar("PRE_TARGETDEPS")
<< ' ' << depVar("POST_TARGETDEPS") << valList(escapeDependencyPaths(build)) << "\n\t";
ar = project->first("QMAKE_AR_CMD").toQString();
ar.replace("$(OBJECTS)", escapeFilePaths(build).join(' '));
ar.replace(QLatin1String("$(OBJECTS)"), escapeFilePaths(build).join(' '));
} else {
t << destdir_d << escapeDependencyPath(*libit) << ": "
<< valList(escapeDependencyPaths(build)) << "\n\t";
@ -1079,8 +1079,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
<< "\n\techo \"// Automatically generated, do not modify\" > " << sourceFile_f
<< "\n\trm -f " << escapeFilePath(pchOutput);
pchFlags.replace("${QMAKE_PCH_TEMP_SOURCE}", sourceFile_f)
.replace("${QMAKE_PCH_TEMP_OBJECT}", escapeFilePath(objectFile));
pchFlags.replace(QLatin1String("${QMAKE_PCH_TEMP_SOURCE}"), sourceFile_f)
.replace(QLatin1String("${QMAKE_PCH_TEMP_OBJECT}"), escapeFilePath(objectFile));
} else {
// gcc style (including clang_pch_style)
ProString header_prefix = project->first("QMAKE_PRECOMP_PREFIX");
@ -1099,9 +1099,9 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
<< escapeDependencyPaths(findDependencies(pchInput)).join(" \\\n\t\t")
<< "\n\t" << mkdir_p_asstring(pchOutputDir);
}
pchFlags.replace("${QMAKE_PCH_INPUT}", escapeFilePath(pchInput))
.replace("${QMAKE_PCH_OUTPUT_BASE}", escapeFilePath(pchBaseName.toQString()))
.replace("${QMAKE_PCH_OUTPUT}", escapeFilePath(pchOutput.toQString()));
pchFlags.replace(QLatin1String("${QMAKE_PCH_INPUT}"), escapeFilePath(pchInput))
.replace(QLatin1String("${QMAKE_PCH_OUTPUT_BASE}"), escapeFilePath(pchBaseName.toQString()))
.replace(QLatin1String("${QMAKE_PCH_OUTPUT}"), escapeFilePath(pchOutput.toQString()));
QString compilerExecutable;
if (compiler == "C" || compiler == "OBJC")
@ -1147,7 +1147,7 @@ void UnixMakefileGenerator::init2()
ProStringList &ar_cmd = project->values("QMAKE_AR_CMD");
if (!ar_cmd.isEmpty())
ar_cmd[0] = ar_cmd.at(0).toQString().replace("(TARGET)","(TARGETA)");
ar_cmd[0] = ar_cmd.at(0).toQString().replace(QLatin1String("(TARGET)"), QLatin1String("(TARGETA)"));
else
ar_cmd.append("$(AR) $(TARGETA) $(OBJECTS)");
if (!project->isEmpty("QMAKE_BUNDLE")) {

View File

@ -142,7 +142,7 @@ bool CeSdkHandler::parseMsBuildFile(QFile *file, CeSdkInfo *info)
QSettings sdkRootPathRegistry(regString, QSettings::NativeFormat);
const QString erg = sdkRootPathRegistry.value(QStringLiteral(".")).toString();
const QString fullSdkRootPath = erg + sdkRootPath.mid(endIndex + 1);
const QString rootString = QStringLiteral("$(SdkRootPath)");
const QLatin1String rootString("$(SdkRootPath)");
includePath = includePath.replace(rootString, fullSdkRootPath);
libraryPath = libraryPath.replace(rootString, fullSdkRootPath);

View File

@ -46,7 +46,7 @@ QString MingwMakefileGenerator::escapeDependencyPath(const QString &path) const
{
QString ret = path;
ret.replace('\\', "/"); // ### this shouldn't be here
ret.replace(' ', "\\ ");
ret.replace(' ', QLatin1String("\\ "));
return ret;
}

View File

@ -323,7 +323,7 @@ static QString vcxCommandSeparator()
static QString unquote(const QString &value)
{
QString result = value;
result.replace(QStringLiteral("\\\""), QStringLiteral("\""));
result.replace(QLatin1String("\\\""), QLatin1String("\""));
return result;
}

View File

@ -49,7 +49,7 @@ static QString nmakePathList(const QStringList &list)
pathList.append(QDir::cleanPath(path));
return QDir::toNativeSeparators(pathList.join(QLatin1Char(';')))
.replace('#', QStringLiteral("^#")).replace('$', QStringLiteral("$$"));
.replace('#', QLatin1String("^#")).replace('$', QLatin1String("$$"));
}
NmakeMakefileGenerator::NmakeMakefileGenerator() : Win32MakefileGenerator(), usePCH(false)
@ -327,7 +327,7 @@ QString NmakeMakefileGenerator::var(const ProKey &value) const
QString precompRule = QString("-c -FI%1 -Yu%2 -Fp%3")
.arg(precompH_f, precompH_f, escapeFilePath(precompPch));
QString p = MakefileGenerator::var(value);
p.replace("-c", precompRule);
p.replace(QLatin1String("-c"), precompRule);
// Cannot use -Gm with -FI & -Yu, as this gives an
// internal compiler error, on the newer compilers
// ### work-around for a VS 2003 bug. Move to some prf file or remove completely.

View File

@ -697,12 +697,12 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
}
QString slnConf = _slnSolutionConf;
if (!project->isEmpty("VCPROJ_ARCH")) {
slnConf.replace(QString("|Win32"), "|" + project->first("VCPROJ_ARCH"));
slnConf.replace(QLatin1String("|Win32"), "|" + project->first("VCPROJ_ARCH"));
} else if (!project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH")) {
QString slnPlatform = QString("|") + project->values("CE_SDK").join(' ') + " (" + project->first("CE_ARCH") + ")";
slnConf.replace(QString("|Win32"), slnPlatform);
slnConf.replace(QLatin1String("|Win32"), slnPlatform);
} else if (is64Bit) {
slnConf.replace(QString("|Win32"), "|x64");
slnConf.replace(QLatin1String("|Win32"), QLatin1String("|x64"));
}
t << slnConf;
@ -1698,12 +1698,12 @@ QString VcprojGenerator::replaceExtraCompilerVariables(
if(defines.isEmpty())
defines.append(varGlue("PRL_EXPORT_DEFINES"," -D"," -D","") +
varGlue("DEFINES"," -D"," -D",""));
ret.replace("$(DEFINES)", defines.first().toQString());
ret.replace(QLatin1String("$(DEFINES)"), defines.first().toQString());
ProStringList &incpath = project->values("VCPROJ_MAKEFILE_INCPATH");
if(incpath.isEmpty() && !this->var("MSVCPROJ_INCPATH").isEmpty())
incpath.append(this->var("MSVCPROJ_INCPATH"));
ret.replace("$(INCPATH)", incpath.join(' '));
ret.replace(QLatin1String("$(INCPATH)"), incpath.join(' '));
return ret;
}

View File

@ -398,7 +398,7 @@ void Win32MakefileGenerator::processRcFileVar()
project->values("RC_FILE").first() = fi.absoluteFilePath();
}
resFile.replace(".rc", Option::res_ext);
resFile.replace(QLatin1String(".rc"), Option::res_ext);
project->values("RES_FILE").prepend(fileInfo(resFile).fileName());
QString resDestDir;
if (project->isActiveConfig("staticlib"))
@ -768,8 +768,8 @@ QString Win32MakefileGenerator::escapeFilePath(const QString &path) const
QString Win32MakefileGenerator::cQuoted(const QString &str)
{
QString ret = str;
ret.replace(QLatin1Char('\\'), QStringLiteral("\\\\"));
ret.replace(QLatin1Char('"'), QStringLiteral("\\\""));
ret.replace(QLatin1Char('\\'), QLatin1String("\\\\"));
ret.replace(QLatin1Char('"'), QLatin1String("\\\""));
ret.prepend(QLatin1Char('"'));
ret.append(QLatin1Char('"'));
return ret;

View File

@ -136,11 +136,11 @@ QString XmlOutput::doConversion(const QString &text)
}
if (conversion == XMLConversion) {
output.replace('\"', "&quot;");
output.replace('\'', "&apos;");
output.replace('\"', QLatin1String("&quot;"));
output.replace('\'', QLatin1String("&apos;"));
} else if (conversion == EscapeConversion) {
output.replace('\"', "\\\"");
output.replace('\'', "\\\'");
output.replace('\"', QLatin1String("\\\""));
output.replace('\'', QLatin1String("\\\'"));
}
return output;
}

View File

@ -125,7 +125,7 @@ static int doSed(int argc, char **argv)
SedSubst subst;
subst.from = QRegExp(phases.at(0), matchcase);
subst.to = phases.at(1);
subst.to.replace("\\\\", "\\"); // QString::replace(rx, sub) groks \1, but not \\.
subst.to.replace(QLatin1String("\\\\"), QLatin1String("\\")); // QString::replace(rx, sub) groks \1, but not \\.
substs << subst;
}
} else if (argv[i][0] == '-' && argv[i][1] != 0) {

View File

@ -423,6 +423,7 @@ QList<QByteArray> QIcuCodec::availableCodecs()
QList<int> QIcuCodec::availableMibs()
{
QList<int> mibs;
mibs.reserve(mibToNameSize + 1);
for (int i = 0; i < mibToNameSize; ++i)
mibs += mibToName[i].mib;

View File

@ -53,7 +53,7 @@ QT_END_NAMESPACE
# include "qcoreapplication.h"
#endif
#ifdef Q_OS_MAC
#ifdef Q_OS_DARWIN
# include "private/qcore_mac_p.h"
#endif
@ -171,7 +171,7 @@ QSettings *QLibraryInfoPrivate::findConfiguration()
if (QFile::exists(qtconfig))
return new QSettings(qtconfig, QSettings::IniFormat);
#else
#ifdef Q_OS_MAC
#ifdef Q_OS_DARWIN
CFBundleRef bundleRef = CFBundleGetMainBundle();
if (bundleRef) {
QCFType<CFURLRef> urlRef = CFBundleCopyResourceURL(bundleRef,
@ -409,12 +409,11 @@ static const struct {
/*!
Returns the location specified by \a loc.
*/
QString
QLibraryInfo::location(LibraryLocation loc)
{
#ifdef QT_BUILD_QMAKE
#ifdef QT_BUILD_QMAKE // ends inside rawLocation !
QString ret = rawLocation(loc, FinalPaths);
// Automatically prepend the sysroot to target paths
@ -433,7 +432,7 @@ QLibraryInfo::location(LibraryLocation loc)
QString
QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
{
#endif
#endif // QT_BUILD_QMAKE, started inside location !
QString ret;
#ifdef QT_BUILD_QMAKE
// Logic for choosing the right data source: if EffectivePaths are requested
@ -549,25 +548,26 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
} else {
// we make any other path absolute to the prefix directory
baseDir = rawLocation(PrefixPath, group);
}
#else
if (loc == PrefixPath) {
if (QCoreApplication::instance()) {
#ifdef Q_OS_MAC
#ifdef Q_OS_DARWIN
CFBundleRef bundleRef = CFBundleGetMainBundle();
if (bundleRef) {
QCFType<CFURLRef> urlRef = CFBundleCopyBundleURL(bundleRef);
if (urlRef) {
QCFString path = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle);
#ifdef Q_OS_MACX
#ifdef Q_OS_OSX
QString bundleContentsDir = QString(path) + QLatin1String("/Contents/");
if (QDir(bundleContentsDir).exists())
return QDir::cleanPath(bundleContentsDir + ret);
#else
return QDir::cleanPath(QString(path) + QLatin1Char('/') + ret); // iOS
#endif
#endif // Q_OS_OSX
}
}
#endif
#endif // Q_OS_DARWIN
// We make the prefix path absolute to the executable's directory.
baseDir = QCoreApplication::applicationDirPath();
} else {
@ -576,8 +576,8 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
} else {
// we make any other path absolute to the prefix directory
baseDir = location(PrefixPath);
#endif
}
#endif // QT_BUILD_QMAKE
ret = QDir::cleanPath(baseDir + QLatin1Char('/') + ret);
}
return ret;

View File

@ -266,17 +266,21 @@ QString QFileSystemEntry::completeSuffix() const
bool QFileSystemEntry::isRelative() const
{
resolveFilePath();
return (m_filePath.isEmpty() || (!m_filePath.isEmpty() && (m_filePath.at(0).unicode() != '/')
&& (!(m_filePath.length() >= 2 && m_filePath.at(1).unicode() == ':'))));
return (m_filePath.isEmpty()
|| (m_filePath.at(0).unicode() != '/'
&& !(m_filePath.length() >= 2 && m_filePath.at(1).unicode() == ':')));
}
bool QFileSystemEntry::isAbsolute() const
{
resolveFilePath();
return (!m_filePath.isEmpty() && ((m_filePath.length() >= 3
&& (m_filePath.at(0).isLetter() && m_filePath.at(1).unicode() == ':' && m_filePath.at(2).unicode() == '/'))
|| (m_filePath.length() >= 2 && (m_filePath.at(0) == QLatin1Char('/') && m_filePath.at(1) == QLatin1Char('/')))
));
return ((m_filePath.length() >= 3
&& m_filePath.at(0).isLetter()
&& m_filePath.at(1).unicode() == ':'
&& m_filePath.at(2).unicode() == '/')
|| (m_filePath.length() >= 2
&& m_filePath.at(0) == QLatin1Char('/')
&& m_filePath.at(1) == QLatin1Char('/')));
}
#else
bool QFileSystemEntry::isRelative() const

View File

@ -171,7 +171,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
// now look for a thread to insert
bool found = false;
for (QWindowsFileSystemWatcherEngineThread *thread : qAsConst(threads)) {
QMutexLocker(&(thread->mutex));
QMutexLocker locker(&(thread->mutex));
if (thread->handles.count() < MAXIMUM_WAIT_OBJECTS) {
DEBUG() << "Added handle" << handle.handle << "for" << absolutePath << "to watch" << fileInfo.absoluteFilePath()
<< "to existing thread " << thread;

View File

@ -282,7 +282,9 @@ void QStringListModel::sort(int, Qt::SortOrder order)
QModelIndexList oldList = persistentIndexList();
QModelIndexList newList;
for (int i = 0; i < oldList.count(); ++i)
const int numOldIndexes = oldList.count();
newList.reserve(numOldIndexes);
for (int i = 0; i < numOldIndexes; ++i)
newList.append(index(forwarding.at(oldList.at(i).row()), 0));
changePersistentIndexList(oldList, newList);

View File

@ -3543,7 +3543,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
QMutexLocker &locker)
{
const int *argumentTypes = c->argumentTypes.load();
if (!argumentTypes && argumentTypes != &DIRECT_CONNECTION_ONLY) {
if (!argumentTypes) {
QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal);
argumentTypes = queuedConnectionTypes(m.parameterTypes());
if (!argumentTypes) // cannot queue arguments

View File

@ -39,4 +39,4 @@ darwin {
OBJECTIVE_SOURCES += plugin/quuid_darwin.mm
}
LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
!no-libdl: LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD

View File

@ -292,7 +292,7 @@ bool QLibraryPrivate::unload_sys()
return true;
}
#ifdef Q_OS_LINUX
#if defined(Q_OS_LINUX) && !defined(QT_NO_DYNAMIC_LIBRARY)
Q_CORE_EXPORT QFunctionPointer qt_linux_find_symbol_sys(const char *symbol)
{
return QFunctionPointer(dlsym(RTLD_DEFAULT, symbol));

View File

@ -161,7 +161,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
case AmPmSection: hour = (newVal == 0 ? hour % 12 : (hour % 12) + 12); break;
default:
qWarning("QDateTimeParser::setDigit() Internal error (%s)",
qPrintable(sectionName(node.type)));
qPrintable(node.name()));
break;
}
@ -212,7 +212,7 @@ int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const
default: break;
}
qWarning("QDateTimeParser::absoluteMax() Internal error (%s)",
qPrintable(sectionName(sn.type)));
qPrintable(sn.name()));
return -1;
}
@ -241,7 +241,7 @@ int QDateTimeParser::absoluteMin(int s) const
default: break;
}
qWarning("QDateTimeParser::absoluteMin() Internal error (%s, %0x)",
qPrintable(sectionName(sn.type)), sn.type);
qPrintable(sn.name()), sn.type);
return -1;
}
@ -296,7 +296,7 @@ int QDateTimeParser::sectionPos(const SectionNode &sn) const
default: break;
}
if (sn.pos == -1) {
qWarning("QDateTimeParser::sectionPos Internal error (%s)", qPrintable(sectionName(sn.type)));
qWarning("QDateTimeParser::sectionPos Internal error (%s)", qPrintable(sn.name()));
return -1;
}
return sn.pos;
@ -520,7 +520,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
last.pos = -1;
// for (int i=0; i<sectionNodes.size(); ++i) {
// QDTPDEBUG << sectionName(sectionNodes.at(i).type) << sectionNodes.at(i).count;
// QDTPDEBUG << sectionNodes.at(i).name() << sectionNodes.at(i).count;
// }
QDTPDEBUG << newFormat << displayFormat;
@ -631,7 +631,7 @@ int QDateTimeParser::sectionMaxSize(Section s, int count) const
case TimeSectionMask:
case DateSectionMask:
qWarning("QDateTimeParser::sectionMaxSize: Invalid section %s",
sectionName(s).toLatin1().constData());
SectionNode::name(s).toLatin1().constData());
case NoSectionIndex:
case FirstSectionIndex:
@ -697,7 +697,7 @@ int QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionInde
const SectionNode &sn = sectionNode(sectionIndex);
if ((sn.type & Internal) == Internal) {
qWarning("QDateTimeParser::parseSection Internal error (%s %d)",
qPrintable(sectionName(sn.type)), sectionIndex);
qPrintable(sn.name()), sectionIndex);
return -1;
}
@ -705,7 +705,7 @@ int QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionInde
QString sectiontext = text.mid(index, sectionmaxsize);
int sectiontextSize = sectiontext.size();
QDTPDEBUG << "sectionValue for" << sectionName(sn.type)
QDTPDEBUG << "sectionValue for" << sn.name()
<< "with text" << text << "and st" << sectiontext
<< text.mid(index, sectionmaxsize)
<< index;
@ -855,7 +855,7 @@ int QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionInde
break; }
default:
qWarning("QDateTimeParser::parseSection Internal error (%s %d)",
qPrintable(sectionName(sn.type)), sectionIndex);
qPrintable(sn.name()), sectionIndex);
return -1;
}
@ -916,7 +916,7 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
int used;
num = parseSection(currentValue, index, input, cursorPosition, pos, tmpstate, &used);
QDTPDEBUG << "sectionValue" << sectionName(sectionType(index)) << input
QDTPDEBUG << "sectionValue" << sn.name() << input
<< "pos" << pos << "used" << used << stateName(tmpstate);
if (fixup && tmpstate == Intermediate && used < sn.count) {
const FieldInfo fi = fieldInfo(index);
@ -934,7 +934,7 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
break;
}
QDTPDEBUG << index << sectionName(sectionType(index)) << "is set to"
QDTPDEBUG << index << sn.name() << "is set to"
<< pos << "state is" << stateName(state);
@ -954,7 +954,7 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
case AmPmSection: current = &ampm; break;
default:
qWarning("QDateTimeParser::parse Internal error (%s)",
qPrintable(sectionName(sn.type)));
qPrintable(sn.name()));
break;
}
if (!current) {
@ -962,7 +962,7 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
return StateNode();
}
if (isSet & sn.type && *current != num) {
QDTPDEBUG << "CONFLICT " << sectionName(sn.type) << *current << num;
QDTPDEBUG << "CONFLICT " << sn.name() << *current << num;
conflicts = true;
if (index != currentSectionIndex || num == -1) {
continue;
@ -1046,15 +1046,16 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
const QLocale loc = locale();
for (int i=0; i<sectionNodesCount; ++i) {
const Section thisSectionType = sectionType(i);
if (thisSectionType & (DaySection)) {
input.replace(sectionPos(i), sectionSize(i), loc.toString(day));
} else if (thisSectionType & (DayOfWeekSectionShort|DayOfWeekSectionLong)) {
const SectionNode sn = sectionNode(i);
if (sn.type & DaySection) {
input.replace(sectionPos(sn), sectionSize(i), loc.toString(day));
} else if (sn.type & (DayOfWeekSectionShort | DayOfWeekSectionLong)) {
const int dayOfWeek = QDate(year, month, day).dayOfWeek();
const QLocale::FormatType dayFormat = (thisSectionType == DayOfWeekSectionShort
const QLocale::FormatType dayFormat =
(sn.type == DayOfWeekSectionShort
? QLocale::ShortFormat : QLocale::LongFormat);
const QString dayName(loc.dayName(dayOfWeek, dayFormat));
input.replace(sectionPos(i), sectionSize(i), dayName);
input.replace(sectionPos(sn), sectionSize(i), dayName);
}
}
} else {
@ -1168,7 +1169,7 @@ end:
toMin = newCurrentValue.daysTo(minimum);
toMax = newCurrentValue.daysTo(maximum);
}
const int maxChange = QDateTimeParser::maxChange(i);
const int maxChange = sn.maxChange();
if (toMin > maxChange) {
QDTPDEBUG << "invalid because toMin > maxChange" << toMin
<< maxChange << t << newCurrentValue << minimum;
@ -1182,7 +1183,7 @@ end:
const int min = getDigit(minimum, i);
if (min == -1) {
qWarning("QDateTimeParser::parse Internal error 4 (%s)",
qPrintable(sectionName(sn.type)));
qPrintable(sn.name()));
state = Invalid;
done = true;
break;
@ -1194,7 +1195,7 @@ end:
pos = -1;
if (!potentialValue(t.simplified(), min, max, i, newCurrentValue, pos)) {
QDTPDEBUG << "invalid because potentialValue(" << t.simplified() << min << max
<< sectionName(sn.type) << "returned" << toMax << toMin << pos;
<< sn.name() << "returned" << toMax << toMin << pos;
state = Invalid;
done = true;
break;
@ -1360,22 +1361,20 @@ int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex
/*!
\internal
returns
0 if str == tr("AM")
1 if str == tr("PM")
2 if str can become tr("AM")
3 if str can become tr("PM")
4 if str can become tr("PM") and can become tr("AM")
-1 can't become anything sensible
Returns
AM if str == tr("AM")
PM if str == tr("PM")
PossibleAM if str can become tr("AM")
PossiblePM if str can become tr("PM")
PossibleBoth if str can become tr("PM") and can become tr("AM")
Neither if str can't become anything sensible
*/
int QDateTimeParser::findAmPm(QString &str, int sectionIndex, int *used) const
QDateTimeParser::AmPmFinder QDateTimeParser::findAmPm(QString &str, int sectionIndex, int *used) const
{
const SectionNode &s = sectionNode(sectionIndex);
if (s.type != AmPmSection) {
qWarning("QDateTimeParser::findAmPm Internal error");
return -1;
return Neither;
}
if (used)
*used = str.size();
@ -1452,10 +1451,9 @@ int QDateTimeParser::findAmPm(QString &str, int sectionIndex, int *used) const
Max number of units that can be changed by this section.
*/
int QDateTimeParser::maxChange(int index) const
int QDateTimeParser::SectionNode::maxChange() const
{
const SectionNode &sn = sectionNode(index);
switch (sn.type) {
switch (type) {
// Time. unit is msec
case MSecSection: return 999;
case SecondSection: return 59 * 1000;
@ -1471,7 +1469,7 @@ int QDateTimeParser::maxChange(int index) const
case YearSection2Digits: return 100 * 365;
default:
qWarning("QDateTimeParser::maxChange() Internal error (%s)",
qPrintable(sectionName(sectionType(index))));
qPrintable(name()));
}
return -1;
@ -1481,8 +1479,7 @@ QDateTimeParser::FieldInfo QDateTimeParser::fieldInfo(int index) const
{
FieldInfo ret = 0;
const SectionNode &sn = sectionNode(index);
const Section s = sn.type;
switch (s) {
switch (sn.type) {
case MSecSection:
ret |= Fraction;
// fallthrough
@ -1493,7 +1490,7 @@ QDateTimeParser::FieldInfo QDateTimeParser::fieldInfo(int index) const
case YearSection:
case YearSection2Digits:
ret |= Numeric;
if (s != YearSection) {
if (sn.type != YearSection) {
ret |= AllowPartial;
}
if (sn.count != 1) {
@ -1521,30 +1518,16 @@ QDateTimeParser::FieldInfo QDateTimeParser::fieldInfo(int index) const
break;
default:
qWarning("QDateTimeParser::fieldInfo Internal error 2 (%d %s %d)",
index, qPrintable(sectionName(sn.type)), sn.count);
index, qPrintable(sn.name()), sn.count);
break;
}
return ret;
}
/*!
\internal
Get a number that str can become which is between min
and max or -1 if this is not possible.
*/
QString QDateTimeParser::sectionFormat(int index) const
{
const SectionNode &sn = sectionNode(index);
return sectionFormat(sn.type, sn.count);
}
QString QDateTimeParser::sectionFormat(Section s, int count) const
QString QDateTimeParser::SectionNode::format() const
{
QChar fillChar;
switch (s) {
switch (type) {
case AmPmSection: return count == 1 ? QLatin1String("AP") : QLatin1String("ap");
case MSecSection: fillChar = QLatin1Char('z'); break;
case SecondSection: fillChar = QLatin1Char('s'); break;
@ -1559,7 +1542,7 @@ QString QDateTimeParser::sectionFormat(Section s, int count) const
case YearSection: fillChar = QLatin1Char('y'); break;
default:
qWarning("QDateTimeParser::sectionFormat Internal error (%s)",
qPrintable(sectionName(s)));
qPrintable(name(type)));
return QString();
}
if (fillChar.isNull()) {
@ -1657,7 +1640,7 @@ bool QDateTimeParser::skipToNextSection(int index, const QDateTime &current, con
For debugging. Returns the name of the section \a s.
*/
QString QDateTimeParser::sectionName(int s) const
QString QDateTimeParser::SectionNode::name(QDateTimeParser::Section s)
{
switch (s) {
case QDateTimeParser::AmPmSection: return QLatin1String("AmPmSection");
@ -1675,7 +1658,7 @@ QString QDateTimeParser::sectionName(int s) const
case QDateTimeParser::NoSection: return QLatin1String("NoSection");
case QDateTimeParser::FirstSection: return QLatin1String("FirstSection");
case QDateTimeParser::LastSection: return QLatin1String("LastSection");
default: return QLatin1String("Unknown section ") + QString::number(s);
default: return QLatin1String("Unknown section ") + QString::number(int(s));
}
}
@ -1684,7 +1667,7 @@ QString QDateTimeParser::sectionName(int s) const
For debugging. Returns the name of the state \a s.
*/
QString QDateTimeParser::stateName(int s) const
QString QDateTimeParser::stateName(State s) const
{
switch (s) {
case Invalid: return QLatin1String("Invalid");

View File

@ -103,7 +103,7 @@ public:
none.zeroesAdded = 0;
}
virtual ~QDateTimeParser() {}
enum {
enum AmPmFinder {
Neither = -1,
AM = 0,
PM = 1,
@ -121,17 +121,18 @@ public:
Hour12Section = 0x00010,
Hour24Section = 0x00020,
TimeSectionMask = (AmPmSection|MSecSection|SecondSection|MinuteSection|Hour12Section|Hour24Section),
Internal = 0x10000,
DaySection = 0x00100,
MonthSection = 0x00200,
YearSection = 0x00400,
YearSection2Digits = 0x00800,
DayOfWeekSectionShort = 0x01000,
DayOfWeekSectionLong = 0x20000,
DayOfWeekSectionLong = 0x02000,
DateSectionMask = (DaySection|MonthSection|YearSection|YearSection2Digits|DayOfWeekSectionShort|DayOfWeekSectionLong),
FirstSection = 0x02000|Internal,
LastSection = 0x04000|Internal,
CalendarPopupSection = 0x08000|Internal,
Internal = 0x10000,
FirstSection = 0x20000 | Internal,
LastSection = 0x40000 | Internal,
CalendarPopupSection = 0x80000 | Internal,
NoSectionIndex = -1,
FirstSectionIndex = -2,
@ -140,11 +141,16 @@ public:
}; // duplicated from qdatetimeedit.h
Q_DECLARE_FLAGS(Sections, Section)
struct SectionNode {
struct Q_CORE_EXPORT SectionNode {
Section type;
mutable int pos;
int count;
int zeroesAdded;
static QString name(Section s);
QString name() const { return name(type); }
QString format() const;
int maxChange() const;
};
enum State { // duplicated from QValidator
@ -201,16 +207,12 @@ public:
int findDay(const QString &str1, int intDaystart, int sectionIndex,
QString *dayName = 0, int *used = 0) const;
#endif
int findAmPm(QString &str1, int index, int *used = 0) const;
int maxChange(int s) const;
AmPmFinder findAmPm(QString &str, int index, int *used = 0) const;
bool potentialValue(const QString &str, int min, int max, int index,
const QDateTime &currentValue, int insert) const;
bool skipToNextSection(int section, const QDateTime &current, const QString &sectionText) const;
QString sectionName(int s) const;
QString stateName(int s) const;
QString sectionFormat(int index) const;
QString sectionFormat(Section s, int count) const;
QString stateName(State s) const;
enum FieldInfoFlag {
Numeric = 0x01,

View File

@ -364,7 +364,7 @@ int qGlobalQHashSeed()
/*! \relates QHash
\since 5.6
Sets the global QHash seed.
Sets the global QHash seed to \a newSeed.
Manually setting the global QHash seed value should be done only for testing
and debugging purposes, when deterministic and reproducible behavior on a QHash

View File

@ -253,7 +253,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case StringToAlternateQuotation:
return lc_messages.quoteString(in.value<QStringRef>(), QLocale::AlternateQuotation);
case ListToSeparatedString:
return lc_messages.createSeparatedList(in.value<QStringList>());
return lc_messages.createSeparatedList(in.toStringList());
case LocaleChanged:
Q_ASSERT(false);
default:

View File

@ -133,7 +133,7 @@
object being tracked is the same.
\omit
\secton1 QSharedPointer internals
\section1 QSharedPointer internals
QSharedPointer has two "private" members: the pointer itself being tracked
and a d-pointer. Those members are private to the class, but QSharedPointer
@ -345,7 +345,7 @@
creating a QSharedPointer using toStrongRef() is too high.
\omit
\secton1 QWeakPointer internals
\section1 QWeakPointer internals
QWeakPointer shares most of its internal functionality with
\l{QSharedPointer#qsharedpointer-internals}{QSharedPointer}, so see that

View File

@ -1629,6 +1629,7 @@ void supportedImageHandlerMimeTypes(QFactoryLoader *loader,
QList<QByteArray> QImageReader::supportedImageFormats()
{
QList<QByteArray> formats;
formats.reserve(_qt_NumFormats);
for (int i = 0; i < _qt_NumFormats; ++i)
formats << _qt_BuiltInFormats[i].extension;
@ -1653,6 +1654,7 @@ QList<QByteArray> QImageReader::supportedImageFormats()
QList<QByteArray> QImageReader::supportedMimeTypes()
{
QList<QByteArray> mimeTypes;
mimeTypes.reserve(_qt_NumFormats);
for (int i = 0; i < _qt_NumFormats; ++i)
mimeTypes << _qt_BuiltInFormats[i].mimeType;

View File

@ -244,11 +244,13 @@ static inline void clearFontUnlocked()
QGuiApplicationPrivate::app_font = 0;
}
// Using aggregate initialization instead of ctor so we can have a POD global static
#define Q_WINDOW_GEOMETRY_SPECIFICATION_INITIALIZER { Qt::TopLeftCorner, -1, -1, -1, -1 }
// Geometry specification for top level windows following the convention of the
// -geometry command line arguments in X11 (see XParseGeometry).
struct QWindowGeometrySpecification
{
QWindowGeometrySpecification() : corner(Qt::TopLeftCorner), xOffset(-1), yOffset(-1), width(-1), height(-1) {}
static QWindowGeometrySpecification fromArgument(const QByteArray &a);
void applyTo(QWindow *window) const;
@ -285,7 +287,7 @@ static inline int nextGeometryToken(const QByteArray &a, int &pos, char *op)
QWindowGeometrySpecification QWindowGeometrySpecification::fromArgument(const QByteArray &a)
{
QWindowGeometrySpecification result;
QWindowGeometrySpecification result = Q_WINDOW_GEOMETRY_SPECIFICATION_INITIALIZER;
int pos = 0;
for (int i = 0; i < 4; ++i) {
char op;
@ -342,7 +344,7 @@ void QWindowGeometrySpecification::applyTo(QWindow *window) const
}
}
static QWindowGeometrySpecification windowGeometrySpecification;
static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOMETRY_SPECIFICATION_INITIALIZER;
/*!
\class QGuiApplication

View File

@ -1267,7 +1267,28 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
if ((key & Qt::KeypadModifier) == Qt::KeypadModifier)
addKey(s, nativeText ? QCoreApplication::translate("QShortcut", "Num") : QString::fromLatin1("Num"), format);
QString p = keyName(key, format);
#if defined(Q_OS_OSX)
if (nativeText)
s += p;
else
#endif
addKey(s, p, format);
return s;
}
/*!
\internal
Returns the text representation of the key \a key, which can be used i.e.
when the sequence is serialized. This does not take modifiers into account
(see encodeString() for a version that does).
This static method is used by encodeString() and by the D-Bus menu exporter.
*/
QString QKeySequencePrivate::keyName(int key, QKeySequence::SequenceFormat format)
{
bool nativeText = (format == QKeySequence::NativeText);
key &= ~(Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier | Qt::KeypadModifier);
QString p;
@ -1318,14 +1339,7 @@ NonSymbol:
}
}
}
#if defined(Q_OS_MACX)
if (nativeText)
s += p;
else
#endif
addKey(s, p, format);
return s;
return p;
}
/*!
Matches the sequence with \a seq. Returns ExactMatch if

View File

@ -81,6 +81,8 @@ public:
QAtomicInt ref;
int key[MaxKeyCount];
static QString encodeString(int key, QKeySequence::SequenceFormat format);
// used in dbusmenu
Q_GUI_EXPORT static QString keyName(int key, QKeySequence::SequenceFormat format);
static int decodeString(const QString &keyStr, QKeySequence::SequenceFormat format);
};
#endif // QT_NO_SHORTCUT

View File

@ -983,7 +983,7 @@ void QWindow::setMask(const QRegion &region)
Q_D(QWindow);
if (!d->platformWindow)
return;
d->platformWindow->setMask(region);
d->platformWindow->setMask(QHighDpi::toNativeLocalRegion(region, this));
d->mask = region;
}

View File

@ -1945,9 +1945,10 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c
// intermediate_buffer[0] is a buffer of red-blue component of the pixel, in the form 0x00RR00BB
// intermediate_buffer[1] is the alpha-green component of the pixel, in the form 0x00AA00GG
// +1 for the last pixel to interpolate with, and +1 for rounding errors.
quint32 intermediate_buffer[2][buffer_size + 2];
// count is the size used in the intermediate_buffer.
int count = qCeil(length * data->m11) + 2; //+1 for the last pixel to interpolate with, and +1 for rounding errors.
int count = (qint64(length) * fdx + fixed_scale - 1) / fixed_scale + 2;
Q_ASSERT(count <= buffer_size + 2); //length is supposed to be <= buffer_size and data->m11 < 1 in this case
int f = 0;
int lim = count;
@ -2455,12 +2456,13 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
// The idea is first to do the interpolation between the row s1 and the row s2
// into an intermediate buffer, then we interpolate between two pixel of this buffer.
FetchPixelsFunc fetch = qFetchPixels[layout->bpp];
// +1 for the last pixel to interpolate with, and +1 for rounding errors.
uint buf1[buffer_size + 2];
uint buf2[buffer_size + 2];
const uint *ptr1;
const uint *ptr2;
int count = qCeil(length * data->m11) + 2; //+1 for the last pixel to interpolate with, and +1 for rounding errors.
int count = (qint64(length) * fdx + fixed_scale - 1) / fixed_scale + 2;
Q_ASSERT(count <= buffer_size + 2); //length is supposed to be <= buffer_size and data->m11 < 1 in this case
if (blendType == BlendTransformedBilinearTiled) {

View File

@ -1009,7 +1009,8 @@ void QPdfEngine::drawHyperlink(const QRectF &r, const QUrl &url)
const uint annot = d->addXrefEntry(-1);
const QByteArray urlascii = url.toEncoded();
int len = urlascii.size();
QVarLengthArray<char> url_esc(0);
QVarLengthArray<char> url_esc;
url_esc.reserve(len + 1);
for (int j = 0; j < len; j++) {
if (urlascii[j] == '(' || urlascii[j] == ')' || urlascii[j] == '\\')
url_esc.append('\\');
@ -2013,10 +2014,11 @@ int QPdfEnginePrivate::createShadingFunction(const QGradient *gradient, int from
}
QVector<QGradientBound> gradientBounds;
gradientBounds.reserve((to - from) * (numStops - 1));
for (int step = from; step < to; ++step) {
if (reflect && step % 2) {
for (int i = stops.size() - 1; i > 0; --i) {
for (int i = numStops - 1; i > 0; --i) {
QGradientBound b;
b.start = step + 1 - qBound(qreal(0.), stops.at(i).first, qreal(1.));
b.stop = step + 1 - qBound(qreal(0.), stops.at(i - 1).first, qreal(1.));
@ -2025,7 +2027,7 @@ int QPdfEnginePrivate::createShadingFunction(const QGradient *gradient, int from
gradientBounds << b;
}
} else {
for (int i = 0; i < stops.size() - 1; ++i) {
for (int i = 0; i < numStops - 1; ++i) {
QGradientBound b;
b.start = step + qBound(qreal(0.), stops.at(i).first, qreal(1.));
b.stop = step + qBound(qreal(0.), stops.at(i + 1).first, qreal(1.));

View File

@ -697,7 +697,9 @@ static QStringList familyList(const QFontDef &req)
return family_list;
QStringList list = req.family.split(QLatin1Char(','));
for (int i = 0; i < list.size(); ++i) {
const int numFamilies = list.size();
family_list.reserve(numFamilies);
for (int i = 0; i < numFamilies; ++i) {
QString str = list.at(i).trimmed();
if ((str.startsWith(QLatin1Char('"')) && str.endsWith(QLatin1Char('"')))
|| (str.startsWith(QLatin1Char('\'')) && str.endsWith(QLatin1Char('\''))))
@ -1613,6 +1615,7 @@ QStringList QFontDatabase::styles(const QString &family) const
}
}
l.reserve(allStyles.count);
for (int i = 0; i < allStyles.count; i++) {
l.append(allStyles.styles[i]->styleName.isEmpty() ?
styleStringHelper(allStyles.styles[i]->key.weight,

View File

@ -1165,7 +1165,6 @@ QByteArray QFontSubset::toTruetype() const
qreal ppem = fontEngine->fontDef.pixelSize;
#define TO_TTF(x) qRound(x * 2048. / ppem)
QVector<QTtfGlyph> glyphs;
QFontEngine::Properties properties = fontEngine->properties();
// initialize some stuff needed in createWidthArray
@ -1200,12 +1199,13 @@ QByteArray QFontSubset::toTruetype() const
font.maxp.maxCompositeContours = 0;
font.maxp.maxComponentElements = 0;
font.maxp.maxComponentDepth = 0;
font.maxp.numGlyphs = nGlyphs();
const int numGlyphs = nGlyphs();
font.maxp.numGlyphs = numGlyphs;
QVector<QTtfGlyph> glyphs;
glyphs.reserve(numGlyphs);
uint sumAdvances = 0;
for (int i = 0; i < nGlyphs(); ++i) {
for (int i = 0; i < numGlyphs; ++i) {
glyph_t g = glyph_indices.at(i);
QPainterPath path;
glyph_metrics_t metric;

View File

@ -1935,13 +1935,7 @@ QVector<QCss::Declaration> standardDeclarationForNode(const QTextHtmlParserNode
decl.d->propertyId = QCss::FontFamily;
QVector<QCss::Value> values;
val.type = QCss::Value::String;
val.variant = QLatin1String("Courier New");
values << val;
val.type = QCss::Value::TermOperatorComma;
val.variant = QVariant();
values << val;
val.type = QCss::Value::String;
val.variant = QLatin1String("courier");
val.variant = QFontDatabase::systemFont(QFontDatabase::FixedFont).family();
values << val;
decl.d->values = values;
decl.d->inheritable = true;

View File

@ -57,8 +57,9 @@
QT_BEGIN_NAMESPACE
QDBusMenuAdaptor::QDBusMenuAdaptor(QObject *parent)
: QDBusAbstractAdaptor(parent)
QDBusMenuAdaptor::QDBusMenuAdaptor(QDBusPlatformMenu *topLevelMenu)
: QDBusAbstractAdaptor(topLevelMenu)
, m_topLevelMenu(topLevelMenu)
{
setAutoRelaySignals(true);
}
@ -86,7 +87,17 @@ uint QDBusMenuAdaptor::version() const
bool QDBusMenuAdaptor::AboutToShow(int id)
{
qCDebug(qLcMenu) << id;
return false;
if (id == 0) {
emit m_topLevelMenu->aboutToShow();
} else {
QDBusPlatformMenuItem *item = QDBusPlatformMenuItem::byId(id);
if (item) {
const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
if (menu)
emit const_cast<QDBusPlatformMenu *>(menu)->aboutToShow();
}
}
return false; // updateNeeded (we don't know that, so false)
}
QList<int> QDBusMenuAdaptor::AboutToShowGroup(const QList<int> &ids, QList<int> &idErrors)
@ -94,6 +105,8 @@ QList<int> QDBusMenuAdaptor::AboutToShowGroup(const QList<int> &ids, QList<int>
qCDebug(qLcMenu) << ids;
Q_UNUSED(idErrors)
idErrors.clear();
Q_FOREACH (int id, ids)
AboutToShow(id);
return QList<int>(); // updatesNeeded
}
@ -103,15 +116,27 @@ void QDBusMenuAdaptor::Event(int id, const QString &eventId, const QDBusVariant
Q_UNUSED(timestamp)
QDBusPlatformMenuItem *item = QDBusPlatformMenuItem::byId(id);
qCDebug(qLcMenu) << id << (item ? item->text() : QLatin1String("")) << eventId;
// Events occur on both menus and menuitems, but we only care if it's an item being clicked.
if (item && eventId == QLatin1String("clicked"))
item->trigger();
if (item && eventId == QLatin1String("hovered"))
emit item->hovered();
if (eventId == QLatin1String("closed")) {
// There is no explicit AboutToHide method, so map closed event to aboutToHide method
const QDBusPlatformMenu *menu = Q_NULLPTR;
if (item)
menu = static_cast<const QDBusPlatformMenu *>(item->menu());
else if (id == 0)
menu = m_topLevelMenu;
if (menu)
emit const_cast<QDBusPlatformMenu *>(menu)->aboutToHide();
}
}
void QDBusMenuAdaptor::EventGroup(const QDBusMenuEventList &events)
QList<int> QDBusMenuAdaptor::EventGroup(const QDBusMenuEventList &events)
{
Q_FOREACH (const QDBusMenuEvent &ev, events)
Event(ev.m_id, ev.m_eventId, ev.m_data, ev.m_timestamp);
return QList<int>(); // idErrors
}
QDBusMenuItemList QDBusMenuAdaptor::GetGroupProperties(const QList<int> &ids, const QStringList &propertyNames)
@ -122,7 +147,7 @@ QDBusMenuItemList QDBusMenuAdaptor::GetGroupProperties(const QList<int> &ids, co
uint QDBusMenuAdaptor::GetLayout(int parentId, int recursionDepth, const QStringList &propertyNames, QDBusMenuLayoutItem &layout)
{
uint ret = layout.populate(parentId, recursionDepth, propertyNames);
uint ret = layout.populate(parentId, recursionDepth, propertyNames, m_topLevelMenu);
qCDebug(qLcMenu) << parentId << "depth" << recursionDepth << propertyNames << layout.m_id << layout.m_properties << "revision" << ret << layout;
return ret;
}

View File

@ -146,7 +146,7 @@ class QDBusMenuAdaptor: public QDBusAbstractAdaptor
" </interface>\n"
"")
public:
QDBusMenuAdaptor(QObject *parent);
QDBusMenuAdaptor(QDBusPlatformMenu *topLevelMenu);
virtual ~QDBusMenuAdaptor();
public: // PROPERTIES
@ -163,7 +163,7 @@ public Q_SLOTS: // METHODS
bool AboutToShow(int id);
QList<int> AboutToShowGroup(const QList<int> &ids, QList<int> &idErrors);
void Event(int id, const QString &eventId, const QDBusVariant &data, uint timestamp);
void EventGroup(const QDBusMenuEventList &events);
QList<int> EventGroup(const QDBusMenuEventList &events);
QDBusMenuItemList GetGroupProperties(const QList<int> &ids, const QStringList &propertyNames);
uint GetLayout(int parentId, int recursionDepth, const QStringList &propertyNames, QDBusMenuLayoutItem &layout);
QDBusVariant GetProperty(int id, const QString &name);
@ -172,6 +172,9 @@ Q_SIGNALS: // SIGNALS
void ItemActivationRequested(int id, uint timestamp);
void ItemsPropertiesUpdated(const QDBusMenuItemList &updatedProps, const QDBusMenuItemKeysList &removedProps);
void LayoutUpdated(uint revision, int parent);
private:
QDBusPlatformMenu *m_topLevelMenu;
};
QT_END_NAMESPACE

View File

@ -86,6 +86,14 @@ void QDBusMenuConnection::dbusError(const QDBusError &error)
}
#ifndef QT_NO_SYSTEMTRAYICON
bool QDBusMenuConnection::registerTrayIconMenu(QDBusTrayIcon *item)
{
bool success = connection().registerObject(MenuBarPath, item->menu());
if (!success) // success == false is normal, because the object may be already registered
qCDebug(qLcMenu) << "failed to register" << item->instanceId() << MenuBarPath;
return success;
}
bool QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item)
{
bool success = connection().registerService(item->instanceId());
@ -101,14 +109,8 @@ bool QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item)
return false;
}
if (item->menu()) {
success = connection().registerObject(MenuBarPath, item->menu());
if (!success) {
unregisterTrayIcon(item);
qWarning() << "failed to register" << item->instanceId() << MenuBarPath;
return false;
}
}
if (item->menu())
registerTrayIconMenu(item);
QDBusMessage registerMethod = QDBusMessage::createMethodCall(
StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService,

View File

@ -71,6 +71,7 @@ public:
QDBusConnection connection() const { return m_connection; }
bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
#ifndef QT_NO_SYSTEMTRAYICON
bool registerTrayIconMenu(QDBusTrayIcon *item);
bool registerTrayIcon(QDBusTrayIcon *item);
bool unregisterTrayIcon(QDBusTrayIcon *item);
#endif // QT_NO_SYSTEMTRAYICON

View File

@ -48,6 +48,7 @@
#include <QDebug>
#include <QtEndian>
#include <QBuffer>
#include <private/qkeysequence_p.h>
#include <qpa/qplatformmenu.h>
#include "qdbusplatformmenu_p.h"
@ -85,29 +86,27 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, QDBusMenuItemKeys &key
return arg;
}
uint QDBusMenuLayoutItem::populate(int id, int depth, const QStringList &propertyNames)
uint QDBusMenuLayoutItem::populate(int id, int depth, const QStringList &propertyNames, const QDBusPlatformMenu *topLevelMenu)
{
qCDebug(qLcMenu) << id << "depth" << depth << propertyNames;
m_id = id;
if (id == 0) {
m_properties.insert(QLatin1String("children-display"), QLatin1String("submenu"));
Q_FOREACH (const QDBusPlatformMenu *menu, QDBusPlatformMenu::topLevelMenus()) {
if (menu)
populate(menu, depth, propertyNames);
}
if (topLevelMenu)
populate(topLevelMenu, depth, propertyNames);
return 1; // revision
}
const QDBusPlatformMenu *menu = QDBusPlatformMenu::byId(id);
if (!menu) {
QDBusPlatformMenuItem *item = QDBusPlatformMenuItem::byId(id);
if (item)
menu = static_cast<const QDBusPlatformMenu *>(item->menu());
}
if (depth != 0 && menu)
if (item) {
const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
if (menu) {
if (depth != 0)
populate(menu, depth, propertyNames);
if (menu)
return menu->revision();
}
}
return 1; // revision
}
@ -123,11 +122,13 @@ void QDBusMenuLayoutItem::populate(const QDBusPlatformMenu *menu, int depth, con
void QDBusMenuLayoutItem::populate(const QDBusPlatformMenuItem *item, int depth, const QStringList &propertyNames)
{
Q_UNUSED(depth)
Q_UNUSED(propertyNames)
m_id = item->dbusID();
QDBusMenuItem proxy(item);
m_properties = proxy.m_properties;
const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
if (depth != 0 && menu)
populate(menu, depth, propertyNames);
}
const QDBusArgument &operator<<(QDBusArgument &arg, const QDBusMenuLayoutItem &item)
@ -171,6 +172,7 @@ void QDBusMenuItem::registerDBusTypes()
qDBusRegisterMetaType<QDBusMenuLayoutItemList>();
qDBusRegisterMetaType<QDBusMenuEvent>();
qDBusRegisterMetaType<QDBusMenuEventList>();
qDBusRegisterMetaType<QDBusMenuShortcut>();
}
QDBusMenuItem::QDBusMenuItem(const QDBusPlatformMenuItem *item)
@ -188,13 +190,11 @@ QDBusMenuItem::QDBusMenuItem(const QDBusPlatformMenuItem *item)
m_properties.insert(QLatin1String("toggle-type"), toggleType);
m_properties.insert(QLatin1String("toggle-state"), item->isChecked() ? 1 : 0);
}
/* TODO support shortcuts
const QKeySequence &scut = item->shortcut();
if (!scut.isEmpty()) {
QDBusMenuShortcut shortcut(scut);
properties.insert(QLatin1String("shortcut"), QVariant::fromValue(shortcut));
QDBusMenuShortcut shortcut = convertKeySequence(scut);
m_properties.insert(QLatin1String("shortcut"), QVariant::fromValue(shortcut));
}
*/
const QIcon &icon = item->icon();
if (!icon.name().isEmpty()) {
m_properties.insert(QLatin1String("icon-name"), icon.name());
@ -204,8 +204,7 @@ QDBusMenuItem::QDBusMenuItem(const QDBusPlatformMenuItem *item)
m_properties.insert(QLatin1String("icon-data"), buf.data());
}
}
if (!item->isVisible())
m_properties.insert(QLatin1String("visible"), false);
m_properties.insert(QLatin1String("visible"), item->isVisible());
}
QDBusMenuItemList QDBusMenuItem::items(const QList<int> &ids, const QStringList &propertyNames)
@ -231,6 +230,35 @@ QString QDBusMenuItem::convertMnemonic(const QString &label)
return ret;
}
QDBusMenuShortcut QDBusMenuItem::convertKeySequence(const QKeySequence &sequence)
{
QDBusMenuShortcut shortcut;
for (int i = 0; i < sequence.count(); ++i) {
QStringList tokens;
int key = sequence[i];
if (key & Qt::MetaModifier)
tokens << QStringLiteral("Super");
if (key & Qt::ControlModifier)
tokens << QStringLiteral("Control");
if (key & Qt::AltModifier)
tokens << QStringLiteral("Alt");
if (key & Qt::ShiftModifier)
tokens << QStringLiteral("Shift");
if (key & Qt::KeypadModifier)
tokens << QStringLiteral("Num");
QString keyName = QKeySequencePrivate::keyName(key, QKeySequence::PortableText);
if (keyName == QLatin1String("+"))
tokens << QStringLiteral("plus");
else if (keyName == QLatin1String("-"))
tokens << QStringLiteral("minus");
else
tokens << keyName;
shortcut << tokens;
}
return shortcut;
}
const QDBusArgument &operator<<(QDBusArgument &arg, const QDBusMenuEvent &ev)
{
arg.beginStructure();

View File

@ -64,6 +64,7 @@ class QDBusPlatformMenu;
class QDBusPlatformMenuItem;
class QDBusMenuItem;
typedef QVector<QDBusMenuItem> QDBusMenuItemList;
typedef QVector<QStringList> QDBusMenuShortcut;
class QDBusMenuItem
{
@ -73,6 +74,7 @@ public:
static QDBusMenuItemList items(const QList<int> &ids, const QStringList &propertyNames);
static QString convertMnemonic(const QString &label);
static QDBusMenuShortcut convertKeySequence(const QKeySequence &sequence);
static void registerDBusTypes();
int m_id;
@ -100,7 +102,7 @@ typedef QVector<QDBusMenuItemKeys> QDBusMenuItemKeysList;
class QDBusMenuLayoutItem
{
public:
uint populate(int id, int depth, const QStringList &propertyNames);
uint populate(int id, int depth, const QStringList &propertyNames, const QDBusPlatformMenu *topLevelMenu);
void populate(const QDBusPlatformMenu *menu, int depth, const QStringList &propertyNames);
void populate(const QDBusPlatformMenuItem *item, int depth, const QStringList &propertyNames);
@ -146,5 +148,6 @@ Q_DECLARE_METATYPE(QDBusMenuLayoutItem)
Q_DECLARE_METATYPE(QDBusMenuLayoutItemList)
Q_DECLARE_METATYPE(QDBusMenuEvent)
Q_DECLARE_METATYPE(QDBusMenuEventList)
Q_DECLARE_METATYPE(QDBusMenuShortcut)
#endif

View File

@ -47,9 +47,7 @@ QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(qLcMenu, "qt.qpa.menu")
static int nextDBusID = 1;
QHash<int, QDBusPlatformMenu *> menusByID;
QHash<int, QDBusPlatformMenuItem *> menuItemsByID;
QList<QDBusPlatformMenu *> QDBusPlatformMenu::m_topLevelMenus;
QDBusPlatformMenuItem::QDBusPlatformMenuItem(quintptr tag)
: m_tag(tag ? tag : reinterpret_cast<quintptr>(this)) // QMenu will overwrite this later
@ -92,7 +90,11 @@ void QDBusPlatformMenuItem::setIcon(const QIcon &icon)
*/
void QDBusPlatformMenuItem::setMenu(QPlatformMenu *menu)
{
m_subMenu = static_cast<QDBusPlatformMenu *>(menu);
if (m_subMenu)
static_cast<QDBusPlatformMenu *>(m_subMenu)->setContainingMenuItem(Q_NULLPTR);
m_subMenu = menu;
if (menu)
static_cast<QDBusPlatformMenu *>(menu)->setContainingMenuItem(this);
}
void QDBusPlatformMenuItem::setEnabled(bool enabled)
@ -142,7 +144,11 @@ void QDBusPlatformMenuItem::trigger()
QDBusPlatformMenuItem *QDBusPlatformMenuItem::byId(int id)
{
// We need to check contains because otherwise QHash would insert
// a default-constructed nullptr value into menuItemsByID
if (menuItemsByID.contains(id))
return menuItemsByID[id];
return Q_NULLPTR;
}
QList<const QDBusPlatformMenuItem *> QDBusPlatformMenuItem::byIds(const QList<int> &ids)
@ -161,18 +167,13 @@ QDBusPlatformMenu::QDBusPlatformMenu(quintptr tag)
, m_isEnabled(true)
, m_isVisible(true)
, m_isSeparator(false)
, m_dbusID(nextDBusID++)
, m_revision(0)
, m_revision(1)
, m_containingMenuItem(Q_NULLPTR)
{
menusByID.insert(m_dbusID, this);
// Assume it's top-level until we find out otherwise
m_topLevelMenus << this;
}
QDBusPlatformMenu::~QDBusPlatformMenu()
{
menusByID.remove(m_dbusID);
m_topLevelMenus.removeOne(this);
}
void QDBusPlatformMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before)
@ -186,38 +187,59 @@ void QDBusPlatformMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMen
else
m_items.insert(idx, item);
m_itemsByTag.insert(item->tag(), item);
// If a menu is found as a submenu under an item, we know that it's not a top-level menu.
if (item->menu())
m_topLevelMenus.removeOne(const_cast<QDBusPlatformMenu *>(static_cast<const QDBusPlatformMenu *>(item->menu())));
syncSubMenu(static_cast<const QDBusPlatformMenu *>(item->menu()));
emitUpdated();
}
void QDBusPlatformMenu::removeMenuItem(QPlatformMenuItem *menuItem)
{
m_items.removeAll(static_cast<QDBusPlatformMenuItem *>(menuItem));
QDBusPlatformMenuItem *item = static_cast<QDBusPlatformMenuItem *>(menuItem);
m_items.removeAll(item);
m_itemsByTag.remove(menuItem->tag());
if (item->menu()) {
// disconnect from the signals we connected to in syncSubMenu()
const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
disconnect(menu, &QDBusPlatformMenu::propertiesUpdated,
this, &QDBusPlatformMenu::propertiesUpdated);
disconnect(menu, &QDBusPlatformMenu::updated,
this, &QDBusPlatformMenu::updated);
}
emitUpdated();
}
void QDBusPlatformMenu::syncSubMenu(const QDBusPlatformMenu *menu)
{
// The adaptor is only connected to the propertiesUpdated signal of the top-level
// menu, so the submenus should transfer their signals to their parents.
connect(menu, &QDBusPlatformMenu::propertiesUpdated,
this, &QDBusPlatformMenu::propertiesUpdated, Qt::UniqueConnection);
connect(menu, &QDBusPlatformMenu::updated,
this, &QDBusPlatformMenu::updated, Qt::UniqueConnection);
}
void QDBusPlatformMenu::syncMenuItem(QPlatformMenuItem *menuItem)
{
QDBusPlatformMenuItem *item = static_cast<QDBusPlatformMenuItem *>(menuItem);
// if a submenu was added to this item, we need to connect to its signals
if (item->menu())
syncSubMenu(static_cast<const QDBusPlatformMenu *>(item->menu()));
// TODO keep around copies of the QDBusMenuLayoutItems so they can be updated?
// or eliminate them by putting dbus streaming operators in this class instead?
// or somehow tell the dbusmenu client that something has changed, so it will ask for properties again
emitUpdated();
QDBusMenuItemList updated;
QDBusMenuItemKeysList removed;
updated << QDBusMenuItem(static_cast<QDBusPlatformMenuItem *>(menuItem));
updated << QDBusMenuItem(item);
qCDebug(qLcMenu) << updated;
emit propertiesUpdated(updated, removed);
}
QDBusPlatformMenu *QDBusPlatformMenu::byId(int id)
{
return menusByID[id];
}
void QDBusPlatformMenu::emitUpdated()
{
emit updated(++m_revision, m_dbusID);
if (m_containingMenuItem)
emit updated(++m_revision, m_containingMenuItem->dbusID());
else
emit updated(++m_revision, 0);
}
void QDBusPlatformMenu::setTag(quintptr tag)
@ -245,6 +267,11 @@ void QDBusPlatformMenu::setVisible(bool isVisible)
m_isVisible = isVisible;
}
void QDBusPlatformMenu::setContainingMenuItem(QDBusPlatformMenuItem *item)
{
m_containingMenuItem = item;
}
QPlatformMenuItem *QDBusPlatformMenu::menuItemAt(int position) const
{
return m_items.at(position);

View File

@ -139,6 +139,7 @@ public:
~QDBusPlatformMenu();
void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) Q_DECL_OVERRIDE;
void removeMenuItem(QPlatformMenuItem *menuItem) Q_DECL_OVERRIDE;
void syncSubMenu(const QDBusPlatformMenu *menu);
void syncMenuItem(QPlatformMenuItem *menuItem) Q_DECL_OVERRIDE;
void syncSeparatorsCollapsible(bool enable) Q_DECL_OVERRIDE { Q_UNUSED(enable); }
@ -147,14 +148,16 @@ public:
const QString text() const { return m_text; }
void setText(const QString &text) Q_DECL_OVERRIDE;
QIcon icon() const { return m_icon; }
void setIcon(const QIcon &icon) Q_DECL_OVERRIDE;
bool isEnabled() const Q_DECL_OVERRIDE { return m_isEnabled; }
void setEnabled(bool enabled) Q_DECL_OVERRIDE;
bool isVisible() const { return m_isVisible; }
void setVisible(bool visible) Q_DECL_OVERRIDE;
void setMinimumWidth(int width) Q_DECL_OVERRIDE { Q_UNUSED(width); }
void setFont(const QFont &font) Q_DECL_OVERRIDE { Q_UNUSED(font); }
void setMenuType(MenuType type) Q_DECL_OVERRIDE { Q_UNUSED(type); }
int dbusID() const { return m_dbusID; }
void setContainingMenuItem(QDBusPlatformMenuItem *item);
void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) Q_DECL_OVERRIDE
{
@ -175,9 +178,6 @@ public:
bool operator==(const QDBusPlatformMenu& other) { return m_tag == other.m_tag; }
static QDBusPlatformMenu* byId(int id);
static QList<QDBusPlatformMenu *> topLevelMenus() { return m_topLevelMenus; }
uint revision() const { return m_revision; }
void emitUpdated();
@ -193,12 +193,10 @@ private:
bool m_isEnabled;
bool m_isVisible;
bool m_isSeparator;
int m_dbusID;
uint m_revision;
QHash<quintptr, QDBusPlatformMenuItem *> m_itemsByTag;
QList<QDBusPlatformMenuItem *> m_items;
QDBusPlatformMenuItem *m_containingMenuItem;
static QList<QDBusPlatformMenu *> m_topLevelMenus;
};
QT_END_NAMESPACE

View File

@ -190,16 +190,13 @@ void QDBusTrayIcon::updateToolTip(const QString &tooltip)
QPlatformMenu *QDBusTrayIcon::createMenu() const
{
qCDebug(qLcTray);
QDBusPlatformMenu *ret = new QDBusPlatformMenu();
if (!m_menu)
const_cast<QDBusTrayIcon *>(this)->m_menu = ret;
return ret;
return new QDBusPlatformMenu();
}
void QDBusTrayIcon::updateMenu(QPlatformMenu * menu)
{
qCDebug(qLcTray) << menu;
bool needsRegistering = !m_menu;
if (!m_menu)
m_menu = qobject_cast<QDBusPlatformMenu *>(menu);
if (!m_menuAdaptor) {
@ -211,6 +208,8 @@ void QDBusTrayIcon::updateMenu(QPlatformMenu * menu)
m_menuAdaptor, SIGNAL(LayoutUpdated(uint,int)));
}
m_menu->emitUpdated();
if (needsRegistering)
dBusConnection()->registerTrayIconMenu(this);
}
void QDBusTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon,

View File

@ -41,6 +41,8 @@
#include <QtGui/qaccessible.h>
#include <private/qcore_mac_p.h>
#include <Carbon/Carbon.h>
QT_BEGIN_NAMESPACE
#ifndef QT_NO_ACCESSIBILITY
@ -201,6 +203,8 @@ NSString *macSubrole(QAccessibleInterface *interface)
QAccessible::State s = interface->state();
if (s.searchEdit)
return NSAccessibilitySearchFieldSubrole;
if (s.passwordEdit)
return NSAccessibilitySecureTextFieldSubrole;
return nil;
}
@ -359,18 +363,23 @@ id getValueAttribute(QAccessibleInterface *interface)
}
if (qtrole == QAccessible::EditableText) {
if (QAccessibleTextInterface *textInterface = interface->textInterface()) {
int begin = 0;
int end = textInterface->characterCount();
QString text;
if (interface->state().passwordEdit) {
// return round password replacement chars
text = QString(end, QChar(kBulletUnicode));
} else {
// VoiceOver will read out the entire text string at once when returning
// text as a value. For large text edits the size of the returned string
// needs to be limited and text range attributes need to be used instead.
// NSTextEdit returns the first sentence as the value, Do the same here:
int begin = 0;
int end = textInterface->characterCount();
// ### call to textAfterOffset hangs. Booo!
//if (textInterface->characterCount() > 0)
// textInterface->textAfterOffset(0, QAccessible2::SentenceBoundary, &begin, &end);
QString text = textInterface->text(begin, end);
//qDebug() << "text" << begin << end << text;
text = textInterface->text(begin, end);
}
return QCFString::toNSString(text);
}
}

View File

@ -69,6 +69,10 @@ QWindowsDirect2DPaintDevice::QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap
{
}
QWindowsDirect2DPaintDevice::~QWindowsDirect2DPaintDevice()
{
}
QPaintEngine *QWindowsDirect2DPaintDevice::paintEngine() const
{
Q_D(const QWindowsDirect2DPaintDevice);

View File

@ -56,6 +56,8 @@ class QWindowsDirect2DPaintDevice : public QPaintDevice
public:
QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags flags,
QWindowsDirect2DPaintEngine::Flags paintFlags = QWindowsDirect2DPaintEngine::NoFlag);
~QWindowsDirect2DPaintDevice();
QPaintEngine *paintEngine() const Q_DECL_OVERRIDE;
int devType() const Q_DECL_OVERRIDE;

View File

@ -307,9 +307,14 @@ void QEglFSKmsEglDeviceIntegration::waitForVSync(QPlatformSurface *) const
if (currentMode)
drmModeFreeCrtc(currentMode);
if (alreadySet) {
// Maybe detecting the DPMS mode could help here, but there are no properties
// exposed on the connector apparently. So rely on an env var for now.
static bool alwaysDoSet = qEnvironmentVariableIntValue("QT_QPA_EGLFS_ALWAYS_SET_MODE");
if (!alwaysDoSet) {
qCDebug(qLcEglfsKmsDebug, "Mode already set");
return;
}
}
qCDebug(qLcEglfsKmsDebug, "Setting mode");
int ret = drmModeSetCrtc(m_dri_fd, m_drm_crtc,

View File

@ -278,348 +278,6 @@ bool QVariant2VARIANT(const QVariant &var, VARIANT &arg, const QByteArray &typeN
}
}
break;
#if 0 // not a value with min/max semantics
case QVariant::Font:
if (out && arg.vt == (VT_DISPATCH|VT_BYREF)) {
if (*arg.ppdispVal)
(*arg.ppdispVal)->Release();
*arg.ppdispVal = QFontToIFont(qvariant_cast<QFont>(qvar));
} else {
arg.vt = VT_DISPATCH;
arg.pdispVal = QFontToIFont(qvariant_cast<QFont>(qvar));
if (out) {
arg.ppdispVal = new IDispatch*(arg.pdispVal);
arg.vt |= VT_BYREF;
}
}
break;
case QVariant::Pixmap:
if (out && arg.vt == (VT_DISPATCH|VT_BYREF)) {
if (*arg.ppdispVal)
(*arg.ppdispVal)->Release();
*arg.ppdispVal = QPixmapToIPicture(qvariant_cast<QPixmap>(qvar));
} else {
arg.vt = VT_DISPATCH;
arg.pdispVal = QPixmapToIPicture(qvariant_cast<QPixmap>(qvar));
if (out) {
arg.ppdispVal = new IDispatch*(arg.pdispVal);
arg.vt |= VT_BYREF;
}
}
break;
case QVariant::Cursor:
{
#ifndef QT_NO_CURSOR
int shape = qvariant_cast<QCursor>(qvar).shape();
if (out && (arg.vt & VT_BYREF)) {
switch (arg.vt & ~VT_BYREF) {
case VT_I4:
*arg.plVal = shape;
break;
case VT_I2:
*arg.piVal = shape;
break;
case VT_UI4:
*arg.pulVal = shape;
break;
case VT_UI2:
*arg.puiVal = shape;
break;
case VT_INT:
*arg.pintVal = shape;
break;
case VT_UINT:
*arg.puintVal = shape;
break;
}
} else {
arg.vt = VT_I4;
arg.lVal = shape;
if (out) {
arg.plVal = new long(arg.lVal);
arg.vt |= VT_BYREF;
}
}
#endif
}
break;
case QVariant::List:
{
const QList<QVariant> list = qvar.toList();
const int count = list.count();
VARTYPE vt = VT_VARIANT;
QVariant::Type listType = QVariant::LastType; // == QVariant
if (!typeName.isEmpty() && typeName.startsWith("QList<")) {
const QByteArray listTypeName = typeName.mid(6, typeName.length() - 7); // QList<int> -> int
listType = QVariant::nameToType(listTypeName);
}
VARIANT variant;
void *pElement = &variant;
switch (listType) {
case QVariant::Int:
vt = VT_I4;
pElement = &variant.lVal;
break;
case QVariant::Double:
vt = VT_R8;
pElement = &variant.dblVal;
break;
case QVariant::DateTime:
vt = VT_DATE;
pElement = &variant.date;
break;
case QVariant::Bool:
vt = VT_BOOL;
pElement = &variant.boolVal;
break;
case QVariant::LongLong:
#if !defined(Q_OS_WINCE) && defined(_MSC_VER) && _MSC_VER >= 1400
vt = VT_I8;
pElement = &variant.llVal;
#else
vt = VT_CY;
pElement = &variant.cyVal;
#endif
break;
default:
break;
}
SAFEARRAY *array = 0;
bool is2D = false;
// If the first element in the array is a list the whole list is
// treated as a 2D array. The column count is taken from the 1st element.
if (count) {
QVariantList col = list.at(0).toList();
int maxColumns = col.count();
if (maxColumns) {
is2D = true;
SAFEARRAYBOUND rgsabound[2] = { {0} };
rgsabound[0].cElements = count;
rgsabound[1].cElements = maxColumns;
array = SafeArrayCreate(VT_VARIANT, 2, rgsabound);
LONG rgIndices[2];
for (LONG i = 0; i < count; ++i) {
rgIndices[0] = i;
QVariantList columns = list.at(i).toList();
int columnCount = qMin(maxColumns, columns.count());
for (LONG j = 0; j < columnCount; ++j) {
QVariant elem = columns.at(j);
VariantInit(&variant);
QVariant2VARIANT(elem, variant, elem.typeName());
rgIndices[1] = j;
SafeArrayPutElement(array, rgIndices, pElement);
clearVARIANT(&variant);
}
}
}
}
if (!is2D) {
array = SafeArrayCreateVector(vt, 0, count);
for (LONG index = 0; index < count; ++index) {
QVariant elem = list.at(index);
if (listType != QVariant::LastType)
elem.convert(listType);
VariantInit(&variant);
QVariant2VARIANT(elem, variant, elem.typeName());
SafeArrayPutElement(array, &index, pElement);
clearVARIANT(&variant);
}
}
if (out && arg.vt == (VT_ARRAY|vt|VT_BYREF)) {
if (*arg.pparray)
SafeArrayDestroy(*arg.pparray);
*arg.pparray = array;
} else {
arg.vt = VT_ARRAY|vt;
arg.parray = array;
if (out) {
arg.pparray = new SAFEARRAY*(arg.parray);
arg.vt |= VT_BYREF;
}
}
}
break;
case QVariant::StringList:
{
const QStringList list = qvar.toStringList();
const int count = list.count();
SAFEARRAY *array = SafeArrayCreateVector(VT_BSTR, 0, count);
for (LONG index = 0; index < count; ++index) {
QString elem = list.at(index);
BSTR bstr = QStringToBSTR(elem);
SafeArrayPutElement(array, &index, bstr);
SysFreeString(bstr);
}
if (out && arg.vt == (VT_ARRAY|VT_BSTR|VT_BYREF)) {
if (*arg.pparray)
SafeArrayDestroy(*arg.pparray);
*arg.pparray = array;
} else {
arg.vt = VT_ARRAY|VT_BSTR;
arg.parray = array;
if (out) {
arg.pparray = new SAFEARRAY*(arg.parray);
arg.vt |= VT_BYREF;
}
}
}
break;
case QVariant::ByteArray:
{
const QByteArray bytes = qvar.toByteArray();
const uint count = bytes.count();
SAFEARRAY *array = SafeArrayCreateVector(VT_UI1, 0, count);
if (count) {
const char *data = bytes.constData();
char *dest;
SafeArrayAccessData(array, (void **)&dest);
memcpy(dest, data, count);
SafeArrayUnaccessData(array);
}
if (out && arg.vt == (VT_ARRAY|VT_UI1|VT_BYREF)) {
if (*arg.pparray)
SafeArrayDestroy(*arg.pparray);
*arg.pparray = array;
} else {
arg.vt = VT_ARRAY|VT_UI1;
arg.parray = array;
if (out) {
arg.pparray = new SAFEARRAY*(arg.parray);
arg.vt |= VT_BYREF;
}
}
}
break;
#ifdef QAX_SERVER
case QVariant::Rect:
case QVariant::Size:
case QVariant::Point:
{
typedef HRESULT(WINAPI* PGetRecordInfoFromTypeInfo)(ITypeInfo *, IRecordInfo **);
static PGetRecordInfoFromTypeInfo pGetRecordInfoFromTypeInfo = 0;
static bool resolved = false;
if (!resolved) {
QSystemLibrary oleaut32(QLatin1String("oleaut32"));
pGetRecordInfoFromTypeInfo = (PGetRecordInfoFromTypeInfo)oleaut32.resolve("GetRecordInfoFromTypeInfo");
resolved = true;
}
if (!pGetRecordInfoFromTypeInfo)
break;
ITypeInfo *typeInfo = 0;
IRecordInfo *recordInfo = 0;
CLSID clsid = qvar.type() == QVariant::Rect ? CLSID_QRect
:qvar.type() == QVariant::Size ? CLSID_QSize
:CLSID_QPoint;
qAxTypeLibrary->GetTypeInfoOfGuid(clsid, &typeInfo);
if (!typeInfo)
break;
pGetRecordInfoFromTypeInfo(typeInfo, &recordInfo);
typeInfo->Release();
if (!recordInfo)
break;
void *record = 0;
switch (qvar.type()) {
case QVariant::Rect:
{
QRect qrect(qvar.toRect());
recordInfo->RecordCreateCopy(&qrect, &record);
}
break;
case QVariant::Size:
{
QSize qsize(qvar.toSize());
recordInfo->RecordCreateCopy(&qsize, &record);
}
break;
case QVariant::Point:
{
QPoint qpoint(qvar.toPoint());
recordInfo->RecordCreateCopy(&qpoint, &record);
}
break;
}
arg.vt = VT_RECORD;
arg.pRecInfo = recordInfo,
arg.pvRecord = record;
if (out) {
qWarning("QVariant2VARIANT: out-parameter not supported for records");
return false;
}
}
break;
#endif // QAX_SERVER
case QVariant::UserType:
{
QByteArray subType = qvar.typeName();
#ifdef QAX_SERVER
if (subType.endsWith('*'))
subType.truncate(subType.length() - 1);
#endif
if (!qstrcmp(qvar.typeName(), "IDispatch*")) {
arg.vt = VT_DISPATCH;
arg.pdispVal = *(IDispatch**)qvar.data();
if (arg.pdispVal)
arg.pdispVal->AddRef();
if (out) {
qWarning("QVariant2VARIANT: out-parameter not supported for IDispatch");
return false;
}
} else if (!qstrcmp(qvar.typeName(), "IDispatch**")) {
arg.vt = VT_DISPATCH;
arg.ppdispVal = *(IDispatch***)qvar.data();
if (out)
arg.vt |= VT_BYREF;
} else if (!qstrcmp(qvar.typeName(), "IUnknown*")) {
arg.vt = VT_UNKNOWN;
arg.punkVal = *(IUnknown**)qvar.data();
if (arg.punkVal)
arg.punkVal->AddRef();
if (out) {
qWarning("QVariant2VARIANT: out-parameter not supported for IUnknown");
return false;
}
#ifdef QAX_SERVER
} else if (qAxFactory()->metaObject(QString::fromLatin1(subType.constData()))) {
arg.vt = VT_DISPATCH;
void *user = *(void**)qvar.constData();
// qVariantGet(qvar, user, qvar.typeName());
if (!user) {
arg.pdispVal = 0;
} else {
qAxFactory()->createObjectWrapper(static_cast<QObject*>(user), &arg.pdispVal);
}
if (out) {
qWarning("QVariant2VARIANT: out-parameter not supported for subtype");
return false;
}
#else
} else if (QMetaType::type(subType)) {
QAxObject *object = *(QAxObject**)qvar.constData();
// qVariantGet(qvar, object, subType);
arg.vt = VT_DISPATCH;
object->queryInterface(IID_IDispatch, (void**)&arg.pdispVal);
if (out) {
qWarning("QVariant2VARIANT: out-parameter not supported for subtype");
return false;
}
#endif
} else {
return false;
}
}
break;
#endif
case QVariant::Invalid: // default-parameters not set
if (out && arg.vt == (VT_ERROR|VT_BYREF)) {

View File

@ -1705,12 +1705,12 @@ QByteArray QWindowsIA2Accessible::IIDToString(REFIID id)
}
// Q_STATIC_ASSERT(IA2_ROLE_CANVAS == QAccessible::Canvas); // ### Qt 6: make them the same
Q_STATIC_ASSERT(IA2_ROLE_COLOR_CHOOSER == QAccessible::ColorChooser);
Q_STATIC_ASSERT(IA2_ROLE_FOOTER == QAccessible::Footer);
Q_STATIC_ASSERT(IA2_ROLE_FORM == QAccessible::Form);
Q_STATIC_ASSERT(IA2_ROLE_HEADING == QAccessible::Heading);
Q_STATIC_ASSERT(IA2_ROLE_NOTE == QAccessible::Note);
Q_STATIC_ASSERT(IA2_ROLE_COMPLEMENTARY_CONTENT == QAccessible::ComplementaryContent);
Q_STATIC_ASSERT(IA2_ROLE_COLOR_CHOOSER == static_cast<IA2Role>(QAccessible::ColorChooser));
Q_STATIC_ASSERT(IA2_ROLE_FOOTER == static_cast<IA2Role>(QAccessible::Footer));
Q_STATIC_ASSERT(IA2_ROLE_FORM == static_cast<IA2Role>(QAccessible::Form));
Q_STATIC_ASSERT(IA2_ROLE_HEADING == static_cast<IA2Role>(QAccessible::Heading));
Q_STATIC_ASSERT(IA2_ROLE_NOTE == static_cast<IA2Role>(QAccessible::Note));
Q_STATIC_ASSERT(IA2_ROLE_COMPLEMENTARY_CONTENT == static_cast<IA2Role>(QAccessible::ComplementaryContent));
QT_END_NAMESPACE

View File

@ -225,24 +225,6 @@ IAccessible *QWindowsAccessibility::wrap(QAccessibleInterface *acc)
#endif // defined(Q_OS_WINCE)
}
/*
void QWindowsAccessibility::setRootObject(QObject *o)
{
}
void QWindowsAccessibility::initialize()
{
}
void QWindowsAccessibility::cleanup()
{
}
*/
bool QWindowsAccessibility::handleAccessibleObjectFromWindowRequest(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
{
#if !defined(Q_OS_WINCE)
@ -251,12 +233,10 @@ bool QWindowsAccessibility::handleAccessibleObjectFromWindowRequest(HWND hwnd, W
} else if ((DWORD)lParam == DWORD(OBJID_CLIENT)) {
// Start handling accessibility internally
QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true);
#if 1
// Ignoring all requests while starting up
// ### Maybe QPA takes care of this???
if (QCoreApplication::startingUp() || QCoreApplication::closingDown())
return false;
#endif
typedef LRESULT (WINAPI *PtrLresultFromObject)(REFIID, WPARAM, LPUNKNOWN);
static PtrLresultFromObject ptrLresultFromObject = 0;

View File

@ -53,12 +53,7 @@ class QWindowsAccessibility : public QPlatformAccessibility
public:
QWindowsAccessibility();
static bool handleAccessibleObjectFromWindowRequest(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult);
virtual void notifyAccessibilityUpdate(QAccessibleEvent *event);
/*
virtual void setRootObject(QObject *o);
virtual void initialize();
virtual void cleanup();
*/
void notifyAccessibilityUpdate(QAccessibleEvent *event) Q_DECL_OVERRIDE;
static IAccessible *wrap(QAccessibleInterface *acc);
static QWindow *windowHelper(const QAccessibleInterface *iface);
};

View File

@ -57,9 +57,6 @@
QT_BEGIN_NAMESPACE
static const char formatTextPlainC[] = "text/plain";
static const char formatTextHtmlC[] = "text/html";
/*!
\class QWindowsClipboard
\brief Clipboard implementation.

View File

@ -95,20 +95,6 @@ Q_LOGGING_CATEGORY(lcQpaAccessibility, "qt.qpa.accessibility")
int QWindowsContext::verbose = 0;
// Get verbosity of components from "foo:2,bar:3"
static inline int componentVerbose(const char *v, const char *keyWord)
{
if (const char *k = strstr(v, keyWord)) {
k += qstrlen(keyWord);
if (*k == ':') {
++k;
if (isdigit(*k))
return *k - '0';
}
}
return 0;
}
#if !defined(LANG_SYRIAC)
# define LANG_SYRIAC 0x5a
#endif

View File

@ -252,9 +252,10 @@ static QSize systemCursorSize(const QPlatformScreen *screen = Q_NULLPTR)
return primaryScreenCursorSize;
}
#if defined (Q_OS_WINCE) || defined (QT_NO_IMAGEFORMAT_PNG)
static inline QSize standardCursorSize() { return QSize(32, 32); }
#if defined (Q_OS_WINCE) || defined (QT_NO_IMAGEFORMAT_PNG)
// Create pixmap cursors from data and scale the image if the cursor size is
// higher than the standard 32. Note that bitmap cursors as produced by
// createBitmapCursor() only work for standard sizes (32,48,64...), which does

View File

@ -743,7 +743,7 @@ inline QUrl QWindowsFileDialogSharedData::directory() const
inline void QWindowsFileDialogSharedData::setDirectory(const QUrl &d)
{
QMutexLocker (&m_data->mutex);
QMutexLocker locker(&m_data->mutex);
m_data->directory = d;
}
@ -757,7 +757,7 @@ inline QString QWindowsFileDialogSharedData::selectedNameFilter() const
inline void QWindowsFileDialogSharedData::setSelectedNameFilter(const QString &f)
{
QMutexLocker (&m_data->mutex);
QMutexLocker locker(&m_data->mutex);
m_data->selectedNameFilter = f;
}
@ -777,13 +777,13 @@ inline QString QWindowsFileDialogSharedData::selectedFile() const
inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList<QUrl> &urls)
{
QMutexLocker (&m_data->mutex);
QMutexLocker locker(&m_data->mutex);
m_data->selectedFiles = urls;
}
inline void QWindowsFileDialogSharedData::fromOptions(const QSharedPointer<QFileDialogOptions> &o)
{
QMutexLocker (&m_data->mutex);
QMutexLocker locker(&m_data->mutex);
m_data->directory = o->initialDirectory();
m_data->selectedFiles = o->initiallySelectedFiles();
m_data->selectedNameFilter = o->initiallySelectedNameFilter();
@ -1590,11 +1590,6 @@ QWindowsNativeFileDialogBase *QWindowsNativeFileDialogBase::create(QFileDialogOp
return result;
}
static inline bool isQQuickWindow(const QWindow *w = 0)
{
return w && w->inherits("QQuickWindow");
}
/*!
\class QWindowsFileDialogHelper
\brief Helper for native Windows file dialogs
@ -1610,8 +1605,8 @@ class QWindowsFileDialogHelper : public QWindowsDialogHelperBase<QPlatformFileDi
{
public:
QWindowsFileDialogHelper() {}
virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return false; }
virtual bool defaultNameFilterDisables() const
virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const Q_DECL_OVERRIDE { return false; }
virtual bool defaultNameFilterDisables() const Q_DECL_OVERRIDE
{ return false; }
virtual void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE;
virtual QUrl directory() const Q_DECL_OVERRIDE;

View File

@ -70,9 +70,9 @@ public:
~QWindowsDialogHelperBase() { cleanupThread(); }
void exec() Q_DECL_OVERRIDE;
virtual bool show(Qt::WindowFlags windowFlags,
bool show(Qt::WindowFlags windowFlags,
Qt::WindowModality windowModality,
QWindow *parent);
QWindow *parent) Q_DECL_OVERRIDE;
void hide() Q_DECL_OVERRIDE;
virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return true; }
@ -81,7 +81,7 @@ protected:
QWindowsDialogHelperBase();
QWindowsNativeDialogBase *nativeDialog() const;
inline bool hasNativeDialog() const { return m_nativeDialog; }
void timerEvent(QTimerEvent *);
void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE;
private:
virtual QWindowsNativeDialogBase *createNativeDialog() = 0;

View File

@ -348,8 +348,8 @@ bool QWindowsLibGLESv2::init()
return glBindTexture && glCreateShader && glClearDepthf;
}
QWindowsEGLStaticContext::QWindowsEGLStaticContext(EGLDisplay display, int version)
: m_display(display), m_version(version)
QWindowsEGLStaticContext::QWindowsEGLStaticContext(EGLDisplay display)
: m_display(display)
{
}
@ -416,7 +416,7 @@ QWindowsEGLStaticContext *QWindowsEGLStaticContext::create(QWindowsOpenGLTester:
}
qCDebug(lcQpaGl) << __FUNCTION__ << "Created EGL display" << display << 'v' <<major << '.' << minor;
return new QWindowsEGLStaticContext(display, (major << 8) | minor);
return new QWindowsEGLStaticContext(display);
}
QWindowsEGLStaticContext::~QWindowsEGLStaticContext()

View File

@ -263,9 +263,9 @@ public:
EGLDisplay display() const { return m_display; }
QWindowsOpenGLContext *createContext(QOpenGLContext *context);
void *moduleHandle() const { return libGLESv2.moduleHandle(); }
QOpenGLContext::OpenGLModuleType moduleType() const { return QOpenGLContext::LibGLES; }
QWindowsOpenGLContext *createContext(QOpenGLContext *context) Q_DECL_OVERRIDE;
void *moduleHandle() const Q_DECL_OVERRIDE { return libGLESv2.moduleHandle(); }
QOpenGLContext::OpenGLModuleType moduleType() const Q_DECL_OVERRIDE { return QOpenGLContext::LibGLES; }
void *createWindowSurface(void *nativeWindow, void *nativeConfig, int *err) Q_DECL_OVERRIDE;
void destroyWindowSurface(void *nativeSurface) Q_DECL_OVERRIDE;
@ -276,10 +276,9 @@ public:
static QWindowsLibGLESv2 libGLESv2;
private:
QWindowsEGLStaticContext(EGLDisplay display, int version);
explicit QWindowsEGLStaticContext(EGLDisplay display);
const EGLDisplay m_display;
const int m_version; //! majorVersion<<8 + minorVersion
};
class QWindowsEGLContext : public QWindowsOpenGLContext

View File

@ -458,6 +458,8 @@ static bool addFontToDatabase(const QString &faceName,
const FontKey *key = findFontKey(faceName, &index);
if (!key) {
key = findFontKey(fullName, &index);
if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName))
englishName = getEnglishName(faceName);
if (!key && !englishName.isEmpty())
key = findFontKey(englishName, &index);
if (!key)

View File

@ -110,17 +110,6 @@ static void resolveGetCharWidthI()
ptrGetCharWidthI = (PtrGetCharWidthI)QSystemLibrary::resolve(QStringLiteral("gdi32"), "GetCharWidthI");
}
static inline quint32 getUInt(unsigned char *p)
{
quint32 val;
val = *p++ << 24;
val |= *p++ << 16;
val |= *p++ << 8;
val |= *p;
return val;
}
static inline quint16 getUShort(unsigned char *p)
{
quint16 val;
@ -272,7 +261,6 @@ QWindowsFontEngine::QWindowsFontEngine(const QString &name,
m_logfont(lf),
ttf(0),
hasOutline(0),
lw(0),
cmap(0),
cmapSize(0),
lbearing(SHRT_MIN),
@ -1168,7 +1156,9 @@ glyph_metrics_t QWindowsFontEngine::alphaMapBoundingBox(glyph_t glyph, QFixed, c
QImage QWindowsFontEngine::alphaMapForGlyph(glyph_t glyph, const QTransform &xform)
{
HFONT font = hfont;
if (m_fontEngineData->clearTypeEnabled) {
bool clearTypeTemporarilyDisabled = (m_fontEngineData->clearTypeEnabled && m_logfont.lfQuality != NONANTIALIASED_QUALITY);
if (clearTypeTemporarilyDisabled) {
LOGFONT lf = m_logfont;
lf.lfQuality = ANTIALIASED_QUALITY;
font = CreateFontIndirect(&lf);
@ -1207,7 +1197,7 @@ QImage QWindowsFontEngine::alphaMapForGlyph(glyph_t glyph, const QTransform &xfo
// Cleanup...
delete mask;
if (m_fontEngineData->clearTypeEnabled) {
if (clearTypeTemporarilyDisabled) {
DeleteObject(font);
}

View File

@ -150,7 +150,6 @@ private:
uint hasUnreliableOutline : 1;
uint cffTable : 1;
TEXTMETRIC tm;
int lw;
const unsigned char *cmap;
int cmapSize;
QByteArray cmapTable;

View File

@ -620,10 +620,6 @@ static inline int asciiToKeycode(char a, int state)
return a & 0xff;
}
static inline bool isModifierKey(int code)
{
return (code >= Qt::Key_Shift) && (code <= Qt::Key_ScrollLock);
}
// Key translation -----------------------------------------------------------------------[ end ]---

View File

@ -83,22 +83,6 @@ static inline QDpi monitorDPI(HMONITOR hMonitor)
#endif // !Q_OS_WINCE
static inline QSizeF deviceSizeMM(const QSize &pixels, const QDpi &dpi)
{
const qreal inchToMM = 25.4;
const qreal h = qreal(pixels.width()) / qreal(dpi.first) * inchToMM;
const qreal v = qreal(pixels.height()) / qreal(dpi.second) * inchToMM;
return QSizeF(h, v);
}
static inline QDpi deviceDPI(const QSize &pixels, const QSizeF &physicalSizeMM)
{
const qreal inchToMM = 25.4;
const qreal h = qreal(pixels.width()) / (qreal(physicalSizeMM.width()) / inchToMM);
const qreal v = qreal(pixels.height()) / (qreal(physicalSizeMM.height()) / inchToMM);
return QDpi(h, v);
}
typedef QList<QWindowsScreenData> WindowsScreenDataList;
static bool monitorData(HMONITOR hMonitor, QWindowsScreenData *data)

View File

@ -84,11 +84,6 @@
QT_BEGIN_NAMESPACE
static inline COLORREF qColorToCOLORREF(const QColor &color)
{
return RGB(color.red(), color.green(), color.blue());
}
static inline QColor COLORREFToQColor(COLORREF cr)
{
return QColor(GetRValue(cr), GetGValue(cr), GetBValue(cr));
@ -105,30 +100,6 @@ static inline QTextStream& operator<<(QTextStream &str, const QColor &c)
return str;
}
static inline void paletteRoleToString(const QPalette &palette,
const QPalette::ColorRole role,
QTextStream &str)
{
str << "Role: ";
str.setFieldWidth(2);
str.setPadChar(QLatin1Char('0'));
str << role;
str.setFieldWidth(0);
str << " Active: " << palette.color(QPalette::Active, role)
<< " Disabled: " << palette.color(QPalette::Disabled, role)
<< " Inactive: " << palette.color(QPalette::Inactive, role)
<< '\n';
}
static inline QString paletteToString(const QPalette &palette)
{
QString result;
QTextStream str(&result);
for (int r = 0; r < QPalette::NColorRoles; ++r)
paletteRoleToString(palette, static_cast<QPalette::ColorRole>(r), str);
return result;
}
static inline bool booleanSystemParametersInfo(UINT what, bool defaultValue)
{
BOOL result;

View File

@ -254,13 +254,6 @@ static QWindow::Visibility windowVisibility_sys(HWND hwnd)
return QWindow::Windowed;
}
static inline QSize clientSize(HWND hwnd)
{
RECT rect = { 0, 0, 0, 0 };
GetClientRect(hwnd, &rect); // Always returns point 0,0, thus unusable for geometry.
return qSizeOfRect(rect);
}
static inline bool windowIsOpenGL(const QWindow *w)
{
switch (w->surfaceType()) {

View File

@ -619,8 +619,8 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
initializeScreens();
initializeXRender();
m_xi2Enabled = false;
#if defined(XCB_USE_XINPUT2)
m_xi2Enabled = false;
initializeXInput2();
#endif
initializeXShape();
@ -1142,8 +1142,16 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
handleClientMessageEvent((xcb_client_message_event_t *)event);
break;
case XCB_ENTER_NOTIFY:
#ifdef XCB_USE_XINPUT22
if (isAtLeastXI22() && xi2MouseEvents())
break;
#endif
HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
case XCB_LEAVE_NOTIFY:
#ifdef XCB_USE_XINPUT22
if (isAtLeastXI22() && xi2MouseEvents())
break;
#endif
m_keyboard->updateXKBStateFromCore(((xcb_leave_notify_event_t *)event)->state);
HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
case XCB_FOCUS_IN:
@ -1930,6 +1938,7 @@ static const char * xcb_atomnames = {
"Abs MT Position Y\0"
"Abs MT Touch Major\0"
"Abs MT Touch Minor\0"
"Abs MT Orientation\0"
"Abs MT Pressure\0"
"Abs MT Tracking ID\0"
"Max Contacts\0"
@ -2224,13 +2233,15 @@ void QXcbConnection::initializeXKB()
#endif
}
#if defined(XCB_USE_XINPUT22)
bool QXcbConnection::xi2MouseEvents() const
{
static bool mouseViaXI2 = !qEnvironmentVariableIsSet("QT_XCB_NO_XI2_MOUSE");
// Don't use XInput2 when Xinerama extension is enabled,
// because it causes problems with multi-monitor setup.
// FIXME: Don't use XInput2 mouse events when Xinerama extension
// is enabled, because it causes problems with multi-monitor setup.
return mouseViaXI2 && !has_xinerama_extension;
}
#endif
#if defined(XCB_USE_XINPUT2)
static int xi2ValuatorOffset(unsigned char *maskPtr, int maskLen, int number)

View File

@ -267,6 +267,7 @@ namespace QXcbAtom {
AbsMTPositionY,
AbsMTTouchMajor,
AbsMTTouchMinor,
AbsMTOrientation,
AbsMTPressure,
AbsMTTrackingID,
MaxContacts,
@ -353,8 +354,10 @@ public:
virtual void handleFocusInEvent(const xcb_focus_in_event_t *) {}
virtual void handleFocusOutEvent(const xcb_focus_out_event_t *) {}
virtual void handlePropertyNotifyEvent(const xcb_property_notify_event_t *) {}
#ifdef XCB_USE_XINPUT22
virtual void handleXIMouseEvent(xcb_ge_event_t *) {}
virtual void handleXIEnterLeave(xcb_ge_event_t *) {}
#endif
virtual QXcbWindow *toWindow() { return 0; }
};
@ -491,8 +494,8 @@ public:
static bool xEmbedSystemTrayAvailable();
static bool xEmbedSystemTrayVisualHasAlphaChannel();
#ifdef XCB_USE_XINPUT2
void handleEnterEvent(const xcb_enter_notify_event_t *);
#ifdef XCB_USE_XINPUT21
void handleEnterEvent();
#endif
#ifdef XCB_USE_XINPUT22
@ -506,7 +509,9 @@ public:
QXcbGlIntegration *glIntegration() const { return m_glIntegration; }
#ifdef XCB_USE_XINPUT22
bool xi2MouseEvents() const;
#endif
protected:
bool event(QEvent *e) Q_DECL_OVERRIDE;
@ -540,9 +545,9 @@ private:
void initializeScreens();
bool compressEvent(xcb_generic_event_t *event, int currentIndex, QXcbEventArray *eventqueue) const;
#ifdef XCB_USE_XINPUT2
bool m_xi2Enabled;
int m_xi2Minor;
#ifdef XCB_USE_XINPUT2
void initializeXInput2();
void finalizeXInput2();
void xi2SetupDevices();

View File

@ -54,6 +54,7 @@ struct XInput2TouchDeviceData {
XInput2TouchDeviceData()
: xiDeviceInfo(0)
, qtTouchDevice(0)
, providesTouchOrientation(false)
{
}
XIDeviceInfo *xiDeviceInfo;
@ -65,6 +66,7 @@ struct XInput2TouchDeviceData {
QPointF firstPressedPosition; // in screen coordinates where the first point was pressed
QPointF firstPressedNormalPosition; // device coordinates (0 to 1, 0 to 1) where the first point was pressed
QSizeF size; // device size in mm
bool providesTouchOrientation;
};
void QXcbConnection::initializeXInput2()
@ -299,6 +301,11 @@ void QXcbConnection::xi2Select(xcb_window_t window)
bitMask |= XI_ButtonPressMask;
bitMask |= XI_ButtonReleaseMask;
bitMask |= XI_MotionMask;
// There is a check for enter/leave events in plain xcb enter/leave event handler
bitMask |= XI_EnterMask;
bitMask |= XI_LeaveMask;
qCDebug(lcQpaXInput, "XInput 2.2: Selecting press/release/motion events in addition to touch");
}
XIEventMask mask;
@ -313,9 +320,12 @@ void QXcbConnection::xi2Select(xcb_window_t window)
if (result != Success)
qCDebug(lcQpaXInput, "XInput 2.2: failed to select pointer/touch events, window %x, result %d", window, result);
}
#endif // XCB_USE_XINPUT22
const bool pointerSelected = isAtLeastXI22() && xi2MouseEvents();
#else
const bool pointerSelected = false;
#endif // XCB_USE_XINPUT22
QSet<int> tabletDevices;
#ifndef QT_NO_TABLETEVENT
if (!m_tabletData.isEmpty()) {
@ -419,6 +429,8 @@ XInput2TouchDeviceData *QXcbConnection::touchDeviceForId(int id)
caps |= QTouchDevice::Position | QTouchDevice::NormalizedPosition;
else if (vci->label == atom(QXcbAtom::AbsMTTouchMajor))
caps |= QTouchDevice::Area;
else if (vci->label == atom(QXcbAtom::AbsMTOrientation))
dev->providesTouchOrientation = true;
else if (vci->label == atom(QXcbAtom::AbsMTPressure) || vci->label == atom(QXcbAtom::AbsPressure))
caps |= QTouchDevice::Pressure;
else if (vci->label == atom(QXcbAtom::RelX)) {
@ -480,6 +492,7 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent *>(event);
int sourceDeviceId = xiEvent->deviceid; // may be the master id
xXIDeviceEvent *xiDeviceEvent = 0;
xXIEnterEvent *xiEnterEvent = 0;
QXcbWindowEventListener *eventListener = 0;
switch (xiEvent->evtype) {
@ -494,14 +507,16 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
{
xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
eventListener = windowEventListenerFromId(xiDeviceEvent->event);
if (eventListener) {
long result = 0;
if (eventListener->handleGenericEvent(reinterpret_cast<xcb_generic_event_t *>(event), &result))
return;
}
sourceDeviceId = xiDeviceEvent->sourceid; // use the actual device id instead of the master
break;
}
case XI_Enter:
case XI_Leave: {
xiEnterEvent = reinterpret_cast<xXIEnterEvent *>(event);
eventListener = windowEventListenerFromId(xiEnterEvent->event);
sourceDeviceId = xiEnterEvent->sourceid; // use the actual device id instead of the master
break;
}
case XI_HierarchyChanged:
xi2HandleHierachyEvent(xiEvent);
return;
@ -512,13 +527,21 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
break;
}
if (eventListener) {
long result = 0;
if (eventListener->handleGenericEvent(reinterpret_cast<xcb_generic_event_t *>(event), &result))
return;
}
#ifndef QT_NO_TABLETEVENT
if (!xiEnterEvent) {
for (int i = 0; i < m_tabletData.count(); ++i) {
if (m_tabletData.at(i).deviceId == sourceDeviceId) {
if (xi2HandleTabletEvent(xiEvent, &m_tabletData[i], eventListener))
return;
}
}
}
#endif // QT_NO_TABLETEVENT
#ifdef XCB_USE_XINPUT21
@ -549,6 +572,13 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
xi2ProcessTouch(xiDeviceEvent, platformWindow);
break;
}
} else if (xiEnterEvent && xi2MouseEvents() && eventListener) {
switch (xiEnterEvent->evtype) {
case XI_Enter:
case XI_Leave:
eventListener->handleXIEnterLeave(event);
break;
}
}
#endif // XCB_USE_XINPUT22
}
@ -580,7 +610,9 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
QXcbScreen* screen = platformWindow->xcbScreen();
qreal x = fixed1616ToReal(xiDeviceEvent->root_x);
qreal y = fixed1616ToReal(xiDeviceEvent->root_y);
qreal nx = -1.0, ny = -1.0, d = 0.0;
qreal nx = -1.0, ny = -1.0;
qreal w = 0.0, h = 0.0;
bool majorAxisIsY = touchPoint.area.height() > touchPoint.area.width();
for (int i = 0; i < dev->xiDeviceInfo->num_classes; ++i) {
XIAnyClassInfo *classinfo = dev->xiDeviceInfo->classes[i];
if (classinfo->type == XIValuatorClass) {
@ -605,7 +637,24 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
} else if (vci->label == atom(QXcbAtom::AbsMTPositionY)) {
ny = valuatorNormalized(value, vci);
} else if (vci->label == atom(QXcbAtom::AbsMTTouchMajor)) {
d = valuatorNormalized(value, vci) * screen->geometry().width();
const qreal sw = screen->geometry().width();
const qreal sh = screen->geometry().height();
w = valuatorNormalized(value, vci) * std::sqrt(sw * sw + sh * sh);
} else if (vci->label == atom(QXcbAtom::AbsMTTouchMinor)) {
const qreal sw = screen->geometry().width();
const qreal sh = screen->geometry().height();
h = valuatorNormalized(value, vci) * std::sqrt(sw * sw + sh * sh);
} else if (vci->label == atom(QXcbAtom::AbsMTOrientation)) {
// Find the closest axis.
// 0 corresponds to the Y axis, vci->max to the X axis.
// Flipping over the Y axis and rotating by 180 degrees
// don't change the result, so normalize value to range
// [0, vci->max] first.
value = qAbs(value);
while (value > vci->max)
value -= 2 * vci->max;
value = qAbs(value);
majorAxisIsY = value < vci->max - value;
} else if (vci->label == atom(QXcbAtom::AbsMTPressure) ||
vci->label == atom(QXcbAtom::AbsPressure)) {
touchPoint.pressure = valuatorNormalized(value, vci);
@ -622,8 +671,18 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
ny = y / screen->geometry().height();
}
if (xiDeviceEvent->evtype != XI_TouchEnd) {
if (d == 0.0)
d = touchPoint.area.width();
if (!dev->providesTouchOrientation) {
if (w == 0.0)
w = touchPoint.area.width();
h = w;
} else {
if (w == 0.0)
w = qMax(touchPoint.area.width(), touchPoint.area.height());
if (h == 0.0)
h = qMin(touchPoint.area.width(), touchPoint.area.height());
if (majorAxisIsY)
qSwap(w, h);
}
}
switch (xiDeviceEvent->evtype) {
@ -687,7 +746,7 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
}
dev->pointPressedPosition.remove(touchPoint.id);
}
touchPoint.area = QRectF(x - d/2, y - d/2, d, d);
touchPoint.area = QRectF(x - w/2, y - h/2, w, h);
touchPoint.normalPosition = QPointF(nx, ny);
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled()))
@ -724,6 +783,8 @@ bool QXcbConnection::xi2SetMouseGrabEnabled(xcb_window_t w, bool grab)
XISetMask(mask, XI_ButtonPress);
XISetMask(mask, XI_ButtonRelease);
XISetMask(mask, XI_Motion);
XISetMask(mask, XI_Enter);
XISetMask(mask, XI_Leave);
XISetMask(mask, XI_TouchBegin);
XISetMask(mask, XI_TouchUpdate);
XISetMask(mask, XI_TouchEnd);
@ -833,9 +894,9 @@ void QXcbConnection::updateScrollingDevice(ScrollingDevice &scrollingDevice, int
#endif
}
void QXcbConnection::handleEnterEvent(const xcb_enter_notify_event_t *)
{
#ifdef XCB_USE_XINPUT21
void QXcbConnection::handleEnterEvent()
{
QHash<int, ScrollingDevice>::iterator it = m_scrollingDevices.begin();
const QHash<int, ScrollingDevice>::iterator end = m_scrollingDevices.end();
while (it != end) {
@ -851,8 +912,8 @@ void QXcbConnection::handleEnterEvent(const xcb_enter_notify_event_t *)
XIFreeDeviceInfo(xiDeviceInfo);
++it;
}
#endif
}
#endif
void QXcbConnection::xi2HandleScrollEvent(void *event, ScrollingDevice &scrollingDevice)
{

View File

@ -180,9 +180,11 @@ QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char
if (canNotGrabEnv)
m_canGrab = false;
const int numParameters = parameters.size();
m_connections.reserve(1 + numParameters / 2);
m_connections << new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName);
for (int i = 0; i < parameters.size() - 1; i += 2) {
for (int i = 0; i < numParameters - 1; i += 2) {
qCDebug(lcQpaScreen) << "connecting to additional display: " << parameters.at(i) << parameters.at(i+1);
QString display = parameters.at(i) + QLatin1Char(':') + parameters.at(i+1);
m_connections << new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, display.toLatin1().constData());

View File

@ -803,9 +803,9 @@ void QXcbKeyboard::updateXKBStateFromCore(quint16 state)
}
}
#ifdef XCB_USE_XINPUT22
void QXcbKeyboard::updateXKBStateFromXI(void *modInfo, void *groupInfo)
{
#ifdef XCB_USE_XINPUT22
if (m_config && !connection()->hasXKB()) {
xXIModifierInfo *mods = static_cast<xXIModifierInfo *>(modInfo);
xXIGroupInfo *group = static_cast<xXIGroupInfo *>(groupInfo);
@ -821,12 +821,8 @@ void QXcbKeyboard::updateXKBStateFromXI(void *modInfo, void *groupInfo)
//qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
}
}
#else
Q_UNUSED(modInfo);
Q_UNUSED(groupInfo);
Q_ASSERT(false); // this can't be
#endif
}
#endif
quint32 QXcbKeyboard::xkbModMask(quint16 state)
{

View File

@ -74,7 +74,9 @@ public:
void updateXKBMods();
quint32 xkbModMask(quint16 state);
void updateXKBStateFromCore(quint16 state);
#ifdef XCB_USE_XINPUT22
void updateXKBStateFromXI(void *modInfo, void *groupInfo);
#endif
#ifndef QT_NO_XKB
// when XKEYBOARD is present on the X server
int coreDeviceId() const { return core_device_id; }

View File

@ -900,8 +900,13 @@ static bool focusInPeeker(QXcbConnection *connection, xcb_generic_event_t *event
return true;
}
uint response_type = event->response_type & ~0x80;
if (response_type == XCB_FOCUS_IN)
if (response_type == XCB_FOCUS_IN) {
// Ignore focus events that are being sent only because the pointer is over
// our window, even if the input focus is in a different window.
xcb_focus_in_event_t *e = (xcb_focus_in_event_t *) event;
if (e->detail != XCB_NOTIFY_DETAIL_POINTER)
return true;
}
/* We are also interested in XEMBED_FOCUS_IN events */
if (response_type == XCB_CLIENT_MESSAGE) {
@ -2171,6 +2176,85 @@ void QXcbWindow::handleButtonReleaseEvent(int event_x, int event_y, int root_x,
handleMouseEvent(timestamp, local, global, modifiers);
}
static bool ignoreLeaveEvent(quint8 mode, quint8 detail)
{
return (mode == XCB_NOTIFY_MODE_GRAB && detail == XCB_NOTIFY_DETAIL_ANCESTOR) // Check for AwesomeWM
|| detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL;
}
static bool ignoreEnterEvent(quint8 mode, quint8 detail)
{
return ((mode == XCB_NOTIFY_MODE_UNGRAB && detail == XCB_NOTIFY_DETAIL_ANCESTOR) // Check for AwesomeWM
|| (mode != XCB_NOTIFY_MODE_NORMAL && mode != XCB_NOTIFY_MODE_UNGRAB)
|| detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL);
}
class EnterEventChecker
{
public:
bool checkEvent(xcb_generic_event_t *event)
{
if (!event)
return false;
if ((event->response_type & ~0x80) != XCB_ENTER_NOTIFY)
return false;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)event;
if (ignoreEnterEvent(enter->mode, enter->detail))
return false;
return true;
}
};
void QXcbWindow::handleEnterNotifyEvent(int event_x, int event_y, int root_x, int root_y,
quint8 mode, quint8 detail, xcb_timestamp_t timestamp)
{
connection()->setTime(timestamp);
#ifdef XCB_USE_XINPUT21
connection()->handleEnterEvent();
#endif
const QPoint global = QPoint(root_x, root_y);
if (ignoreEnterEvent(mode, detail)
|| (connection()->buttons() != Qt::NoButton
&& QGuiApplicationPrivate::lastCursorPosition != global))
return;
const QPoint local(event_x, event_y);
QWindowSystemInterface::handleEnterEvent(window(), local, global);
}
void QXcbWindow::handleLeaveNotifyEvent(int root_x, int root_y,
quint8 mode, quint8 detail, xcb_timestamp_t timestamp)
{
connection()->setTime(timestamp);
const QPoint global(root_x, root_y);
if (ignoreLeaveEvent(mode, detail)
|| (connection()->buttons() != Qt::NoButton
&& QGuiApplicationPrivate::lastCursorPosition != global))
return;
EnterEventChecker checker;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)connection()->checkEvent(checker);
QXcbWindow *enterWindow = enter ? connection()->platformWindowFromId(enter->event) : 0;
if (enterWindow) {
QPoint local(enter->event_x, enter->event_y);
QPoint global = QPoint(root_x, root_y);
QWindowSystemInterface::handleEnterLeaveEvent(enterWindow->window(), window(), local, global);
} else {
QWindowSystemInterface::handleLeaveEvent(window());
}
free(enter);
}
void QXcbWindow::handleMotionNotifyEvent(int event_x, int event_y, int root_x, int root_y,
Qt::KeyboardModifiers modifiers, xcb_timestamp_t timestamp)
{
@ -2205,12 +2289,10 @@ static inline int fixed1616ToInt(FP1616 val)
{
return int((qreal(val >> 16)) + (val & 0xFFFF) / (qreal)0xFFFF);
}
#endif
// With XI 2.2+ press/release/motion comes here instead of the above handlers.
void QXcbWindow::handleXIMouseEvent(xcb_ge_event_t *event)
{
#ifdef XCB_USE_XINPUT22
QXcbConnection *conn = connection();
xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent *>(event);
const Qt::KeyboardModifiers modifiers = conn->keyboard()->translateModifiers(ev->mods.effective_mods);
@ -2248,12 +2330,41 @@ void QXcbWindow::handleXIMouseEvent(xcb_ge_event_t *event)
qWarning() << "Unrecognized XI2 mouse event" << ev->evtype;
break;
}
#else
Q_UNUSED(event);
Q_ASSERT(false); // this can't be
#endif
}
// With XI 2.2+ enter/leave comes here and are blocked in plain xcb events
void QXcbWindow::handleXIEnterLeave(xcb_ge_event_t *event)
{
xXIEnterEvent *ev = reinterpret_cast<xXIEnterEvent *>(event);
// Compare the window with current mouse grabber to prevent deliver events to any other windows.
// If leave event occurs and the window is under mouse - allow to deliver the leave event.
QXcbWindow *mouseGrabber = connection()->mouseGrabber();
if (mouseGrabber && mouseGrabber != this
&& (ev->evtype != XI_Leave || QGuiApplicationPrivate::currentMouseWindow != window())) {
return;
}
const int root_x = fixed1616ToInt(ev->root_x);
const int root_y = fixed1616ToInt(ev->root_y);
switch (ev->evtype) {
case XI_Enter: {
const int event_x = fixed1616ToInt(ev->event_x);
const int event_y = fixed1616ToInt(ev->event_y);
qCDebug(lcQpaXInput, "XI2 mouse enter %d,%d, mode %d, detail %d, time %d", event_x, event_y, ev->mode, ev->detail, ev->time);
handleEnterNotifyEvent(event_x, event_y, root_x, root_y, ev->mode, ev->detail, ev->time);
break;
}
case XI_Leave:
qCDebug(lcQpaXInput, "XI2 mouse leave, mode %d, detail %d, time %d", ev->mode, ev->detail, ev->time);
connection()->keyboard()->updateXKBStateFromXI(&ev->mods, &ev->group);
handleLeaveNotifyEvent(root_x, root_y, ev->mode, ev->detail, ev->time);
break;
}
}
#endif
QXcbWindow *QXcbWindow::toWindow() { return this; }
void QXcbWindow::handleMouseEvent(xcb_timestamp_t time, const QPoint &local, const QPoint &global, Qt::KeyboardModifiers modifiers)
@ -2262,74 +2373,14 @@ void QXcbWindow::handleMouseEvent(xcb_timestamp_t time, const QPoint &local, con
QWindowSystemInterface::handleMouseEvent(window(), time, local, global, connection()->buttons(), modifiers);
}
static bool ignoreLeaveEvent(const xcb_leave_notify_event_t *event)
{
return event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL
|| event->mode == XCB_NOTIFY_MODE_GRAB;
}
static bool ignoreEnterEvent(const xcb_enter_notify_event_t *event)
{
return (event->mode != XCB_NOTIFY_MODE_NORMAL
|| event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL);
}
class EnterEventChecker
{
public:
bool checkEvent(xcb_generic_event_t *event)
{
if (!event)
return false;
if ((event->response_type & ~0x80) != XCB_ENTER_NOTIFY)
return false;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)event;
if (ignoreEnterEvent(enter))
return false;
return true;
}
};
void QXcbWindow::handleEnterNotifyEvent(const xcb_enter_notify_event_t *event)
{
connection()->setTime(event->time);
#ifdef XCB_USE_XINPUT2
connection()->handleEnterEvent(event);
#endif
if (ignoreEnterEvent(event))
return;
const QPoint local(event->event_x, event->event_y);
QPoint global = QPoint(event->root_x, event->root_y);
QWindowSystemInterface::handleEnterEvent(window(), local, global);
handleEnterNotifyEvent(event->event_x, event->event_y, event->root_x, event->root_y, event->mode, event->detail, event->time);
}
void QXcbWindow::handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event)
{
connection()->setTime(event->time);
if (ignoreLeaveEvent(event))
return;
EnterEventChecker checker;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)connection()->checkEvent(checker);
QXcbWindow *enterWindow = enter ? connection()->platformWindowFromId(enter->event) : 0;
if (enterWindow) {
QPoint local(enter->event_x, enter->event_y);
QPoint global = QPoint(event->root_x, event->root_y);
QWindowSystemInterface::handleEnterLeaveEvent(enterWindow->window(), window(), local, global);
} else {
QWindowSystemInterface::handleLeaveEvent(window());
}
free(enter);
handleLeaveNotifyEvent(event->root_x, event->root_y, event->mode, event->detail, event->time);
}
void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *event)
@ -2383,14 +2434,22 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
}
}
void QXcbWindow::handleFocusInEvent(const xcb_focus_in_event_t *)
void QXcbWindow::handleFocusInEvent(const xcb_focus_in_event_t *event)
{
// Ignore focus events that are being sent only because the pointer is over
// our window, even if the input focus is in a different window.
if (event->detail == XCB_NOTIFY_DETAIL_POINTER)
return;
doFocusIn();
}
void QXcbWindow::handleFocusOutEvent(const xcb_focus_out_event_t *)
void QXcbWindow::handleFocusOutEvent(const xcb_focus_out_event_t *event)
{
// Ignore focus events that are being sent only because the pointer is over
// our window, even if the input focus is in a different window.
if (event->detail == XCB_NOTIFY_DETAIL_POINTER)
return;
doFocusOut();
}
@ -2433,7 +2492,7 @@ bool QXcbWindow::setMouseGrabEnabled(bool grab)
if (!grab && connection()->mouseGrabber() == this)
connection()->setMouseGrabber(Q_NULLPTR);
#ifdef XCB_USE_XINPUT22
if (connection()->xi2MouseEvents()) {
if (connection()->isAtLeastXI22() && connection()->xi2MouseEvents()) {
bool result = connection()->xi2SetMouseGrabEnabled(m_window, grab);
if (grab && result)
connection()->setMouseGrabber(this);

View File

@ -138,7 +138,10 @@ public:
void handleFocusInEvent(const xcb_focus_in_event_t *event) Q_DECL_OVERRIDE;
void handleFocusOutEvent(const xcb_focus_out_event_t *event) Q_DECL_OVERRIDE;
void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) Q_DECL_OVERRIDE;
#ifdef XCB_USE_XINPUT22
void handleXIMouseEvent(xcb_ge_event_t *) Q_DECL_OVERRIDE;
void handleXIEnterLeave(xcb_ge_event_t *) Q_DECL_OVERRIDE;
#endif
QXcbWindow *toWindow() Q_DECL_OVERRIDE;
@ -219,6 +222,12 @@ protected:
void handleMotionNotifyEvent(int event_x, int event_y, int root_x, int root_y,
Qt::KeyboardModifiers modifiers, xcb_timestamp_t timestamp);
void handleEnterNotifyEvent(int event_x, int event_y, int root_x, int root_y,
quint8 mode, quint8 detail, xcb_timestamp_t timestamp);
void handleLeaveNotifyEvent(int root_x, int root_y,
quint8 mode, quint8 detail, xcb_timestamp_t timestamp);
xcb_window_t m_window;
uint m_depth;

View File

@ -40,7 +40,6 @@
#include "qtestresult_p.h"
#include <QtTest/qtestcase.h>
#include <QtTest/qtest.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qfile.h>
#include <QtCore/qset.h>

View File

@ -332,7 +332,9 @@ static void qPrintDataTags(FILE *stream)
member.resize(qstrlen(slot) + qstrlen("_data()") + 1);
qsnprintf(member.data(), member.size(), "%s_data()", slot);
invokeMethod(QTest::currentTestObject, member.constData());
for (int j = 0; j < table.dataCount(); ++j)
const int dataCount = table.dataCount();
localTags.reserve(dataCount);
for (int j = 0; j < dataCount; ++j)
localTags << QLatin1String(table.testData(j)->dataTag());
// Print all tag combinations:

View File

@ -392,6 +392,7 @@ static void parseCmdLine(QStringList &arguments)
int main(int argc, char **argv)
{
QStringList args;
args.reserve(argc - 1);
for (int n = 1; n < argc; ++n)
args.append(QString::fromLocal8Bit(argv[n]));
parseCmdLine(args);

View File

@ -381,7 +381,10 @@ static QStringList makeArgNames(const QDBusIntrospection::Arguments &inputArgs,
QDBusIntrospection::Arguments())
{
QStringList retval;
for (int i = 0; i < inputArgs.count(); ++i) {
const int numInputArgs = inputArgs.count();
const int numOutputArgs = outputArgs.count();
retval.reserve(numInputArgs + numOutputArgs);
for (int i = 0; i < numInputArgs; ++i) {
const QDBusIntrospection::Argument &arg = inputArgs.at(i);
QString name = arg.name;
if (name.isEmpty())
@ -392,7 +395,7 @@ static QStringList makeArgNames(const QDBusIntrospection::Arguments &inputArgs,
name += QLatin1String("_");
retval << name;
}
for (int i = 0; i < outputArgs.count(); ++i) {
for (int i = 0; i < numOutputArgs; ++i) {
const QDBusIntrospection::Argument &arg = outputArgs.at(i);
QString name = arg.name;
if (name.isEmpty())
@ -1137,7 +1140,7 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte
int main(int argc, char **argv)
{
QStringList arguments;
arguments.reserve(argc);
for (int i = 0; i < argc; ++i) {
arguments.append(QString::fromLocal8Bit(argv[i]));
}

View File

@ -2195,8 +2195,10 @@ QList<WriteInitialization::Item *> WriteInitialization::initializeTreeWidgetItem
{
// items
QList<Item *> items;
const int numDomItems = domItems.size();
items.reserve(numDomItems);
for (int i = 0; i < domItems.size(); ++i) {
for (int i = 0; i < numDomItems; ++i) {
const DomItem *domItem = domItems.at(i);
Item *item = new Item(QLatin1String("QTreeWidgetItem"), m_indent, m_output, m_refreshOut, m_driver);

View File

@ -466,6 +466,7 @@ void QSidebar::removeEntry()
QList<QModelIndex> idxs = selectionModel()->selectedIndexes();
QList<QPersistentModelIndex> indexes;
const int numIndexes = idxs.count();
indexes.reserve(numIndexes);
for (int i = 0; i < numIndexes; i++)
indexes.append(idxs.at(i));

View File

@ -188,7 +188,7 @@ protected:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
#ifdef Q_OS_WIN
bool nativeEvent(const QByteArray &eventType, void * message, long * result);
bool nativeEvent(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
#endif
void done(int result) Q_DECL_OVERRIDE;
virtual void initializePage(int id);

View File

@ -313,6 +313,7 @@ void QGraphicsWidget::resize(const QSizeF &size)
\fn void QGraphicsWidget::resize(qreal w, qreal h)
\overload
Constructs a resize with the given \c width (\a w) and \c height (\a h).
This convenience function is equivalent to calling resize(QSizeF(w, h)).
\sa setGeometry(), setTransform()

View File

@ -3154,9 +3154,8 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
case QEvent::KeyRelease:
{
bool isWidget = receiver->isWidgetType();
bool isGraphicsWidget = false;
#ifndef QT_NO_GRAPHICSVIEW
isGraphicsWidget = !isWidget && qobject_cast<QGraphicsWidget *>(receiver);
const bool isGraphicsWidget = !isWidget && qobject_cast<QGraphicsWidget *>(receiver);
#endif
QKeyEvent* key = static_cast<QKeyEvent*>(e);
bool def = key->isAccepted();

View File

@ -6443,13 +6443,13 @@ bool QWidget::hasFocus() const
const QWidget* w = this;
while (w->d_func()->extra && w->d_func()->extra->focus_proxy)
w = w->d_func()->extra->focus_proxy;
if (QWidget *window = w->window()) {
#ifndef QT_NO_GRAPHICSVIEW
if (QWidget *window = w->window()) {
QWExtra *e = window->d_func()->extra;
if (e && e->proxyWidget && e->proxyWidget->hasFocus() && window->focusWidget() == w)
return true;
#endif
}
#endif // !QT_NO_GRAPHICSVIEW
return (QApplication::focusWidget() == w);
}
@ -7946,8 +7946,11 @@ void QWidgetPrivate::show_sys()
invalidateBuffer(q->rect());
q->setAttribute(Qt::WA_Mapped);
// add our window the modal window list (native dialogs)
if ((q->isWindow() && (!extra || !extra->proxyWidget))
&& q->windowModality() != Qt::NonModal && window) {
if (window && q->isWindow()
#ifndef QT_NO_GRAPHICSVIEW
&& (!extra || !extra->proxyWidget)
#endif
&& q->windowModality() != Qt::NonModal) {
QGuiApplicationPrivate::showModalWindow(window);
}
return;
@ -8081,8 +8084,11 @@ void QWidgetPrivate::hide_sys()
if (q->testAttribute(Qt::WA_DontShowOnScreen)) {
q->setAttribute(Qt::WA_Mapped, false);
// remove our window from the modal window list (native dialogs)
if ((q->isWindow() && (!extra || !extra->proxyWidget))
&& q->windowModality() != Qt::NonModal && window) {
if (window && q->isWindow()
#ifndef QT_NO_GRAPHICSVIEW
&& (!extra || !extra->proxyWidget)
#endif
&& q->windowModality() != Qt::NonModal) {
QGuiApplicationPrivate::hideModalWindow(window);
}
// do not return here, if window non-zero, we must hide it
@ -12875,9 +12881,8 @@ void QWidget::setMask(const QRegion &newMask)
void QWidgetPrivate::setMask_sys(const QRegion &region)
{
Q_Q(QWidget);
if (const QWindow *window = q->windowHandle())
if (QPlatformWindow *platformWindow = window->handle())
platformWindow->setMask(QHighDpi::toNativeLocalRegion(region, window));
if (QWindow *window = q->windowHandle())
window->setMask(region);
}
/*!

View File

@ -1248,13 +1248,15 @@ void QWidgetBackingStore::doSync()
// OpenGL content changes. Check if we have such widgets in the special
// dirty list.
QVarLengthArray<QWidget *, 16> paintPending;
for (int i = 0; i < dirtyRenderToTextureWidgets.count(); ++i) {
const int numPaintPending = dirtyRenderToTextureWidgets.count();
paintPending.reserve(numPaintPending);
for (int i = 0; i < numPaintPending; ++i) {
QWidget *w = dirtyRenderToTextureWidgets.at(i);
paintPending << w;
resetWidget(w);
}
dirtyRenderToTextureWidgets.clear();
for (int i = 0; i < paintPending.count(); ++i) {
for (int i = 0; i < numPaintPending; ++i) {
QWidget *w = paintPending[i];
w->d_func()->sendPaintEvent(w->rect());
if (w != tlw) {

View File

@ -219,6 +219,26 @@ void QWindowsVistaAnimation::paint(QPainter *painter, const QStyleOption *option
painter->drawImage(option->rect, currentImage());
}
static inline bool supportsStateTransition(QStyle::PrimitiveElement element,
const QStyleOption *option,
const QWidget *widget)
{
bool result = false;
switch (element) {
case QStyle::PE_IndicatorRadioButton:
case QStyle::PE_IndicatorCheckBox:
result = true;
break;
// QTBUG-40634, do not animate when color is set in palette for PE_PanelLineEdit.
case QStyle::PE_FrameLineEdit:
result = !QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget);
break;
default:
break;
}
return result;
}
/*!
\internal
@ -249,6 +269,7 @@ void QWindowsVistaAnimation::paint(QPainter *painter, const QStyleOption *option
starting image for the hover transition.
*/
void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const
{
@ -265,11 +286,7 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
QRect oldRect;
QRect newRect;
/* widgets that support state transitions : */
if ( element == PE_FrameLineEdit
|| element == PE_IndicatorRadioButton
|| element == PE_IndicatorCheckBox)
{
if (supportsStateTransition(element, option, widget)) {
// Retrieve and update the dynamic properties tracking
// the previous state of the widget:
QObject *styleObject = option->styleObject;
@ -504,26 +521,9 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
case PE_PanelLineEdit:
if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
QBrush bg;
bool usePalette = false;
bool isEnabled = option->state & State_Enabled;
uint resolve_mask = panel->palette.resolve();
if (widget) {
// Since spin box includes a line edit we need to resolve the palette mask also from
// the parent, as while the color is always correct on the palette supplied by panel,
// the mask can still be empty. If either mask specifies custom base color, use that.
#ifndef QT_NO_SPINBOX
if (QAbstractSpinBox *spinbox = qobject_cast<QAbstractSpinBox*>(widget->parentWidget()))
resolve_mask |= spinbox->palette().resolve();
#endif // QT_NO_SPINBOX
}
if (resolve_mask & (1 << QPalette::Base)) {
// Base color is set for this widget, so use it
bg = panel->palette.brush(QPalette::Base);
usePalette = true;
}
if (usePalette) {
painter->fillRect(panel->rect, bg);
if (QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget)) {
painter->fillRect(panel->rect, panel->palette.brush(QPalette::Base));
} else {
int partId = EP_BACKGROUND;
int stateId = EBS_NORMAL;

View File

@ -377,6 +377,22 @@ bool QWindowsXPStylePrivate::isItemViewDelegateLineEdit(const QWidget *widget)
&& parent2->inherits("QAbstractItemView");
}
// Returns whether base color is set for this widget
bool QWindowsXPStylePrivate::isLineEditBaseColorSet(const QStyleOption *option, const QWidget *widget)
{
uint resolveMask = option->palette.resolve();
if (widget) {
// Since spin box includes a line edit we need to resolve the palette mask also from
// the parent, as while the color is always correct on the palette supplied by panel,
// the mask can still be empty. If either mask specifies custom base color, use that.
#ifndef QT_NO_SPINBOX
if (const QAbstractSpinBox *spinbox = qobject_cast<QAbstractSpinBox*>(widget->parentWidget()))
resolveMask |= spinbox->palette().resolve();
#endif // QT_NO_SPINBOX
}
return (resolveMask & (1 << QPalette::Base)) != 0;
}
/*! \internal
This function will always return a valid window handle, and might
create a limbo widget to do so.
@ -1606,30 +1622,12 @@ case PE_Frame:
themeNumber = QWindowsXPStylePrivate::EditTheme;
partId = EP_EDITTEXT;
noBorder = true;
QBrush bg;
bool usePalette = false;
bool isEnabled = flags & State_Enabled;
uint resolve_mask = panel->palette.resolve();
#ifndef QT_NO_SPINBOX
// Since spin box includes a line edit we need to resolve the palette mask also from
// the parent, as while the color is always correct on the palette supplied by panel,
// the mask can still be empty. If either mask specifies custom base color, use that.
if (widget) {
if (QAbstractSpinBox *spinbox = qobject_cast<QAbstractSpinBox*>(widget->parentWidget()))
resolve_mask |= spinbox->palette().resolve();
}
#endif // QT_NO_SPINBOX
if (resolve_mask & (1 << QPalette::Base)) {
// Base color is set for this widget, so use it
bg = panel->palette.brush(QPalette::Base);
usePalette = true;
}
stateId = isEnabled ? ETS_NORMAL : ETS_DISABLED;
if (usePalette) {
p->fillRect(panel->rect, bg);
if (QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget)) {
p->fillRect(panel->rect, panel->palette.brush(QPalette::Base));
} else {
XPThemeData theme(0, p, themeNumber, partId, stateId, rect);
if (!theme.isValid()) {

View File

@ -421,6 +421,7 @@ public:
static QString themeName(int theme);
static inline bool hasTheme(int theme) { return theme >= 0 && theme < NThemes && m_themes[theme]; }
static bool isItemViewDelegateLineEdit(const QWidget *widget);
static bool isLineEditBaseColorSet(const QStyleOption *option, const QWidget *widget);
QIcon dockFloat, dockClose;

View File

@ -879,7 +879,7 @@ void QDateTimeEdit::setDisplayFormat(const QString &format)
d->displayFormat.clear();
for (int i=d->sectionNodes.size() - 1; i>=0; --i) {
d->displayFormat += d->separators.at(i + 1);
d->displayFormat += d->sectionFormat(i);
d->displayFormat += d->sectionNode(i).format();
}
d->displayFormat += d->separators.at(0);
d->separators = reverse(d->separators);
@ -2220,9 +2220,9 @@ void QDateTimeEditPrivate::_q_editorCursorPositionChanged(int oldpos, int newpos
}
}
QDTEDEBUG << "currentSectionIndex is set to" << sectionName(sectionType(s))
QDTEDEBUG << "currentSectionIndex is set to" << sectionNode(s).name()
<< oldpos << newpos
<< "was" << sectionName(sectionType(currentSectionIndex));
<< "was" << sectionNode(currentSectionIndex).name();
currentSectionIndex = s;
Q_ASSERT_X(currentSectionIndex < sectionNodes.size(),

View File

@ -3356,8 +3356,9 @@ QSet<QTabBar*> QDockAreaLayout::usedTabBars() const
QSet<QWidget*> QDockAreaLayout::usedSeparatorWidgets() const
{
QSet<QWidget*> result;
for (int i = 0; i < separatorWidgets.count(); ++i)
const int numSeparators = separatorWidgets.count();
result.reserve(numSeparators);
for (int i = 0; i < numSeparators; ++i)
result << separatorWidgets.at(i);
for (int i = 0; i < QInternal::DockCount; ++i) {
const QDockAreaLayoutInfo &dock = docks[i];

View File

@ -1451,6 +1451,8 @@ bool QDockWidget::event(QEvent *event)
switch (event->type()) {
#ifndef QT_NO_ACTION
case QEvent::Hide:
if (d->state && d->state->dragging)
d->endDrag(true);
if (layout != 0)
layout->keepSize(this);
d->toggleViewAction->setChecked(false);

View File

@ -163,6 +163,7 @@ tst_QLocale::tst_QLocale()
void tst_QLocale::initTestCase()
{
#ifndef QT_NO_PROCESS
const QString syslocaleapp_dir = QFINDTESTDATA("syslocaleapp");
QVERIFY2(!syslocaleapp_dir.isEmpty(),
qPrintable(QStringLiteral("Cannot find 'syslocaleapp' starting from ")
@ -175,6 +176,7 @@ void tst_QLocale::initTestCase()
QVERIFY2(fi.exists() && fi.isExecutable(),
qPrintable(QDir::toNativeSeparators(m_sysapp)
+ QStringLiteral(" does not exist or is not executable.")));
#endif // QT_NO_PROCESS
}
void tst_QLocale::cleanupTestCase()

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