2
* Copyright 2014 Canonical Ltd.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation; version 3.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
* Michael Zanetti <michael.zanetti@canonical.com>
20
#include "desktopfilehandler.h"
22
#include <QStringList>
23
#include <QStandardPaths>
30
DesktopFileHandler::DesktopFileHandler(const QString &appId, QObject *parent):
37
QString DesktopFileHandler::appId() const
42
void DesktopFileHandler::setAppId(const QString &appId)
44
if (m_appId != appId) {
50
QString DesktopFileHandler::filename() const
55
bool DesktopFileHandler::isValid() const
57
return !m_filename.isEmpty();
60
void DesktopFileHandler::load()
64
if (m_appId.isEmpty()) {
69
QString helper = m_appId;
71
QStringList searchDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
72
#ifdef LAUNCHER_TESTING
73
searchDirs << QStringLiteral(".");
79
helper.replace(dashPos, 1, '/');
82
if (helper.contains('/')) {
83
path += helper.split('/').at(0) + '/';
84
helper.remove(QRegExp("^" + path));
87
Q_FOREACH(const QString &searchDirName, searchDirs) {
88
QDir searchDir(searchDirName + "/" + path);
89
const QString desktop = QStringLiteral("*.desktop");
90
Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << desktop)) {
91
if (desktopFile.startsWith(helper)) {
92
QFileInfo fileInfo(searchDir, desktopFile);
93
m_filename = fileInfo.absoluteFilePath();
99
dashPos = helper.indexOf('-');
100
} while (dashPos != -1);
103
QString DesktopFileHandler::displayName() const
109
QSettings settings(m_filename, QSettings::IniFormat);
110
settings.setIniCodec("UTF-8");
111
settings.beginGroup(QStringLiteral("Desktop Entry"));
113
// First try to find Name[xx_YY] and Name[xx] in .desktop file
114
const QString locale = QLocale().name();
115
const QStringList splitLocale = locale.split(QLatin1Char('_'));
116
const QString shortLocale = splitLocale.first();
118
if (locale != shortLocale && settings.contains(QStringLiteral("Name[%1]").arg(locale))) {
119
return settings.value(QStringLiteral("Name[%1]").arg(locale)).toString();
122
if (settings.contains(QStringLiteral("Name[%1]").arg(shortLocale))) {
123
return settings.value(QStringLiteral("Name[%1]").arg(shortLocale)).toString();
126
// No translation found in desktop file. Get the untranslated one and have a go with gettext.
127
QString displayName = settings.value(QStringLiteral("Name")).toString();
129
if (settings.contains(QStringLiteral("X-Ubuntu-Gettext-Domain"))) {
130
const QString domain = settings.value(QStringLiteral("X-Ubuntu-Gettext-Domain")).toString();
131
return dgettext(domain.toUtf8().constData(), displayName.toUtf8().constData());
137
QString DesktopFileHandler::icon() const
143
QSettings settings(m_filename, QSettings::IniFormat);
144
settings.setIniCodec("UTF-8");
145
settings.beginGroup(QStringLiteral("Desktop Entry"));
146
QString iconString = settings.value(QStringLiteral("Icon")).toString();
147
QString pathString = settings.value(QStringLiteral("Path")).toString();
149
if (QFileInfo::exists(iconString)) {
150
return QFileInfo(iconString).absoluteFilePath();
151
} else if (QFileInfo::exists(pathString + '/' + iconString)) {
152
return pathString + '/' + iconString;
154
return "image://theme/" + iconString;