From f1b984768a34d1b50d2b04dc0f94cbe52122f944 Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Sat, 26 Jul 2014 09:44:54 +0300 Subject: [PATCH] Fixed line endings and applied gitignore --- BuildTools/Build.bat | 176 ++++ BuildTools/BuildLanguages.bat | 2 + BuildTools/BuildVersion.bat | 2 + BuildTools/DllExporter/AssemblyInfo.cs | 7 + BuildTools/DllExporter/DllExporter.csproj | 82 ++ BuildTools/DllExporter/Program.cs | 241 +++++ BuildTools/Installer/Header.bmp | Bin 0 -> 10198 bytes BuildTools/Installer/Icon.ico | Bin 0 -> 25214 bytes BuildTools/Installer/Installer.nsi | 959 ++++++++++++++++++ BuildTools/Installer/MD5.dll | Bin 0 -> 6656 bytes BuildTools/Installer/MoreInfo.dll | Bin 0 -> 7168 bytes BuildTools/Installer/UAC.dll | Bin 0 -> 13312 bytes BuildTools/Installer/UAC.nsh | 200 ++++ BuildTools/Installer/Wizard.bmp | Bin 0 -> 52574 bytes .../Layouts/illustro default/Rainmeter.ini | 23 + .../Skins/illustro/@Resources/Background.png | Bin 0 -> 1986 bytes BuildTools/Skins/illustro/Clock/Clock.ini | 138 +++ BuildTools/Skins/illustro/Disk/1 Disk.ini | 149 +++ BuildTools/Skins/illustro/Disk/2 Disks.ini | 209 ++++ BuildTools/Skins/illustro/Google/Google.ini | 119 +++ BuildTools/Skins/illustro/Network/Network.ini | 215 ++++ .../illustro/Recycle Bin/Recycle Bin.ini | 147 +++ BuildTools/Skins/illustro/System/System.ini | 206 ++++ .../Skins/illustro/Welcome/Background.png | Bin 0 -> 1836 bytes BuildTools/Skins/illustro/Welcome/Welcome.ini | 173 ++++ BuildTools/VS/Rainmeter.Cpp.Default.props | 31 + BuildTools/VS/Rainmeter.Cpp.props | 129 +++ BuildTools/VS/RainmeterPlugin.Cpp.props | 18 + BuildTools/VS/RainmeterPlugin.Cs.props | 9 + 29 files changed, 3235 insertions(+) create mode 100644 BuildTools/Build.bat create mode 100644 BuildTools/BuildLanguages.bat create mode 100644 BuildTools/BuildVersion.bat create mode 100644 BuildTools/DllExporter/AssemblyInfo.cs create mode 100644 BuildTools/DllExporter/DllExporter.csproj create mode 100644 BuildTools/DllExporter/Program.cs create mode 100644 BuildTools/Installer/Header.bmp create mode 100644 BuildTools/Installer/Icon.ico create mode 100644 BuildTools/Installer/Installer.nsi create mode 100644 BuildTools/Installer/MD5.dll create mode 100644 BuildTools/Installer/MoreInfo.dll create mode 100644 BuildTools/Installer/UAC.dll create mode 100644 BuildTools/Installer/UAC.nsh create mode 100644 BuildTools/Installer/Wizard.bmp create mode 100644 BuildTools/Layouts/illustro default/Rainmeter.ini create mode 100644 BuildTools/Skins/illustro/@Resources/Background.png create mode 100644 BuildTools/Skins/illustro/Clock/Clock.ini create mode 100644 BuildTools/Skins/illustro/Disk/1 Disk.ini create mode 100644 BuildTools/Skins/illustro/Disk/2 Disks.ini create mode 100644 BuildTools/Skins/illustro/Google/Google.ini create mode 100644 BuildTools/Skins/illustro/Network/Network.ini create mode 100644 BuildTools/Skins/illustro/Recycle Bin/Recycle Bin.ini create mode 100644 BuildTools/Skins/illustro/System/System.ini create mode 100644 BuildTools/Skins/illustro/Welcome/Background.png create mode 100644 BuildTools/Skins/illustro/Welcome/Welcome.ini create mode 100644 BuildTools/VS/Rainmeter.Cpp.Default.props create mode 100644 BuildTools/VS/Rainmeter.Cpp.props create mode 100644 BuildTools/VS/RainmeterPlugin.Cpp.props create mode 100644 BuildTools/VS/RainmeterPlugin.Cs.props diff --git a/BuildTools/Build.bat b/BuildTools/Build.bat new file mode 100644 index 00000000..e3dd3baf --- /dev/null +++ b/BuildTools/Build.bat @@ -0,0 +1,176 @@ +@echo off +setlocal EnableDelayedExpansion + +set VCVARSALL=%VS120COMNTOOLS%..\..\VC\vcvarsall.bat +set MAKENSIS=%PROGRAMFILES%\NSIS\MakeNSIS.exe +set GIT=%PROGRAMFILES%\Git\bin\git.exe + +:: Set VERSION_REVISION to non-zero value to override +set VERSION_MAJOR=3 +set VERSION_MINOR=2 +set VERSION_SUBMINOR=0 +set VERSION_REVISION=0 +set ISBETA=true + +if "%1" == "RELEASE" set ISBETA=false +if "%1" == "BUILDVERSION" goto BUILDVERSION +echo Rainmeter Build +echo ---------------------------------------------- +echo. + +if not exist "%VCVARSALL%" echo ERROR: vcvarsall.bat not found & goto END +call "%VCVARSALL%" x86 > nul + +set MSBUILD="msbuild.exe" /nologo^ + /p:PlatformToolset=v120_xp;VisualStudioVersion=12.0^ + /p:ExcludeTests=true^ + /p:Configuration=Release + +if exist "Certificate.bat" call "Certificate.bat" > nul +set SIGNTOOL="signtool.exe" sign /t http://time.certum.pl /f "%CERTFILE%" /p "%CERTKEY%" + +if "%1" == "BUILDLANGUAGES" goto BUILDLANGUAGES + +if exist "%MAKENSIS%" goto NSISFOUND +set MAKENSIS=%MAKENSIS:Program Files\=Program Files (x86)\% +if not exist "%MAKENSIS%" echo ERROR: MakeNSIS.exe not found & goto END +:NSISFOUND + +:BUILDVERSION + +if not exist "..\.git" goto UPDATEVERSION +if not "%VERSION_REVISION%" == "0" goto UPDATEVERSION + +:: git +if exist "%GIT%" goto GITFOUND +set GIT=%GIT:Program Files\=Program Files (x86)\% +if not exist "%GIT%" echo ERROR: git.exe not found & goto END +:GITFOUND +set /a VERSION_REVISION=0 +for /f "usebackq delims= " %%G in (`"%GIT%" rev-list --all --count`) do set VERSION_REVISION=%%G + +:UPDATEVERSION + +set VERSION_FULL=%VERSION_MAJOR%.%VERSION_MINOR%.%VERSION_SUBMINOR%.%VERSION_REVISION% +set VERSION_SHORT=%VERSION_MAJOR%.%VERSION_MINOR% +if not "%VERSION_SUBMINOR%" == "0" set VERSION_SHORT=!VERSION_SHORT!.%VERSION_SUBMINOR% + +:: Update Version.h +> "..\Version.h" echo #pragma once +>>"..\Version.h" echo #define FILEVER %VERSION_MAJOR%,%VERSION_MINOR%,%VERSION_SUBMINOR%,%VERSION_REVISION% +>>"..\Version.h" echo #define PRODUCTVER FILEVER +>>"..\Version.h" echo #define STRFILEVER "%VERSION_FULL%" +>>"..\Version.h" echo #define STRPRODUCTVER STRFILEVER +>>"..\Version.h" echo #define APPVERSION L"%VERSION_MAJOR%.%VERSION_MINOR%.%VERSION_SUBMINOR%" +>>"..\Version.h" echo #define RAINMETER_VERSION ((%VERSION_MAJOR% * 1000000) + (%VERSION_MINOR% * 1000) + %VERSION_SUBMINOR%) +>>"..\Version.h" echo const int revision_number = %VERSION_REVISION%; +>>"..\Version.h" echo const bool revision_beta = %ISBETA%; + +:: Update Version.cs +> "..\Version.cs" echo namespace Rainmeter +>>"..\Version.cs" echo { +>>"..\Version.cs" echo public class Version +>>"..\Version.cs" echo { +>>"..\Version.cs" echo #if X64 +>>"..\Version.cs" echo public const string Informational = "%VERSION_FULL% (64-bit)"; +>>"..\Version.cs" echo #else +>>"..\Version.cs" echo public const string Informational = "%VERSION_FULL% (32-bit)"; +>>"..\Version.cs" echo #endif +>>"..\Version.cs" echo } +>>"..\Version.cs" echo } + + +if "%1" == "BUILDVERSION" goto :eof +echo * Updated Version.h + +:: Set vcbuild environment variables and begin build +echo * Starting build for %VERSION_FULL% +for /F "tokens=1-4 delims=:.," %%a in ("%TIME%") do ( + set /A "BUILD_BEGIN_TIMESTAMP=(((%%a * 60) + 1%%b %% 100)* 60 + 1%%c %% 100) * 100 + 1%%d %% 100" +) + +:: Build Library +echo * Building 32-bit projects +%MSBUILD% /t:rebuild /p:Platform=Win32 /v:q /m ..\Rainmeter.sln > "BuildLog.txt" +if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Build failed & goto END + +echo * Building 64-bit projects +%MSBUILD% /t:rebuild /p:Platform=x64 /v:q /m ..\Rainmeter.sln > "BuildLog.txt" +if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Build failed & goto END + +:BUILDLANGUAGES +echo * Building languages + +:: Build all language libraries +>".\Installer\Languages.nsh" echo. +for /f "tokens=1,2,3 delims=," %%a in (..\Language\List) do ( + > "..\Language\Language.rc" echo #include "%%a.h" + >>"..\Language\Language.rc" echo #include "Resource.rc" + >>".\Installer\Languages.nsh" echo ${IncludeLanguage} "%%b" "%%a" + set LANGDLL_PARAMS='%%a - ${LANGFILE_%%b_NAME}' '${LANG_%%b}' '${LANG_%%b_CP}' !LANGDLL_PARAMS! + set LANGUAGE_IDS=${LANG_%%b},!LANGUAGE_IDS! + + %MSBUILD% /t:Language /p:Platform=Win32;TargetName=%%c /v:q ..\Rainmeter.sln > "BuildLog.txt" + if not %ERRORLEVEL% == 0 echo ERROR: Building language %%a failed & goto END +) +>>".\Installer\Languages.nsh" echo ^^!define LANGDLL_PARAMS "%LANGDLL_PARAMS%" +>>".\Installer\Languages.nsh" echo ^^!define LANGUAGE_IDS "%LANGUAGE_IDS%" + +:: Restore English +echo #include "English.h"> "..\Language\Language.rc" +echo #include "Resource.rc">> "..\Language\Language.rc" +if "%1" == "BUILDLANGUAGES" ( + xcopy /Q /S /Y ..\x32-Release\Languages\*.dll ..\x64-Release\Languages\ > nul + xcopy /Q /S /Y ..\x32-Release\Release\Languages\*.dll ..\x32-Debug\Languages\ > nul + xcopy /Q /S /Y ..\x32-Release\Release\Languages\*.dll ..\x64-Debug\Languages\ > nul + if exist "BuildLog.txt" del "BuildLog.txt" + goto END +) + +:: Sign binaries +if not "%CERTFILE%" == "" ( + echo * Signing binaries + for %%Z in (Rainmeter.dll Rainmeter.exe SkinInstaller.exe SkinInstaller.dll) do ( + %SIGNTOOL% ..\x32-Release\%%Z > BuildLog.txt + if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Signing x32\%%Z failed & goto END + %SIGNTOOL% ..\x64-Release\%%Z > BuildLog.txt + if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Signing x64\%%Z failed & goto END + ) +) + +:: Build installer +echo * Building installer + +set INSTALLER_NAME=Rainmeter-%VERSION_SHORT%.exe +if not "%1" == "RELEASE" set INSTALLER_NAME=Rainmeter-%VERSION_SHORT%-r%VERSION_REVISION%-beta.exe + +set INSTALLER_DEFINES=^ + /DOUTFILE="%INSTALLER_NAME%"^ + /DVERSION_FULL="%VERSION_FULL%"^ + /DVERSION_SHORT="%VERSION_SHORT%"^ + /DVERSION_REVISION="%VERSION_REVISION%" +if not "%1" == "RELEASE" set INSTALLER_DEFINES=!INSTALLER_DEFINES! /DBETA + +"%MAKENSIS%" %INSTALLER_DEFINES% .\Installer\Installer.nsi > "BuildLog.txt" +if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Building installer failed & goto END + +:: Sign installer +if not "%CERTFILE%" == "" ( + echo * Signing installer + %SIGNTOOL% %INSTALLER_NAME% > BuildLog.txt + if not %ERRORLEVEL% == 0 echo ERROR %ERRORLEVEL%: Signing installer failed & goto END +) + +:: If we got here, build was successful so delete BuildLog.txt +if exist "BuildLog.txt" del "BuildLog.txt" + +for /F "tokens=1-4 delims=:.," %%a in ("%TIME%") do ( + set /A "BUILD_END_TIMESTAMP=(((%%a * 60) + 1%%b %% 100)* 60 + %%c %% 100) * 100 + 1%%d %% 100" +) +set /A "BUILD_ELAPSED_TIME=(%BUILD_END_TIMESTAMP% - %BUILD_BEGIN_TIMESTAMP%) / 100" +echo * Build complete. Elapsed time: %BUILD_ELAPSED_TIME% sec + +:END +if exist ".\Installer\Languages.nsh" del ".\Installer\Languages.nsh" +echo. +pause diff --git a/BuildTools/BuildLanguages.bat b/BuildTools/BuildLanguages.bat new file mode 100644 index 00000000..cd8047ac --- /dev/null +++ b/BuildTools/BuildLanguages.bat @@ -0,0 +1,2 @@ +@echo off +"Build.bat" BUILDLANGUAGES \ No newline at end of file diff --git a/BuildTools/BuildVersion.bat b/BuildTools/BuildVersion.bat new file mode 100644 index 00000000..fcf49acf --- /dev/null +++ b/BuildTools/BuildVersion.bat @@ -0,0 +1,2 @@ +@echo off +"Build.bat" BUILDVERSION diff --git a/BuildTools/DllExporter/AssemblyInfo.cs b/BuildTools/DllExporter/AssemblyInfo.cs new file mode 100644 index 00000000..c23d01a9 --- /dev/null +++ b/BuildTools/DllExporter/AssemblyInfo.cs @@ -0,0 +1,7 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyCopyright("© 2013 - Birunthan Mohanathas")] +[assembly: AssemblyVersion("1.0.1.0")] +[assembly: AssemblyProduct("Rainmeter")] \ No newline at end of file diff --git a/BuildTools/DllExporter/DllExporter.csproj b/BuildTools/DllExporter/DllExporter.csproj new file mode 100644 index 00000000..7079b9f3 --- /dev/null +++ b/BuildTools/DllExporter/DllExporter.csproj @@ -0,0 +1,82 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {49D56CA5-54AB-45C9-A245-EAE588FCBFE1} + Exe + Properties + DllExporter + DllExporter + v4.0 + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + $(SolutionDir)x32-$(Configuration)\Tools\ + $(SolutionDir)x64-$(Configuration)\Tools\ + + + x86 + true + full + false + DEBUG;TRACE + prompt + 4 + 1607 + + + x86 + none + true + TRACE + prompt + 4 + 1607 + + + OnOutputUpdated + + + true + DEBUG;TRACE + full + x64 + prompt + 1607 + + + TRACE + true + none + x64 + prompt + 1607 + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildTools/DllExporter/Program.cs b/BuildTools/DllExporter/Program.cs new file mode 100644 index 00000000..4b56fda4 --- /dev/null +++ b/BuildTools/DllExporter/Program.cs @@ -0,0 +1,241 @@ +/* + Copyright (C) 2011 Birunthan Mohanathas + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; +using Microsoft.Build.Utilities; +using System.IO; + +namespace DllExporter +{ + class Program + { + static int Main(string[] args) + { + if (args.Length < 4) + { + Console.WriteLine("DllExporter error: Invalid arguments"); + return 1; + } + + string configurationName = args[0]; + string platformTarget = args[1]; + string targetDirectory = args[2]; + string targetDllName = targetDirectory + args[3]; + string targetIlName = targetDllName + ".il"; + string targetResName = targetDllName + ".res"; + + bool is64 = platformTarget.ToLower().Equals("x64"); + bool isDebug = configurationName.ToLower().Equals("debug"); + + string ilasmPath = FindIlasmPath(is64); + if (ilasmPath == null) + { + Console.WriteLine("DllExporter error: ilasm.exe not found"); + return 1; + } + + string ildasmPath = FindIldasmPath(); + if (ildasmPath == null) + { + Console.WriteLine("DllExporter error: ildasm.exe not found"); + return 1; + } + + Directory.SetCurrentDirectory(targetDirectory); + + // Disassemble + Process ildasmProc = new Process(); + string ildasmArgs = string.Format( + "/nobar {0} /output=\"{1}\" \"{2}\"", + isDebug ? "/linenum" : "", + targetIlName, + targetDllName); + + ildasmProc.StartInfo = new ProcessStartInfo(ildasmPath, ildasmArgs); + ildasmProc.StartInfo.UseShellExecute = false; + ildasmProc.StartInfo.CreateNoWindow = false; + ildasmProc.StartInfo.RedirectStandardOutput = true; + ildasmProc.Start(); + ildasmProc.WaitForExit(); + + if (ildasmProc.ExitCode != 0) + { + Console.WriteLine("DllExporter error: Unable to disassemble!"); + Console.WriteLine(ildasmProc.StandardOutput.ReadToEnd()); + return ildasmProc.ExitCode; + } + + bool hasResource = File.Exists(targetResName); + + // Read disassembly and find methods marked with DllExport attribute + List lines = new List(File.ReadAllLines(targetIlName)); + int attributeIndex = 0; + int exportCount = 0; + while (true) + { + attributeIndex = lines.FindIndex(attributeIndex, new Predicate(x => x.Contains(".custom instance void") && x.Contains("DllExport::.ctor()"))); + if (attributeIndex < 8) break; + + int methodIndex = lines.FindLastIndex(attributeIndex, attributeIndex, new Predicate(x => x.Contains(".method"))); + if (methodIndex == -1) + { + Console.WriteLine("DllExporter error: Unable to parse disassembly (.method not found)!"); + return 1; + } + + int functionIndex = lines.FindIndex(methodIndex, new Predicate(x => x.Contains("("))); + if (functionIndex == -1) + { + Console.WriteLine("DllExporter error: Unable to parse disassembly (bracket not found)!"); + return 1; + } + + int bracketPos = lines[functionIndex].IndexOf('('); + int functionNamePos = lines[functionIndex].LastIndexOf(' ', bracketPos); + string functionName = lines[functionIndex].Substring(functionNamePos, bracketPos - functionNamePos); + + // Change calling convention to cdecl + lines[functionIndex] = string.Format("{0} modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) {1}", lines[functionIndex].Substring(0, functionNamePos - 1), lines[functionIndex].Substring(functionNamePos)); + + int attributeBeginPos = lines[attributeIndex].IndexOf('.'); + string spaces = new string(' ', attributeBeginPos); + + // Replace attribute with export + ++exportCount; + lines[attributeIndex] = string.Format("{0}.export [{1}] as {2}", spaces, exportCount, functionName); + + ++attributeIndex; + } + + if (exportCount == 0) + { + Console.WriteLine("DllExporter warning: Nothing found to export."); + } + + // Remove the DllExport class + int classIndex = lines.FindIndex(new Predicate(x => x.Contains(".class ") && x.EndsWith(".DllExport"))); + if (classIndex == -1) + { + Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class not found)!"); + return 1; + } + else + { + int classEndIndex = lines.FindIndex(classIndex, new Predicate(x => x.Contains("} // end of class") && x.EndsWith(".DllExport"))); + if (classEndIndex == -1) + { + Console.WriteLine("DllExporter error: Unable to parse disassembly (DllExport class end not found)!"); + return 1; + } + + lines.RemoveRange(classIndex, classEndIndex - classIndex + 2); + } + + // Write everything back + File.WriteAllLines(targetIlName, lines.ToArray()); + + // Reassemble + Process ilasmProc = new Process(); + string resource = hasResource ? string.Format("/resource=\"{0}\"", targetResName) : ""; + string ilasmArgs = string.Format("/nologo /quiet /dll {0} {1} /output=\"{2}\" {3} \"{4}\"", isDebug ? "/debug /pdb" : "/optimize", is64 ? "/x64 /PE64" : "", targetDllName, resource, targetIlName); + ilasmProc.StartInfo = new ProcessStartInfo(ilasmPath, ilasmArgs); + ilasmProc.StartInfo.UseShellExecute = false; + ilasmProc.StartInfo.CreateNoWindow = false; + ilasmProc.StartInfo.RedirectStandardOutput = true; + ilasmProc.Start(); + ilasmProc.WaitForExit(); + + if (ilasmProc.ExitCode != 0) + { + Console.WriteLine("DllExporter error: Unable to assemble!"); + Console.WriteLine(ilasmProc.StandardOutput.ReadToEnd()); + return ilasmProc.ExitCode; + } + + // Cleanup + File.Delete(targetIlName); + File.Delete(targetResName); + + Console.WriteLine("DllExporter: Processed {0}", args[3]); + + return 0; + } + + /// + /// Finds path to ilasm.exe. + /// + private static string FindIlasmPath(bool x64) + { + var arch = x64 ? DotNetFrameworkArchitecture.Bitness64 : DotNetFrameworkArchitecture.Bitness32; + var path = ToolLocationHelper.GetPathToDotNetFrameworkFile( + "ilasm.exe", TargetDotNetFrameworkVersion.Version20, arch); + return File.Exists(path) ? path : null; + } + + /// + /// Finds path to ildasm.exe. + /// + private static string FindIldasmPath() + { + var sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Microsoft SDKs\Windows\"); + if (!Directory.Exists(sdkPath)) + { + sdkPath = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Microsoft SDKs\Windows\"); + } + + if (!Directory.Exists(sdkPath)) + { + throw new DirectoryNotFoundException("'Microsoft SDKs' directory not found"); + } + + // Get the version directories. + var sdkVersionDirectories = Directory.GetDirectories(sdkPath); + foreach (var sdkVersionDirectory in sdkVersionDirectories) + { + var binDirectory = Path.Combine(sdkVersionDirectory, @"bin"); + if (!Directory.Exists(binDirectory)) + { + continue; + } + + // Check for e.g. 'Microsoft SDKs\v8.0A\bin\ildasm.exe'. + var ildasmPath = Path.Combine(binDirectory, @"ildasm.exe"); + if (File.Exists(ildasmPath)) + { + return ildasmPath; + } + + // Check for e.g. 'Microsoft SDKs\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe'. + var toolsDirectories = Directory.GetDirectories(binDirectory, "NETFX*Tools"); + foreach (var toolDirectory in toolsDirectories) + { + ildasmPath = Path.Combine(toolDirectory, @"ildasm.exe"); + if (File.Exists(ildasmPath)) + { + return ildasmPath; + } + } + } + + return null; + } + } +} diff --git a/BuildTools/Installer/Header.bmp b/BuildTools/Installer/Header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9eb90fec4c57b21cb59f9c2a6e62c7de6a478ad1 GIT binary patch literal 10198 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�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 $LANGUAGE + ${AndIf} $NonDefaultLanguage != 1 + ; New install or better match + LangDLL::LangDialog "$(^SetupCaption)" "Please select the installer language.$\n$(SELECTLANGUAGE)" AC ${LANGDLL_PARAMS} "" + Pop $0 + ${If} $0 == "cancel" + Abort + ${EndIf} + + ${If} $0 <> $LANGUAGE + ; User selected non-default language + StrCpy $NonDefaultLanguage 1 + ${EndIf} + ${EndIf} + + StrCpy $LANGUAGE $0 + ${Else} + ${If} $0 != "" + StrCpy $LANGUAGE $0 + ${EndIf} + + ${GetParameters} $R1 + + ClearErrors + ${GetOptions} $R1 "/LANGUAGE=" $0 + ${IfNot} ${Errors} + ${If} $LANGUAGE != $0 + StrCpy $NonDefaultLanguage 1 + ${EndIf} + + StrCpy $LANGUAGE $0 + ${EndIf} + + ${GetOptions} $R1 "/STARTUP=" $0 + ${If} $0 = 1 + StrCpy $AutoStartup 1 + ${EndIf} + + ${GetOptions} $R1 "/PORTABLE=" $0 + ${If} $0 = 1 + StrCpy $InstallPortable 1 + ${Else} + ${IfNot} ${UAC_IsAdmin} + SetErrorLevel ${ERROR_NOTADMIN} + Quit + ${EndIf} + ${EndIf} + + ${GetOptions} $R1 "/VERSION=" $0 + ${If} $0 = 64 + StrCpy $Install64Bit 1 + + ${If} $INSTDIR == "" + StrCpy $INSTDIR "$PROGRAMFILES64\Rainmeter" + ${EndIf} + ${Else} + ${If} $INSTDIR == "" + StrCpy $INSTDIR "$PROGRAMFILES\Rainmeter" + ${EndIf} + ${EndIf} + + ClearErrors + CreateDirectory "$INSTDIR" + WriteINIStr "$INSTDIR\writetest~.rm" "1" "1" "1" + Delete "$INSTDIR\writetest~.rm" + + ${If} ${Errors} + RMDir "$INSTDIR" + SetErrorLevel ${ERROR_WRITEFAIL} + Quit + ${EndIf} + ${EndIf} + + ; If the language was set to a non-existent language, reset it back to English. + ${WordFind} ",${LANGUAGE_IDS}" ",$LANGUAGE," "E+1{" $0 + ${If} ${Errors} + StrCpy $LANGUAGE "1033" + ${EndIf} + ${Else} + ; Exchange settings with user instance + !insertmacro UAC_AsUser_Call Function ExchangeSettings ${UAC_SYNCREGISTERS} + StrCpy $AutoStartup $1 + StrCpy $Install64Bit $2 + StrCpy $NonDefaultLanguage $3 + StrCpy $LANGUAGE $4 + StrCpy $INSTDIR $5 + ${EndIf} +FunctionEnd + +Function ExchangeSettings + StrCpy $1 $AutoStartup + StrCpy $2 $Install64Bit + StrCpy $3 $NonDefaultLanguage + StrCpy $4 $LANGUAGE + StrCpy $5 $INSTDIR + HideWindow +FunctionEnd + +Function PageWelcome + ${If} ${UAC_IsInnerInstance} + ${If} ${UAC_IsAdmin} + ; Skip page + Abort + ${Else} + MessageBox MB_OK|MB_ICONSTOP "$(ADMINERROR) (Inner)" + Quit + ${EndIf} + ${EndIf} + + !insertmacro MUI_HEADER_TEXT "$(INSTALLOPTIONS)" "$(^ComponentsSubText1)" + nsDialogs::Create 1044 + Pop $0 + nsDialogs::SetRTL $(^RTL) + SetCtlColors $0 "" "${MUI_BGCOLOR}" + + ${NSD_CreateBitmap} 0u 0u 109u 193u "" + Pop $0 + ${NSD_SetImage} $0 "$PLUGINSDIR\modern-wizard.bmp" $R0 + + ${NSD_CreateLabel} 120u 10u 195u 38u "$(MUI_TEXT_WELCOME_INFO_TITLE)" + Pop $0 + SetCtlColors $0 "" "${MUI_BGCOLOR}" + CreateFont $1 "$(^Font)" "12" "700" + SendMessage $0 ${WM_SETFONT} $1 0 + + ${NSD_CreateLabel} 120u 55u 195u 12u "$(^ComponentsSubText1)" + Pop $0 + SetCtlColors $0 "" "${MUI_BGCOLOR}" + + ${NSD_CreateRadioButton} 120u 70u 205u 12u "$(STANDARDINST)" + Pop $R1 + SetCtlColors $R1 "" "${MUI_BGCOLOR}" + ${NSD_AddStyle} $R1 ${WS_GROUP} + SendMessage $R1 ${WM_SETFONT} $mui.Header.Text.Font 0 + + ${NSD_CreateLabel} 132u 82u 185u 24u "$(STANDARDINSTDESC)" + Pop $0 + SetCtlColors $0 "" "${MUI_BGCOLOR}" + + ${NSD_CreateRadioButton} 120u 106u 310u 12u "$(PORTABLEINST)" + Pop $R2 + SetCtlColors $R2 "" "${MUI_BGCOLOR}" + ${NSD_AddStyle} $R2 ${WS_TABSTOP} + SendMessage $R2 ${WM_SETFONT} $mui.Header.Text.Font 0 + + ${NSD_CreateLabel} 132u 118u 185u 52u "$(PORTABLEINSTDESC)" + Pop $0 + SetCtlColors $0 "" "${MUI_BGCOLOR}" + + ${If} $InstallPortable = 1 + ${NSD_Check} $R2 + ${Else} + ${NSD_Check} $R1 + ${EndIf} + + Call muiPageLoadFullWindow + + nsDialogs::Show + ${NSD_FreeImage} $R0 +FunctionEnd + +Function PageWelcomeOnLeave + ${NSD_GetState} $R2 $InstallPortable + Call muiPageUnloadFullWindow +FunctionEnd + +Function PageOptions + ${If} ${UAC_IsInnerInstance} + ${AndIf} ${UAC_IsAdmin} + ; Skip page + Abort + ${EndIf} + + !insertmacro MUI_HEADER_TEXT "$(INSTALLOPTIONS)" "$(INSTALLOPTIONSDESC)" + nsDialogs::Create 1018 + nsDialogs::SetRTL $(^RTL) + + ${NSD_CreateGroupBox} 0 0u -1u 36u "$(^DirSubText)" + + ${NSD_CreateDirRequest} 6u 14u 232u 14u "" + Pop $R0 + ${NSD_OnChange} $R0 PageOptionsDirectoryOnChange + + ${NSD_CreateBrowseButton} 242u 14u 50u 14u "$(^BrowseBtn)" + Pop $R1 + ${NSD_OnClick} $R1 PageOptionsBrowseOnClick + + StrCpy $1 0 + + StrCpy $R2 0 + ${If} ${RunningX64} + ${If} $InstallPortable = 1 + ${OrIf} $INSTDIR == "" + ${NSD_CreateCheckBox} 6u 54u 285u 12u "$(INSTALL64BIT)" + Pop $R2 + StrCpy $1 30u + ${EndIf} + ${EndIf} + + ${If} $InstallPortable <> 1 + ${If} $1 = 0 + StrCpy $0 54u + StrCpy $1 30u + ${Else} + StrCpy $0 66u + StrCpy $1 42u + ${EndIf} + + ${NSD_CreateCheckbox} 6u $0 285u 12u "$(AUTOSTARTUP)" + Pop $R3 + + ${If} $INSTDIR == "" + ${NSD_Check} $R3 + ${Else} + SetShellVarContext all + ${If} ${FileExists} "$SMSTARTUP\Rainmeter.lnk" + ${NSD_Check} $R3 + ${EndIf} + + SetShellVarContext current + ${If} ${FileExists} "$SMSTARTUP\Rainmeter.lnk" + ${NSD_Check} $R3 + ${EndIf} + ${EndIf} + ${Else} + StrCpy $R3 0 + ${EndIf} + + ${If} $1 <> 0 + ${NSD_CreateGroupBox} 0 42u -1u $1 "$(ADDITIONALOPTIONS)" + ${EndIf} + + ; Set default directory + ${If} $InstallPortable = 1 + ${GetRoot} "$WINDIR" $0 + ${NSD_SetText} $R0 "$0\Rainmeter" + ${Else} + ; Disable Directory editbox and Browse button if already installed + SendMessage $R0 ${EM_SETREADONLY} 1 0 + + ${If} $INSTDIR != "" + EnableWindow $R1 0 + ${NSD_SetText} $R0 "$INSTDIR" + ${Else} + ; Fresh install + ${If} ${RunningX64} + ${NSD_SetText} $R0 "$PROGRAMFILES64\Rainmeter" + ${NSD_Check} $R2 + ${Else} + ${NSD_SetText} $R0 "$PROGRAMFILES\Rainmeter" + ${EndIf} + ${EndIf} + ${EndIf} + + ; Show UAC shield on Install button if requiredd + GetDlgItem $0 $HWNDPARENT 1 + ${If} $InstallPortable = 1 + SendMessage $0 ${BCM_SETSHIELD} 0 0 + ${Else} + SendMessage $0 ${BCM_SETSHIELD} 0 1 + + ; Hide Back button + GetDlgItem $0 $HWNDPARENT 3 + ShowWindow $0 ${SW_HIDE} + ${EndIf} + + nsDialogs::Show +FunctionEnd + +Function PageOptionsDirectoryOnChange + ${NSD_GetText} $R0 $0 + + ; Disable Install button if not enough space + GetDlgItem $1 $HWNDPARENT 1 + ${GetRoot} $0 $2 + ${DriveSpace} "$2\" "/D=F /S=M" $3 + ${If} $3 < ${REQUIREDSPACE} + EnableWindow $1 0 + ${Else} + EnableWindow $1 1 + ${EndIf} + + StrCpy $Install64Bit 0 + ${If} ${RunningX64} + ${If} ${FileExists} "$0\Rainmeter.exe" + MoreInfo::GetProductVersion "$0\Rainmeter.exe" + Pop $0 + StrCpy $0 $0 2 -7 + ${If} $0 == 64 + StrCpy $Install64Bit 1 + ${EndIf} + + ${If} $R2 != 0 + ${NSD_SetState} $R2 $Install64Bit + EnableWindow $R2 0 + ${EndIf} + ${Else} + ${If} $R2 != 0 + EnableWindow $R2 1 + ${EndIf} + ${EndIf} + ${EndIf} +FunctionEnd + +Function PageOptionsBrowseOnClick + ${NSD_GetText} $R0 $0 + nsDialogs::SelectFolderDialog "$(^DirBrowseText)" $0 + Pop $1 + ${If} $1 != error + ${NSD_SetText} $R0 $1 + ${EndIf} +FunctionEnd + +Function PageOptionsOnLeave + ; Verify that selected folder is writable + ${NSD_GetText} $R0 $0 + ${If} $InstallPortable = 1 + ClearErrors + CreateDirectory "$0" + WriteINIStr "$0\writetest~.rm" "1" "1" "1" + Delete "$0\writetest~.rm" + + ${If} ${Errors} + RMDir "$0" + MessageBox MB_OK|MB_ICONEXCLAMATION "$(WRITEERROR)" + Abort + ${EndIf} + + RMDir "$0" + ${EndIf} + + StrCpy $INSTDIR $0 + + GetDlgItem $0 $HWNDPARENT 1 + EnableWindow $0 0 + + ${If} $R2 != 0 + ${NSD_GetState} $R2 $Install64Bit + ${EndIf} + + ${If} $R3 != 0 + ${NSD_GetState} $R3 $AutoStartup + ${EndIf} + + ${If} $InstallPortable <> 1 + ${IfNot} ${UAC_IsAdmin} + ; UAC_IsAdmin seems to return incorrect result sometimes. Recheck with UserInfo::GetAccountType to be sure. + UserInfo::GetAccountType + Pop $0 + ${If} $0 != "Admin" +UAC_TryAgain: + !insertmacro UAC_RunElevated + ${Switch} $0 + ${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} + ${IfThen} $3 <> 0 ${|} ${Break} ${|} + ${If} $1 = 3 + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(ADMINERROR)" /SD IDNO IDOK UAC_TryAgain IDNO 0 + ${EndIf} + ${Case} 1223 + Quit + ${Case} 1062 + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(LOGONERROR)" + Quit + ${Default} + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(UACERROR) ($0)" + Quit + ${EndSwitch} + ${EndIf} + ${EndIf} + ${EndIf} +FunctionEnd + +!macro InstallFiles DIR ARCH + SetOutPath "$INSTDIR" + File "..\..\${DIR}-Release\Rainmeter.exe" + File "..\..\${DIR}-Release\Rainmeter.dll" + File "..\..\${DIR}-Release\SkinInstaller.exe" + File "..\..\${DIR}-Release\SkinInstaller.dll" + + SetOutPath "$INSTDIR\Plugins" + File /x *Example*.dll "..\..\${DIR}-Release\Plugins\*.dll" + + SetOutPath "$INSTDIR\Runtime" + File "$%VS120COMNTOOLS%..\..\VC\redist\${ARCH}\Microsoft.VC120.CRT\msvcp120.dll" + File "$%VS120COMNTOOLS%..\..\VC\redist\${ARCH}\Microsoft.VC120.CRT\msvcr120.dll" +!macroend + +!macro RemoveStartMenuShortcuts STARTMENUPATH + Delete "${STARTMENUPATH}\Rainmeter.lnk" + Delete "${STARTMENUPATH}\Rainmeter Help.lnk" + Delete "${STARTMENUPATH}\Rainmeter Help.URL" + Delete "${STARTMENUPATH}\Remove Rainmeter.lnk" + Delete "${STARTMENUPATH}\RainThemes.lnk" + Delete "${STARTMENUPATH}\RainThemes Help.lnk" + Delete "${STARTMENUPATH}\RainBrowser.lnk" + Delete "${STARTMENUPATH}\RainBackup.lnk" + Delete "${STARTMENUPATH}\Rainstaller.lnk" + Delete "${STARTMENUPATH}\Skin Installer.lnk" + Delete "${STARTMENUPATH}\Rainstaller Help.lnk" + RMDir "${STARTMENUPATH}" +!macroend + +Section + SetOutPath "$PLUGINSDIR" + SetShellVarContext current + + Var /GLOBAL InstArc + ${If} $Install64Bit = 1 + StrCpy $InstArc "x64" + ${Else} + StrCpy $InstArc "x86" + ${EndIf} + + ${If} $InstallPortable <> 1 + ${AndIfNot} ${AtLeastWinVista} + ; Download and install .NET if required + ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install" + ${If} $0 <> 1 + ${If} $Install64Bit <> 1 + NSISdl::download /TIMEOUT=30000 "http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe" "$PLUGINSDIR\dotnetfx.exe" + ${Else} + NSISdl::download /TIMEOUT=30000 "http://download.microsoft.com/download/a/3/f/a3f1bf98-18f3-4036-9b68-8e6de530ce0a/NetFx64.exe" "$PLUGINSDIR\dotnetfx.exe" + ${EndIf} + Pop $0 + + ${If} $0 == "success" + ExecWait '"$PLUGINSDIR\dotnetfx.exe" /q:a /c:"install /q"' $0 + Delete "$PLUGINSDIR\dotnetfx.exe" + + ${If} $0 = 3010 + SetRebootFlag true + ${ElseIf} $0 <> 0 + MessageBox MB_OK|MB_ICONSTOP "$(DOTNETINSTERROR)" + Quit + ${EndIf} + ${ElseIf} $0 == "cancel" + Quit + ${Else} + MessageBox MB_OK|MB_ICONSTOP "$(DOTNETINSTERROR)" + Quit + ${EndIf} + ${EndIf} + ${EndIf} + + SetOutPath "$INSTDIR" + + ; Close Rainmeter (and wait up to five seconds) + ${ForEach} $0 10 0 - 1 + FindWindow $1 "DummyRainWClass" "Rainmeter control window" + ClearErrors + Delete "$INSTDIR\Rainmeter.exe" + ${If} $1 = 0 + ${AndIfNot} ${Errors} + ${Break} + ${EndIf} + + SendMessage $1 ${WM_CLOSE} 0 0 + + ${If} $0 = 0 + ${If} ${Silent} + SetErrorLevel ${ERROR_CLOSEFAIL} + Quit + ${Else} + MessageBox MB_RETRYCANCEL|MB_ICONSTOP "$(RAINMETERCLOSEERROR)" IDRETRY +2 + Quit + ${EndIf} + ${EndIf} + + Sleep 500 + ${Next} + + ; Move Rainmeter.ini to %APPDATA% if needed + ${IfNot} ${Silent} + ${AndIf} ${FileExists} "$INSTDIR\Rainmeter.ini" + ${If} $InstallPortable <> 1 + ${If} $Install64Bit = 1 + ${AndIf} "$INSTDIR" == "$PROGRAMFILES64\Rainmeter" + ${OrIf} "$INSTDIR" == "$PROGRAMFILES\Rainmeter" + MessageBox MB_YESNO|MB_ICONEXCLAMATION "$(SETTINGSFILEERROR)" IDNO SkipIniMove + StrCpy $0 1 + !insertmacro UAC_AsUser_Call Function CopyIniToAppData ${UAC_SYNCREGISTERS} + ${If} $0 = 1 + ; Copy succeeded + Delete "$INSTDIR\Rainmeter.ini" + ${Else} + MessageBox MB_OK|MB_ICONSTOP "$(SETTINGSMOVEERROR)" + ${EndIf} +SkipIniMove: + ${EndIf} + ${Else} + ReadINIStr $0 "$INSTDIR\Rainmeter.ini" "Rainmeter" "SkinPath" + ${If} $0 == "$INSTDIR\Skins\" + DeleteINIStr "$INSTDIR\Rainmeter.ini" "Rainmeter" "SkinPath" + ${EndIf} + ${EndIf} + ${EndIf} + + SetOutPath "$INSTDIR" + + ; Cleanup old stuff + Delete "$INSTDIR\Rainmeter.chm" + Delete "$INSTDIR\Default.ini" + Delete "$INSTDIR\Launcher.exe" + Delete "$INSTDIR\Defaults\Plugins\FileView.dll" + RMDir /r "$INSTDIR\Addons\Rainstaller" + RMDir /r "$INSTDIR\Addons\RainBackup" + + ${If} $InstallPortable <> 1 + CreateDirectory "$INSTDIR\Defaults" + Rename "$INSTDIR\Skins" "$INSTDIR\Defaults\Skins" + + Rename "$INSTDIR\Themes" "$INSTDIR\Defaults\Layouts" + Rename "$INSTDIR\Defaults\Themes" "$INSTDIR\Defaults\Layouts" + ${Locate} "$INSTDIR\Defaults\Layouts" "/L=F /M=Rainmeter.thm /G=1" "RenameToRainmeterIni" + + ${If} ${FileExists} "$INSTDIR\Addons\Backup" + ${OrIf} ${FileExists} "$INSTDIR\Plugins\Backup" + CreateDirectory "$INSTDIR\Defaults\Backup" + Rename "$INSTDIR\Addons\Backup" "$INSTDIR\Defaults\Backup\Addons" + Rename "$INSTDIR\Plugins\Backup" "$INSTDIR\Defaults\Backup\Plugins" + ${EndIf} + + Rename "$INSTDIR\Addons" "$INSTDIR\Defaults\Addons" + ${Locate} "$INSTDIR\Plugins" "/L=F /M=*.dll /G=0" "MoveNonDefaultPlugins" + ${EndIf} + +!ifdef INCLUDEFILES + File "..\..\Application\Rainmeter.exe.config" + + ${If} $instArc == "x86" + !insertmacro InstallFiles "x32" "x86" + ${Else} + !insertmacro InstallFiles "x64" "x64" + ${EndIf} + + RMDir /r "$INSTDIR\Languages" + SetOutPath "$INSTDIR\Languages" + File "..\..\x32-Release\Languages\*.*" + + SetOutPath "$INSTDIR\Defaults\Skins" + RMDir /r "$INSTDIR\Skins\illustro" + Delete "$INSTDIR\Skins\*.txt" + File /r "..\Skins\*.*" + + SetOutPath "$INSTDIR\Defaults\Layouts" + File /r "..\Layouts\*.*" +!endif + + SetOutPath "$INSTDIR" + + ${If} $InstallPortable <> 1 + ReadRegStr $0 HKLM "SOFTWARE\Rainmeter" "" + WriteRegStr HKLM "SOFTWARE\Rainmeter" "" "$INSTDIR" + WriteRegStr HKLM "SOFTWARE\Rainmeter" "Language" "$LANGUAGE" + WriteRegDWORD HKLM "SOFTWARE\Rainmeter" "NonDefault" $NonDefaultLanguage + + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "DisplayName" "Rainmeter" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "DisplayIcon" "$INSTDIR\Rainmeter.exe,0" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "URLInfoAbout" "http://rainmeter.net" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "UninstallString" "$INSTDIR\uninst.exe" + +!ifdef BETA + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "DisplayVersion" "${VERSION_SHORT} beta r${VERSION_REVISION}" +!else + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" "DisplayVersion" "${VERSION_SHORT} r${VERSION_REVISION}" +!endif + + ; Create .rmskin association + WriteRegStr HKCR ".rmskin" "" "Rainmeter.SkinInstaller" + DeleteRegKey HKCR "Rainmeter skin" ; Old key + WriteRegStr HKCR "Rainmeter.SkinInstaller" "" "Rainmeter Skin Installer" + WriteRegStr HKCR "Rainmeter.SkinInstaller\shell" "" "open" + WriteRegStr HKCR "Rainmeter.SkinInstaller\DefaultIcon" "" "$INSTDIR\SkinInstaller.exe,0" + WriteRegStr HKCR "Rainmeter.SkinInstaller\shell\open\command" "" '"$INSTDIR\SkinInstaller.exe" %1' + WriteRegStr HKCR "Rainmeter.SkinInstaller\shell\edit" "" "Install Rainmeter skin" + WriteRegStr HKCR "Rainmeter.SkinInstaller\shell\edit\command" "" '"$INSTDIR\SkinInstaller.exe" %1' + + ; If .inc isn't associated, use the .ini association for it. + ReadRegStr $1 HKCR ".inc" "" + ${If} $1 == "" + ReadRegStr $1 HKCR ".ini" "" + ${If} $1 != "" + WriteRegStr HKCR ".inc" "" "$1" + ${EndIf} + ${EndIf} + + ; Refresh shell icons if new install + ${If} $0 == "" + ${RefreshShellIcons} + ${EndIf} + + ; Remove all start menu shortcuts + SetShellVarContext all + Call RemoveStartMenuShortcuts + + StrCpy $0 "$SMPROGRAMS\Rainmeter.lnk" + ${If} ${FileExists} "$SMPROGRAMS\Rainmeter" + StrCpy $0 "$SMPROGRAMS\Rainmeter\Rainmeter.lnk" + ${EndIf} + CreateShortcut "$0" "$INSTDIR\Rainmeter.exe" "" "$INSTDIR\Rainmeter.exe" 0 + + ${If} $AutoStartup = 1 + ${If} ${FileExists} "$SMSTARTUP\Rainmeter.lnk" + ; Remove user shortcut to prevent duplicate with all users shortcut + !insertmacro UAC_AsUser_Call Function RemoveUserStartupShortcut ${UAC_SYNCREGISTERS} + ${Else} + !insertmacro UAC_AsUser_Call Function CreateUserStartupShortcut ${UAC_SYNCREGISTERS} + ${EndIf} + ${EndIf} + + SetShellVarContext current + Call RemoveStartMenuShortcuts + + !insertmacro UAC_AsUser_Call Function RemoveStartMenuShortcuts ${UAC_SYNCREGISTERS} + + WriteUninstaller "$INSTDIR\uninst.exe" + ${Else} + ${IfNot} ${FileExists} "Rainmeter.ini" + CopyFiles /SILENT "$INSTDIR\Defaults\Layouts\illustro default\Rainmeter.ini" "$INSTDIR\Rainmeter.ini" + ${EndIf} + + WriteINIStr "$INSTDIR\Rainmeter.ini" "Rainmeter" "Language" "$LANGUAGE" + ${EndIf} +SectionEnd + +Function CopyIniToAppData + ClearErrors + CreateDirectory "$APPDATA\Rainmeter" + CopyFiles /SILENT "$INSTDIR\Rainmeter.ini" "$APPDATA\Rainmeter\Rainmeter.ini" + ${If} ${Errors} + StrCpy $0 0 + ${EndIf} +FunctionEnd + +Function RenameToRainmeterIni + ${If} ${FileExists} "$R8\Rainmeter.ini" + Delete "$R8\Rainmeter.thm" + ${Else} + Rename "$R9" "$R8\Rainmeter.ini" + ${EndIf} + + Push $0 +FunctionEnd + +Function MoveNonDefaultPlugins + ${If} $R7 != "AdvancedCPU.dll" + ${AndIf} $R7 != "CoreTemp.dll" + ${AndIf} $R7 != "FileView.dll" + ${AndIf} $R7 != "FolderInfo.dll" + ${AndIf} $R7 != "InputText.dll" + ${AndIf} $R7 != "iTunesPlugin.dll" + ${AndIf} $R7 != "MediaKey.dll" + ${AndIf} $R7 != "NowPlaying.dll" + ${AndIf} $R7 != "PerfMon.dll" + ${AndIf} $R7 != "PingPlugin.dll" + ${AndIf} $R7 != "PowerPlugin.dll" + ${AndIf} $R7 != "Process.dll" + ${AndIf} $R7 != "QuotePlugin.dll" + ${AndIf} $R7 != "RecycleManager.dll" + ${AndIf} $R7 != "ResMon.dll" + ${AndIf} $R7 != "SpeedFanPlugin.dll" + ${AndIf} $R7 != "SysInfo.dll" + ${AndIf} $R7 != "VirtualDesktops.dll" + ${AndIf} $R7 != "WebParser.dll" + ${AndIf} $R7 != "WifiStatus.dll" + ${AndIf} $R7 != "Win7AudioPlugin.dll" + ${AndIf} $R7 != "WindowMessagePlugin.dll" + CreateDirectory "$INSTDIR\Defaults\Plugins" + Delete "$INSTDIR\Defaults\Plugins\$R7" + Rename "$R9" "$INSTDIR\Defaults\Plugins\$R7" + ${EndIf} + + Push $0 +FunctionEnd + +Function RemoveStartMenuShortcuts + !insertmacro RemoveStartMenuShortcuts "$SMPROGRAMS\Rainmeter" +FunctionEnd + +Function CreateUserStartupShortcut + SetShellVarContext current + CreateShortcut "$SMSTARTUP\Rainmeter.lnk" "$INSTDIR\Rainmeter.exe" "" "$INSTDIR\Rainmeter.exe" 0 +FunctionEnd + +Function RemoveUserStartupShortcut + SetShellVarContext current + Delete "$SMSTARTUP\Rainmeter.lnk" +FunctionEnd + +Function FinishRun + !insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\Rainmeter.exe" "" "" "" +FunctionEnd + + +; Uninstall +; -------------------------------------- +Function un.onInit +UAC_TryAgain: + ; Request administrative rights + !insertmacro UAC_RunElevated + ${Switch} $0 + ${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} + ${IfThen} $3 <> 0 ${|} ${Break} ${|} + ${If} $1 = 3 + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(ADMINERROR)" /SD IDNO IDOK UAC_TryAgain IDNO 0 + ${EndIf} + ${Case} 1223 + Quit + ${Case} 1062 + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(LOGONERROR)" + Quit + ${Default} + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "$(UACERROR) ($0)" + Quit + ${EndSwitch} + + ReadRegStr $0 HKLM "SOFTWARE\Rainmeter" "Language" + ${If} $0 != "" + StrCpy $LANGUAGE $0 + ${EndIf} +FunctionEnd + +Function un.PageOptions + !insertmacro MUI_HEADER_TEXT "$(UNSTALLOPTIONS)" "$(UNSTALLOPTIONSDESC)" + nsDialogs::Create 1018 + nsDialogs::SetRTL $(^RTL) + + ${NSD_CreateCheckbox} 0 0u 95% 12u "$(UNSTALLRAINMETER)" + Pop $0 + EnableWindow $0 0 + ${NSD_Check} $0 + + ${NSD_CreateCheckbox} 0 15u 70% 12u "$(UNSTALLSETTINGS)" + Pop $R0 + + ${NSD_CreateLabel} 16 26u 95% 12u "$(UNSTALLSETTINGSDESC)" + + nsDialogs::Show +FunctionEnd + +Function un.GetOptions + ${NSD_GetState} $R0 $un.DeleteAll +FunctionEnd + +Section Uninstall + ; Close Rainmeter (and wait up to five seconds) + ${ForEach} $0 10 0 - 1 + FindWindow $1 "DummyRainWClass" "Rainmeter control window" + ClearErrors + Delete "$INSTDIR\Rainmeter.exe" + ${If} $1 = 0 + ${AndIfNot} ${Errors} + ${Break} + ${EndIf} + + SendMessage $1 ${WM_CLOSE} 0 0 + + ${If} $0 = 0 + ${If} ${Silent} + SetErrorLevel ${ERROR_CLOSEFAIL} + Quit + ${Else} + MessageBox MB_RETRYCANCEL|MB_ICONSTOP "$(RAINMETERCLOSEERROR)" IDRETRY +2 + Quit + ${EndIf} + ${EndIf} + + Sleep 500 + ${Next} + + ; Old stuff + RMDir /r "$INSTDIR\Addons" + RMDir /r "$INSTDIR\Fonts" + + RMDir /r "$INSTDIR\Defaults" + RMDir /r "$INSTDIR\Languages" + RMDir /r "$INSTDIR\Plugins" + RMDir /r "$INSTDIR\Runtime" + RMDir /r "$INSTDIR\Skins" + Delete "$INSTDIR\Rainmeter.dll" + Delete "$INSTDIR\Rainmeter.exe" + Delete "$INSTDIR\Rainmeter.exe.config" + Delete "$INSTDIR\SkinInstaller.exe" + Delete "$INSTDIR\SkinInstaller.dll" + Delete "$INSTDIR\uninst.exe" + + RMDir "$INSTDIR" + + SetShellVarContext all + RMDir /r "$APPDATA\Rainstaller" + + SetShellVarContext current + Call un.RemoveShortcuts + ${If} $un.DeleteAll = 1 + RMDir /r "$APPDATA\Rainmeter" + RMDir /r "$DOCUMENTS\Rainmeter\Skins" + RMDir "$DOCUMENTS\Rainmeter" + RMDir /r "$1\Rainmeter" + ${EndIf} + + !insertmacro UAC_AsUser_Call Function un.RemoveShortcuts ${UAC_SYNCREGISTERS} + ${If} $un.DeleteAll = 1 + RMDir /r "$APPDATA\Rainmeter" + RMDir /r "$DOCUMENTS\Rainmeter\Skins" + RMDir "$DOCUMENTS\Rainmeter" + ${EndIf} + + SetShellVarContext all + Call un.RemoveShortcuts + Delete "$SMPROGRAMS\Rainmeter.lnk" + + DeleteRegKey HKLM "SOFTWARE\Rainmeter" + DeleteRegKey HKCR ".rmskin" + DeleteRegKey HKCR "Rainmeter.SkinInstaller" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Rainmeter" + ${RefreshShellIcons} +SectionEnd + +Function un.RemoveShortcuts + !insertmacro RemoveStartMenuShortcuts "$SMPROGRAMS\Rainmeter" + Delete "$SMSTARTUP\Rainmeter.lnk" + Delete "$DESKTOP\Rainmeter.lnk" +FunctionEnd diff --git a/BuildTools/Installer/MD5.dll b/BuildTools/Installer/MD5.dll new file mode 100644 index 0000000000000000000000000000000000000000..bde153f702f0d6c251d2b7ad7787fe950fd1725f GIT binary patch literal 6656 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 X=Oue{UGoji?&hWZ^7#tB^a%VDdaRno literal 0 HcmV?d00001 diff --git a/BuildTools/Installer/UAC.dll b/BuildTools/Installer/UAC.dll new file mode 100644 index 0000000000000000000000000000000000000000..ccaa050e4cc877ef660d14c08fe9719ac8d8ae7e GIT binary patch literal 13312 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 bs-t#~0=CK8r9Dzdcj2Kd29TsZ&WHa$RDxLd literal 0 HcmV?d00001 diff --git a/BuildTools/Layouts/illustro default/Rainmeter.ini b/BuildTools/Layouts/illustro default/Rainmeter.ini new file mode 100644 index 00000000..b362333b --- /dev/null +++ b/BuildTools/Layouts/illustro default/Rainmeter.ini @@ -0,0 +1,23 @@ +[Rainmeter] + +[illustro\Clock] +Active=1 +WindowX=(#SCREENAREAWIDTH#-200) +WindowY=0 + +[illustro\Disk] +Active=2 +WindowX=(#SCREENAREAWIDTH#-200) +WindowY=176 + +[illustro\System] +Active=1 +WindowX=(#SCREENAREAWIDTH#-200) +WindowY=68 + +[illustro\Welcome] +Active=1 +WindowX=50.000000% +WindowY=50.000000% +AnchorX=50.000000% +AnchorY=50.000000% \ No newline at end of file diff --git a/BuildTools/Skins/illustro/@Resources/Background.png b/BuildTools/Skins/illustro/@Resources/Background.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa0d7d031147f3f1c1d35b6da3e8319882dabf8 GIT binary patch literal 1986 zcmcIl`8(TL7ym{|N+U0^?@A_!5L;@g+8UK$jH0AyD=kvqQLzt$SY9erh>UG)t+Dql ziCQ~-N=YdRYFA5XZ9}D|V=bngOrLq)|KR=Mob#OXeD1mDo^$W#(p+5}#KjcF000mt z;BjsOJ0=j^X%T_mt@*dIztv?nK@4*XQJ$l>taOWYgE>)jyslq{pk51SahX|_WJR=0%n2xWeYyJ zuu{Q90&KuPOphwMn}FyQ=EOC*W~`t}w0`%8^?)RiB=e9BHbPGaL*9B)sW71nw&JqH zmszkKRu0%jTZ<_*_@UvtuhK_#-Y+$5Mrx$PJA*1Kr`hmfBfkNhLQ6$vplcJ*NNjK9yHTdW%2SiH%e+1~%sBt3M0R3W2(nc97_wYAlrX7|<; z$?TNCO7s8YY?h+?a^*zl#)FzV-Kpej(YeNW|H2!J3Ac}qcYA)<7ioUI)$}Po(UO5L z&GD}+Ca%5B?BeKVt+?p3s@|8ElqfYLB>iGyp=Xw?$y+YVjM5cZOw!7J~fvN`Mb4(m8TsB=&ToB;JuU>z`3Ut8WG z&S-r^>NPI$lr+Nn=;w`}avz>`L>RgT_yq*4vWIT*!WA4eyeMl$`1qCQavP25+6<0O ze)93bHZ^3YE zQ3n9Sb-E=c@xcfhf-!*y$>-uh>2;UfGzkb=)g`g+B%GK54x6V)&>$eNZh#2FE$M87 z0QkkBN)wD9g>sS%)ftEs-06Rik3Eraf<`?<$UvPT1ihSHbtw-ICuB?iQxyW6_y4R) z4FzB1@x01*9<71r=H}ubc3vMa0UJsfx@t?S7E76;HNOtE|Jh`zQZ1Um?Oa$`I1eXa z5Q4dPZ*FdaOZua@26SBGlJmEWI6i%MYHG@hP25To(JAKGa4$PJ^q=vWl?jo(%C%Q! zFNtZi`plwNsU2Zs;j?32sC=stf1?rX-&e((E&_p22Uo+h&SgC;*!jAx48xn>C+akx z$0}7(Q&VfjzIE~ODVcgXtA)ja%~&lhyWji!`}fTIQB5*58M@)aih{u~(QC0oiQ&mYbb3ZV2AyQKFl^Q$#yc`g;UJxU{w(mG0_Z`O$mA!YiL=SdS zpBAxstDr={(g3vE$hr62yH0@9*@9R#l%1%JKwhxoMPgv`G< z7N~oB>d11o-#3soah*2{FFblM9)hI--C@x2|Iv0wl2pfA%m$sd;@@L1?d&1<-Uhm& zKJ)U}`NHV)PiBlWU9N%y=YuK&ILTqeyRkF ztuTI9sQt6;F9yIkJyZbIlF&aCAjLjRJneuS9wT8kW<|_1&re^e6)^X3(sFSHJ)-|l yD*U&ohw%?iYQkGOq3rMy#V7uxH$9X{Q8VEI_b#!8O|XrThi@(S(iw literal 0 HcmV?d00001 diff --git a/BuildTools/Skins/illustro/Clock/Clock.ini b/BuildTools/Skins/illustro/Clock/Clock.ini new file mode 100644 index 00000000..3bcb981d --- /dev/null +++ b/BuildTools/Skins/illustro/Clock/Clock.ini @@ -0,0 +1,138 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Displays the current date and time. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureTime] +; This measure returns the time in a 24-hour format (i.e. HH:MM). +Measure=Time +Format=%H:%M +; For a 12-hour clock, change the Format option above to: %I:%M %p +; Refer to the Rainmeter manual for other format codes. + +[measureDate] +; Returns the date as DD.MM.YYYY +Measure=Time +Format=%d.%m.%Y + +[measureDay] +; Returns the current day +Measure=Time +Format=%A + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleSeperator] +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +MeasureName=measureTime +X=100 +Y=12 +W=190 +H=18 +Text="%1" +; %1 stands for the value of MeasureName (measureTime in this case). + +[meterDay] +Meter=STRING +MeterStyle=styleLeftText +MeasureName=measureDay +X=10 +Y=40 +W=190 +H=14 +Text="%1" + +[meterDate] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureDate +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1" + +[meterSeperator] +Meter=IMAGE +MeterStyle=styleSeperator +X=10 +Y=52 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Disk/1 Disk.ini b/BuildTools/Skins/illustro/Disk/1 Disk.ini new file mode 100644 index 00000000..669723bd --- /dev/null +++ b/BuildTools/Skins/illustro/Disk/1 Disk.ini @@ -0,0 +1,149 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +; NOTE! If you want to add more disks, take a look at 'Disks 2.ini'. + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Displays disk usage. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 +disk1=C: + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureTotalDisk1] +; This measure returns the total disk space +Measure=FreeDiskSpace +Drive=#disk1# +Total=1 +UpdateDivider=120 + +[measureUsedDisk1] +; Returns inverted value of free disk space (i.e. used disk space) +Measure=FreeDiskSpace +Drive=#disk1# +InvertMeasure=1 +UpdateDivider=120 + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleBar] +BarColor=#colorBar# +BarOrientation=HORIZONTAL +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="Disks" +; Even though the text is set to Disks, Rainmeter will display +; it as DISKS, because styleTitle contains StringCase=UPPER. + +[meterLabelDisk1] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=40 +W=190 +H=14 +Text="#disk1#\" + +[meterValueDisk1] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureUsedDisk1 +MeasureName2=measureTotalDisk1 +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1B/%2B used" +; %1 stands for the value of MeasureName (measureUsedDisk1 in this case). +; %2 stands for the value of MeasureName2. +NumOfDecimals=1 +AutoScale=1 +; Because disk measures return the free/used space in bytes, we must use AutoScale=1 to +; automatically scale the value into a more readable figure. +LeftMouseUpAction=!Execute ["#disk1#\"] +; Open #disk1# on click + +[meterBarDisk1] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureUsedDisk1 +X=10 +Y=52 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Disk/2 Disks.ini b/BuildTools/Skins/illustro/Disk/2 Disks.ini new file mode 100644 index 00000000..e255501a --- /dev/null +++ b/BuildTools/Skins/illustro/Disk/2 Disks.ini @@ -0,0 +1,209 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +; HOWTO: Adding more disks +; ---------------------------------- +; Adding more disks is a pretty straightforward process. Follow the following steps to turn +; this 2 disks skin into a 3 disks skin. You can then extend it even further as you wish. +; +; 1) Create a new variable called disk3=X: directly below disk2=D: in the [Variables] section +; 2) Create a copy of the [measureTotalDisk2] and [measureUsedDisk2] sections +; 3) Rename the copied sections to [measureTotalDisk3] and [measureUsedDisk3], respectively. +; Also change Drive=#disk2# to Drive=#disk3# +; 4) Create a copy of the [meterLabelDisk2], [meterValueDisk2], and [meterBarDisk2]. +; Rename all Disk2's in the copied sections to Disk3. +; 5) Now we need to change the Y= values to adjust height. Change Y= under [meterLabelDisk3] +; to Y=80 (calculated by adding 20 to the Y= value of previous meterLabel). +; Then change Y= under [meterBarDisk3] to Y=92 (calculated by adding 20 to the Y= value of previous meterBar). +; 6) Save the file as '3 Disks.ini'. Now right-click on the Rainmeter tray icon and select +; 'Refresh All'. Now go activate the '3 Disks.ini' skin and enjoy! :) + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Displays disk usage. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 +disk1=C: +disk2=D: + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureTotalDisk1] +; This measure returns the total disk space +Measure=FreeDiskSpace +Drive=#disk1# +Total=1 +UpdateDivider=120 + +[measureUsedDisk1] +; Returns inverted value of free disk space (i.e. used disk space) +Measure=FreeDiskSpace +Drive=#disk1# +InvertMeasure=1 +UpdateDivider=120 + +[measureTotalDisk2] +Measure=FreeDiskSpace +Drive=#disk2# +Total=1 +UpdateDivider=120 + +[measureUsedDisk2] +Measure=FreeDiskSpace +Drive=#disk2# +InvertMeasure=1 +UpdateDivider=120 + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleBar] +BarColor=#colorBar# +BarOrientation=HORIZONTAL +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="Disk" +; Even though the text is set to Disk, Rainmeter will display +; it as DISK, because styleTitle contains StringCase=UPPER. + +[meterLabelDisk1] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=40 +W=190 +H=14 +Text="#disk1#\" + +[meterValueDisk1] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureUsedDisk1 +MeasureName2=measureTotalDisk1 +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1B/%2B used" +; %1 stands for the value of MeasureName (measureUsedDisk1 in this case). +; %2 stands for the value of MeasureName2. +NumOfDecimals=1 +AutoScale=1 +; Because disk measures return the free/used space in bytes, we must use AutoScale=1 to +; automatically scale the value into a more readable figure. +LeftMouseUpAction=!Execute ["#disk1#\"] +; Open #disk1# on click + +[meterBarDisk1] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureUsedDisk1 +X=10 +Y=52 +W=190 +H=1 + +[meterLabelDisk2] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=60 +W=190 +H=14 +Text="#disk2#\" +LeftMouseUpAction=!Execute ["#disk2#\"] + +[meterValueDisk2] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureUsedDisk2 +MeasureName2=measureTotalDisk2 +X=200 +Y=0r +W=190 +H=14 +Text="%1B/%2B used" +NumOfDecimals=1 +AutoScale=1 + +[meterBarDisk2] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureUsedDisk2 +X=10 +Y=72 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Google/Google.ini b/BuildTools/Skins/illustro/Google/Google.ini new file mode 100644 index 00000000..07b32b6c --- /dev/null +++ b/BuildTools/Skins/illustro/Google/Google.ini @@ -0,0 +1,119 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Allows searching through Google. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureInput] +; The InputText.dll plugin has special powers: it allows user input. +; However, it's not the easiest way to start learning Rainmeter. Get a +; hold of the basics, and then check out the manual entry for InputText. +Measure=Plugin +Plugin=InputText.dll +SolidColor=20,20,20,255 +StringAlign=LEFT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +X=10 +Y=38 +W=188 +H=17 +FocusDismiss=1 +DefaultValue="" +Command1=!Execute ["http://www.google.com/search?q=$UserInput$"] +UpdateDivider=86400 + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleSeperator] +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="Google" + +[meterSearch] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=40 +W=190 +H=14 +Text="Search..." +LeftMouseUpAction=!PluginBang "measureInput ExecuteBatch 1" + +[meterSeperator] +Meter=IMAGE +MeterStyle=styleSeperator +X=10 +Y=52 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Network/Network.ini b/BuildTools/Skins/illustro/Network/Network.ini new file mode 100644 index 00000000..b72007bf --- /dev/null +++ b/BuildTools/Skins/illustro/Network/Network.ini @@ -0,0 +1,215 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Shows your IP address and network activity. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 +maxDownload=10485760 +MaxUpload=10485760 +; Set maxDownload and maxUpload to your maximum download and upload speed in bits. +; To convert kilobits, megabits, kilobytes, and megabytes into bits, go to www.google.com +; and search for something like "10 megabytes in bits". + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureIP] +; This measure returns your IP. WebParser measures are relatively complicated. If you're a beginner with +; Rainmeter, take a look at some of the other illustro skins before modifying this one. +Measure=Plugin +Plugin=WebParser.dll +Url=http://checkip.dyndns.org +UpdateRate=14400 +RegExp="(?siU)Address: (.*)" +StringIndex=1 +Substitute="":"N/A" +; Substitute works as follows: "A":"B" where A is a string to substitute and B is a string +; to substitute with. In this case, it substutes "" (i.e. empty) to N/A + +[measureNetIn] +Measure=NetIn +NetInSpeed=#maxDownload# +; NetInSpeed must be set so your maximun download speed for the download bar to scale correctly + +[measureNetOut] +Measure=NetOut +NetOutSpeed=#maxUpload# + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleBar] +BarColor=#colorBar# +BarOrientation=HORIZONTAL +SolidColor=255,255,255,15 + +[styleSeperator] +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="Network" +; Even though the text is set to Network, Rainmeter will display +; it as NETWORK, because styleTitle contains StringCase=UPPER. + +[meterIPLabel] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=40 +W=190 +H=14 +Text="IP Address" + +[meterIPValue] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureIP +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1" +; %1 stands for the value of MeasureName (measureIP in this case). + +[meterSeperator] +Meter=IMAGE +MeterStyle=styleSeperator +X=10 +Y=52 +W=190 +H=1 + +[meterUploadLabel] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=60 +W=190 +H=14 +Text="Upload" + +[meterUploadValue] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureNetOut +X=200 +Y=0r +W=190 +H=14 +Text="%1B/s" +NumOfDecimals=1 +AutoScale=1 +; Because measureIP returns the current upload speed in bytes, we must use AutoScale=1 to +; automatically scale the value into a more readable figure. + +[meterUploadBar] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureNetOut +X=10 +Y=72 +W=190 +H=1 + +[meterDownloadLabel] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=80 +W=190 +H=14 +Text="Download" + +[meterDownloadValue] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureNetIn +X=200 +Y=0r +W=190 +H=14 +Text="%1B/s" +NumOfDecimals=1 +AutoScale=1 + +[meterDownloadBar] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureNetIn +X=10 +Y=92 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Recycle Bin/Recycle Bin.ini b/BuildTools/Skins/illustro/Recycle Bin/Recycle Bin.ini new file mode 100644 index 00000000..9a1a7448 --- /dev/null +++ b/BuildTools/Skins/illustro/Recycle Bin/Recycle Bin.ini @@ -0,0 +1,147 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Shows the state and size of your Recycle Bin. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureBinItems] +; This measure returns the amount of items in the Recycle Bin. +Measure=Plugin +Plugin=RecycleManager.dll +RecycleType=COUNT +UpdateDivider=3 +; UpdateDivider sets the rate at which the value of the measure is updated. It is +; calculated as follows: UpdateDivider x Update. In this case, Update is set to +; 1000 milliseconds (in the [Rainmeter] section). 1000 x 3 = 3000 ms or 3 seconds. + +[measureBinSize] +; Returns the total size of the Recycle Bin in bytes. +Measure=Plugin +Plugin=RecycleManager.dll +RecycleType=SIZE +UpdateDivider=3 + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleSeperator] +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="Recycle Bin" +; Even though the text is set to Recycle Bin, Rainmeter will display +; it as RECYCLE BIN, because styleTitle contains StringCase=UPPER. +LeftMouseUpAction=!Execute [!PluginBang "measureBinItems OpenBin"] +RightMouseUpAction=!Execute [!PluginBang "measureBinItems EmptyBin"] +ToolTipText="Left-click to open Recycle Bin#CRLF#Right-click to empty" +; Hovering over this meter will display a tooltip with the text above. +; The #CRLF# variable creates a new line. + +[meterBinItems] +Meter=STRING +MeterStyle=styleLeftText +MeasureName=measureBinItems +X=10 +Y=40 +W=190 +H=14 +Text="%1 items" +; %1 stands for the value of MeasureName (measureBinItems in this case). + +[meterBinSize] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureBinSize +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1B" +AutoScale=1 +; Because measureBinSize returns the size in bytes, we must use AutoScale=1 to +; automatically scale the value into a more readable figure. + +[meterSeperator] +Meter=IMAGE +MeterStyle=styleSeperator +X=10 +Y=52 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/System/System.ini b/BuildTools/Skins/illustro/System/System.ini new file mode 100644 index 00000000..c7a89ffa --- /dev/null +++ b/BuildTools/Skins/illustro/System/System.ini @@ -0,0 +1,206 @@ +; Lines starting ; (semicolons) are commented out. +; That is, they do not affect the code and are here for demonstration purposes only. +; ---------------------------------- + +[Rainmeter] +; This section contains general settings that can be used to change how Rainmeter behaves. +Author=poiru +AppVersion=2003000 +Update=1000 +Background=#@#Background.png +; #@# is equal to Rainmeter\Skins\illustro\@Resources +BackgroundMode=3 +BackgroundMargins=0,34,0,14 + +[Metadata] +; Contains basic information of the skin. +Description=Displays basic system stats. +License=Creative Commons BY-NC-SA 3.0 +Version=1.0.0 + +[Variables] +; Variables declared here can be used later on between two # characters (e.g. #MyVariable#). +fontName=Trebuchet MS +textSize=8 +colorBar=235,170,0,255 +colorText=255,255,255,205 + +; ---------------------------------- +; MEASURES return some kind of value +; ---------------------------------- + +[measureCPU] +; This measure returns the average CPU load between all cores. +Measure=CPU +Processor=0 + +[measureRAM] +; Returns the amount of RAM used in bytes. +Measure=PhysicalMemory +UpdateDivider=20 +; UpdateDivider sets the rate at which the value of the measure is updated. It is +; calculated as follows: UpdateDivider x Update. In this case, Update is set to +; 1000 milliseconds (in the [Rainmeter] section). 1000 x 20 = 20000 ms or 20 seconds. + +[measureSWAP] +; Returns the amount of SWAP (pagefile) used in bytes. +Measure=SWAPMemory +UpdateDivider=20 + +; ---------------------------------- +; STYLES are used to "centralize" options +; ---------------------------------- + +[styleTitle] +StringAlign=CENTER +StringCase=UPPER +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,50 +FontColor=#colorText# +FontFace=#fontName# +FontSize=10 +AntiAlias=1 +ClipString=1 + +[styleLeftText] +StringAlign=LEFT +; Meters using styleLeftText will be left-aligned. +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleRightText] +StringAlign=RIGHT +StringCase=NONE +StringStyle=BOLD +StringEffect=SHADOW +FontEffectColor=0,0,0,20 +FontColor=#colorText# +FontFace=#fontName# +FontSize=#textSize# +AntiAlias=1 +ClipString=1 + +[styleBar] +BarColor=#colorBar# +BarOrientation=HORIZONTAL +SolidColor=255,255,255,15 + +; ---------------------------------- +; METERS display images, text, bars, etc. +; ---------------------------------- + +[meterTitle] +Meter=STRING +MeterStyle=styleTitle +; Using MeterStyle=styleTitle will basically "copy" the +; contents of the [styleTitle] section here during runtime. +X=100 +Y=12 +W=190 +H=18 +Text="System" +; Even though the text is set to System, Rainmeter will display +; it as SYSTEM, because styleTitle contains StringCase=UPPER. +LeftMouseUpAction=!Execute ["taskmgr.exe"] +; Left-clicking this meter will launch taskmgr.exe (the Task Manager). +ToolTipText="Open Task Manager" +; Hovering over this meter will display a tooltip with the text above. + +[meterLabelCPU] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=40 +W=190 +H=14 +Text="CPU Usage" + +[meterValueCPU] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureCPU +X=200 +Y=0r +; r stands for relative. In this case, the Y postition of meterValueCPU is 0 pixels +; below the Y value of the previous meter (i.e it's the same as in meterLabelCPU). +W=190 +H=14 +Text="%1%" +; %1 stands for the value of MeasureName (measureCPU in this case). + +[meterBarCPU] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureCPU +X=10 +Y=52 +W=190 +H=1 + +[meterLabelRAM] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=60 +W=190 +H=14 +Text="RAM Usage" + +[meterValueRAM] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureRAM +X=200 +Y=0r +W=190 +H=14 +Text="%1%" +Percentual=1 +; Percentual=1 needs to be added her because measureRAM returns the amount +; of RAM used in bytes. Using Percentual=1 will convert that into a percentual value. + +[meterBarRAM] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureRAM +X=10 +Y=72 +W=190 +H=1 + +[meterLabelSWAP] +Meter=STRING +MeterStyle=styleLeftText +X=10 +Y=80 +W=190 +H=14 +Text="SWAP Usage" + +[meterValueSWAP] +Meter=STRING +MeterStyle=styleRightText +MeasureName=measureSWAP +X=200 +Y=0r +W=190 +H=14 +Text="%1%" +Percentual=1 + +[meterBarSWAP] +Meter=BAR +MeterStyle=styleBar +MeasureName=measureSWAP +X=10 +Y=92 +W=190 +H=1 \ No newline at end of file diff --git a/BuildTools/Skins/illustro/Welcome/Background.png b/BuildTools/Skins/illustro/Welcome/Background.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf1119425bd04941f6bc0f64bab91067538edc8 GIT binary patch literal 1836 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8aQXI@ckqd62UO>*&0G|+7AQuyagoFSEGcqzT zrAQLV%*@189~KrC8X5`|&&tZesvsvPM^aKUGBPqeJUlfum64H=iHQlQURG8XNOE&? z1IhgS{Pgtnyu3UkBO_s9VSj&rph_Vjq1@bD7BGm8j<&M0Dkvz3iHS*0PWJHd@bdBk z%CfVw1J!eIZ~#TLwY9Uevw?OQ8X6iH7z6|a@bdC{dU^s?N=Zq%xw!!y0CXWx3mY37 zFie0(0S%OslLJcG+S&p=0(4|xV4#ME2GC5P0tW{NdwY9FM@OLfK|w*m!NIDksz7Bx z5@@)yvop|zf`WoTyL^3pBO)Szjs(gAO>l8>QBzZccn#>yO5uVYpeNf)g8YJe)-&<2 z$%!PI`)e^Wurdp?$Z`s?^Kx;BYf6gp$?*FLa7$|ls>LUm`uZv>s+j2*_{@umGhEjr zrDW1&?BV8ZB;#hb$Z_?WAT5swld?kZm5WxDihGOn_Sq^b7YQrJx_5U++PHN1YiC;( z*~?njG=C)e57x|bd8oCBX#76kp8OXQi)tbL$U|`wr>Eakt5%=ceLEZxjJj@3) z-mbr~DL~}joBb(Qr)UanKNP8b{bqe(1s12D%XU6~ z=8f`#tpAtqcD}fNTJG;+1s-QciRmhAPi}snb!0-&ZMBkYbJpWpe0)tE&3#o2@9P=< z%P3SU>=&;2a8pl0X;Pu2s<=;zQ~J(0(Gxf7tr(^q`grWbs&~;#pB2vZ(u>$y8|!(w zK;4V&!|Zbb8NX{{{VpdO_uSK8Wb{7xwQT$Gf3S#J<&Z>8@YV@>MyKJIR>`D z%eT+|(r4`5Ap5e|uf61wqm>8yO9j~_%_S4~K%D>Xa3+d4m^1m`X}MYzRUTlPD>-tm zg`u&*r9k6b-JwqsuOp7#+xK8M??-;QNq6<%gfMe9r%k|oNrFFmH~#UeOJ z;_kaj7~zUg#b44?-0IR&?g>!GA=?WS_nuBu@rin|4Uj-VwRfVP?V7b*8g9RebkAIB zHmQwv5X^bwf2rBC%Kl9rr$*D)vx(+!(q9&uSO^8MJYSyOtntrVzEn?-^~wFKUmwP$ zi-cePlC}5xzMp~<>bIA(?|vI+>#H9gb@s`>L>-0q$NK#b-&}HY)s)L$+%&7|Dn%!h z=f9V?J|4Jo;!^gnQ=dHf{Q9?#L*3s^{^^=LhXN$rysvCCF_SQrSlk3e%3JbF<7J;G z-uE?suzS+xrqh3al>a{bQKdlO*6aF`gq=}d=cm7ZyYFV&&!nO$Hq|!q@B4pT3MtlA zSbTbA^^t`;p5$H^KU-8ZW!a0})27d`Ix^Y0-B_4u$!!(B8G%=ue(&2awWQ~*vyrBF zY3c?AwQYS2CaEPII(IKSrTaw+CFbx1e|W)nEb!2a^|n?g5+zy|Dn!lHn0K6xG(pdp6B{yI;3H{KT10rE-d*t2iFb;OnsR z_TG9g(dl$-c2?^;rkdsUw?prG=3S2T*tOd3^zSc>bA56g#oPJY=j3?qj9@(hOz8}s Lu6{1-oD!M + + + + $(SolutionDir)..\WinDDK\7600.16385.1\ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + Unicode + v120_xp + + \ No newline at end of file diff --git a/BuildTools/VS/Rainmeter.Cpp.props b/BuildTools/VS/Rainmeter.Cpp.props new file mode 100644 index 00000000..d4b94401 --- /dev/null +++ b/BuildTools/VS/Rainmeter.Cpp.props @@ -0,0 +1,129 @@ + + + + + + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath); + + + + true + true + + + + true + + + + + $(SolutionDir)x32-$(Configuration)\ + $(SolutionDir)x64-$(Configuration)\ + + $(RmOutDirRoot) + $(OutDir)\Obj\$(ProjectName)\ + + + + + $(IntDir) + + + + + + false + + + Microsoft.VisualStudio.TestTools.CppUnitTestFramework.dll + Microsoft.VisualStudio.TestTools.CppUnitTestFramework.x64.dll + + + + + + + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + + + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + + + 4351;%(DisableSpecificWarnings) + + false + + + + WIN32;_WINDOWS;WINVER=0x0601;_WIN32_WINNT=0x0601;_WIN32_IE=0x0601;PSAPI_VERSION=1;_CRT_SECURE_NO_WARNINGS;WIN32_LEAN_AND_MEAN;_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions) + Level3 + + + Windows + $(IntDir)$(TargetName).lib + $(IntDir)$(TargetName).pdb + false + + + 0x0409 + + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + + + true + + + _DEBUG;%(PreprocessorDefinitions) + + + + + + true + MaxSpeed + NDEBUG;%(PreprocessorDefinitions) + true + true + /Gw %(AdditionalOptions) + + + false + UseLinkTimeCodeGeneration + .rdata=.text + true + true + + + NDEBUG;%(PreprocessorDefinitions) + + + + + + StreamingSIMDExtensions + + + MachineX86 + + + + + + _WIN64;%(PreprocessorDefinitions) + + + MachineX64 + + + \ No newline at end of file diff --git a/BuildTools/VS/RainmeterPlugin.Cpp.props b/BuildTools/VS/RainmeterPlugin.Cpp.props new file mode 100644 index 00000000..486163dc --- /dev/null +++ b/BuildTools/VS/RainmeterPlugin.Cpp.props @@ -0,0 +1,18 @@ + + + + false + $(OutDir)Plugins\ + + + + + $(SolutionDir)Plugins\API\x32\Rainmeter.lib;%(AdditionalDependencies) + + + + + $(SolutionDir)Plugins\API\x64\Rainmeter.lib;%(AdditionalDependencies) + + + \ No newline at end of file diff --git a/BuildTools/VS/RainmeterPlugin.Cs.props b/BuildTools/VS/RainmeterPlugin.Cs.props new file mode 100644 index 00000000..b79649ae --- /dev/null +++ b/BuildTools/VS/RainmeterPlugin.Cs.props @@ -0,0 +1,9 @@ + + + + $(SolutionDir)x32-$(Configuration)\ + $(SolutionDir)x64-$(Configuration)\ + + $(RmOutDirRoot)Plugins\ + + \ No newline at end of file