Fixed shortcuts generated via Flatpak not working

This commit is contained in:
OpenSauce04 2024-08-12 14:54:44 +01:00 committed by OpenSauce
parent 2cd1ea1277
commit 3262515c89
3 changed files with 28 additions and 19 deletions

View File

@ -1,4 +1,4 @@
// Copyright 2014 Citra Emulator Project // Copyright Citra Emulator Project / Lime3DS Emulator Project
// Licensed under GPLv2 or any later version // Licensed under GPLv2 or any later version
// Refer to the license.txt file included. // Refer to the license.txt file included.

View File

@ -1764,9 +1764,9 @@ void GMainWindow::OnGameListRemovePlayTimeData(u64 program_id) {
bool GMainWindow::CreateShortcutLink(const std::filesystem::path& shortcut_path, bool GMainWindow::CreateShortcutLink(const std::filesystem::path& shortcut_path,
const std::string& comment, const std::string& comment,
const std::filesystem::path& icon_path, const std::filesystem::path& icon_path,
const std::filesystem::path& command, const std::string& command, const std::string& arguments,
const std::string& arguments, const std::string& categories, const std::string& categories, const std::string& keywords,
const std::string& keywords, const std::string& name) try { const std::string& name, const bool& skip_tryexec) try {
#if defined(__linux__) || defined(__FreeBSD__) // Linux and FreeBSD #if defined(__linux__) || defined(__FreeBSD__) // Linux and FreeBSD
std::filesystem::path shortcut_path_full = shortcut_path / (name + ".desktop"); std::filesystem::path shortcut_path_full = shortcut_path / (name + ".desktop");
std::ofstream shortcut_stream(shortcut_path_full, std::ios::binary | std::ios::trunc); std::ofstream shortcut_stream(shortcut_path_full, std::ios::binary | std::ios::trunc);
@ -1785,8 +1785,10 @@ bool GMainWindow::CreateShortcutLink(const std::filesystem::path& shortcut_path,
if (std::filesystem::is_regular_file(icon_path)) { if (std::filesystem::is_regular_file(icon_path)) {
fmt::print(shortcut_stream, "Icon={}\n", icon_path.string()); fmt::print(shortcut_stream, "Icon={}\n", icon_path.string());
} }
fmt::print(shortcut_stream, "TryExec={}\n", command.string()); if (!skip_tryexec) {
fmt::print(shortcut_stream, "Exec={} {}\n", command.string(), arguments); fmt::print(shortcut_stream, "TryExec={}\n", command);
}
fmt::print(shortcut_stream, "Exec={} {}\n", command, arguments);
if (!categories.empty()) { if (!categories.empty()) {
fmt::print(shortcut_stream, "Categories={}\n", categories); fmt::print(shortcut_stream, "Categories={}\n", categories);
} }
@ -1923,12 +1925,20 @@ bool GMainWindow::MakeShortcutIcoPath(const u64 program_id, const std::string_vi
void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path, void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path,
GameListShortcutTarget target) { GameListShortcutTarget target) {
// Get path to Lime3DS executable std::string lime_command{};
const QStringList args = QApplication::arguments(); bool skip_tryexec = false;
std::filesystem::path lime_command = args[0].toStdString(); const char* env_flatpak_id = getenv("FLATPAK_ID");
// If relative path, make it an absolute path if (env_flatpak_id) {
if (lime_command.c_str()[0] == '.') { lime_command = fmt::format("flatpak run {}", env_flatpak_id);
lime_command = FileUtil::GetCurrentDir().value_or("") + DIR_SEP + lime_command.string(); skip_tryexec = true;
} else {
// Get path to Lime3DS executable
const QStringList args = QApplication::arguments();
lime_command = args[0].toStdString();
// If relative path, make it an absolute path
if (lime_command.c_str()[0] == '.') {
lime_command = FileUtil::GetCurrentDir().value_or("") + DIR_SEP + lime_command;
}
} }
// Shortcut path // Shortcut path
@ -1984,8 +1994,7 @@ void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& ga
// Warn once if we are making a shortcut to a volatile AppImage // Warn once if we are making a shortcut to a volatile AppImage
const std::string appimage_ending = const std::string appimage_ending =
std::string(Common::g_scm_rev).substr(0, 9).append(".AppImage"); std::string(Common::g_scm_rev).substr(0, 9).append(".AppImage");
if (lime_command.string().ends_with(appimage_ending) && if (lime_command.ends_with(appimage_ending) && !UISettings::values.shortcut_already_warned) {
!UISettings::values.shortcut_already_warned) {
if (CreateShortcutMessagesGUI(this, CREATE_SHORTCUT_MSGBOX_APPIMAGE_VOLATILE_WARNING, if (CreateShortcutMessagesGUI(this, CREATE_SHORTCUT_MSGBOX_APPIMAGE_VOLATILE_WARNING,
qt_game_title)) { qt_game_title)) {
return; return;
@ -2003,7 +2012,7 @@ void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& ga
const std::string keywords = "3ds;Nintendo;"; const std::string keywords = "3ds;Nintendo;";
if (CreateShortcutLink(shortcut_path, comment, out_icon_path, lime_command, arguments, if (CreateShortcutLink(shortcut_path, comment, out_icon_path, lime_command, arguments,
categories, keywords, game_title)) { categories, keywords, game_title, skip_tryexec)) {
CreateShortcutMessagesGUI(this, CREATE_SHORTCUT_MSGBOX_SUCCESS, qt_game_title); CreateShortcutMessagesGUI(this, CREATE_SHORTCUT_MSGBOX_SUCCESS, qt_game_title);
return; return;
} }

View File

@ -217,10 +217,10 @@ private:
bool MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name, bool MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name,
std::filesystem::path& out_icon_path); std::filesystem::path& out_icon_path);
bool CreateShortcutLink(const std::filesystem::path& shortcut_path, const std::string& comment, bool CreateShortcutLink(const std::filesystem::path& shortcut_path, const std::string& comment,
const std::filesystem::path& icon_path, const std::filesystem::path& icon_path, const std::string& command,
const std::filesystem::path& command, const std::string& arguments, const std::string& arguments, const std::string& categories,
const std::string& categories, const std::string& keywords, const std::string& keywords, const std::string& name,
const std::string& name); const bool& skip_tryexec);
private slots: private slots:
void OnStartGame(); void OnStartGame();