diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/main.cpp | 68 | 
1 files changed, 38 insertions, 30 deletions
| diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 5427758c1..1a6b63856 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -67,6 +67,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual  #define QT_NO_OPENGL  #include <QClipboard>  #include <QDesktopServices> +#include <QDir>  #include <QFile>  #include <QFileDialog>  #include <QInputDialog> @@ -76,6 +77,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual  #include <QPushButton>  #include <QScreen>  #include <QShortcut> +#include <QStandardPaths>  #include <QStatusBar>  #include <QString>  #include <QSysInfo> @@ -2869,44 +2871,50 @@ void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& ga  #endif // __linux__      std::filesystem::path target_directory{}; -    // Determine target directory for shortcut -#if defined(WIN32) -    const char* home = std::getenv("USERPROFILE"); -#else -    const char* home = std::getenv("HOME"); -#endif -    const std::filesystem::path home_path = (home == nullptr ? "~" : home); -    const char* xdg_data_home = std::getenv("XDG_DATA_HOME"); -    if (target == GameListShortcutTarget::Desktop) { -        target_directory = home_path / "Desktop"; -        if (!Common::FS::IsDir(target_directory)) { -            QMessageBox::critical( -                this, tr("Create Shortcut"), -                tr("Cannot create shortcut on desktop. Path \"%1\" does not exist.") -                    .arg(QString::fromStdString(target_directory.generic_string())), -                QMessageBox::StandardButton::Ok); -            return; -        } -    } else if (target == GameListShortcutTarget::Applications) { -        target_directory = (xdg_data_home == nullptr ? home_path / ".local/share" : xdg_data_home) / -                           "applications"; -        if (!Common::FS::CreateDirs(target_directory)) { -            QMessageBox::critical( -                this, tr("Create Shortcut"), -                tr("Cannot create shortcut in applications menu. Path \"%1\" " -                   "does not exist and cannot be created.") -                    .arg(QString::fromStdString(target_directory.generic_string())), -                QMessageBox::StandardButton::Ok); -            return; +    switch (target) { +    case GameListShortcutTarget::Desktop: { +        const QString desktop_path = +            QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); +        target_directory = desktop_path.toUtf8().toStdString(); +        break; +    } +    case GameListShortcutTarget::Applications: { +        const QString applications_path = +            QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation); +        if (applications_path.isEmpty()) { +            const char* home = std::getenv("HOME"); +            if (home != nullptr) { +                target_directory = std::filesystem::path(home) / ".local/share/applications"; +            } +        } else { +            target_directory = applications_path.toUtf8().toStdString();          } +        break; +    } +    default: +        return; +    } + +    const QDir dir(QString::fromStdString(target_directory.generic_string())); +    if (!dir.exists()) { +        QMessageBox::critical(this, tr("Create Shortcut"), +                              tr("Cannot create shortcut. Path \"%1\" does not exist.") +                                  .arg(QString::fromStdString(target_directory.generic_string())), +                              QMessageBox::StandardButton::Ok); +        return;      }      const std::string game_file_name = std::filesystem::path(game_path).filename().string();      // Determine full paths for icon and shortcut  #if defined(__linux__) || defined(__FreeBSD__) +    const char* home = std::getenv("HOME"); +    const std::filesystem::path home_path = (home == nullptr ? "~" : home); +    const char* xdg_data_home = std::getenv("XDG_DATA_HOME"); +      std::filesystem::path system_icons_path = -        (xdg_data_home == nullptr ? home_path / ".local/share/" : xdg_data_home) / +        (xdg_data_home == nullptr ? home_path / ".local/share/" +                                  : std::filesystem::path(xdg_data_home)) /          "icons/hicolor/256x256";      if (!Common::FS::CreateDirs(system_icons_path)) {          QMessageBox::critical( | 
