Imported new upstream release: 3.0.0

* Switched to experimental
* Renamed packages to reflect the new soname
* Bumped Standards to 4.1.0
* Added override_dh_missing
* Added tools package
* Fixed symbols
ubuntu/cosmic
Alf Gaida 7 years ago
parent 4c58fcb9c3
commit ccc4eccbef

@ -0,0 +1,34 @@
<!--- Provide a general summary of the issue in the Title above -->
<!--- You could delete sections and/or questions irrelevant to your report --->
##### Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
##### Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
##### Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
##### Steps to Reproduce (for bugs)
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.
##### Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
##### System Information
<!--- Include as many relevant details about the system you experienced the bug in -->
* Distribution & Version:
* Kernel:
* Qt Version:
* cmake Version:
* Package version:

@ -1,7 +1,70 @@
libqtxdg-2.0.0 / 2016-09-17 libqtxdg-3.0.0 / 2017-09-22
=========================== ===========================
* Backport support for Scale directory key according to Icon Theme spec
* Bump Major to 3
* test: Drop Q_FOREACH
* Drop Q_FOREACH
* liblxqt make no sense here
* Copied issue template
* Drops Qt5Core_VERSION_STRING
* Avoid Qt special keywords collision
* XdgDesktopFile: Stops allocating unneeded QMap::keys()
* XdgDesktopFile: Stop allocating unneeded QHash:values()
* XdgDesktopFile: Improve const-ness
* xdgiconloader: Reworks the unthemed/pixmap search
* xdgiconloader: Puts the hicolor at the end of the theme hierarchy
* XdgIcon: Add flag for "FollowsColorScheme" processing
* xdgiconloader: Honor "FolowsColorScheme" theme hint
* xdgiconloader: Support symbolic SVG icons
* More fixes (#131)
* xdgiconloader: Correct hierarchy of fallbacks (#116)
* xdgiconloader: Fix XdgIconLoaderEngine::actualSize() (#130)
* Update CMakeLists.txt
* It adds loadIcon() timing measurements.
* xdgiconloader: Consider all existing files/images
* Check QTXDGX_ICONENGINEPLUGIN_INSTALL_PATH existence
* Mark QTXDGX_ICONENGINEPLUGIN_INSTALL_PATH as advanced
* xdgiconloader: Implement QIconEnginePlugin interface
* Disables uninstall target
* Remove last uses of Java-style (non-mutable) iterators from QtBase
* Adds a development qtxdg-iconfinder utility tool
* Enable strict iterators for debug builds
* Removes extra semi-colons
* Improve build warnings
* Bump year
* QtGui: eradicate Q_FOREACH loops [already const]
* Optimize QIconLoader::findIconHelper()
* Remove unused variable in QIconLoader::findIconHelper()
* Improve use of QHash to minimize double hashing
* QIconLoaderEngine: add missing Q_DECL_OVERRIDEs
* Replace QLatin1Literal with QLatin1String
* QIconCacheGtkReader: use QStringRef more
* Gui: use const (and const APIs) more
* Adds Link Time Optimization
* Replaces CMAKE_SOURCE_DIR by PROJECT_SOURCE_DIR
* Refactors superbuild support
* Remove duplicate use of source header files
* Use AUTOMOC everywhere
* Stop using include_directories()
* Removes test project definition
* Use CMAKE_INCLUDE_CURRENT_DIR
* Adds PROJECT_NAME to the build Qt version message
* Simplify target_compile_definitions() and target_include_directories()
* qiconloader: Reuse Qt implementation
* XdgIconLoader: Fix FTBFS in super-build/in-tree builds
* Allow xdg-user-dirs in the realpath of $HOME. On some systems /home is a symlink and $HOME points to the symlink. This commit allows the xdg-user-dirs to start with the real/canonical path.
* Updates version requirements in pkg-config (.pc) stuff
* Make Qt5Xdg use only the same version Qt5XdgIconLoader
* Adds minimum Qt version requirement (5.4.2)
* test: Fixes false positive in tst_xdgdesktopfile::testReadLocalized()
* Remove cpack (#106)
2.0.0 / 2016-09-17
==================
* Release 2.0.0: Add changelog
* Bump version to 2.0.0 * Bump version to 2.0.0
* Extend README.md * Extend README.md
* Updates dependencies * Updates dependencies

13
debian/changelog vendored

@ -1,11 +1,16 @@
libqtxdg (2.96.0-1) experimental; urgency=medium libqtxdg (3.0.0-1) experimental; urgency=medium
* New snapshot: 2.0.0-58-gbc64037 * Imported new upstream release: 3.0.0
* Switched to experimental * Switched to experimental
* Renamed packages to reflect the new soname * Renamed packages to reflect the new soname
* Bumped standards to 4.0.0, no changes needed * Added dependency libqt5svg5-dev to QtXdgIconloader dev package.
* Bumped Standards to 4.1.0
* Added override_dh_missing
* Added tools package
* Fixed symbols
* Reworked copyright
-- Alf Gaida <agaida@siduction.org> Tue, 25 Jul 2017 00:42:08 +0200 -- Alf Gaida <agaida@siduction.org> Fri, 06 Oct 2017 23:02:29 +0200
libqtxdg (2.0.0-7) unstable; urgency=medium libqtxdg (2.0.0-7) unstable; urgency=medium

5
debian/control vendored

@ -13,7 +13,7 @@ Build-Depends: debhelper (>= 10),
qtbase5-private-dev, qtbase5-private-dev,
qttools5-dev, qttools5-dev,
qttools5-dev-tools qttools5-dev-tools
Standards-Version: 4.1.0 Standards-Version: 4.1.1
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/libqtxdg.git/?h=debian/experimental Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/libqtxdg.git/?h=debian/experimental
Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/libqtxdg.git -b debian/experimental Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/libqtxdg.git -b debian/experimental
Homepage: https://github.com/lxde/libqtxdg Homepage: https://github.com/lxde/libqtxdg
@ -64,6 +64,8 @@ Package: libqt5xdgiconloader-dev
Architecture: any Architecture: any
Section: libdevel Section: libdevel
Depends: ${shlibs:Depends}, Depends: ${shlibs:Depends},
${misc:Depends},
libqt5svg5-dev,
libqt5xdgiconloader3 (= ${binary:Version}) libqt5xdgiconloader3 (= ${binary:Version})
Description: Development files for libqtxdgiconloader Description: Development files for libqtxdgiconloader
This library implements the backend to load icons which are handled according This library implements the backend to load icons which are handled according
@ -79,4 +81,3 @@ Depends: ${shlibs:Depends},
libqt5xdgiconloader3 (= ${binary:Version}) libqt5xdgiconloader3 (= ${binary:Version})
Description: Development tools for libqtxdgiconloader Description: Development tools for libqtxdgiconloader
This package provide some development tools for qtxdg. This package provide some development tools for qtxdg.

100
debian/copyright vendored

@ -3,22 +3,104 @@ Upstream-Name: libqtxdg
Source: https://github.com/lxde/libqtxdg Source: https://github.com/lxde/libqtxdg
Files: * Files: *
Copyright: 2012-2016 LXQt team Copyright: 2012-2016, LXQt team
2010-2012 Razor team 2010-2012, Razor team
License: LGPL-2.1+ License: LGPL-2.1+
Files: qtxdg/desktopenvironment_p.cpp
qtxdg/xdgdesktopfile_p.h
test/qtxdg_test.cpp
test/qtxdg_test.h
test/tst_xdgdirs.cpp
xdgiconloader/plugin/xdgiconengineplugin.cpp
xdgiconloader/plugin/xdgiconengineplugin.h
Copyright: 2013-2017, LXQt team
License: LGPL-2.1+
Files: xdgiconloader/xdgiconloader_p.h Files: qtxdg/xdgmacros.h
xdgiconloader/xdgiconloader.cpp qtxdg/xdgmimetype.cpp
Copyright: 2014 Digia Plc and/or its subsidiary(-ies). qtxdg/xdgmimetype.h
License: LGPL-2.1-or-3-with-Digia-1.1-exception test/tst_xdgdesktopfile.cpp
test/tst_xdgdesktopfile.h
util/qtxdg-desktop-file-start.cpp
util/qtxdg-iconfinder.cpp
Copyright: 2014-2017, Luís Pereira <luis.artur.pereira@gmail.com>
License: LGPL-2.1+
Files: cmake/create_pkgconfig_file.cmake
cmake/create_portable_headers.cmake
Copyright: 2015, Luís Pereira <luis.artur.pereira@gmail.com>
License: BSD-3-clause
Files: cmake/compiler_settings.cmake
Copyright: 2013, Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
2015, Luís Pereira <luis.artur.pereira@gmail.com>
License: BSD-3-clause
Files: debian/* Files: debian/*
Copyright: 2014-2016 ChangZhuo Chen (陳昌倬) <czchen@debian.org> Copyright: 2013-2017, Alf Gaida <agaida@siduction.org>
2013-2017 Alf Gaida <agaida@siduction.org> 2015, Andrew Lee (李健秋) <ajqlee@debian.org>
2015 Andrew Lee (李健秋) <ajqlee@debian.org> 2014-2016, ChangZhuo Chen (陳昌倬) <czchen@debian.org>
License: LGPL-2.1+ License: LGPL-2.1+
Files: qtxdg/xdgaction.cpp
qtxdg/xdgaction.h
qtxdg/xdgautostart.cpp
qtxdg/xdgautostart.h
qtxdg/xdgdesktopfile.cpp
qtxdg/xdgdesktopfile.h
qtxdg/xdgdirs.cpp
qtxdg/xdgdirs.h
qtxdg/xdgicon.cpp
qtxdg/xdgicon.h
qtxdg/xdgmenu.cpp
qtxdg/xdgmenu.h
qtxdg/xdgmenu_p.h
qtxdg/xdgmenuapplinkprocessor.cpp
qtxdg/xdgmenuapplinkprocessor.h
qtxdg/xdgmenulayoutprocessor.cpp
qtxdg/xdgmenulayoutprocessor.h
qtxdg/xdgmenureader.cpp
qtxdg/xdgmenureader.h
qtxdg/xdgmenurules.cpp
qtxdg/xdgmenurules.h
qtxdg/xdgmenuwidget.cpp
qtxdg/xdgmenuwidget.h
qtxdg/xmlhelper.cpp
qtxdg/xmlhelper.h
Copyright: 2010-2012, Razor team
License: LGPL-2.1+
Files: xdgiconloader/xdgiconloader.cpp
xdgiconloader/xdgiconloader_p.h
Copyright: 2014, Digia Plc and/or its subsidiary(-ies)
License: LGPL-2.1-or-3-with-Digia-1.1-exception
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
License: LGPL-2.1+ License: LGPL-2.1+
This program or library is free software; you can redistribute it This program or library is free software; you can redistribute it
and/or modify it under the terms of the GNU Lesser General Public and/or modify it under the terms of the GNU Lesser General Public

@ -94,11 +94,11 @@ libQt5Xdg.so.3 libqt5xdg3 #MINVER#
(c++)"XdgIcon::defaultApplicationIcon()@Base" 1.0.0 (c++)"XdgIcon::defaultApplicationIcon()@Base" 1.0.0
(c++)"XdgIcon::defaultApplicationIconName()@Base" 1.0.0 (c++)"XdgIcon::defaultApplicationIconName()@Base" 1.0.0
(c++)"XdgIcon::followColorScheme()@Base" 2.0.1~ (c++)"XdgIcon::followColorScheme()@Base" 3.0.0
(c++)"XdgIcon::fromTheme(QString const&, QIcon const&)@Base" 1.0.0 (c++)"XdgIcon::fromTheme(QString const&, QIcon const&)@Base" 1.0.0
(c++)"XdgIcon::fromTheme(QString const&, QString const&, QString const&, QString const&, QString const&)@Base" 1.0.0 (c++)"XdgIcon::fromTheme(QString const&, QString const&, QString const&, QString const&, QString const&)@Base" 1.0.0
(c++)"XdgIcon::fromTheme(QStringList const&, QIcon const&)@Base" 1.0.0 (c++)"XdgIcon::fromTheme(QStringList const&, QIcon const&)@Base" 1.0.0
(c++)"XdgIcon::setFollowColorScheme(bool)@Base" 2.0.1~ (c++)"XdgIcon::setFollowColorScheme(bool)@Base" 3.0.0
(c++)"XdgIcon::~XdgIcon()@Base" 1.0.0 (c++)"XdgIcon::~XdgIcon()@Base" 1.0.0
(c++)"XdgIcon::XdgIcon()@Base" 1.0.0 (c++)"XdgIcon::XdgIcon()@Base" 1.0.0

@ -6,7 +6,7 @@ libQt5XdgIconLoader.so.3 libqt5xdgiconloader3 #MINVER#
(c++)"XdgIconLoaderEngine::actualSize(QSize const&, QIcon::Mode, QIcon::State)@Base" 2.0.0 (c++)"XdgIconLoaderEngine::actualSize(QSize const&, QIcon::Mode, QIcon::State)@Base" 2.0.0
(c++)"XdgIconLoaderEngine::clone() const@Base" 2.0.0 (c++)"XdgIconLoaderEngine::clone() const@Base" 2.0.0
(c++)"XdgIconLoaderEngine::ensureLoaded()@Base" 2.0.0 (c++)"XdgIconLoaderEngine::ensureLoaded()@Base" 2.0.0
(c++)"XdgIconLoaderEngine::entryForSize(QSize const&)@Base" 2.0.0 (c++)"XdgIconLoaderEngine::entryForSize(QSize const&, int)@Base" 3.0.0
(c++)"XdgIconLoaderEngine::hasIcon() const@Base" 2.0.0 (c++)"XdgIconLoaderEngine::hasIcon() const@Base" 2.0.0
(c++)"XdgIconLoaderEngine::key() const@Base" 2.0.0 (c++)"XdgIconLoaderEngine::key() const@Base" 2.0.0
(c++)"XdgIconLoaderEngine::paint(QPainter*, QRect const&, QIcon::Mode, QIcon::State)@Base" 2.0.0 (c++)"XdgIconLoaderEngine::paint(QPainter*, QRect const&, QIcon::Mode, QIcon::State)@Base" 2.0.0
@ -18,8 +18,8 @@ libQt5XdgIconLoader.so.3 libqt5xdgiconloader3 #MINVER#
(c++)"XdgIconLoaderEngine::XdgIconLoaderEngine(QString const&)@Base" 2.0.0 (c++)"XdgIconLoaderEngine::XdgIconLoaderEngine(QString const&)@Base" 2.0.0
(c++)"XdgIconLoaderEngine::XdgIconLoaderEngine(XdgIconLoaderEngine const&)@Base" 2.0.0 (c++)"XdgIconLoaderEngine::XdgIconLoaderEngine(XdgIconLoaderEngine const&)@Base" 2.0.0
(c++)"XdgIconLoader::findIconHelper(QString const&, QString const&, QStringList&, bool) const@Base" 2.0.1~ (c++)"XdgIconLoader::findIconHelper(QString const&, QString const&, QStringList&, bool) const@Base" 3.0.0
(c++)"XdgIconLoader::instance()@Base" 2.0.0 (c++)"XdgIconLoader::instance()@Base" 2.0.0
(c++)"XdgIconLoader::loadIcon(QString const&) const@Base" 2.0.0 (c++)"XdgIconLoader::loadIcon(QString const&) const@Base" 2.0.0
(c++)"XdgIconLoader::setFollowColorScheme(bool)@Base" 2.0.1~ (c++)"XdgIconLoader::setFollowColorScheme(bool)@Base" 3.0.0
(c++)"XdgIconLoader::unthemedFallback(QString const&, QStringList const&) const@Base" 2.0.1~ (c++)"XdgIconLoader::unthemedFallback(QString const&, QStringList const&) const@Base" 3.0.0

@ -57,14 +57,14 @@ XdgDesktopFileList XdgAutoStart::desktopFileList(QStringList dirs, bool excludeH
QSet<QString> processed; QSet<QString> processed;
XdgDesktopFileList ret; XdgDesktopFileList ret;
Q_FOREACH (const QString &dirName, dirs) for (const QString &dirName : const_cast<const QStringList&>(dirs))
{ {
QDir dir(dirName); QDir dir(dirName);
if (!dir.exists()) if (!dir.exists())
continue; continue;
const QFileInfoList files = dir.entryInfoList(QStringList(QLatin1String("*.desktop")), QDir::Files | QDir::Readable); const QFileInfoList files = dir.entryInfoList(QStringList(QLatin1String("*.desktop")), QDir::Files | QDir::Readable);
Q_FOREACH (const QFileInfo &fi, files) for (const QFileInfo &fi : files)
{ {
if (processed.contains(fi.fileName())) if (processed.contains(fi.fileName()))
continue; continue;

@ -409,9 +409,9 @@ bool XdgDesktopFileData::startApplicationDetached(const XdgDesktopFile *q, const
} }
bool nonDetach = false; bool nonDetach = false;
Q_FOREACH(const QString &s, nonDetachExecs) for (const QString &s : nonDetachExecs)
{ {
Q_FOREACH(const QString &a, args) for (const QString &a : const_cast<const QStringList&>(args))
{ {
if (a.contains(s)) if (a.contains(s))
{ {
@ -953,7 +953,7 @@ QString expandEnvVariables(const QString str)
QStringList expandEnvVariables(const QStringList strs) QStringList expandEnvVariables(const QStringList strs)
{ {
QStringList res; QStringList res;
Q_FOREACH(const QString &s, strs) for (const QString &s : strs)
res << expandEnvVariables(s); res << expandEnvVariables(s);
return res; return res;
@ -969,9 +969,9 @@ QStringList XdgDesktopFile::expandExecString(const QStringList& urls) const
QString execStr = value(execKey).toString(); QString execStr = value(execKey).toString();
unEscapeExec(execStr); unEscapeExec(execStr);
QStringList tokens = parseCombinedArgString(execStr); const QStringList tokens = parseCombinedArgString(execStr);
Q_FOREACH (QString token, tokens) for (QString token : tokens)
{ {
// The parseCombinedArgString() splits the string by the space symbols, // The parseCombinedArgString() splits the string by the space symbols,
// we temporarily replaced them on the special characters. // we temporarily replaced them on the special characters.
@ -1016,7 +1016,7 @@ QStringList XdgDesktopFile::expandExecString(const QStringList& urls) const
// program. Local files may either be passed as file: URLs or as file path. // program. Local files may either be passed as file: URLs or as file path.
if (token == QLatin1String("%U")) if (token == QLatin1String("%U"))
{ {
Q_FOREACH (const QString &s, urls) for (const QString &s : urls)
{ {
QUrl url(expandEnvVariables(s)); QUrl url(expandEnvVariables(s));
result << ((!url.toLocalFile().isEmpty()) ? url.toLocalFile() : QString::fromUtf8(url.toEncoded())); result << ((!url.toLocalFile().isEmpty()) ? url.toLocalFile() : QString::fromUtf8(url.toEncoded()));
@ -1079,9 +1079,9 @@ bool checkTryExec(const QString& progName)
if (progName.startsWith(QDir::separator())) if (progName.startsWith(QDir::separator()))
return QFileInfo(progName).isExecutable(); return QFileInfo(progName).isExecutable();
QStringList dirs = QFile::decodeName(qgetenv("PATH")).split(QLatin1Char(':')); const QStringList dirs = QFile::decodeName(qgetenv("PATH")).split(QLatin1Char(':'));
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : dirs)
{ {
if (QFileInfo(QDir(dir), progName).isExecutable()) if (QFileInfo(QDir(dir), progName).isExecutable())
return true; return true;
@ -1103,7 +1103,7 @@ QString XdgDesktopFile::id(const QString &fileName, bool checkFileExists)
QString id = f.absoluteFilePath(); QString id = f.absoluteFilePath();
const QStringList dataDirs = XdgDirs::dataDirs(); const QStringList dataDirs = XdgDirs::dataDirs();
Q_FOREACH(const QString &d, dataDirs) { for (const QString &d : dataDirs) {
if (id.startsWith(d)) { if (id.startsWith(d)) {
// remove only the first occurence // remove only the first occurence
id.replace(id.indexOf(d), d.size(), QString()); id.replace(id.indexOf(d), d.size(), QString());
@ -1211,7 +1211,8 @@ bool XdgDesktopFile::isSuitable(bool excludeHidden, const QString &environment)
QString expandDynamicUrl(QString url) QString expandDynamicUrl(QString url)
{ {
Q_FOREACH(const QString &line, QProcess::systemEnvironment()) const QStringList env = QProcess::systemEnvironment();
for (const QString &line : env)
{ {
QString name = line.section(QLatin1Char('='), 0, 0); QString name = line.section(QLatin1Char('='), 0, 0);
QString val = line.section(QLatin1Char('='), 1); QString val = line.section(QLatin1Char('='), 1);
@ -1252,8 +1253,8 @@ QString findDesktopFile(const QString& dirName, const QString& desktopName)
return fi.canonicalFilePath(); return fi.canonicalFilePath();
// Working recursively ............ // Working recursively ............
QFileInfoList dirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot); const QFileInfoList dirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot);
Q_FOREACH (const QFileInfo &d, dirs) for (const QFileInfo &d : dirs)
{ {
QString cn = d.canonicalFilePath(); QString cn = d.canonicalFilePath();
if (dirName != cn) if (dirName != cn)
@ -1273,7 +1274,7 @@ QString findDesktopFile(const QString& desktopName)
QStringList dataDirs = XdgDirs::dataDirs(); QStringList dataDirs = XdgDirs::dataDirs();
dataDirs.prepend(XdgDirs::dataHome(false)); dataDirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH (const QString &dirName, dataDirs) for (const QString &dirName : const_cast<const QStringList&>(dataDirs))
{ {
QString f = findDesktopFile(dirName + QLatin1String("/applications"), desktopName); QString f = findDesktopFile(dirName + QLatin1String("/applications"), desktopName);
if (!f.isEmpty()) if (!f.isEmpty())
@ -1461,8 +1462,8 @@ void XdgDesktopFileCache::initialize(const QString& dirName)
// Working recursively ............ // Working recursively ............
QFileInfoList files = dir.entryInfoList(QStringList(), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); const QFileInfoList files = dir.entryInfoList(QStringList(), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
Q_FOREACH (const QFileInfo &f, files) for (const QFileInfo &f : files)
{ {
if (f.isDir()) if (f.isDir())
{ {
@ -1480,9 +1481,9 @@ void XdgDesktopFileCache::initialize(const QString& dirName)
m_fileCache.insert(f.absoluteFilePath(), df); m_fileCache.insert(f.absoluteFilePath(), df);
} }
QStringList mimes = df->value(mimeTypeKey).toString().split(QLatin1Char(';'), QString::SkipEmptyParts); const QStringList mimes = df->value(mimeTypeKey).toString().split(QLatin1Char(';'), QString::SkipEmptyParts);
Q_FOREACH (const QString &mime, mimes) for (const QString &mime : mimes)
{ {
int pref = df->value(initialPreferenceKey, 0).toInt(); int pref = df->value(initialPreferenceKey, 0).toInt();
// We move the desktopFile forward in the list for this mime, so that // We move the desktopFile forward in the list for this mime, so that
@ -1523,7 +1524,7 @@ void loadMimeCacheDir(const QString& dirName, QHash<QString, QList<XdgDesktopFil
// Working recursively ............ // Working recursively ............
const QFileInfoList files = dir.entryInfoList(QStringList(), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); const QFileInfoList files = dir.entryInfoList(QStringList(), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
Q_FOREACH (const QFileInfo &f, files) for (const QFileInfo &f : files)
{ {
if (f.isDir()) if (f.isDir())
{ {
@ -1538,7 +1539,7 @@ void loadMimeCacheDir(const QString& dirName, QHash<QString, QList<XdgDesktopFil
const QStringList mimes = df->value(mimeTypeKey).toString().split(QLatin1Char(';'), QString::SkipEmptyParts); const QStringList mimes = df->value(mimeTypeKey).toString().split(QLatin1Char(';'), QString::SkipEmptyParts);
Q_FOREACH (const QString &mime, mimes) for (const QString &mime : mimes)
{ {
int pref = df->value(initialPreferenceKey, 0).toInt(); int pref = df->value(initialPreferenceKey, 0).toInt();
// We move the desktopFile forward in the list for this mime, so that // We move the desktopFile forward in the list for this mime, so that
@ -1582,7 +1583,7 @@ void XdgDesktopFileCache::initialize()
QStringList dataDirs = XdgDirs::dataDirs(); QStringList dataDirs = XdgDirs::dataDirs();
dataDirs.prepend(XdgDirs::dataHome(false)); dataDirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH (const QString &dirname, dataDirs) for (const QString &dirname : const_cast<const QStringList&>(dataDirs))
{ {
initialize(dirname + QLatin1String("/applications")); initialize(dirname + QLatin1String("/applications"));
// loadMimeCacheDir(dirname + "/applications", m_defaultAppsCache); // loadMimeCacheDir(dirname + "/applications", m_defaultAppsCache);
@ -1593,7 +1594,8 @@ QList<XdgDesktopFile*> XdgDesktopFileCache::getAppsOfCategory(const QString& cat
{ {
QList<XdgDesktopFile*> list; QList<XdgDesktopFile*> list;
const QString _category = category.toUpper(); const QString _category = category.toUpper();
Q_FOREACH (XdgDesktopFile *desktopFile, instance().m_fileCache) const QHash<QString, XdgDesktopFile*> fileCache = instance().m_fileCache;
for (XdgDesktopFile *desktopFile : fileCache)
{ {
QStringList categories = desktopFile->value(categoriesKey).toString().toUpper().split(QLatin1Char(';')); QStringList categories = desktopFile->value(categoriesKey).toString().toUpper().split(QLatin1Char(';'));
if (!categories.isEmpty() && (categories.contains(_category) || categories.contains(QLatin1String("X-") + _category))) if (!categories.isEmpty() && (categories.contains(_category) || categories.contains(QLatin1String("X-") + _category)))
@ -1614,7 +1616,7 @@ XdgDesktopFile* XdgDesktopFileCache::getDefaultApp(const QString& mimetype)
// /usr/share/applications/mimeapps.list (in that order) for a default. // /usr/share/applications/mimeapps.list (in that order) for a default.
QStringList dataDirs = XdgDirs::dataDirs(); QStringList dataDirs = XdgDirs::dataDirs();
dataDirs.prepend(XdgDirs::dataHome(false)); dataDirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH(const QString &dataDir, dataDirs) for (const QString &dataDir : const_cast<const QStringList&>(dataDirs))
{ {
QString defaultsListPath = dataDir + QLatin1String("/applications/mimeapps.list"); QString defaultsListPath = dataDir + QLatin1String("/applications/mimeapps.list");
if (QFileInfo::exists(defaultsListPath)) if (QFileInfo::exists(defaultsListPath))
@ -1628,7 +1630,8 @@ XdgDesktopFile* XdgDesktopFileCache::getDefaultApp(const QString& mimetype)
QVariant value = defaults.value(mimetype); QVariant value = defaults.value(mimetype);
if (value.canConvert<QStringList>()) // A single string can also convert to a stringlist if (value.canConvert<QStringList>()) // A single string can also convert to a stringlist
{ {
Q_FOREACH (const QString &desktopFileName, value.toStringList()) const QStringList values = value.toStringList();
for (const QString &desktopFileName : values)
{ {
XdgDesktopFile* desktopFile = XdgDesktopFileCache::getFile(desktopFileName); XdgDesktopFile* desktopFile = XdgDesktopFileCache::getFile(desktopFileName);
if (desktopFile) if (desktopFile)

@ -336,7 +336,7 @@ QStringList XdgDirs::autostartDirs(const QString &postfix)
{ {
QStringList dirs; QStringList dirs;
const QStringList s = configDirs(); const QStringList s = configDirs();
Q_FOREACH(const QString &dir, s) for (const QString &dir : s)
dirs << QString::fromLatin1("%1/autostart").arg(dir) + postfix; dirs << QString::fromLatin1("%1/autostart").arg(dir) + postfix;
return dirs; return dirs;

@ -118,7 +118,7 @@ QIcon XdgIcon::fromTheme(const QString& iconName, const QIcon& fallback)
************************************************/ ************************************************/
QIcon XdgIcon::fromTheme(const QStringList& iconNames, const QIcon& fallback) QIcon XdgIcon::fromTheme(const QStringList& iconNames, const QIcon& fallback)
{ {
Q_FOREACH (const QString &iconName, iconNames) for (const QString &iconName : iconNames)
{ {
QIcon icon = fromTheme(iconName); QIcon icon = fromTheme(iconName);
if (!icon.isNull()) if (!icon.isNull())

@ -412,7 +412,7 @@ QDomElement XdgMenu::findMenu(QDomElement& baseElement, const QString& path, boo
const QStringList names = path.split(QLatin1Char('/'), QString::SkipEmptyParts); const QStringList names = path.split(QLatin1Char('/'), QString::SkipEmptyParts);
QDomElement el = baseElement; QDomElement el = baseElement;
Q_FOREACH (const QString &name, names) for (const QString &name : names)
{ {
QDomElement p = el; QDomElement p = el;
el = d->mXml.createElement(QLatin1String("Menu")); el = d->mXml.createElement(QLatin1String("Menu"));
@ -537,12 +537,12 @@ void XdgMenuPrivate::processDirectoryEntries(QDomElement& element, const QString
dirs << parentDirs; dirs << parentDirs;
bool found = false; bool found = false;
Q_FOREACH(const QString &file, files){ for (const QString &file : const_cast<const QStringList&>(files)){
if (file.startsWith(QLatin1Char('/'))) if (file.startsWith(QLatin1Char('/')))
found = loadDirectoryFile(file, element); found = loadDirectoryFile(file, element);
else else
{ {
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : const_cast<const QStringList&>(dirs))
{ {
found = loadDirectoryFile(dir + QLatin1Char('/') + file, element); found = loadDirectoryFile(dir + QLatin1Char('/') + file, element);
if (found) break; if (found) break;
@ -651,7 +651,7 @@ QString XdgMenu::getMenuFileName(const QString& baseName)
const QStringList configDirs = XdgDirs::configDirs(); const QStringList configDirs = XdgDirs::configDirs();
QString menuPrefix = QString::fromLocal8Bit(qgetenv("XDG_MENU_PREFIX")); QString menuPrefix = QString::fromLocal8Bit(qgetenv("XDG_MENU_PREFIX"));
Q_FOREACH(const QString &configDir, configDirs) for (const QString &configDir : configDirs)
{ {
QFileInfo file(QString::fromLatin1("%1/menus/%2%3").arg(configDir, menuPrefix, baseName)); QFileInfo file(QString::fromLatin1("%1/menus/%2%3").arg(configDir, menuPrefix, baseName));
if (file.exists()) if (file.exists())
@ -669,9 +669,9 @@ QString XdgMenu::getMenuFileName(const QString& baseName)
wellKnownFiles << QLatin1String("gnome-applications.menu"); wellKnownFiles << QLatin1String("gnome-applications.menu");
wellKnownFiles << QLatin1String("lxde-applications.menu"); wellKnownFiles << QLatin1String("lxde-applications.menu");
Q_FOREACH(const QString &configDir, configDirs) for (const QString &configDir : configDirs)
{ {
Q_FOREACH (const QString &f, wellKnownFiles) for (const QString &f : const_cast<const QStringList&>(wellKnownFiles))
{ {
QFileInfo file(QString::fromLatin1("%1/menus/%2").arg(configDir, f)); QFileInfo file(QString::fromLatin1("%1/menus/%2").arg(configDir, f));
if (file.exists()) if (file.exists())

@ -90,7 +90,8 @@ void XdgMenuApplinkProcessor::step1()
} }
// Process childs menus ............................... // Process childs menus ...............................
Q_FOREACH (XdgMenuApplinkProcessor* child, mChilds)
for (XdgMenuApplinkProcessor* child : const_cast<const QLinkedList<XdgMenuApplinkProcessor*>&>(mChilds))
child->step1(); child->step1();
} }
@ -100,7 +101,7 @@ void XdgMenuApplinkProcessor::step2()
// Create AppLinks elements ........................... // Create AppLinks elements ...........................
QDomDocument doc = mElement.ownerDocument(); QDomDocument doc = mElement.ownerDocument();
Q_FOREACH (XdgMenuAppFileInfo* fileInfo, mSelected) for (XdgMenuAppFileInfo* fileInfo : const_cast<const QLinkedList<XdgMenuAppFileInfo*>&>(mSelected))
{ {
if (mOnlyUnallocated && fileInfo->allocated()) if (mOnlyUnallocated && fileInfo->allocated())
continue; continue;
@ -141,7 +142,7 @@ void XdgMenuApplinkProcessor::step2()
// Process childs menus ............................... // Process childs menus ...............................
Q_FOREACH (XdgMenuApplinkProcessor* child, mChilds) for (XdgMenuApplinkProcessor* child : const_cast<const QLinkedList<XdgMenuApplinkProcessor*>&>(mChilds))
child->step2(); child->step2();
} }
@ -189,7 +190,7 @@ void XdgMenuApplinkProcessor::findDesktopFiles(const QString& dirName, const QSt
mMenu->addWatchPath(dir.absolutePath()); mMenu->addWatchPath(dir.absolutePath());
const QFileInfoList files = dir.entryInfoList(QStringList(QLatin1String("*.desktop")), QDir::Files); const QFileInfoList files = dir.entryInfoList(QStringList(QLatin1String("*.desktop")), QDir::Files);
Q_FOREACH (const QFileInfo &file, files) for (const QFileInfo &file : files)
{ {
XdgDesktopFile* f = XdgDesktopFileCache::getFile(file.canonicalFilePath()); XdgDesktopFile* f = XdgDesktopFileCache::getFile(file.canonicalFilePath());
if (f) if (f)
@ -199,7 +200,7 @@ void XdgMenuApplinkProcessor::findDesktopFiles(const QString& dirName, const QSt
// Working recursively ............ // Working recursively ............
const QFileInfoList dirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot); const QFileInfoList dirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot);
Q_FOREACH (const QFileInfo &d, dirs) for (const QFileInfo &d : dirs)
{ {
QString dn = d.canonicalFilePath(); QString dn = d.canonicalFilePath();
if (dn != dirName) if (dn != dirName)
@ -242,7 +243,7 @@ bool XdgMenuApplinkProcessor::checkTryExec(const QString& progName)
const QStringList dirs = QFile::decodeName(qgetenv("PATH")).split(QLatin1Char(':')); const QStringList dirs = QFile::decodeName(qgetenv("PATH")).split(QLatin1Char(':'));
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : dirs)
{ {
if (QFileInfo(QDir(dir), progName).isExecutable()) if (QFileInfo(QDir(dir), progName).isExecutable())
return true; return true;

@ -215,7 +215,7 @@ void XdgMenuReader::processMergeFileTag(QDomElement& element, QStringList* merge
QString relativeName; QString relativeName;
QStringList configDirs = XdgDirs::configDirs(); QStringList configDirs = XdgDirs::configDirs();
Q_FOREACH (const QString &configDir, configDirs) for (const QString &configDir : const_cast<const QStringList&>(configDirs))
{ {
if (mFileName.startsWith(configDir)) if (mFileName.startsWith(configDir))
{ {
@ -236,7 +236,7 @@ void XdgMenuReader::processMergeFileTag(QDomElement& element, QStringList* merge
if (relativeName.isEmpty()) if (relativeName.isEmpty())
return; return;
Q_FOREACH (const QString &configDir, configDirs) for (const QString &configDir : configDirs)
{ {
if (QFileInfo::exists(configDir + relativeName)) if (QFileInfo::exists(configDir + relativeName))
{ {
@ -295,7 +295,7 @@ void XdgMenuReader::processDefaultMergeDirsTag(QDomElement& element, QStringList
QStringList dirs = XdgDirs::configDirs(); QStringList dirs = XdgDirs::configDirs();
dirs << XdgDirs::configHome(); dirs << XdgDirs::configHome();
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : const_cast<const QStringList&>(dirs))
{ {
mergeDir(QString::fromLatin1("%1/menus/%2-merged").arg(dir, menuBaseName), element, mergedFiles); mergeDir(QString::fromLatin1("%1/menus/%2-merged").arg(dir, menuBaseName), element, mergedFiles);
} }
@ -329,7 +329,7 @@ void XdgMenuReader::processDefaultAppDirsTag(QDomElement& element)
QStringList dirs = XdgDirs::dataDirs(); QStringList dirs = XdgDirs::dataDirs();
dirs.prepend(XdgDirs::dataHome(false)); dirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : const_cast<const QStringList&> (dirs))
{ {
//qDebug() << "Add AppDir: " << dir + "/applications/"; //qDebug() << "Add AppDir: " << dir + "/applications/";
addDirTag(element, QLatin1String("AppDir"), dir + QLatin1String("/applications/")); addDirTag(element, QLatin1String("AppDir"), dir + QLatin1String("/applications/"));
@ -360,7 +360,7 @@ void XdgMenuReader::processDefaultDirectoryDirsTag(QDomElement& element)
QStringList dirs = XdgDirs::dataDirs(); QStringList dirs = XdgDirs::dataDirs();
dirs.prepend(XdgDirs::dataHome(false)); dirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH (const QString &dir, dirs) for (const QString &dir : const_cast<const QStringList&>(dirs))
addDirTag(element, QLatin1String("DirectoryDir"), dir + QLatin1String("/desktop-directories/")); addDirTag(element, QLatin1String("DirectoryDir"), dir + QLatin1String("/desktop-directories/"));
} }
@ -379,8 +379,7 @@ void XdgMenuReader::addDirTag(QDomElement& previousElement, const QString& tagNa
} }
} }
/*
/************************************************
If fileName is not an absolute path then the file to be merged should be located If fileName is not an absolute path then the file to be merged should be located
relative to the location of this menu file. relative to the location of this menu file.
************************************************/ ************************************************/
@ -431,7 +430,7 @@ void XdgMenuReader::mergeDir(const QString& dirName, QDomElement& element, QStri
QDir dir = QDir(dirInfo.canonicalFilePath()); QDir dir = QDir(dirInfo.canonicalFilePath());
const QFileInfoList files = dir.entryInfoList(QStringList() << QLatin1String("*.menu"), QDir::Files | QDir::Readable); const QFileInfoList files = dir.entryInfoList(QStringList() << QLatin1String("*.menu"), QDir::Files | QDir::Readable);
Q_FOREACH (const QFileInfo &file, files) for (const QFileInfo &file : files)
mergeFile(file.canonicalFilePath(), element, mergedFiles); mergeFile(file.canonicalFilePath(), element, mergedFiles);
} }
} }

@ -96,7 +96,7 @@ QString XdgMimeType::iconName() const
names.append(QMimeType::iconName()); names.append(QMimeType::iconName());
names.append(QMimeType::genericIconName()); names.append(QMimeType::genericIconName());
Q_FOREACH (const QString &s, names) { for (const QString &s : const_cast<const QStringList&>(names)) {
if (!XdgIcon::fromTheme(s).isNull()) { if (!XdgIcon::fromTheme(s).isNull()) {
dx->iconName = s; dx->iconName = s;
break; break;

@ -47,15 +47,17 @@ void QtXdgTest::testDefaultApp()
{ {
QStringList mimedirs = XdgDirs::dataDirs(); QStringList mimedirs = XdgDirs::dataDirs();
mimedirs.prepend(XdgDirs::dataHome(false)); mimedirs.prepend(XdgDirs::dataHome(false));
Q_FOREACH (QString mimedir, mimedirs) for (const QString &mimedir : const_cast<const QStringList&>(mimedirs))
{ {
QDir dir(mimedir + "/mime"); QDir dir(mimedir + "/mime");
qDebug() << dir.path(); qDebug() << dir.path();
QStringList filters = (QStringList() << "*.xml"); QStringList filters = (QStringList() << "*.xml");
Q_FOREACH(QFileInfo mediaDir, dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) const QFileInfoList &mediaDirs = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const QFileInfo &mediaDir : mediaDirs)
{ {
qDebug() << " " << mediaDir.fileName(); qDebug() << " " << mediaDir.fileName();
Q_FOREACH (QString mimeXmlFileName, QDir(mediaDir.absoluteFilePath()).entryList(filters, QDir::Files)) const QStringList mimeXmlFileNames = QDir(mediaDir.absoluteFilePath()).entryList(filters, QDir::Files);
for (const QString &mimeXmlFileName : mimeXmlFileNames)
{ {
QString mimetype = mediaDir.fileName() + "/" + mimeXmlFileName.left(mimeXmlFileName.length() - 4); QString mimetype = mediaDir.fileName() + "/" + mimeXmlFileName.left(mimeXmlFileName.length() - 4);
QString xdg_utils_default = xdgUtilDefaultApp(mimetype); QString xdg_utils_default = xdgUtilDefaultApp(mimetype);

@ -41,6 +41,7 @@
#include <qpa/qplatformtheme.h> #include <qpa/qplatformtheme.h>
#include <QtGui/QIconEngine> #include <QtGui/QIconEngine>
#include <QtGui/QPalette> #include <QtGui/QPalette>
#include <QtCore/qmath.h>
#include <QtCore/QList> #include <QtCore/QList>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QSettings> #include <QtCore/QSettings>
@ -287,6 +288,11 @@ XdgIconTheme::XdgIconTheme(const QString &themeName)
dirInfo.maxSize = indexReader.value(directoryKey + dirInfo.maxSize = indexReader.value(directoryKey +
QLatin1String("/MaxSize"), QLatin1String("/MaxSize"),
size).toInt(); size).toInt();
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
dirInfo.scale = indexReader.value(directoryKey +
QLatin1String("/Scale"),
1).toInt();
#endif
m_keyList.append(dirInfo); m_keyList.append(dirInfo);
} }
} }
@ -594,8 +600,12 @@ void XdgIconLoaderEngine::paint(QPainter *painter, const QRect &rect,
* This algorithm is defined by the freedesktop spec: * This algorithm is defined by the freedesktop spec:
* http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html * http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
*/ */
static bool directoryMatchesSize(const QIconDirInfo &dir, int iconsize) static bool directoryMatchesSize(const QIconDirInfo &dir, int iconsize, int iconscale)
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
if (dir.scale != iconscale)
return false;
#endif
if (dir.type == QIconDirInfo::Fixed) { if (dir.type == QIconDirInfo::Fixed) {
return dir.size == iconsize; return dir.size == iconsize;
@ -616,8 +626,29 @@ static bool directoryMatchesSize(const QIconDirInfo &dir, int iconsize)
* This algorithm is defined by the freedesktop spec: * This algorithm is defined by the freedesktop spec:
* http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html * http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
*/ */
static int directorySizeDistance(const QIconDirInfo &dir, int iconsize) static int directorySizeDistance(const QIconDirInfo &dir, int iconsize, int iconscale)
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
const int scaledIconSize = iconsize * iconscale;
if (dir.type == QIconDirInfo::Fixed) {
return qAbs(dir.size * dir.scale - scaledIconSize);
} else if (dir.type == QIconDirInfo::Scalable) {
if (scaledIconSize < dir.minSize * dir.scale)
return dir.minSize * dir.scale - scaledIconSize;
else if (scaledIconSize > dir.maxSize * dir.scale)
return scaledIconSize - dir.maxSize * dir.scale;
else
return 0;
} else if (dir.type == QIconDirInfo::Threshold) {
if (scaledIconSize < (dir.size - dir.threshold) * dir.scale)
return dir.minSize * dir.scale - scaledIconSize;
else if (scaledIconSize > (dir.size + dir.threshold) * dir.scale)
return scaledIconSize - dir.maxSize * dir.scale;
else return 0;
}
#else
if (dir.type == QIconDirInfo::Fixed) { if (dir.type == QIconDirInfo::Fixed) {
return qAbs(dir.size - iconsize); return qAbs(dir.size - iconsize);
@ -636,12 +667,13 @@ static int directorySizeDistance(const QIconDirInfo &dir, int iconsize)
return iconsize - dir.maxSize; return iconsize - dir.maxSize;
else return 0; else return 0;
} }
#endif
Q_ASSERT(1); // Not a valid value Q_ASSERT(1); // Not a valid value
return INT_MAX; return INT_MAX;
} }
QIconLoaderEngineEntry *XdgIconLoaderEngine::entryForSize(const QSize &size) QIconLoaderEngineEntry *XdgIconLoaderEngine::entryForSize(const QSize &size, int scale)
{ {
int iconsize = qMin(size.width(), size.height()); int iconsize = qMin(size.width(), size.height());
@ -653,7 +685,7 @@ QIconLoaderEngineEntry *XdgIconLoaderEngine::entryForSize(const QSize &size)
// Search for exact matches first // Search for exact matches first
for (int i = 0; i < numEntries; ++i) { for (int i = 0; i < numEntries; ++i) {
QIconLoaderEngineEntry *entry = m_info.entries.at(i); QIconLoaderEngineEntry *entry = m_info.entries.at(i);
if (directoryMatchesSize(entry->dir, iconsize)) { if (directoryMatchesSize(entry->dir, iconsize, scale)) {
return entry; return entry;
} }
} }
@ -663,7 +695,7 @@ QIconLoaderEngineEntry *XdgIconLoaderEngine::entryForSize(const QSize &size)
QIconLoaderEngineEntry *closestMatch = 0; QIconLoaderEngineEntry *closestMatch = 0;
for (int i = 0; i < numEntries; ++i) { for (int i = 0; i < numEntries; ++i) {
QIconLoaderEngineEntry *entry = m_info.entries.at(i); QIconLoaderEngineEntry *entry = m_info.entries.at(i);
int distance = directorySizeDistance(entry->dir, iconsize); int distance = directorySizeDistance(entry->dir, iconsize, scale);
if (distance < minimalSize) { if (distance < minimalSize) {
minimalSize = distance; minimalSize = distance;
closestMatch = entry; closestMatch = entry;
@ -716,6 +748,8 @@ QPixmap PixmapEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State st
basePixmap.load(filename); basePixmap.load(filename);
QSize actualSize = basePixmap.size(); QSize actualSize = basePixmap.size();
// If the size of the best match we have (basePixmap) is larger than the
// requested size, we downscale it to match.
if (!actualSize.isNull() && (actualSize.width() > size.width() || actualSize.height() > size.height())) if (!actualSize.isNull() && (actualSize.width() > size.width() || actualSize.height() > size.height()))
actualSize.scale(size, Qt::KeepAspectRatio); actualSize.scale(size, Qt::KeepAspectRatio);
@ -879,6 +913,17 @@ void XdgIconLoaderEngine::virtual_hook(int id, void *data)
*reinterpret_cast<bool*>(data) = m_info.entries.isEmpty(); *reinterpret_cast<bool*>(data) = m_info.entries.isEmpty();
} }
break; break;
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
case QIconEngine::ScaledPixmapHook:
{
QIconEngine::ScaledPixmapArgument &arg = *reinterpret_cast<QIconEngine::ScaledPixmapArgument*>(data);
// QIcon::pixmap() multiplies size by the device pixel ratio.
const int integerScale = qCeil(arg.scale);
QIconLoaderEngineEntry *entry = entryForSize(arg.size / integerScale, integerScale);
arg.pixmap = entry ? entry->pixmap(arg.size, arg.mode, arg.state) : QPixmap();
}
break;
#endif #endif
default: default:
QIconEngine::virtual_hook(id, data); QIconEngine::virtual_hook(id, data);

@ -86,7 +86,7 @@ private:
bool hasIcon() const; bool hasIcon() const;
void ensureLoaded(); void ensureLoaded();
void virtual_hook(int id, void *data) Q_DECL_OVERRIDE; void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
QIconLoaderEngineEntry *entryForSize(const QSize &size); QIconLoaderEngineEntry *entryForSize(const QSize &size, int scale = 1);
XdgIconLoaderEngine(const XdgIconLoaderEngine &other); XdgIconLoaderEngine(const XdgIconLoaderEngine &other);
QThemeIconInfo m_info; QThemeIconInfo m_info;
QString m_iconName; QString m_iconName;

Loading…
Cancel
Save