-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathinstaller.nsi.in
293 lines (252 loc) · 11.1 KB
/
installer.nsi.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
Unicode True
!define AppName @PACKAGE@
!define ReleaseVersion @VERSION@
!define Arch @HOST_MACHINE_ARCH@
!define DisplayName "${AppName} ${ReleaseVersion}"
!define Author "ahoka"
!define Homepage "https://github.com/ahodesuka/ahoviewer"
!define ReleaseNotes "${Homepage}/releases/${ReleaseVersion}"
!define AppDir "${AppName}"
!define AppFile "${AppName}.exe"
!define InstallerFile "${AppName}-v${ReleaseVersion}-${Arch}-installer.exe"
!define UninstallerFile "Uninstall ${AppName}.exe"
!define RegKeyInstall "SOFTWARE\${AppName}"
!define RegKeyUninstall "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${AppName}"
!define RegKeyCapabilities "SOFTWARE\Clients\Media\${AppName}"
!define RegKeyAppPath "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\${AppFile}"
!define RegKeyApplications "SOFTWARE\Classes\Applications\${AppFile}"
!define RegKeyOpenWith "SOFTWARE\Classes\SystemFileAssociations\image\OpenWithList\${AppFile}"
!define KillCmd 'cmd /c taskkill /f /im "${AppFile}"'
RequestExecutionLevel admin
# Modules
!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "FileFunc.nsh"
!include "x64.nsh"
# Installer/Uninstaller params
Name "${AppName}"
Caption "${DisplayName}"
BrandingText "${DisplayName}"
ShowInstDetails show
ShowUninstDetails show
InstallDir ""
InstallDirRegKey HKLM "${RegKeyInstall}" "InstallPath"
# Package params
CRCCheck on
SetCompressor /SOLID lzma
# NSIS Installer output dir
OutFile "..\mingw-build\${InstallerFile}"
# Metadata params
VIProductVersion "${ReleaseVersion}.0"
VIAddVersionKey "ProductName" "${AppName}"
VIAddVersionKey "ProductVersion" "${ReleaseVersion}"
VIAddVersionKey "FileDescription" "${DisplayName}"
VIAddVersionKey "FileVersion" "${ReleaseVersion}"
VIAddVersionKey "LegalCopyright" "${Author}"
# GUI
!define MUI_ICON "..\src\ahoviewer.ico"
!define MUI_WELCOMEPAGE_TITLE "${DisplayName}"
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_ABORTWARNING
!define MUI_ABORTWARNING_CANCEL_DEFAULT
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_FINISHPAGE_RUN_TEXT "Launch ${AppName}"
!define MUI_FINISHPAGE_RUN "$INSTDIR\${AppFile}"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!define MUI_FINISHPAGE_SHOWREADME "${ReleaseNotes}"
!define MUI_FINISHPAGE_SHOWREADME_TEXT "Open release notes in web browser"
!define MUI_UNICON "${NSISDIR}/Contrib/Graphics/Icons/modern-uninstall.ico"
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
# File Association macros
!macro APP_ASSOCIATE EXT FILECLASS
; Backup the previously associated file class
ReadRegStr $R0 HKCR ".${EXT}" ""
WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
WriteRegStr HKLM "${RegKeyCapabilities}\Capabilities\FileAssociations" ".${EXT}" "${FILECLASS}"
!macroend
!macro APP_FILECLASS EXT FILECLASS DESCRIPTION ICON
WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
WriteRegDWORD HKCR "${FILECLASS}" "EditFlags" "4259840"
WriteRegStr HKCR "${FILECLASS}" "FriendlyNameType" `${DESCRIPTION}`
WriteRegExpandStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
WriteRegStr HKCR "${FILECLASS}\shell" "" "view"
WriteRegStr HKCR "${FILECLASS}\shell\view" "" "&View"
WriteRegStr HKCR "${FILECLASS}\shell\view\command" "" '"$INSTDIR\${AppFile}" "%1"'
# This is needed for programs other than Explorer
WriteRegStr HKCR "${FILECLASS}\shell\open" "LegacyDisable" ""
WriteRegStr HKCR "${FILECLASS}\shell\open\command" "" '"$INSTDIR\${AppFile}" "%1"'
WriteRegStr HKLM "${RegKeyApplications}\SupportedTypes" ".${EXT}" ""
WriteRegStr HKCR ".${EXT}\OpenWithProgids" `${FILECLASS}` ""
!macroend
!macro APP_UNASSOCIATE EXT FILECLASS
; Restore from backup
ReadRegStr $R0 HKCR ".${EXT}" `${FILECLASS}_backup`
WriteRegStr HKCR ".${EXT}" "" "$R0"
DeleteRegValue HKCR ".${EXT}" `${FILECLASS}_backup`
DeleteRegValue HKCR ".${EXT}\OpenWithProgids" `${FILECLASS}`
DeleteRegKey HKCR `${FILECLASS}`
!macroend
; !defines for use with SHChangeNotify
!ifdef SHCNE_ASSOCCHANGED
!undef SHCNE_ASSOCCHANGED
!endif
!define SHCNE_ASSOCCHANGED 0x08000000
!ifdef SHCNF_FLUSH
!undef SHCNF_FLUSH
!endif
!define SHCNF_FLUSH 0x1000
!macro UPDATEFILEASSOC
; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we
; can update the shell.
System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
!macroend
# Installer
Section "${DisplayName}" SEC_DEFAULT
DetailPrint '${KillCmd}'
nsExec::Exec /TIMEOUT=3000 '${KillCmd}'
SetOutPath $INSTDIR
File /r "..\mingw-build\${AppName}-${ReleaseVersion}-${Arch}\*"
WriteUninstaller "$INSTDIR\${UninstallerFile}"
WriteRegStr HKLM "${RegKeyInstall}" "InstallPath" "$INSTDIR"
WriteRegStr HKLM "${RegKeyUninstall}" "DisplayName" "${DisplayName}"
WriteRegStr HKLM "${RegKeyUninstall}" "UninstallString" "$INSTDIR\${UninstallerFile}"
WriteRegStr HKLM "${RegKeyUninstall}" "DisplayIcon" "$INSTDIR\${AppFile}"
WriteRegStr HKLM "${RegKeyUninstall}" "DisplayVersion" "${ReleaseVersion}"
WriteRegStr HKLM "${RegKeyUninstall}" "Publisher" "${Author}"
WriteRegStr HKLM "${RegKeyUninstall}" "URLInfoAbout" "${Homepage}"
# Default program entry
WriteRegStr HKLM "${RegKeyCapabilities}\Capabilities" "ApplicationName" "${AppName}"
WriteRegStr HKLM "${RegKeyCapabilities}\Capabilities" "ApplicationDescription" "A GTK image viewer, manga reader, and booru browser"
# App path, allows ahoviewer to be launched from ShellExecute, and run command (win+r)
WriteRegStr HKLM "${RegKeyAppPath}" "" "$INSTDIR\${AppFile}"
# Applications open with menu entries
WriteRegStr HKLM "${RegKeyApplications}" "FriendlyAppName" "${AppName}"
WriteRegStr HKLM "${RegKeyApplications}\shell" "" "view"
WriteRegStr HKLM "${RegKeyApplications}\shell\view" "" "&View"
WriteRegStr HKLM "${RegKeyApplications}\shell\view\command" "" '"$INSTDIR\${AppFile}" "%1"'
# This is needed for programs other than Explorer
WriteRegStr HKCR "${RegKeyApplications}\shell\open" "LegacyDisable" ""
WriteRegStr HKCR "${RegKeyApplications}\shell\open\command" "" '"$INSTDIR\${AppFile}" "%1"'
# Open With entry
WriteRegStr HKLM "${RegKeyOpenWith}" "" ""
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
IntFmt $0 "0x%08X" $0
WriteRegDWORD HKLM "${RegKeyUninstall}" "EstimatedSize" "$0"
!insertmacro UPDATEFILEASSOC
SectionEnd
# Components
Section "Create Desktop shortcut" SEC_SHORTCUT_DESKTOP
${If} ${SectionIsSelected} ${SEC_SHORTCUT_DESKTOP}
SetOutPath $INSTDIR
CreateShortCut "$DESKTOP\${AppName}.lnk" "$INSTDIR\${AppFile}"
${EndIf}
SectionEnd
Section "Create Start Menu shortcut" SEC_SHORTCUT_START
${If} ${SectionIsSelected} ${SEC_SHORTCUT_START}
SetOutPath $INSTDIR
CreateShortCut "$SMPROGRAMS\${AppName}.lnk" "$INSTDIR\${AppFile}"
${EndIf}
SectionEnd
SectionGroup "File Associations"
Section ".gif" SEC_FILE_GIF
!insertmacro APP_FILECLASS "gif" "${AppName}.AssocFile.GIF" "GIF Image File" "%SystemRoot%\System32\imageres.dll,-71"
${If} ${SectionIsSelected} ${SEC_FILE_GIF}
!insertmacro APP_ASSOCIATE "gif" "${AppName}.AssocFile.GIF"
${EndIf}
SectionEnd
Section ".jpg" SEC_FILE_JPG
!insertmacro APP_FILECLASS "jpe" "${AppName}.AssocFile.JPE" "JPEG Image File" "%SystemRoot%\System32\imageres.dll,-72"
!insertmacro APP_FILECLASS "jpg" "${AppName}.AssocFile.JPG" "JPEG Image File" "%SystemRoot%\System32\imageres.dll,-72"
!insertmacro APP_FILECLASS "jpeg" "${AppName}.AssocFile.JPEG" "JPEG Image File" "%SystemRoot%\System32\imageres.dll,-72"
${If} ${SectionIsSelected} ${SEC_FILE_JPG}
!insertmacro APP_ASSOCIATE "jpe" "${AppName}.AssocFile.JPE"
!insertmacro APP_ASSOCIATE "jpg" "${AppName}.AssocFile.JPG"
!insertmacro APP_ASSOCIATE "jpeg" "${AppName}.AssocFile.JPEG"
${EndIf}
SectionEnd
Section ".png" SEC_FILE_PNG
!insertmacro APP_FILECLASS "png" "${AppName}.AssocFile.PNG" "PNG Image File" "%SystemRoot%\System32\imageres.dll,-83"
${If} ${SectionIsSelected} ${SEC_FILE_PNG}
!insertmacro APP_ASSOCIATE "png" "${AppName}.AssocFile.PNG"
${EndIf}
SectionEnd
Section ".webm" SEC_FILE_WEBM
!insertmacro APP_FILECLASS "webm" "${AppName}.AssocFile.WEBM" "WebM Video File" "%SystemRoot%\System32\imageres.dll,-23"
${If} ${SectionIsSelected} ${SEC_FILE_WEBM}
!insertmacro APP_ASSOCIATE "webm" "${AppName}.AssocFile.WEBM"
${EndIf}
SectionEnd
Section ".rar" SEC_FILE_RAR
!insertmacro APP_FILECLASS "rar" "${AppName}.AssocFile.RAR" "RAR Archive" "%SystemRoot%\System32\imageres.dll,-174"
${If} ${SectionIsSelected} ${SEC_FILE_RAR}
!insertmacro APP_ASSOCIATE "rar" "${AppName}.AssocFile.RAR"
${EndIf}
SectionEnd
Section ".cbr" SEC_FILE_CBR
!insertmacro APP_FILECLASS "cbr" "${AppName}.AssocFile.CBR" "Comic Book RAR Archive" "%SystemRoot%\System32\imageres.dll,-174"
${If} ${SectionIsSelected} ${SEC_FILE_CBR}
!insertmacro APP_ASSOCIATE "cbr" "${AppName}.AssocFile.CBR"
${EndIf}
SectionEnd
Section ".zip" SEC_FILE_ZIP
!insertmacro APP_FILECLASS "zip" "${AppName}.AssocFile.ZIP" "Zip Archive" "%SystemRoot%\System32\imageres.dll,-174"
${If} ${SectionIsSelected} ${SEC_FILE_ZIP}
!insertmacro APP_ASSOCIATE "zip" "${AppName}.AssocFile.ZIP"
${EndIf}
SectionEnd
Section ".cbz" SEC_FILE_CBZ
!insertmacro APP_FILECLASS "cbz" "${AppName}.AssocFile.CBZ" "Comic Book Zip Archive" "%SystemRoot%\System32\imageres.dll,-174"
${If} ${SectionIsSelected} ${SEC_FILE_CBZ}
!insertmacro APP_ASSOCIATE "cbz" "${AppName}.AssocFile.CBZ"
${EndIf}
SectionEnd
SectionGroupEnd
# Uninstaller
Section "Uninstall"
DetailPrint '${KillCmd}'
nsExec::Exec /TIMEOUT=3000 '${KillCmd}'
Delete "$INSTDIR\${UninstallerFile}"
RMDir /r "$INSTDIR"
Delete "$DESKTOP\${AppName}.lnk"
Delete "$SMPROGRAMS\${AppName}.lnk"
!insertmacro APP_UNASSOCIATE "gif" "${AppName}.AssocFile.GIF"
!insertmacro APP_UNASSOCIATE "jpe" "${AppName}.AssocFile.JPE"
!insertmacro APP_UNASSOCIATE "jpg" "${AppName}.AssocFile.JPG"
!insertmacro APP_UNASSOCIATE "jpeg" "${AppName}.AssocFile.JPEG"
!insertmacro APP_UNASSOCIATE "png" "${AppName}.AssocFile.PNG"
!insertmacro APP_UNASSOCIATE "webm" "${AppName}.AssocFile.WEBM"
!insertmacro APP_UNASSOCIATE "rar" "${AppName}.AssocFile.RAR"
!insertmacro APP_UNASSOCIATE "cbr" "${AppName}.AssocFile.CBR"
!insertmacro APP_UNASSOCIATE "zip" "${AppName}.AssocFile.ZIP"
!insertmacro APP_UNASSOCIATE "cbz" "${AppName}.AssocFile.CBZ"
DeleteRegKey HKLM "${RegKeyInstall}"
DeleteRegKey HKLM "${RegKeyUninstall}"
DeleteRegKey HKLM "${RegKeyCapabilities}"
DeleteRegKey HKLM "${RegKeyAppPath}"
DeleteRegKey HKLM "${RegKeyApplications}"
DeleteRegKey HKLM "${RegKeyOpenWith}"
!insertmacro UPDATEFILEASSOC
SectionEnd
# Functions
Function .onInit
# set default section as read only
SectionSetFlags ${SEC_DEFAULT} 17
${If} $InstDir == ""
${If} ${RunningX64}
${AndIf} "${Arch}" == "win64"
StrCpy $InstDir "$PROGRAMFILES64\${AppDir}\"
${Else}
StrCpy $InstDir "$PROGRAMFILES32\${AppDir}\"
${EndIf}
${EndIf}
FunctionEnd