|
|
|
@ -19,6 +19,7 @@
@@ -19,6 +19,7 @@
|
|
|
|
|
#include <QThread> |
|
|
|
|
|
|
|
|
|
#include <boost/filesystem.hpp> |
|
|
|
|
#include <boost/filesystem/fstream.hpp> |
|
|
|
|
|
|
|
|
|
#ifdef WIN32 |
|
|
|
|
#ifdef _WIN32_WINNT |
|
|
|
@ -268,5 +269,149 @@ bool ToolTipToRichTextFilter::eventFilter(QObject *obj, QEvent *evt)
@@ -268,5 +269,149 @@ bool ToolTipToRichTextFilter::eventFilter(QObject *obj, QEvent *evt)
|
|
|
|
|
return QObject::eventFilter(obj, evt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef WIN32 |
|
|
|
|
boost::filesystem::path static StartupShortcutPath() |
|
|
|
|
{ |
|
|
|
|
return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin.lnk"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool GetStartOnSystemStartup() |
|
|
|
|
{ |
|
|
|
|
// check for Bitcoin.lnk
|
|
|
|
|
return boost::filesystem::exists(StartupShortcutPath()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool SetStartOnSystemStartup(bool fAutoStart) |
|
|
|
|
{ |
|
|
|
|
// If the shortcut exists already, remove it for updating
|
|
|
|
|
boost::filesystem::remove(StartupShortcutPath()); |
|
|
|
|
|
|
|
|
|
if (fAutoStart) |
|
|
|
|
{ |
|
|
|
|
CoInitialize(NULL); |
|
|
|
|
|
|
|
|
|
// Get a pointer to the IShellLink interface.
|
|
|
|
|
IShellLink* psl = NULL; |
|
|
|
|
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, |
|
|
|
|
CLSCTX_INPROC_SERVER, IID_IShellLink, |
|
|
|
|
reinterpret_cast<void**>(&psl)); |
|
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres)) |
|
|
|
|
{ |
|
|
|
|
// Get the current executable path
|
|
|
|
|
TCHAR pszExePath[MAX_PATH]; |
|
|
|
|
GetModuleFileName(NULL, pszExePath, sizeof(pszExePath)); |
|
|
|
|
|
|
|
|
|
TCHAR pszArgs[5] = TEXT("-min"); |
|
|
|
|
|
|
|
|
|
// Set the path to the shortcut target
|
|
|
|
|
psl->SetPath(pszExePath); |
|
|
|
|
PathRemoveFileSpec(pszExePath); |
|
|
|
|
psl->SetWorkingDirectory(pszExePath); |
|
|
|
|
psl->SetShowCmd(SW_SHOWMINNOACTIVE); |
|
|
|
|
psl->SetArguments(pszArgs); |
|
|
|
|
|
|
|
|
|
// Query IShellLink for the IPersistFile interface for
|
|
|
|
|
// saving the shortcut in persistent storage.
|
|
|
|
|
IPersistFile* ppf = NULL; |
|
|
|
|
hres = psl->QueryInterface(IID_IPersistFile, |
|
|
|
|
reinterpret_cast<void**>(&ppf)); |
|
|
|
|
if (SUCCEEDED(hres)) |
|
|
|
|
{ |
|
|
|
|
WCHAR pwsz[MAX_PATH]; |
|
|
|
|
// Ensure that the string is ANSI.
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().string().c_str(), -1, pwsz, MAX_PATH); |
|
|
|
|
// Save the link by calling IPersistFile::Save.
|
|
|
|
|
hres = ppf->Save(pwsz, TRUE); |
|
|
|
|
ppf->Release(); |
|
|
|
|
psl->Release(); |
|
|
|
|
CoUninitialize(); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
psl->Release(); |
|
|
|
|
} |
|
|
|
|
CoUninitialize(); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#elif defined(LINUX) |
|
|
|
|
|
|
|
|
|
// Follow the Desktop Application Autostart Spec:
|
|
|
|
|
// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
|
|
|
|
|
|
|
|
|
|
boost::filesystem::path static GetAutostartDir() |
|
|
|
|
{ |
|
|
|
|
namespace fs = boost::filesystem; |
|
|
|
|
|
|
|
|
|
char* pszConfigHome = getenv("XDG_CONFIG_HOME"); |
|
|
|
|
if (pszConfigHome) return fs::path(pszConfigHome) / "autostart"; |
|
|
|
|
char* pszHome = getenv("HOME"); |
|
|
|
|
if (pszHome) return fs::path(pszHome) / ".config" / "autostart"; |
|
|
|
|
return fs::path(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
boost::filesystem::path static GetAutostartFilePath() |
|
|
|
|
{ |
|
|
|
|
return GetAutostartDir() / "bitcoin.desktop"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool GetStartOnSystemStartup() |
|
|
|
|
{ |
|
|
|
|
boost::filesystem::ifstream optionFile(GetAutostartFilePath()); |
|
|
|
|
if (!optionFile.good()) |
|
|
|
|
return false; |
|
|
|
|
// Scan through file for "Hidden=true":
|
|
|
|
|
std::string line; |
|
|
|
|
while (!optionFile.eof()) |
|
|
|
|
{ |
|
|
|
|
getline(optionFile, line); |
|
|
|
|
if (line.find("Hidden") != std::string::npos && |
|
|
|
|
line.find("true") != std::string::npos) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
optionFile.close(); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool SetStartOnSystemStartup(bool fAutoStart) |
|
|
|
|
{ |
|
|
|
|
if (!fAutoStart) |
|
|
|
|
boost::filesystem::remove(GetAutostartFilePath()); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
char pszExePath[MAX_PATH+1]; |
|
|
|
|
memset(pszExePath, 0, sizeof(pszExePath)); |
|
|
|
|
if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
boost::filesystem::create_directories(GetAutostartDir()); |
|
|
|
|
|
|
|
|
|
boost::filesystem::ofstream optionFile(GetAutostartFilePath(), std::ios_base::out|std::ios_base::trunc); |
|
|
|
|
if (!optionFile.good()) |
|
|
|
|
return false; |
|
|
|
|
// Write a bitcoin.desktop file to the autostart directory:
|
|
|
|
|
optionFile << "[Desktop Entry]\n"; |
|
|
|
|
optionFile << "Type=Application\n"; |
|
|
|
|
optionFile << "Name=Bitcoin\n"; |
|
|
|
|
optionFile << "Exec=" << pszExePath << " -min\n"; |
|
|
|
|
optionFile << "Terminal=false\n"; |
|
|
|
|
optionFile << "Hidden=false\n"; |
|
|
|
|
optionFile.close(); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
// TODO: OSX startup stuff; see:
|
|
|
|
|
// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html
|
|
|
|
|
|
|
|
|
|
bool GetStartOnSystemStartup() { return false; } |
|
|
|
|
bool SetStartOnSystemStartup(bool fAutoStart) { return false; } |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
} // namespace GUIUtil
|
|
|
|
|
|
|
|
|
|