2007-10-18 Marcus Brinkmann <marcus@g10code.de>
[gpg4win.git] / src / installer.nsi
1 # installer.nsi - Installer for GnuPG 4 Windows.    -*- coding: latin-1; -*-
2 # Copyright (C) 2005, 2007 g10 Code GmbH
3
4 # This file is part of GPG4Win.
5
6 # GPG4Win is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10
11 # GPG4Win is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19
20 # No servicable parts beyond this line.  Stay clear :)
21
22 !ifdef REQUIRE_W32_NSIS
23 !ifdef PACKAGE_LIBRARY
24 !include "Library.nsh"
25 !endif
26 !else
27 !macro InstallLib libtype shared install localfile destfile tempbasedir
28   File "${localfile}"
29 !macroend
30 !endif
31
32 !include "WinMessages.nsh"
33
34 # Define for the registry key to change the environment.  The
35 # commented one may be used if the setting should affect only the
36 # current user.
37 !define Regkey_for_Env \
38     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
39 # !define Regkey_for_Env 'HKCU "Environment"'
40
41
42
43
44
45 # We use the modern UI.
46 !include "MUI.nsh"
47
48 # Set the package name.  Note that this name should not be sufficed
49 #  with the version because this would get displayed in the start menu.
50 Name "${PRETTY_PACKAGE}"
51
52
53 # Set the output filename.
54 !ifdef GPG4WIN_LIGHT
55 OutFile "${PACKAGE}-light-${VERSION}.exe"
56 !else
57 OutFile "${PACKAGE}-${VERSION}.exe"
58 !endif
59
60 Icon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
61 UninstallIcon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
62
63 # Set the installation directory.
64 !ifndef INSTALL_DIR
65 !define INSTALL_DIR "${PACKAGE}"
66 !endif
67 InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}" 
68
69
70 InstallDirRegKey HKLM "Software\GNU\${PRETTY_PACKAGE_SHORT}" \
71         "Install Directory"
72
73
74 # Add version information to the file properties.
75 VIProductVersion "${PROD_VERSION}"
76 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
77 !ifdef LICENSE_GPL
78 VIAddVersionKey "Comments" \
79    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
80     and/or modify it under the terms of the GNU General Public License.  \
81     You should have received a copy of the GNU General Public License  \
82     along with this software; if not, write to the Free Software  \
83     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
84     MA 02110-1301, USA"
85 !else
86 VIAddVersionKey "Comments" \
87    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
88     and/or modify it under the terms of the GNU Lesser General Public  \
89     License. You should have received a copy of the GNU Lesser General  \
90     Public License along with this software; if not, write to the Free  \
91     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
92     MA 02110-1301, USA"
93 !endif
94 VIAddVersionKey "CompanyName" "${COMPANY}"
95 VIAddVersionKey "LegalTrademarks" ""
96 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
97 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
98 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
99
100 # Set to the name of another GnuPG installation if one has been detected
101 Var OtherGnuPGDetected
102
103 # Interface Settings
104
105 # !define MUI_ABORTWARNING
106 !define MUI_FINISHPAGE_NOAUTOCLOSE
107 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
108
109 #!define MUI_HEADERIMAGE
110 #!define MUI_HEADERIMAGE_BITMAP \
111 #               "${TOP_SRCDIR}/doc/logo/gpg4win-logo-150x57.bmp"
112 !define MUI_WELCOMEFINISHPAGE_BITMAP \
113                "${TOP_SRCDIR}/doc/logo/gpg4win-logo-164x314.bmp"
114
115 # Remember the installer language
116
117 #!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" 
118 #!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}" 
119 #!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
120
121 # The list of wizard pages.
122
123 !define MUI_WELCOMEPAGE_TITLE "$(T_WelcomeTitle)"
124 !define MUI_WELCOMEPAGE_TEXT  "$(T_About)"
125 !insertmacro MUI_PAGE_WELCOME
126
127 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
128 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
129 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
130 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
131
132 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
133 !insertmacro MUI_PAGE_COMPONENTS
134
135 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
136 !insertmacro MUI_PAGE_DIRECTORY
137
138 !ifdef HAVE_STARTMENU
139
140 Page custom CustomPageOptions
141
142 Var STARTMENU_FOLDER
143
144 !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
145 !define MUI_STARTMENUPAGE_NODISABLE
146 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
147 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
148 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
149
150 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
151
152 !endif
153
154 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
155 !insertmacro MUI_PAGE_INSTFILES
156
157 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
158 !define MUI_FINISHPAGE_SHOWREADME "README.$(T_LangCode).txt"
159 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
160 #!define MUI_FINISHPAGE_RUN
161 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
162 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
163 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
164 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
165 !define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
166 !insertmacro MUI_PAGE_FINISH
167
168
169 # Uninstaller pages.
170
171 !insertmacro MUI_UNPAGE_CONFIRM
172 !insertmacro MUI_UNPAGE_INSTFILES
173
174
175 #Page license
176 #Page components
177 #Page directory
178 #Page instfiles
179 #UninstPage uninstConfirm
180 #UninstPage instfiles
181
182
183 # Language support.  This has to be done after defining the pages, but
184 # before defining the translation strings.  Confusing.
185
186 !insertmacro MUI_LANGUAGE "English"
187
188 #!insertmacro MUI_RESERVEFILE_LANGDLL
189 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
190 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
191 !ifdef SOURCES
192 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
193 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
194 !endif
195 ReserveFile "${TOP_SRCDIR}\COPYING"
196 ReserveFile "installer-options.ini"
197 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
198
199 # Language support
200
201 LangString T_LangCode ${LANG_ENGLISH} "en"
202
203 # The WelcomeTitle is displayed on the first page.
204 LangString T_WelcomeTitle ${LANG_ENGLISH} "${WELCOME_TITLE_ENGLISH}"
205
206 # The About string as displayed on the first page.
207 LangString T_About ${LANG_ENGLISH} "${ABOUT_ENGLISH}"
208
209 # Startup page
210 LangString T_GPLHeader ${LANG_ENGLISH} \
211   "This software is licensed under the terms of the GNU General Public \
212    License (GPL) which guarantees your freedom to share and change Free \
213    Software."
214
215 LangString T_GPLShort ${LANG_ENGLISH} \
216   "In short: You are allowed to run this software for any purpose. \
217    You may distribute it as long as you give the recipients the same \
218    rights you have received."
219
220 LangString T_RunKeyManager ${LANG_ENGLISH} \
221    "Run the key manager"
222
223 LangString T_MoreInfo ${LANG_ENGLISH} \
224    "Click here for the project's homepage"
225 LangString T_MoreInfoURL ${LANG_ENGLISH} "http://www.gpg4win.org"
226
227 LangString T_ShowReadme ${LANG_ENGLISH} \
228    "Show the README file"
229
230 LangString T_NoKeyManager ${LANG_ENGLISH} \
231    "No key manager has been installed, thus we can't run one now."
232
233
234 # Functions
235
236 # Custom functions and macros for gpg4win. 
237 !include "g4wihelp.nsi"
238
239 #
240 # Control function for the Custom page to select special
241 # install options.
242 #
243 Function CustomPageOptions
244   !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_InstallOptLinks)"
245
246   # Note that the default selection is done in the ini file.
247   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
248         "Field 1" "Text"  "$(T_InstOptLabelA)"
249   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
250         "Field 2" "Text"  "$(T_InstOptFieldA)"
251   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
252         "Field 3" "Text"  "$(T_InstOptFieldB)"
253   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
254         "Field 4" "Text"  "$(T_InstOptFieldC)"
255   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
256         "Field 5" "Text"  "$(T_InstOptLabelB)"
257
258   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "installer-options.ini"
259 FunctionEnd
260
261
262 # Display a warning if GnuPP has been detected and allow the user to abort
263 # the installation.
264 Function PrintGnuPPWarning
265    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
266      Abort
267  cont:
268    StrCpy $OtherGnuPGDetected "GnuPP"
269 FunctionEnd
270
271 # Display a warning if GnuPT has been detected and allow the user to abort
272 # the installation.
273 Function PrintGnuPTWarning
274    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
275      Abort
276  cont:
277    StrCpy $OtherGnuPGDetected "GnuPT"
278 FunctionEnd
279
280 # Display a warning if the Sourceforge WinPT has been detected and
281 # allow the user to abort the installation.
282 Function PrintWinPTSFWarning
283    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
284      Abort
285  cont:
286    StrCpy $OtherGnuPGDetected "WinPT-SF"
287 FunctionEnd
288
289 # Display a warning if GnuPG Pack has been detected and abort the
290 # the installation.  This one clobbers our own Registry space.
291 Function PrintGnuPackWarning
292    MessageBox MB_OK "$(T_FoundOldGnuPack)"
293    Abort
294 FunctionEnd
295
296
297 # Check whether one of the other GnuPG systems has already been
298 # installed.  We do this by looking at the registry.
299 Function CheckOtherGnuPGApps
300   StrCpy $OtherGnuPGDetected ""
301   ClearErrors
302   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
303   IfErrors +2 0
304     Call PrintGnuPPWarning
305
306   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
307   StrCmp $0 "" +2
308     Call PrintGnuPTWarning
309
310   ClearErrors
311   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
312   IfErrors +2 0
313     Call PrintWinPTSFWarning
314
315   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
316   Push $0
317   Push "GnuPG-Pack"
318   Call StrStr
319   Pop $0
320   StrCmp $0 "" +2
321     Call PrintGnuPackWarning
322
323
324 FunctionEnd
325
326 # Check whether gpg4win has already been installed.  This is called as
327 # a leave function from the directory page.  A call to abort will get
328 # back to the directory selection.
329 Function CheckExistingVersion
330   ClearErrors
331   FileOpen $0 "$INSTDIR\VERSION" r
332   IfErrors nexttest
333   FileRead $0 $R0
334   FileRead $0 $R1
335   FileClose $0
336
337   Push $R1
338   Call TrimNewLines
339   Pop $R1
340
341   MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
342   Abort
343
344  nexttest:
345   ClearErrors
346   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPG4Win" "DisplayVersion"
347   IfErrors leave 0
348      MessageBox MB_YESNO "$(T_FoundExistingVersionB)" IDYES leave
349      Abort
350      
351  leave:
352 FunctionEnd
353
354
355
356 # PrintNonAdminWarning
357
358 # Check whether the current user is in the Administrator group or an
359 # OS version without the need for an Administrator is in use.  Print a
360 # diagnostic if this is not the case and abort installation.
361 Function PrintNonAdminWarning
362   ClearErrors
363   UserInfo::GetName
364   IfErrors leave
365   Pop $0
366   UserInfo::GetAccountType
367   Pop $1
368   StrCmp $1 "Admin" leave +1
369   MessageBox MB_OK "$(T_AdminNeeded)"
370   Quit
371
372  leave:
373 FunctionEnd
374
375
376 # Check whether the start menu is actually wanted.
377
378 Function CheckIfStartMenuWanted
379   !insertmacro MUI_INSTALLOPTIONS_READ $R0 "installer-options.ini" \
380         "Field 2" "State"
381   IntCmp $R0 1 +2
382     Abort
383 FunctionEnd
384
385
386 # Check whether this is a reinstall and popup a message box to explain
387 # that it is better to close other apps before continuing
388 Function PrintCloseOtherApps
389     IfFileExists $INSTDIR\gnupg.exe print_warning
390     IfFileExists $INSTDIR\winpt.exe print_warning
391     IfFileExists $INSTDIR\gpa.exe   print_warning
392     IfFileExists $INSTDIR\gpgol.dll print_warning
393     IfFileExists $INSTDIR\gpgee.dll print_warning
394     IfFileExists $INSTDIR\dirmngr.exe print_warning
395     Return
396    print_warning:
397     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
398     IfFileExists $INSTDIR\winpt.exe 0 +3
399       MessageBox MB_OK "$(T_ShuttingDownWinPT)"
400       ExecWait '"$INSTDIR\winpt.exe" --stop'
401     IfFileExists $INSTDIR\dirmngr.exe 0 +3
402       MessageBox MB_OK "$(T_ShuttingDownDirMngr)"
403       g4wihelp::service_stop "DirMngr"
404    leave:
405 FunctionEnd
406
407 # Called right before the final page to show more warnings.
408 Function ShowFinalWarnings
409    StrCmp $OtherGnupgDetected "" +2
410      MessageBox MB_OK "$(T_FoundOldSeeManual)"
411    leave:
412 FunctionEnd
413
414 #-----------------------------------------------
415 # Strings pertaining to the install options page
416 #-----------------------------------------------
417
418 # Installation options title
419 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
420
421 # Installation options subtitle 1
422 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
423
424 LangString T_InstOptLabelA  ${LANG_ENGLISH} \
425      "Please select where Gpg4win shall install links:"
426
427 LangString T_InstOptLabelB  ${LANG_ENGLISH} \
428      "(Only programs will be linked into the quick launch bar.)"
429
430 LangString T_InstOptFieldA  ${LANG_ENGLISH} \
431      "Start Menu"
432
433 LangString T_InstOptFieldB  ${LANG_ENGLISH} \
434      "Desktop"
435
436 LangString T_InstOptFieldC  ${LANG_ENGLISH} \
437      "Quick Launch Bar"
438
439 #------------------------------------------------
440 # String pertaining to the existing version check
441 #------------------------------------------------
442 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
443      "Version $R1 has already been installed.  $\r$\n\
444       Do you want to overwrite it with version ${VERSION}?"
445 LangString T_FoundExistingVersionB ${LANG_ENGLISH} \
446      "A version of Gpg4Win has already been installed on the system. \
447       There will be no problem installing and thus overwriting this \
448       Version. $\r$\n\
449        $\r$\n\
450       Do you want to continue installing Gpg4win?"
451
452
453 #---------------------------------------------
454 # From the old installation checking functions
455 #---------------------------------------------
456 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
457      "Please see the Gpg4win user manual to learn how to migrate existing \
458       keys from other GnuPG based installations to Gpg4win."
459
460 #---------
461 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
462      "An old installation of GnuPP (GNU Privacy Project) has been been \
463       detected.  That software is not maintained anymore and thus should \
464       be removed. $\r$\n\
465           $\r$\n\
466       Do you want to continue installing Gpg4win and take care of the old \
467       installation later?"
468
469 #---------
470 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
471      "An installation of GnuPT has been been detected.  This may cause \
472       problems when used along with Gpg4win. $\r$\n\
473           $\r$\n\
474       Do you want to continue installing Gpg4win?"
475
476 #---------
477 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
478      "An old installation of the Sourceforge hosted WinPT has been been \
479       detected.  That software is not maintained anymore and should \
480       be removed. $\r$\n\
481           $\r$\n\
482       Do you want to continue installing Gpg4win and take care of the old \
483       installation later?"
484
485
486 #--------
487 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
488      "An installation of GnuPG-Pack has been been detected. You need to \
489       uninstall it before you can continue with Gpg4win installation. $\r$\n\
490         $\r$\n\
491       The installation will be aborted now!"
492
493
494
495 # From Function PrintNonAdminWarning
496 LangString T_AdminNeeded ${LANG_ENGLISH} \
497    "Warning: Administrator permissions required for a successful installation"
498
499 # From Function PrintCloseOtherApps
500 LangString T_CloseOtherApps ${LANG_ENGLISH} \
501    "Please make sure that other applications are not running. \
502     In particular you should close Outlook and all Explorer \
503     windows.  Gpg4Win will try to install anyway but a reboot \
504     will be required then."
505 LangString T_ShuttingDownWinPT ${LANG_ENGLISH} \
506    "Trying to shutdown a possible running instance of WinPT."
507 LangString T_ShuttingDownDirMngr ${LANG_ENGLISH} \
508    "Trying to shutdown a possible running instance of DirMngr."
509
510
511 # FIXME: The GetAfterChar function comes from the NSIS wiki.
512 Function un.GetAfterChar
513   Exch $0 ; chop char
514   Exch
515   Exch $1 ; input string
516   Push $2
517   Push $3
518   StrCpy $2 0
519   loop:
520     IntOp $2 $2 - 1
521     StrCpy $3 $1 1 $2
522     StrCmp $3 "" 0 +3
523       StrCpy $0 ""
524       Goto exit2
525     StrCmp $3 $0 exit1
526     Goto loop
527   exit1:
528     IntOp $2 $2 + 1
529     StrCpy $0 $1 "" $2
530   exit2:
531     Pop $3
532     Pop $2
533     Pop $1
534     Exch $0 ; output
535 FunctionEnd
536
537
538 Function un.SourceDelete
539   Push "/"
540   Call un.GetAfterChar
541   Pop $R0
542   Delete "$INSTDIR\$R0"
543 FunctionEnd
544
545
546 # StrStr  - taken from the NSIS reference
547 # input, top of stack = string to search for
548 #        top of stack-1 = string to search in
549 # output, top of stack (replaces with the portion of the string remaining)
550 # modifies no other variables.
551 #
552 # Usage:
553 #   Push "this is a long ass string"
554 #   Push "ass"
555 #   Call StrStr
556 #   Pop $R0
557 #  ($R0 at this point is "ass string")
558 #
559 !macro StrStr un
560 Function ${un}StrStr
561    Exch $R1 # st=haystack,old$R1, $R1=needle
562    Exch     # st=old$R1,haystack
563    Exch $R2 # st=old$R1,old$R2, $R2=haystack
564    Push $R3
565    Push $R4
566    Push $R5
567    StrLen $R3 $R1
568    StrCpy $R4 0
569    # $R1=needle
570    # $R2=haystack
571    # $R3=len(needle)
572    # $R4=cnt
573    # $R5=tmp
574    loop:
575      StrCpy $R5 $R2 $R3 $R4
576      StrCmp $R5 $R1 done
577      StrCmp $R5 "" done
578      IntOp $R4 $R4 + 1
579      Goto loop
580  done:
581    StrCpy $R1 $R2 "" $R4
582    Pop $R5
583    Pop $R4
584    Pop $R3
585    Pop $R2
586    Exch $R1
587 FunctionEnd
588 !macroend
589 !insertmacro StrStr ""
590 !insertmacro StrStr "un."
591
592
593 # TrimNewlines  - taken from the NSIS reference
594 # input, top of stack  (e.g. whatever$\r$\n)
595 # output, top of stack (replaces, with e.g. whatever)
596 # modifies no other variables.
597 Function TrimNewlines
598    Exch $R0
599    Push $R1
600    Push $R2
601    StrCpy $R1 0
602  
603  loop:
604    IntOp $R1 $R1 - 1
605    StrCpy $R2 $R0 1 $R1
606    StrCmp $R2 "$\r" loop
607    StrCmp $R2 "$\n" loop
608    IntOp $R1 $R1 + 1
609    IntCmp $R1 0 no_trim_needed
610    StrCpy $R0 $R0 $R1
611  
612  no_trim_needed:
613    Pop $R2
614    Pop $R1
615    Exch $R0
616 FunctionEnd
617
618
619 # AddToPath - Adds the given dir to the search path.
620 #        Input - head of the stack
621 Function AddToPath
622   Exch $0
623   g4wihelp::path_add "$0"
624   StrCmp $R5 "0" add_to_path_done
625   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
626   add_to_path_done:
627   Pop $0
628 FunctionEnd
629  
630 # RemoveFromPath - Remove a given dir from the path
631 #     Input: head of the stack
632 Function un.RemoveFromPath
633   Exch $0
634   g4wihelp::path_remove "$0"
635   StrCmp $R5 "0" remove_from_path_done
636   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
637   remove_from_path_done:
638   Pop $0
639 FunctionEnd
640  
641