Merge pull request #1178 from laanwj/2012_05_move_startonsystemstartup
Move GetStartOnSystemStartup and SetStartOnSystemStartup to GUI code
This commit is contained in:
commit
b07ea7c74b
7 changed files with 155 additions and 154 deletions
|
@ -656,11 +656,6 @@ bool AppInit2(int argc, char* argv[])
|
||||||
if (fServer)
|
if (fServer)
|
||||||
CreateThread(ThreadRPCServer, NULL);
|
CreateThread(ThreadRPCServer, NULL);
|
||||||
|
|
||||||
#ifdef QT_GUI
|
|
||||||
if (GetStartOnSystemStartup())
|
|
||||||
SetStartOnSystemStartup(true); // Remove startup links
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(QT_GUI)
|
#if !defined(QT_GUI)
|
||||||
while (1)
|
while (1)
|
||||||
Sleep(5000);
|
Sleep(5000);
|
||||||
|
|
|
@ -232,6 +232,10 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Regenerate startup link, to fix links to old versions
|
||||||
|
if (GUIUtil::GetStartOnSystemStartup())
|
||||||
|
GUIUtil::SetStartOnSystemStartup(true);
|
||||||
|
|
||||||
BitcoinGUI window;
|
BitcoinGUI window;
|
||||||
guiref = &window;
|
guiref = &window;
|
||||||
if(AppInit2(argc, argv))
|
if(AppInit2(argc, argv))
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#ifdef _WIN32_WINNT
|
#ifdef _WIN32_WINNT
|
||||||
|
@ -268,5 +269,149 @@ bool ToolTipToRichTextFilter::eventFilter(QObject *obj, QEvent *evt)
|
||||||
return QObject::eventFilter(obj, 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
|
} // namespace GUIUtil
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,9 @@ namespace GUIUtil
|
||||||
int size_threshold;
|
int size_threshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool GetStartOnSystemStartup();
|
||||||
|
bool SetStartOnSystemStartup(bool fAutoStart);
|
||||||
|
|
||||||
} // namespace GUIUtil
|
} // namespace GUIUtil
|
||||||
|
|
||||||
#endif // GUIUTIL_H
|
#endif // GUIUTIL_H
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "walletdb.h"
|
#include "walletdb.h"
|
||||||
|
#include "guiutil.h"
|
||||||
|
|
||||||
OptionsModel::OptionsModel(QObject *parent) :
|
OptionsModel::OptionsModel(QObject *parent) :
|
||||||
QAbstractListModel(parent)
|
QAbstractListModel(parent)
|
||||||
|
@ -107,7 +108,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
|
||||||
switch(index.row())
|
switch(index.row())
|
||||||
{
|
{
|
||||||
case StartAtStartup:
|
case StartAtStartup:
|
||||||
return QVariant(GetStartOnSystemStartup());
|
return QVariant(GUIUtil::GetStartOnSystemStartup());
|
||||||
case MinimizeToTray:
|
case MinimizeToTray:
|
||||||
return QVariant(fMinimizeToTray);
|
return QVariant(fMinimizeToTray);
|
||||||
case MapPortUPnP:
|
case MapPortUPnP:
|
||||||
|
@ -146,7 +147,7 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
|
||||||
switch(index.row())
|
switch(index.row())
|
||||||
{
|
{
|
||||||
case StartAtStartup:
|
case StartAtStartup:
|
||||||
successful = SetStartOnSystemStartup(value.toBool());
|
successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
|
||||||
break;
|
break;
|
||||||
case MinimizeToTray:
|
case MinimizeToTray:
|
||||||
fMinimizeToTray = value.toBool();
|
fMinimizeToTray = value.toBool();
|
||||||
|
|
143
src/util.cpp
143
src/util.cpp
|
@ -48,7 +48,6 @@ namespace boost {
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
#endif
|
#endif
|
||||||
#include "shlobj.h"
|
#include "shlobj.h"
|
||||||
#include "shlwapi.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -1078,146 +1077,4 @@ boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate)
|
||||||
printf("SHGetSpecialFolderPathA() failed, could not obtain requested path.\n");
|
printf("SHGetSpecialFolderPathA() failed, could not obtain requested path.\n");
|
||||||
return fs::path("");
|
return fs::path("");
|
||||||
}
|
}
|
||||||
|
|
||||||
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":
|
|
||||||
string line;
|
|
||||||
while (!optionFile.eof())
|
|
||||||
{
|
|
||||||
getline(optionFile, line);
|
|
||||||
if (line.find("Hidden") != string::npos &&
|
|
||||||
line.find("true") != 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(), ios_base::out|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
|
#endif
|
||||||
|
|
|
@ -162,8 +162,6 @@ void ReadConfigFile(std::map<std::string, std::string>& mapSettingsRet, std::map
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
|
boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
|
||||||
#endif
|
#endif
|
||||||
bool GetStartOnSystemStartup();
|
|
||||||
bool SetStartOnSystemStartup(bool fAutoStart);
|
|
||||||
void ShrinkDebugFile();
|
void ShrinkDebugFile();
|
||||||
int GetRandInt(int nMax);
|
int GetRandInt(int nMax);
|
||||||
uint64 GetRand(uint64 nMax);
|
uint64 GetRand(uint64 nMax);
|
||||||
|
@ -182,8 +180,6 @@ void AddTimeData(const CNetAddr& ip, int64 nTime);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline std::string i64tostr(int64 n)
|
inline std::string i64tostr(int64 n)
|
||||||
{
|
{
|
||||||
return strprintf("%"PRI64d, n);
|
return strprintf("%"PRI64d, n);
|
||||||
|
|
Loading…
Reference in a new issue