diff --git a/Build/Installer/Installer.nsi b/Build/Installer/Installer.nsi index bdd0106b..42a50e3f 100644 --- a/Build/Installer/Installer.nsi +++ b/Build/Installer/Installer.nsi @@ -501,6 +501,7 @@ UAC_TryAgain: FunctionEnd !macro InstallFiles DIR + SetOutPath "$INSTDIR" File "..\..\TestBench\${DIR}\Release\Rainmeter.exe" File "..\..\TestBench\${DIR}\Release\Rainmeter.dll" File "..\..\TestBench\${DIR}\Release\SkinInstaller.exe" @@ -700,6 +701,13 @@ SkipIniMove: Delete "$INSTDIR\Rainmeter.chm" Delete "$INSTDIR\Default.ini" + ${If} $InstallPortable != 1 + ${AndIfNot} ${FileExists} "$INSTDIR\Defaults" + SetOutPath "$INSTDIR\Defaults" + Rename "$INSTDIR\Skins" "$INSTDIR\Defaults\Skins" + Rename "$INSTDIR\Themes" "$INSTDIR\Defaults\Themes" + ${EndIf} + !ifdef INCLUDEFILES ${If} $instArc == "x86" !insertmacro InstallFiles "x32" @@ -713,12 +721,12 @@ SkipIniMove: RMDir /r "$INSTDIR\Addons\Rainstaller" - SetOutPath "$INSTDIR\Skins" + SetOutPath "$INSTDIR\Defaults\Skins" RMDir /r "$INSTDIR\Skins\illustro" Delete "$INSTDIR\Skins\*.txt" File /r "..\Skins\*.*" - SetOutPath "$INSTDIR\Themes" + SetOutPath "$INSTDIR\Defaults\Themes" File /r "..\Themes\*.*" !endif diff --git a/Library/Rainmeter.cpp b/Library/Rainmeter.cpp index 1946c757..d3bc4b9c 100644 --- a/Library/Rainmeter.cpp +++ b/Library/Rainmeter.cpp @@ -802,12 +802,6 @@ int CRainmeter::Initialize(LPCWSTR iniPath) const WCHAR* iniFile = m_IniFile.c_str(); - // Create a default Rainmeter.ini file if needed - if (_waccess(iniFile, 0) == -1) - { - CreateDefaultConfigFile(); - } - // Set file locations { size_t len = m_IniFile.length(); @@ -830,10 +824,6 @@ int CRainmeter::Initialize(LPCWSTR iniPath) CreateDataFile(); } - // Read Logging settings beforehand - m_Logging = 0!=GetPrivateProfileInt(L"Rainmeter", L"Logging", 0, iniFile); - m_Debug = 0!=GetPrivateProfileInt(L"Rainmeter", L"Debug", 0, iniFile); - // Determine the language resource to load std::wstring resource = m_Path + L"Languages\\"; if (GetPrivateProfileString(L"Rainmeter", L"Language", L"", buffer, MAX_LINE_LENGTH, iniFile) == 0) @@ -878,20 +868,19 @@ int CRainmeter::Initialize(LPCWSTR iniPath) // Reset log file CSystem::RemoveFile(m_LogFile); + m_Debug = 0!=GetPrivateProfileInt(L"Rainmeter", L"Debug", 0, iniFile); + m_Logging = 0!=GetPrivateProfileInt(L"Rainmeter", L"Logging", 0, iniFile); + if (m_Logging) { StartLogging(); } - m_PluginPath = m_AddonPath = m_SkinPath = m_Path; - m_PluginPath += L"Plugins\\"; - m_AddonPath += L"Addons\\"; - m_SkinPath += L"Skins\\"; - - // Read the skin folder from the ini file + // Get skin folder path size_t len = GetPrivateProfileString(L"Rainmeter", L"SkinPath", L"", buffer, MAX_LINE_LENGTH, iniFile); if (len > 0) { + // Try Rainmeter.ini first m_SkinPath.assign(buffer, len); ExpandEnvironmentVariables(m_SkinPath); @@ -903,44 +892,46 @@ int CRainmeter::Initialize(LPCWSTR iniPath) } } } - else if (bDefaultIniLocation) + else if (bDefaultIniLocation && + SUCCEEDED(SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, buffer))) { - // If the skin path is not defined in the Rainmeter.ini file use My Documents/Rainmeter/Skins - buffer[0] = L'\0'; - HRESULT hr = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, buffer); - if (SUCCEEDED(hr)) + // Use My Documents/Rainmeter/Skins + m_SkinPath = buffer; + m_SkinPath += L"\\Rainmeter\\"; + CreateDirectory(m_SkinPath.c_str(), NULL); + m_SkinPath += L"Skins\\"; + DWORD result = CreateDirectory(m_SkinPath.c_str(), NULL); + if (result) { - // Make the folders if they don't exist yet - m_SkinPath = buffer; - m_SkinPath += L"\\Rainmeter"; - CreateDirectory(m_SkinPath.c_str(), NULL); - m_SkinPath += L"\\Skins\\"; - DWORD result = CreateDirectory(m_SkinPath.c_str(), NULL); - if (result) - { - // The folder was created successfully which means that it wasn't available yet. - // Copy the default skin to the Skins folder - std::wstring from = m_Path + L"Skins\\*.*"; - CSystem::CopyFiles(from, m_SkinPath); - } - - std::wstring themesPath = GetSettingsPath(); - themesPath += L"Themes\\"; - result = CreateDirectory(themesPath.c_str(), NULL); - if (result) - { - // Copy themes to %APPDATA% - std::wstring from = m_Path + L"Themes\\*.*"; - CSystem::CopyFiles(from, themesPath); - } + // Folder just created, so copy default skins there + std::wstring from = GetDefaultSkinPath(); + from += L"*.*"; + CSystem::CopyFiles(from, m_SkinPath); } - else + + std::wstring themesPath = GetSettingsPath(); + themesPath += L"Themes\\"; + result = CreateDirectory(themesPath.c_str(), NULL); + if (result) { - Log(LOG_WARNING, L"Documents folder not found"); + // Copy themes to %APPDATA% + std::wstring from = GetDefaultThemePath(); + from += L"*.*"; + CSystem::CopyFiles(from, themesPath); } WritePrivateProfileString(L"Rainmeter", L"SkinPath", m_SkinPath.c_str(), iniFile); } + else + { + m_SkinPath = m_Path + L"Skins\\"; + } + + // Create a default Rainmeter.ini file if needed + if (_waccess(iniFile, 0) == -1) + { + CreateDefaultConfigFile(); + } delete [] buffer; buffer = NULL; @@ -1166,10 +1157,6 @@ void CRainmeter::SetNetworkStatisticsTimer() static bool set = SetTimer(m_Window, TIMER_NETSTATS, INTERVAL_NETSTATS, NULL); } -/* -** Creates the default Rainmeter.ini file with illustro\System enabled. -** -*/ void CRainmeter::CreateDefaultConfigFile() { size_t pos = m_IniFile.find_last_of(L'\\'); @@ -1179,15 +1166,9 @@ void CRainmeter::CreateDefaultConfigFile() CreateDirectory(strPath.c_str(), NULL); } - std::wstring defaultIni = GetPath() + L"Themes\\illustro default\\Rainmeter.thm"; - if (_waccess(defaultIni.c_str(), 0) == -1) - { - WritePrivateProfileString(L"Rainmeter", L"\r\n[illustro\\System]\r\nActive", L"1", m_IniFile.c_str()); - } - else - { - CSystem::CopyFiles(defaultIni, m_IniFile); - } + std::wstring defaultIni = GetDefaultThemePath(); + defaultIni += L"illustro default\\Rainmeter.thm"; + CSystem::CopyFiles(defaultIni, m_IniFile); } void CRainmeter::CreateDataFile() diff --git a/Library/Rainmeter.h b/Library/Rainmeter.h index 997cbc1f..ad69c960 100644 --- a/Library/Rainmeter.h +++ b/Library/Rainmeter.h @@ -155,9 +155,12 @@ public: const std::wstring& GetDataFile() { return m_DataFile; } const std::wstring& GetLogFile() { return m_LogFile; } const std::wstring& GetSkinPath() { return m_SkinPath; } - const std::wstring& GetPluginPath() { return m_PluginPath; } - const std::wstring& GetAddonPath() { return m_AddonPath; } std::wstring GetSettingsPath() { return ExtractPath(m_IniFile); } + std::wstring GetPluginPath() { return m_Path + L"Plugins\\"; } + std::wstring GetAddonPath() { return m_Path + L"Addons\\"; } + + std::wstring GetDefaultSkinPath() { return m_Path + L"Defaults\\Skins\\"; } + std::wstring GetDefaultThemePath() { return m_Path + L"Defaults\\Themes\\"; } const std::wstring& GetDrive() { return m_Drive; } @@ -282,8 +285,6 @@ private: std::wstring m_StatsFile; std::wstring m_LogFile; std::wstring m_SkinPath; - std::wstring m_PluginPath; - std::wstring m_AddonPath; std::wstring m_Drive;