Merge pull request #1280 from Trial97/shortcut

Fixed illegal characters in shortcuts name
This commit is contained in:
seth 2023-06-27 20:01:48 +00:00 committed by Sefa Eyeoglu
parent 6464127d05
commit 5fdbc9d75e
No known key found for this signature in database
GPG Key ID: E13DFD4B47127951
2 changed files with 97 additions and 119 deletions

View File

@ -769,6 +769,9 @@ QString getDesktopDir()
// Cross-platform Shortcut creation // Cross-platform Shortcut creation
bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon)
{ {
if (destination.isEmpty()) {
destination = PathCombine(getDesktopDir(), RemoveInvalidFilenameChars(name));
}
#if defined(Q_OS_MACOS) #if defined(Q_OS_MACOS)
destination += ".command"; destination += ".command";
@ -791,6 +794,8 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri
return true; return true;
#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) #elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
if (!destination.endsWith(".desktop")) // in case of isFlatpak destination is already populated
destination += ".desktop";
QFile f(destination); QFile f(destination);
f.open(QIODevice::WriteOnly | QIODevice::Text); f.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream stream(&f); QTextStream stream(&f);

View File

@ -1510,8 +1510,8 @@ void MainWindow::on_actionKillInstance_triggered()
void MainWindow::on_actionCreateInstanceShortcut_triggered() void MainWindow::on_actionCreateInstanceShortcut_triggered()
{ {
if (m_selectedInstance) if (!m_selectedInstance)
{ return;
auto desktopPath = FS::getDesktopDir(); auto desktopPath = FS::getDesktopDir();
if (desktopPath.isEmpty()) { if (desktopPath.isEmpty()) {
// TODO come up with an alternative solution (open "save file" dialog) // TODO come up with an alternative solution (open "save file" dialog)
@ -1519,70 +1519,55 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered()
return; return;
} }
#if defined(Q_OS_MACOS) QString desktopFilePath;
QString appPath = QApplication::applicationFilePath(); QString appPath = QApplication::applicationFilePath();
QString iconPath;
QStringList args;
#if defined(Q_OS_MACOS)
if (appPath.startsWith("/private/var/")) { if (appPath.startsWith("/private/var/")) {
QMessageBox::critical(this, tr("Create instance shortcut"), tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts.")); QMessageBox::critical(this, tr("Create instance shortcut"),
tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts."));
return; return;
} }
if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()),
appPath, { "--launch", m_selectedInstance->id() },
m_selectedInstance->name(), "")) {
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
}
else
{
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!"));
}
#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) #elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
QString appPath = QApplication::applicationFilePath();
if (appPath.startsWith("/tmp/.mount_")) { if (appPath.startsWith("/tmp/.mount_")) {
// AppImage! // AppImage!
appPath = QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE")); appPath = QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE"));
if (appPath.isEmpty()) if (appPath.isEmpty()) {
{ QMessageBox::critical(this, tr("Create instance shortcut"),
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Launcher is running as misconfigured AppImage? ($APPIMAGE environment variable is missing)")); tr("Launcher is running as misconfigured AppImage? ($APPIMAGE environment variable is missing)"));
} } else if (appPath.endsWith("/")) {
else if (appPath.endsWith("/"))
{
appPath.chop(1); appPath.chop(1);
} }
} }
auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey());
if (icon == nullptr) if (icon == nullptr) {
{
icon = APPLICATION->icons()->icon("grass"); icon = APPLICATION->icons()->icon("grass");
} }
QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.png"); iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.png");
QFile iconFile(iconPath); QFile iconFile(iconPath);
if (!iconFile.open(QFile::WriteOnly)) if (!iconFile.open(QFile::WriteOnly)) {
{
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut."));
return; return;
} }
bool success = icon->icon().pixmap(64, 64).save(&iconFile, "PNG"); bool success = icon->icon().pixmap(64, 64).save(&iconFile, "PNG");
iconFile.close(); iconFile.close();
if (!success) if (!success) {
{
iconFile.remove(); iconFile.remove();
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut."));
return; return;
} }
QString desktopFilePath = FS::PathCombine(desktopPath, m_selectedInstance->name() + ".desktop");
QStringList args;
if (DesktopServices::isFlatpak()) { if (DesktopServices::isFlatpak()) {
desktopFilePath = FS::PathCombine(desktopPath, FS::RemoveInvalidFilenameChars(m_selectedInstance->name()) + ".desktop");
QFileDialog fileDialog; QFileDialog fileDialog;
// workaround to make sure the portal file dialog opens in the desktop directory // workaround to make sure the portal file dialog opens in the desktop directory
fileDialog.setDirectoryUrl(desktopPath); fileDialog.setDirectoryUrl(desktopPath);
desktopFilePath = fileDialog.getSaveFileName( desktopFilePath = fileDialog.getSaveFileName(this, tr("Create Shortcut"), desktopFilePath, tr("Desktop Entries (*.desktop)"));
this, tr("Create Shortcut"), desktopFilePath,
tr("Desktop Entries (*.desktop)"));
if (desktopFilePath.isEmpty()) if (desktopFilePath.isEmpty())
return; // file dialog canceled by user return; // file dialog canceled by user
appPath = "flatpak"; appPath = "flatpak";
@ -1590,31 +1575,21 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered()
flatpakAppId.remove(".desktop"); flatpakAppId.remove(".desktop");
args.append({ "run", flatpakAppId }); args.append({ "run", flatpakAppId });
} }
args.append({ "--launch", m_selectedInstance->id() });
if (FS::createShortcut(desktopFilePath, appPath, args, m_selectedInstance->name(), iconPath)) {
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
}
else
{
iconFile.remove();
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!"));
}
#elif defined(Q_OS_WIN) #elif defined(Q_OS_WIN)
auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey());
if (icon == nullptr) if (icon == nullptr) {
{
icon = APPLICATION->icons()->icon("grass"); icon = APPLICATION->icons()->icon("grass");
} }
QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico");
// part of fix for weird bug involving the window icon being replaced // part of fix for weird bug involving the window icon being replaced
// dunno why it happens, but this 2-line fix seems to be enough, so w/e // dunno why it happens, but this 2-line fix seems to be enough, so w/e
auto appIcon = APPLICATION->getThemedIcon("logo"); auto appIcon = APPLICATION->getThemedIcon("logo");
QFile iconFile(iconPath); QFile iconFile(iconPath);
if (!iconFile.open(QFile::WriteOnly)) if (!iconFile.open(QFile::WriteOnly)) {
{
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut."));
return; return;
} }
@ -1624,26 +1599,24 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered()
// restore original window icon // restore original window icon
QGuiApplication::setWindowIcon(appIcon); QGuiApplication::setWindowIcon(appIcon);
if (!success) if (!success) {
{
iconFile.remove(); iconFile.remove();
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut."));
return; return;
} }
if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()),
QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() },
m_selectedInstance->name(), iconPath)) {
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
}
else
{
iconFile.remove();
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!"));
}
#else #else
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on your platform!")); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on your platform!"));
return;
#endif #endif
args.append({ "--launch", m_selectedInstance->id() });
if (FS::createShortcut(desktopFilePath, appPath, args, m_selectedInstance->name(), iconPath)) {
QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!"));
} else {
#if not defined(Q_OS_MACOS)
iconFile.remove();
#endif
QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!"));
} }
} }