Skip to content
Permalink
Browse files
Merge pull request #9438 from shuffle2/add-shortcut-to-desktop
DolphinQT: Gives option to add desktop shortcut
  • Loading branch information
leoetlino committed Jan 27, 2021
2 parents b597b16 + 23e565d commit 6dc0f0d
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
@@ -53,6 +53,20 @@

#include "UICommon/GameFile.h"

#ifdef _WIN32
#include <QCoreApplication>
#include <shlobj.h>
#include <wil/com.h>

// This file uses some identifiers which are defined as macros in Windows headers.
// Undefine them for the intellisense parser to solve some red squiggles.
#ifdef __INTELLISENSE__
#ifdef DeleteFile
#undef DeleteFile
#endif
#endif
#endif

GameList::GameList(QWidget* parent) : QStackedWidget(parent), m_model(this)
{
m_list_proxy = new ListProxyModel(this);
@@ -382,6 +396,15 @@ void GameList::ShowContextMenu(const QPoint&)

menu->addAction(tr("Open &Containing Folder"), this, &GameList::OpenContainingFolder);
menu->addAction(tr("Delete File..."), this, &GameList::DeleteFile);
#ifdef _WIN32
menu->addAction(tr("Add Shortcut to Desktop"), this, [this] {
if (!AddShortcutToDesktop())
{
ModalMessageBox::critical(this, tr("Add Shortcut to Desktop"),
tr("There was an issue adding a shortcut to the desktop"));
}
});
#endif

menu->addSeparator();

@@ -631,6 +654,41 @@ void GameList::OpenGCSaveFolder()
ModalMessageBox::information(this, tr("Information"), tr("No save data found."));
}

#ifdef _WIN32
bool GameList::AddShortcutToDesktop()
{
auto init = wil::CoInitializeEx_failfast(COINIT_APARTMENTTHREADED);
auto shell_link = wil::CoCreateInstanceNoThrow<ShellLink, IShellLink>();
if (!shell_link)
return false;

std::wstring dolphin_path = QCoreApplication::applicationFilePath().toStdWString();
if (FAILED(shell_link->SetPath(dolphin_path.c_str())))
return false;

const auto game = GetSelectedGame();
const auto& file_path = game->GetFilePath();
std::wstring args = UTF8ToTStr("-e \"" + file_path + "\"");
if (FAILED(shell_link->SetArguments(args.c_str())))
return false;

wil::unique_cotaskmem_string desktop;
if (FAILED(SHGetKnownFolderPath(FOLDERID_Desktop, KF_FLAG_NO_ALIAS, nullptr, &desktop)))
return false;

const auto& game_name = game->GetLongName();
std::wstring desktop_path = std::wstring(desktop.get()) + UTF8ToTStr("\\" + game_name + ".lnk");
auto persist_file = shell_link.try_query<IPersistFile>();
if (!persist_file)
return false;

if (FAILED(persist_file->Save(desktop_path.c_str(), TRUE)))
return false;

return true;
}
#endif

void GameList::DeleteFile()
{
ModalMessageBox confirm_dialog(this);
@@ -65,6 +65,9 @@ class GameList final : public QStackedWidget
void OpenWiki();
void SetDefaultISO();
void DeleteFile();
#ifdef _WIN32
bool AddShortcutToDesktop();
#endif
void InstallWAD();
void UninstallWAD();
void ExportWiiSave();

0 comments on commit 6dc0f0d

Please sign in to comment.