mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-06-29 01:54:20 +03:00
Add proper escaping for .desktop entries
' in a pack name would be entered as 'Foo'\''blah' rather than "Foo'blah" as the spec would require. Assisted-by: OpenAI ChatGPT Signed-off-by: Dominic Monroe <dominic@dominic.io>
This commit is contained in:
parent
f67a670bcf
commit
84c5a0778f
1 changed files with 23 additions and 2 deletions
|
|
@ -913,6 +913,26 @@ QString quoteArgs(const QStringList& args, const QString& wrap, const QString& e
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString quoteDesktopExecArg(QString arg)
|
||||||
|
{
|
||||||
|
arg.replace("\\", "\\\\\\\\");
|
||||||
|
arg.replace("$", "\\\\$");
|
||||||
|
arg.replace("\"", "\\\"");
|
||||||
|
arg.replace("`", "\\`");
|
||||||
|
arg.replace("%", "%%");
|
||||||
|
return QStringLiteral("\"") + arg + QStringLiteral("\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString quoteDesktopExecArgs(const QStringList& args)
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
result.reserve(args.size());
|
||||||
|
for (auto arg : args) {
|
||||||
|
result.append(quoteDesktopExecArg(arg));
|
||||||
|
}
|
||||||
|
return result.join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
// Cross-platform Shortcut creation
|
// Cross-platform Shortcut creation
|
||||||
QString createShortcut(QString destination, QString target, QStringList args, QString name, QString icon)
|
QString createShortcut(QString destination, QString target, QStringList args, QString name, QString icon)
|
||||||
{
|
{
|
||||||
|
|
@ -1007,12 +1027,13 @@ QString createShortcut(QString destination, QString target, QStringList args, QS
|
||||||
}
|
}
|
||||||
QTextStream stream(&f);
|
QTextStream stream(&f);
|
||||||
|
|
||||||
auto argstring = quoteArgs(args, "'", "'\\''");
|
args.prepend(target);
|
||||||
|
auto argstring = quoteDesktopExecArgs(args);
|
||||||
|
|
||||||
stream << "[Desktop Entry]" << "\n";
|
stream << "[Desktop Entry]" << "\n";
|
||||||
stream << "Type=Application" << "\n";
|
stream << "Type=Application" << "\n";
|
||||||
stream << "Categories=Game;ActionGame;AdventureGame;Simulation" << "\n";
|
stream << "Categories=Game;ActionGame;AdventureGame;Simulation" << "\n";
|
||||||
stream << "Exec=\"" << target.toLocal8Bit() << "\" " << argstring.toLocal8Bit() << "\n";
|
stream << "Exec=" << argstring.toLocal8Bit() << "\n";
|
||||||
stream << "Name=" << name.toLocal8Bit() << "\n";
|
stream << "Name=" << name.toLocal8Bit() << "\n";
|
||||||
if (!icon.isEmpty()) {
|
if (!icon.isEmpty()) {
|
||||||
stream << "Icon=" << icon.toLocal8Bit() << "\n";
|
stream << "Icon=" << icon.toLocal8Bit() << "\n";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue