winamp/Src/Plugins/Visualization/vis_milk2/milkdrop.nsi
2024-09-24 14:54:57 +02:00

440 lines
20 KiB
Plaintext

; LICENSE
; -------
; Copyright 2005-2013 Nullsoft, Inc.
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without modification,
; are permitted provided that the following conditions are met:
;
; * Redistributions of source code must retain the above copyright notice,
; this list of conditions and the following disclaimer.
;
; * Redistributions in binary form must reproduce the above copyright notice,
; this list of conditions and the following disclaimer in the documentation
; and/or other materials provided with the distribution.
;
; * Neither the name of Nullsoft nor the names of its contributors may be used to
; endorse or promote products derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
; FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
; IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
; OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
; ----------------------------------------------------------------
; NOTE: this .nsi script was last built with 'makensis.exe'
; version 1.98. If you go to install it (unchanged) and get errors,
; try tracking down that older version, or try to figure out what
; has changed since then. You can get NSIS at:
;
; http://www.nullsoft.com/free/nsis/
;
; This installer will produce a single EXE file that, when run,
; will decompress and install your plugin and all of its data files
; to Winamp 2 or Winamp 3.
; ----------------------------------------------------------------
; MODIFYING THIS SCRIPT TO CREATE AN INSTALLER FOR YOUR OWN PLUGIN:
; ----------------------------------------------------------------
; 1) there are three sections below, each marked 'EDIT THIS SECTION
; [x/3]' where 'x' is the section number. These are the 3
; places where you need to make changes to customize this
; installer script for your particular plugin. Go to each
; and make the changes, reading the comments there for
; more information.
; 2) download NSIS from http://www.nullsoft.com/free/nsis/, if you
; haven't already.
; 3) run the command 'makensis.exe installer.nsi' to build
; the executable. (note: ignore the warning message about
; 'InstallRegKey' being used multiple times; this is necessary
; to determine whether Winamp 2 or 3 is a better candidate
; for the install.)
; ----------------------------------------------------------------
; WHAT THIS INSTALLER SCRIPT DOES:
; ----------------------------------------------------------------
; If Winamp 2 is installed, it will install your plugin to Winamp 2,
; in the directory Winamp\Plugins (or whatever is specified as the
; vis plugins path, in Winamp\winamp.ini). It will also select
; the plugin as the current plugin. (Note that Winamp must be
; closed to do this, so if it's open, the installer will ask the
; user to close it before proceeding.) At the end of a successful
; install, it asks if they'd like to run Winamp.
;
; If Winamp 2 is not present but Winamp 3 is, or if the user manually
; selects the Winamp 3 directory to install to, the plugin will be
; installed to Winamp 3 as a classic visualization plugin, to the
; directory Winamp3\Plugins. At install time, if ClassicVis is not
; installed, it will prompt the user to go download it. If they
; don't download it, it will tell them the installation failed.
; If they already had it, or after they presumably download it,
; the installer will briefly tell them how to select their new
; plugin and run it in Winamp 3, using ClassicVis. Finally, at
; the end of a successful install, it asks if they'd like to run
; Winamp 3.
; ----------------------------------------------------------------
; -------------------- EDIT THIS SECTION [1/3] --------------------
; -------------------- EDIT THIS SECTION [1/3] --------------------
; -------------------- EDIT THIS SECTION [1/3] --------------------
!define PLUGIN_NAME "MilkDrop 2" ; Brief name of the component. Can have spaces in it.
!define INSTALL_CAPTION "MilkDrop 2.2 Setup" ; Caption for the installer dialog
!define PLUGIN_DLL "vis_milk2.dll" ; The filename of the actual plugin
!define PLUGIN_OUTFILE "milkdrop_2.exe" ; Name of the installer to create
; ----------------------- END SECTION [1/3] -----------------------
; ----------------------- END SECTION [1/3] -----------------------
; ----------------------- END SECTION [1/3] -----------------------
; ----------------------------------------------------------------
Name ${PLUGIN_NAME}
Caption "${INSTALL_CAPTION}"
OutFile ${PLUGIN_OUTFILE}
; ----------------------------------------------------------------
; to determine the install directory, we start with Program Files\Winamp.
; then, if winamp 3 is found, override this and use that directory.
; finally, if winamp 2 is found, override again and use that directory.
InstallDir $PROGRAMFILES\Winamp
InstallDirRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp3" "UninstallString"
InstallDirRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString"
DirText \
"The installer has determined that this is the path to Winamp.$\rIf it is not correct, please change it. You will not be able to proceed$\runtil a valid path is found." \
"Select the directory in which Winamp 2 or 3 is installed:"
Function .onInit
IfFileExists $INSTDIR\winamp.exe End ; else if winamp.exe found (winamp2), we're good
IfFileExists $INSTDIR\winamp3.exe End ; if winamp3.exe found (winamp3), we're good
IfFileExists $INSTDIR\studio.exe End ; or if studio.exe found (older version of winamp3), we're good
; the above will work fine if winamp 2 or 3 is installed,
; but will break if winamp 2 or 3 was uninstalled *but the directory remains.*
IfFileExists $PROGRAMFILES\Winamp\winamp.exe SelectNaturalWinamp2 ; last but not least, try the default winamp 2 directory
IfFileExists $PROGRAMFILES\Winamp3\winamp3.exe SelectNaturalWinamp3 ; otherwise, try the default winamp 3 directory
IfFileExists $PROGRAMFILES\Winamp3\studio.exe SelectNaturalWinamp3 ; otherwise, try the default winamp 3 directory
; if all of these failed, no good path to Winamp (2 or 3) could be found,
; and the 'Next' button will be disabled until the user can specify
; the correct folder.
Goto End
SelectNaturalWinamp3:
strcpy $INSTDIR $PROGRAMFILES\Winamp3
goto End
SelectNaturalWinamp2:
strcpy $INSTDIR $PROGRAMFILES\Winamp
goto End
End:
FunctionEnd
Function .onVerifyInstDir
IfFileExists $INSTDIR\Winamp.exe DirOk
IfFileExists $INSTDIR\Winamp3.exe DirOk
IfFileExists $INSTDIR\Studio.exe DirOk
Abort ; leaves the directory as the selected one, but disables the 'Next' button...
DirOk:
FunctionEnd
Function QueryWinampVisPath
; input: $INSTDIR, the currently-selected install dir (path to winamp)
; output: $1, the path to the winamp vis plugins subdirectory
; -for winamp 3x, this is just $INSTDIR\plugins
; -for winamp 2x, it comes from the winamp.ini file
; (or just $INSTDIR\plugins if there is an error reading it.)
IfFileExists $INSTDIR\Winamp.exe CaseWinamp2
IfFileExists $INSTDIR\Winamp3.exe CaseWinamp3
IfFileExists $INSTDIR\Studio.exe CaseWinamp3 ; legacy check
goto CaseImpossible
CaseWinamp2:
StrCpy $1 $INSTDIR\Plugins\MilkDrop2
ReadINIStr $8 $INSTDIR\winamp.ini Winamp VisDir
StrCmp $8 "" End
IfFileExists $8 0 End
StrCpy $1 $8 ; update dir
goto end
CaseWinamp3:
CaseImpossible:
StrCpy $1 $INSTDIR\Plugins\MilkDrop2
goto end
End:
FunctionEnd
; The stuff to install
Section ""
CloseWinamp2:
; make sure winamp is closed before we 1) try to install files
; and 2) (later) edit winamp.ini. for 1), if they're running
; (or were running) some other vms-based plugin using
; vms_desktop.dll, then if winamp is still open, the installer
; could have trouble overwriting vms_desktop.dll, or other files;
; the user would get an abort/retry/ignore box, but it's easier
; to just play it safe.
FindWindow $R0 "winamp v1.x"
StrCmp $R0 0 "" RequestCloseWinamp2
goto Winamp2Closed
RequestCloseWinamp2:
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "Winamp is currently running; please close it,$\rand then hit OK to continue..." \
IDCANCEL WarnWinampStillOpen
goto CloseWinamp2
WarnWinampStillOpen:
FindWindow $R0 "winamp v1.x"
StrCmp $R0 0 "" WarnWinampStillOpen2
goto Winamp2Closed
WarnWinampStillOpen2:
MessageBox MB_OK|MB_ICONEXCLAMATION "Warning: Winamp is still open; as a result, the installer$\rwill not be able to set ${PLUGIN_NAME} as the default plugin; you will$\rhave to do this yourself.$\r$\rTo do so, wait until the installation is finished. Then bring up $\rWinamp and hit CTRL+K. From there, you will be able to select$\r${PLUGIN_NAME} from the list of visualization plug-ins, and it will$\rbecome the new default."
goto Winamp2Closed
Winamp2Closed:
; this function sets $1 to point to the 'winamp\plugins\milkdrop2' folder:
; (see function definition above)
Call QueryWinampVisPath
; -------------------- EDIT THIS SECTION [2/3] --------------------
; -------------------- EDIT THIS SECTION [2/3] --------------------
; -------------------- EDIT THIS SECTION [2/3] --------------------
; LIST FILES TO INCLUDE WITH THE INSTALLER
; For each file we want to install onto the destination system,
; we first set the output directory (relative to $1, which is
; the PLUGINS directory) and then list files. The paths for
; the files will be local paths on your hard disk, but fear not -
; the files will be placed in the current output directory
; (as last set by SetOutPath) on the destination system.
; So, first, we set the current output path (the folder to which
; files will be decompressed on the user's system) to '$1',
; which is the path to their winamp plugins folder.
SetOutPath $1
File "C:\program files\winamp\plugins\${PLUGIN_DLL}"
SetOutPath $1\Milkdrop2\config
File "C:\program files\winamp\plugins\milkdrop2\config\milk_msg.ini"
File "C:\program files\winamp\plugins\milkdrop2\config\milk_img.ini"
;File "C:\program files\winamp\plugins\milkdrop2\config\milkdrop.ini" ;this one will be generated - do not install
SetOutPath $1\Milkdrop2\data
File "C:\program files\winamp\plugins\milkdrop2\data\vms_desktop.dll"
File "C:\program files\winamp\plugins\milkdrop2\data\comp_ps.fx"
File "C:\program files\winamp\plugins\milkdrop2\data\comp_vs.fx"
File "C:\program files\winamp\plugins\milkdrop2\data\warp_ps.fx"
File "C:\program files\winamp\plugins\milkdrop2\data\warp_vs.fx"
File "C:\program files\winamp\plugins\milkdrop2\data\include.fx"
SetOutPath $1\Milkdrop2\docs
File "C:\program files\winamp\plugins\milkdrop2\docs\milkdrop.html"
File "C:\program files\winamp\plugins\milkdrop2\docs\milkdrop_preset_authoring.html"
File "C:\program files\winamp\plugins\milkdrop2\docs\q_and_t_vars.gif"
SetOutPath $1\Milkdrop2\textures
File "C:\program files\winamp\plugins\milkdrop2\textures\*.*"
SetOutPath $1\Milkdrop2\presets
File "C:\program files\winamp\plugins\milkdrop2\presets\*.milk"
hmmm
SetOutPath $1\MilkDrop2\presets\3d
File "C:\program files\winamp\plugins\milkdrop2\presets\3d\*.milk"
hmmm
SetOutPath $1\MilkDrop2\presets\inverted
File "C:\program files\winamp\plugins\milkdrop2\presets\inverted\*.milk"
; ----------------------- END SECTION [2/3] -----------------------
; ----------------------- END SECTION [2/3] -----------------------
; ----------------------- END SECTION [2/3] -----------------------
; now time to create the Uninstaller:
IfFileExists $INSTDIR\Winamp.exe UninstWinamp2
IfFileExists $INSTDIR\Winamp3.exe UninstWinamp3
IfFileExists $INSTDIR\Studio.exe UninstWinamp3 ; legacy check
goto UninstDone
UninstWinamp3:
WriteRegStr HKLM SOFTWARE\${PLUGIN_DLL}Winamp3 "Install_Dir" "$INSTDIR"
WriteRegStr HKLM SOFTWARE\${PLUGIN_DLL}Winamp3 "Install_Plugins_Dir" $1
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp3" "DisplayName" "${PLUGIN_NAME} for Winamp 3 (remove only)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp3" "UninstallString" '"$INSTDIR\uninst-${PLUGIN_DLL}.exe"'
WriteUninstaller "$INSTDIR\uninst-${PLUGIN_DLL}.exe"
CreateDirectory "$SMPROGRAMS\Winamp3\Vis Plugin Uninstallers"
CreateShortCut "$SMPROGRAMS\Winamp3\Vis Plugin Uninstallers\Uninstall ${PLUGIN_NAME}.lnk" "$INSTDIR\uninst-${PLUGIN_DLL}.exe" "" "$INSTDIR\uninst-${PLUGIN_DLL}.exe" 0
goto UninstDone
UninstWinamp2:
WriteRegStr HKLM SOFTWARE\${PLUGIN_DLL}Winamp "Install_Dir" "$INSTDIR"
WriteRegStr HKLM SOFTWARE\${PLUGIN_DLL}Winamp "Install_Plugins_Dir" $1
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp" "DisplayName" "${PLUGIN_NAME} for Winamp 2x (remove only)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp" "UninstallString" '"$INSTDIR\uninst-${PLUGIN_DLL}.exe"'
WriteUninstaller "$INSTDIR\uninst-${PLUGIN_DLL}.exe"
CreateDirectory "$SMPROGRAMS\Winamp\Vis Plugin Uninstallers"
CreateShortCut "$SMPROGRAMS\Winamp\Vis Plugin Uninstallers\Uninstall ${PLUGIN_NAME}.lnk" "$INSTDIR\uninst-${PLUGIN_DLL}.exe" "" "$INSTDIR\uninst-${PLUGIN_DLL}.exe" 0
goto UninstDone
UninstDone:
SectionEnd
;----------------------------------------------------------------------
UninstallText "This will uninstall the ${PLUGIN_NAME} plugin. Hit next to continue."
ShowUninstDetails Show
Section "Uninstall"
; This section is the code that will be run when the user goes
; to Uninstall the plugin.
IfFileExists $INSTDIR\Winamp.exe UninstStep1Winamp2
IfFileExists $INSTDIR\Winamp3.exe UninstStep1Winamp3
IfFileExists $INSTDIR\Studio.exe UninstStep1Winamp3 ; legacy check
goto UninstScriptDone
UninstStep1Winamp3:
ReadRegStr $1 HKLM SOFTWARE\${PLUGIN_DLL}Winamp3 "Install_Plugins_Dir"
goto UninstStep2
UninstStep1Winamp2:
ReadRegStr $1 HKLM SOFTWARE\${PLUGIN_DLL}Winamp "Install_Plugins_Dir"
goto UninstStep2
UninstStep2:
; -------------------- EDIT THIS SECTION [3/3] --------------------
; -------------------- EDIT THIS SECTION [3/3] --------------------
; -------------------- EDIT THIS SECTION [3/3] --------------------
; LIST OF FILES TO DELETE WHEN USER RUNS THE UNINSTALL
Delete "$1\${PLUGIN_DLL}"
;Delete "$1\vms_desktop.dll" ** DO NOT DELETE! **
Delete "$1\milkdrop.html"
Delete "$1\milkdrop_preset_authoring.html"
Delete "$1\q_and_t_vars.gif"
MessageBox MB_YESNO|MB_ICONQUESTION \
"Clear your saved settings?:$\r $1\milkdrop_config.ini$\r $1\milk_msg.ini$\r $1\milk_img.ini" \
IDNO SaveSettings
Delete "$1\milkdrop_config.ini"
Delete "$1\milk_msg.ini"
Delete "$1\milk_img.ini"
SaveSettings:
MessageBox MB_YESNO|MB_ICONQUESTION \
"Delete all presets in these 3 directories?:$\r $1\milkdrop$\r $1\milkdrop\3d$\r $1\milkdrop\inverted" \
IDNO SavePresets
Delete "$1\milkdrop2\inverted\*.milk"
Delete "$1\milkdrop2\3d\*.milk"
Delete "$1\milkdrop2\*.milk"
RMDir "$1\milkdrop2\inverted"
RMDir "$1\milkdrop2\3d"
RMDir "$1\milkdrop2"
SavePresets:
; ----------------------- END SECTION [3/3] -----------------------
; ----------------------- END SECTION [3/3] -----------------------
; ----------------------- END SECTION [3/3] -----------------------
IfFileExists $INSTDIR\Winamp.exe UninstStep3Winamp2
IfFileExists $INSTDIR\Winamp3.exe UninstStep3Winamp3
IfFileExists $INSTDIR\Studio.exe UninstStep3Winamp3 ; legacy check
goto UninstScriptDone
UninstStep3Winamp3:
DeleteRegKey HKLM SOFTWARE\${PLUGIN_DLL}Winamp3
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp3"
Delete $INSTDIR\uninst-${PLUGIN_DLL}.exe
Delete "$SMPROGRAMS\Winamp3\Vis Plugin Uninstallers\Uninstall ${PLUGIN_NAME}.lnk"
RMDir "$SMPROGRAMS\Winamp3\Vis Plugin Uninstallers"
goto UninstScriptDone
UninstStep3Winamp2:
DeleteRegKey HKLM SOFTWARE\${PLUGIN_DLL}Winamp
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PLUGIN_DLL}Winamp"
Delete $INSTDIR\uninst-${PLUGIN_DLL}.exe
Delete "$SMPROGRAMS\Winamp\Vis Plugin Uninstallers\Uninstall ${PLUGIN_NAME}.lnk"
RMDir "$SMPROGRAMS\Winamp\Vis Plugin Uninstallers"
goto UninstScriptDone
UninstScriptDone:
SectionEnd
;----------------------------------------------------------------------
Function .onInstSuccess
IfFileExists $INSTDIR\Winamp.exe CaseWinamp2
IfFileExists $INSTDIR\Winamp3.exe CaseWinamp3
IfFileExists $INSTDIR\Studio.exe CaseWinamp3 ; legacy check
goto CaseImpossible
CaseWinamp3:
IfFileExists $INSTDIR\wacs\classicvis.wac ClassicVisOk
; no classicvis -> give them instructions
MessageBox MB_YESNO|MB_ICONEXCLAMATION \
"IMPORTANT: You must download and install the Classic Visualization$\rComponent before ${PLUGIN_NAME} will work with Winamp 3.$\r$\rWould you like to download it now?" \
IDNO FailNoClassicVis
ExecShell "open" "http://www.winamp.com/components3/detail.jhtml?componentId=122130"
MessageBox MB_OK|MB_ICONINFORMATION \
"Your web browser will now open and allow you to download$\rthe Classic Visualization Component. Please download$\rand install it.$\r$\rOnce it is installed, open Winamp 3 and hit CTRL+P$\rto open the Preferences screen. Then, on the left,$\rscroll to 'Classic Visualizations' and select it. From there,$\ryou can easily select, configure and run any plugins$\rinstalled to Winamp 2 or 3."
goto end
FailNoClassicVis:
MessageBox MB_OK|MB_ICONSTOP "Installation failed."
goto end
ClassicVisOk:
FindWindow $R0 "STUDIO"
StrCmp $R0 0 "" DoneWinamp3
MessageBox MB_YESNO|MB_ICONQUESTION \
"${PLUGIN_NAME} was installed successfully.$\rWould you like to run Winamp 3 now?" \
IDNO DoneWinamp3
; to do here: update 'oldvisname' string in the *xml* file winamp3\studio.xnf,
; and set 'oldvisidx' to "0"
IfFileExists $INSTDIR\Winamp3.exe CaseWinamp3b
Exec '"$INSTDIR\studio.exe"'
goto DoneWinamp3
CaseWinamp3b:
Exec '"$INSTDIR\winamp3.exe"'
goto DoneWinamp3
DoneWinamp3:
MessageBox MB_OK "While in Winamp 3, press CTRL+P to bring up the$\rPreferences screen, then scroll down and select$\rthe 'Classic Visualizations' option. From there,$\ryou can select, configure, and run the ${PLUGIN_NAME} plugin."
goto end
CaseWinamp2:
; note: winamp 2 should already be closed at this point.
WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_name" ${PLUGIN_DLL}
WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_num" "0"
MessageBox MB_YESNO|MB_ICONQUESTION \
"${PLUGIN_NAME} was installed successfully.$\r$\rWhile in Winamp, press ALT+K to configure it (optional);$\rpress CTRL+SHIFT+K to execute it.$\r$\rWould you like to run Winamp now?" \
IDNO end
Exec '"$INSTDIR\Winamp.exe"'
Goto end
CaseImpossible:
MessageBox MB_OK|MB_ICONEXCLAMATION "ERROR: unable to find winamp.exe (winamp2) or studio.exe/winamp3.exe (winamp3) in the install directory..."
Goto end
End:
FunctionEnd
; eof