fix: introduce new DesktopFile class
KeyFile::saveToFile not guaranteed section order, which is not the right behavior of desktop file. XDG requires the first section of desktop file always to be "Desktop Entry". So I write a new DesktopFile class, which override the saveToFile method of KeyFile, to make it work. close linuxdeepin/developer-center#3807 Signed-off-by: black-desk <me@black-desk.cn>
This commit is contained in:
parent
abf322377e
commit
accc9c2aac
42
src/lib/desktopfile.cpp
Normal file
42
src/lib/desktopfile.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "desktopfile.h"
|
||||||
|
|
||||||
|
DesktopFile::DesktopFile(char separtor)
|
||||||
|
: KeyFile(separtor)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DesktopFile::~DesktopFile() = default;
|
||||||
|
|
||||||
|
bool DesktopFile::saveToFile(const std::string &filePath){
|
||||||
|
FILE *sfp = fopen(filePath.data(), "w+");
|
||||||
|
if (!sfp) {
|
||||||
|
perror("open file failed...");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(black_desk): XDG require the first section of desktop file
|
||||||
|
// is always "Desktop Entry"
|
||||||
|
|
||||||
|
auto mainSection = m_mainKeyMap.find("Desktop Entry");
|
||||||
|
if (mainSection != m_mainKeyMap.end()) {
|
||||||
|
// FIXME(black_desk): should handle write fail.
|
||||||
|
writeSectionToFile(mainSection->first, mainSection->second, sfp);
|
||||||
|
} else {
|
||||||
|
// FIXME(black_desk): should have some warning.
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &im : m_mainKeyMap) {
|
||||||
|
if (im.first == "Desktop Entry") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// FIXME(black_desk): should handle write fail.
|
||||||
|
writeSectionToFile(im.first, im.second, sfp);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(sfp);
|
||||||
|
return true;
|
||||||
|
}
|
24
src/lib/desktopfile.h
Normal file
24
src/lib/desktopfile.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#ifndef DESKTOPFILE_H
|
||||||
|
#define DESKTOPFILE_H
|
||||||
|
|
||||||
|
#include "keyfile.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// 解析desktop文件类
|
||||||
|
class DesktopFile: public KeyFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit DesktopFile(char separtor = ';');
|
||||||
|
virtual ~DesktopFile();
|
||||||
|
|
||||||
|
virtual bool saveToFile(const std::string &filePath) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DESKTOPFILE_H
|
@ -20,7 +20,7 @@ std::vector<std::string> DesktopInfo::currentDesktops;
|
|||||||
|
|
||||||
DesktopInfo::DesktopInfo(const std::string &_fileName)
|
DesktopInfo::DesktopInfo(const std::string &_fileName)
|
||||||
: m_isValid(true)
|
: m_isValid(true)
|
||||||
, m_keyFile(KeyFile())
|
, m_desktopFile()
|
||||||
{
|
{
|
||||||
std::string fileNameWithSuffix(_fileName);
|
std::string fileNameWithSuffix(_fileName);
|
||||||
if (!DString::endWith(_fileName, ".desktop"))
|
if (!DString::endWith(_fileName, ".desktop"))
|
||||||
@ -45,10 +45,10 @@ DesktopInfo::DesktopInfo(const std::string &_fileName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_keyFile.loadFile(m_fileName);
|
m_desktopFile.loadFile(m_fileName);
|
||||||
|
|
||||||
// check DesktopInfo valid
|
// check DesktopInfo valid
|
||||||
std::vector<std::string> mainKeys = m_keyFile.getMainKeys();
|
std::vector<std::string> mainKeys = m_desktopFile.getMainKeys();
|
||||||
if (mainKeys.size() == 0)
|
if (mainKeys.size() == 0)
|
||||||
m_isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
@ -58,11 +58,11 @@ DesktopInfo::DesktopInfo(const std::string &_fileName)
|
|||||||
if (!found)
|
if (!found)
|
||||||
m_isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
if (m_keyFile.getStr(MainSection, KeyType) != TypeApplication)
|
if (m_desktopFile.getStr(MainSection, KeyType) != TypeApplication)
|
||||||
m_isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
m_name = m_keyFile.getLocaleStr(MainSection, KeyName, "");
|
m_name = m_desktopFile.getLocaleStr(MainSection, KeyName, "");
|
||||||
m_icon = m_keyFile.getStr(MainSection, KeyIcon);
|
m_icon = m_desktopFile.getStr(MainSection, KeyIcon);
|
||||||
m_id = getId();
|
m_id = getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,12 +98,12 @@ bool DesktopInfo::shouldShow()
|
|||||||
|
|
||||||
bool DesktopInfo::getNoDisplay()
|
bool DesktopInfo::getNoDisplay()
|
||||||
{
|
{
|
||||||
return m_keyFile.getBool(MainSection, KeyNoDisplay);
|
return m_desktopFile.getBool(MainSection, KeyNoDisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::getIsHidden()
|
bool DesktopInfo::getIsHidden()
|
||||||
{
|
{
|
||||||
return m_keyFile.getBool(MainSection, KeyHidden);
|
return m_desktopFile.getBool(MainSection, KeyHidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
||||||
@ -119,8 +119,8 @@ bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
|||||||
desktopEnvs.assign(currentDesktops.begin(), currentDesktops.end());
|
desktopEnvs.assign(currentDesktops.begin(), currentDesktops.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> onlyShowIn = m_keyFile.getStrList(MainSection, KeyOnlyShowIn);
|
std::vector<std::string> onlyShowIn = m_desktopFile.getStrList(MainSection, KeyOnlyShowIn);
|
||||||
std::vector<std::string> notShowIn = m_keyFile.getStrList(MainSection, KeyNotShowIn);
|
std::vector<std::string> notShowIn = m_desktopFile.getStrList(MainSection, KeyNotShowIn);
|
||||||
|
|
||||||
#ifdef QT_DEBUG
|
#ifdef QT_DEBUG
|
||||||
auto strVector2qstrVector = [](const std::vector<std::string> &vector) {
|
auto strVector2qstrVector = [](const std::vector<std::string> &vector) {
|
||||||
@ -159,7 +159,7 @@ bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
|||||||
|
|
||||||
std::string DesktopInfo::getExecutable()
|
std::string DesktopInfo::getExecutable()
|
||||||
{
|
{
|
||||||
return m_keyFile.getStr(MainSection, KeyExec);
|
return m_desktopFile.getStr(MainSection, KeyExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::isExecutableOk()
|
bool DesktopInfo::isExecutableOk()
|
||||||
@ -213,12 +213,12 @@ bool DesktopInfo::isDesktopAction(std::string name)
|
|||||||
std::vector<DesktopAction> DesktopInfo::getActions()
|
std::vector<DesktopAction> DesktopInfo::getActions()
|
||||||
{
|
{
|
||||||
std::vector<DesktopAction> actions;
|
std::vector<DesktopAction> actions;
|
||||||
for (const auto &mainKey : m_keyFile.getMainKeys()) {
|
for (const auto &mainKey : m_desktopFile.getMainKeys()) {
|
||||||
if (DString::startWith(mainKey, "Desktop Action")
|
if (DString::startWith(mainKey, "Desktop Action")
|
||||||
|| DString::endWith(mainKey, "Shortcut Group")) {
|
|| DString::endWith(mainKey, "Shortcut Group")) {
|
||||||
DesktopAction action;
|
DesktopAction action;
|
||||||
action.name = m_keyFile.getLocaleStr(mainKey, KeyName, "");
|
action.name = m_desktopFile.getLocaleStr(mainKey, KeyName, "");
|
||||||
action.exec = m_keyFile.getStr(mainKey, KeyExec);
|
action.exec = m_desktopFile.getStr(mainKey, KeyExec);
|
||||||
action.section = mainKey;
|
action.section = mainKey;
|
||||||
actions.push_back(action);
|
actions.push_back(action);
|
||||||
}
|
}
|
||||||
@ -246,13 +246,13 @@ DesktopInfo DesktopInfo::getDesktopInfoById(std::string appId)
|
|||||||
|
|
||||||
bool DesktopInfo::getTerminal()
|
bool DesktopInfo::getTerminal()
|
||||||
{
|
{
|
||||||
return m_keyFile.getBool(MainSection, KeyTerminal);
|
return m_desktopFile.getBool(MainSection, KeyTerminal);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TryExec is Path to an executable file on disk used to determine if the program is actually installed
|
// TryExec is Path to an executable file on disk used to determine if the program is actually installed
|
||||||
std::string DesktopInfo::getTryExec()
|
std::string DesktopInfo::getTryExec()
|
||||||
{
|
{
|
||||||
return m_keyFile.getStr(MainSection, KeyTryExec);
|
return m_desktopFile.getStr(MainSection, KeyTryExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按$PATH路径查找执行文件
|
// 按$PATH路径查找执行文件
|
||||||
@ -301,7 +301,7 @@ std::string DesktopInfo::getId()
|
|||||||
|
|
||||||
std::string DesktopInfo::getGenericName()
|
std::string DesktopInfo::getGenericName()
|
||||||
{
|
{
|
||||||
return m_keyFile.getLocaleStr(MainSection, KeyGenericName, "");
|
return m_desktopFile.getLocaleStr(MainSection, KeyGenericName, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DesktopInfo::getName()
|
std::string DesktopInfo::getName()
|
||||||
@ -316,17 +316,17 @@ std::string DesktopInfo::getIcon()
|
|||||||
|
|
||||||
std::string DesktopInfo::getCommandLine()
|
std::string DesktopInfo::getCommandLine()
|
||||||
{
|
{
|
||||||
return m_keyFile.getStr(MainSection, KeyExec);
|
return m_desktopFile.getStr(MainSection, KeyExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> DesktopInfo::getKeywords()
|
std::vector<std::string> DesktopInfo::getKeywords()
|
||||||
{
|
{
|
||||||
return m_keyFile.getLocaleStrList(MainSection, KeyKeywords, "");
|
return m_desktopFile.getLocaleStrList(MainSection, KeyKeywords, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> DesktopInfo::getCategories()
|
std::vector<std::string> DesktopInfo::getCategories()
|
||||||
{
|
{
|
||||||
return m_keyFile.getStrList(MainSection, KeyCategories);
|
return m_desktopFile.getStrList(MainSection, KeyCategories);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DesktopInfo::setDesktopOverrideExec(const std::string &execStr)
|
void DesktopInfo::setDesktopOverrideExec(const std::string &execStr)
|
||||||
@ -334,9 +334,9 @@ void DesktopInfo::setDesktopOverrideExec(const std::string &execStr)
|
|||||||
m_overRideExec = execStr;
|
m_overRideExec = execStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyFile *DesktopInfo::getKeyFile()
|
DesktopFile *DesktopInfo::getDesktopFile()
|
||||||
{
|
{
|
||||||
return &m_keyFile;
|
return &m_desktopFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// class AppsDir
|
// class AppsDir
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#ifndef DESKTOPINFO_H
|
#ifndef DESKTOPINFO_H
|
||||||
#define DESKTOPINFO_H
|
#define DESKTOPINFO_H
|
||||||
|
|
||||||
#include "keyfile.h"
|
#include "desktopfile.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -82,7 +82,7 @@ public:
|
|||||||
std::vector<std::string> getCategories();
|
std::vector<std::string> getCategories();
|
||||||
void setDesktopOverrideExec(const std::string &execStr);
|
void setDesktopOverrideExec(const std::string &execStr);
|
||||||
|
|
||||||
KeyFile *getKeyFile();
|
DesktopFile *getDesktopFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string getTryExec();
|
std::string getTryExec();
|
||||||
@ -96,7 +96,7 @@ private:
|
|||||||
std::string m_icon;
|
std::string m_icon;
|
||||||
std::string m_overRideExec;
|
std::string m_overRideExec;
|
||||||
bool m_isValid;
|
bool m_isValid;
|
||||||
KeyFile m_keyFile;
|
DesktopFile m_desktopFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 应用目录类
|
// 应用目录类
|
||||||
|
@ -177,12 +177,8 @@ bool KeyFile::saveToFile(const std::string &filePath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &im : m_mainKeyMap) {
|
for (const auto &im : m_mainKeyMap) {
|
||||||
const auto &keyMap = im.second;
|
if (!writeSectionToFile(im.first, im.second,sfp)){
|
||||||
std::string section = "[" + im.first + "]\n";
|
return false;
|
||||||
fputs(section.c_str(), sfp);
|
|
||||||
for (const auto &ik : keyMap) {
|
|
||||||
std::string kv = ik.first + "=" + ik.second + "\n";
|
|
||||||
fputs(kv.c_str(), sfp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,6 +186,22 @@ bool KeyFile::saveToFile(const std::string &filePath)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool KeyFile::writeSectionToFile(const std::string& sectionName, const KeyMap& keyMap, FILE * file){
|
||||||
|
if (file == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string section = "[" + sectionName + "]\n";
|
||||||
|
fputs(section.c_str(), file);
|
||||||
|
for (const auto &ik : keyMap) {
|
||||||
|
std::string kv = ik.first + "=" + ik.second + "\n";
|
||||||
|
fputs(kv.c_str(), file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME(black_desk): should handle fputs error
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool KeyFile::loadFile(const std::string &filePath)
|
bool KeyFile::loadFile(const std::string &filePath)
|
||||||
{
|
{
|
||||||
m_mainKeyMap.clear();
|
m_mainKeyMap.clear();
|
||||||
|
@ -12,12 +12,12 @@
|
|||||||
typedef std::map<std::string, std::string> KeyMap;
|
typedef std::map<std::string, std::string> KeyMap;
|
||||||
typedef std::map<std::string, KeyMap> MainKeyMap;
|
typedef std::map<std::string, KeyMap> MainKeyMap;
|
||||||
|
|
||||||
// 解析ini、desktop文件类
|
// 解析ini文件类
|
||||||
class KeyFile
|
class KeyFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit KeyFile(char separtor = ';');
|
explicit KeyFile(char separtor = ';');
|
||||||
~KeyFile();
|
virtual ~KeyFile();
|
||||||
|
|
||||||
bool getBool(const std::string §ion, const std::string &key, bool defaultValue = false);
|
bool getBool(const std::string §ion, const std::string &key, bool defaultValue = false);
|
||||||
void setBool(const std::string §ion, const std::string &key, const std::string &defaultValue = "false");
|
void setBool(const std::string §ion, const std::string &key, const std::string &defaultValue = "false");
|
||||||
@ -34,7 +34,7 @@ public:
|
|||||||
std::vector<std::string> getLocaleStrList(const std::string §ion, const std::string &key, std::string defaultLocale = "");
|
std::vector<std::string> getLocaleStrList(const std::string §ion, const std::string &key, std::string defaultLocale = "");
|
||||||
|
|
||||||
void setKey(const std::string §ion, const std::string &key, const std::string &value);
|
void setKey(const std::string §ion, const std::string &key, const std::string &value);
|
||||||
bool saveToFile(const std::string &filePath);
|
virtual bool saveToFile(const std::string &filePath);
|
||||||
bool loadFile(const std::string &filePath);
|
bool loadFile(const std::string &filePath);
|
||||||
std::vector<std::string> getMainKeys();
|
std::vector<std::string> getMainKeys();
|
||||||
std::string getFilePath()
|
std::string getFilePath()
|
||||||
@ -45,12 +45,14 @@ public:
|
|||||||
// for test
|
// for test
|
||||||
void print();
|
void print();
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
MainKeyMap m_mainKeyMap; // section -> key : value
|
MainKeyMap m_mainKeyMap; // section -> key : value
|
||||||
std::string m_filePath;
|
std::string m_filePath;
|
||||||
FILE *m_fp;
|
FILE *m_fp;
|
||||||
bool m_modified;
|
bool m_modified;
|
||||||
char m_listSeparator;
|
char m_listSeparator;
|
||||||
|
|
||||||
|
static bool writeSectionToFile(const std::string& sectionName, const KeyMap& keyMap, FILE * file);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // KEYFILE_H
|
#endif // KEYFILE_H
|
||||||
|
@ -29,7 +29,7 @@ void AppInfo::init(DesktopInfo &info)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string xDeepinVendor= info.getKeyFile()->getStr(MainSection, "X-Deepin-Vendor");
|
std::string xDeepinVendor= info.getDesktopFile()->getStr(MainSection, "X-Deepin-Vendor");
|
||||||
if (xDeepinVendor == "deepin") {
|
if (xDeepinVendor == "deepin") {
|
||||||
m_name = info.getGenericName().c_str();
|
m_name = info.getGenericName().c_str();
|
||||||
if (m_name.isEmpty())
|
if (m_name.isEmpty())
|
||||||
|
@ -247,9 +247,9 @@ bool Launcher::requestSendToDesktop(QString appId)
|
|||||||
|
|
||||||
// 创建桌面快捷方式文件
|
// 创建桌面快捷方式文件
|
||||||
DesktopInfo dinfo(itemsMap[appId].info.path.toStdString());
|
DesktopInfo dinfo(itemsMap[appId].info.path.toStdString());
|
||||||
dinfo.getKeyFile()->setKey(MainSection, dbusService.toStdString(), "X-Deepin-CreatedBy");
|
dinfo.getDesktopFile()->setKey(MainSection, dbusService.toStdString(), "X-Deepin-CreatedBy");
|
||||||
dinfo.getKeyFile()->setKey(MainSection, appId.toStdString(), "X-Deepin-AppID");
|
dinfo.getDesktopFile()->setKey(MainSection, appId.toStdString(), "X-Deepin-AppID");
|
||||||
if (!dinfo.getKeyFile()->saveToFile(filePath.toStdString()))
|
if (!dinfo.getDesktopFile()->saveToFile(filePath.toStdString()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// 播放音频
|
// 播放音频
|
||||||
@ -907,7 +907,7 @@ AppType Launcher::getAppType(DesktopInfo &info, const Item &item)
|
|||||||
QFileInfo fileInfo;
|
QFileInfo fileInfo;
|
||||||
// 判断是否为flatpak应用
|
// 判断是否为flatpak应用
|
||||||
do {
|
do {
|
||||||
if (!info.getKeyFile()->containKey(MainSection, "X-Flatpak"))
|
if (!info.getDesktopFile()->containKey(MainSection, "X-Flatpak"))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
std::vector<std::string> parts = DString::splitStr(info.getCommandLine(), ' ');
|
std::vector<std::string> parts = DString::splitStr(info.getCommandLine(), ' ');
|
||||||
@ -946,7 +946,7 @@ AppType Launcher::getAppType(DesktopInfo &info, const Item &item)
|
|||||||
|
|
||||||
// 判断是否为wineApp
|
// 判断是否为wineApp
|
||||||
do {
|
do {
|
||||||
std::string createdBy = info.getKeyFile()->getStr(MainSection, "X-Created-By");
|
std::string createdBy = info.getDesktopFile()->getStr(MainSection, "X-Created-By");
|
||||||
if (DString::startWith(createdBy, "cxoffice-") || strstr(info.getCommandLine().c_str(), "env WINEPREFIX=")) {
|
if (DString::startWith(createdBy, "cxoffice-") || strstr(info.getCommandLine().c_str(), "env WINEPREFIX=")) {
|
||||||
ty = AppType::WineApp;
|
ty = AppType::WineApp;
|
||||||
goto end;
|
goto end;
|
||||||
@ -1184,10 +1184,10 @@ bool Launcher::isDeepinCustomDesktopFile(QString fileName)
|
|||||||
|
|
||||||
Item Launcher::NewItemWithDesktopInfo(DesktopInfo &info)
|
Item Launcher::NewItemWithDesktopInfo(DesktopInfo &info)
|
||||||
{
|
{
|
||||||
QString enName(info.getKeyFile()->getStr(MainSection, KeyName).c_str());
|
QString enName(info.getDesktopFile()->getStr(MainSection, KeyName).c_str());
|
||||||
QString enComment(info.getKeyFile()->getStr(MainSection, KeyComment).c_str());
|
QString enComment(info.getDesktopFile()->getStr(MainSection, KeyComment).c_str());
|
||||||
QString xDeepinCategory(info.getKeyFile()->getStr(MainSection, "X-Deepin-Category").c_str());
|
QString xDeepinCategory(info.getDesktopFile()->getStr(MainSection, "X-Deepin-Category").c_str());
|
||||||
QString xDeepinVendor(info.getKeyFile()->getStr(MainSection, "X-Deepin-Vendor").c_str());
|
QString xDeepinVendor(info.getDesktopFile()->getStr(MainSection, "X-Deepin-Vendor").c_str());
|
||||||
|
|
||||||
QString appName;
|
QString appName;
|
||||||
if (xDeepinVendor == "deepin")
|
if (xDeepinVendor == "deepin")
|
||||||
|
@ -343,7 +343,7 @@ bool StartManager::doLaunchAppWithOptions(QString desktopFile, uint32_t timestam
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (options.find("path") != options.end()) {
|
if (options.find("path") != options.end()) {
|
||||||
info.getKeyFile()->setKey(MainSection, KeyPath, options["path"].toString().toStdString());
|
info.getDesktopFile()->setKey(MainSection, KeyPath, options["path"].toString().toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.find("desktop-override-exec") != options.end()) {
|
if (options.find("desktop-override-exec") != options.end()) {
|
||||||
@ -433,7 +433,7 @@ bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp
|
|||||||
exeArgs.insert(0, SETTING->getDefaultTerminalExec());
|
exeArgs.insert(0, SETTING->getDefaultTerminalExec());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string workingDir = info->getKeyFile()->getStr(MainSection, KeyPath);
|
std::string workingDir = info->getDesktopFile()->getStr(MainSection, KeyPath);
|
||||||
if (workingDir.empty()) {
|
if (workingDir.empty()) {
|
||||||
workingDir = BaseDir::homeDir();
|
workingDir = BaseDir::homeDir();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user