1 #-------------------------------------------------------------
2 # - - - - - - - - - - - - Preamble - - - - - - - - - - - - - -
3 #-------------------------------------------------------------
5 # Do a Cyclic Redundancy Check to make sure the installer
6 # was not corrupted by the download.
8 # Make the installer as small as possible
9 SetCompressor /SOLID lzma
10 # Make it a Unicode installer
12 # Enable support for high DPI resolution
15 Name "LyX ${APP_VERSION}" # Name of the Program to be displayed during installation
16 BrandingText " " # Remove branding text ('Nullsoft Install System vX.XX')
18 # ===== Variables =====
20 Var LatexPath # Used to store path to "latex.exe"
21 Var StartMenuFolder # Used to store the start menu folder
24 # ========= Multiuser settings =========
26 !define MULTIUSER_MUI # Multiuser uses modern UI 2
27 !define MULTIUSER_EXECUTIONLEVEL Highest # Can install with any privileges (admin, user)
28 !if ${APP_ARCHITECTURE} = 64
29 !define MULTIUSER_USE_PROGRAMFILES64 # Install 64 bit program in "Program files" instead of "Program files (x86)"
32 !define MULTIUSER_INSTALLMODE_COMMANDLINE # Allow setting installmode in commandline (/AllUsers or /CurrentUser)
34 # Set default install mode based on a non empty registry entry (if exists in HKLM, then all users, if HKCU then current user)
35 !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "SOFTWARE\LyX"
36 !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "InstDir${VERSION_MAJOR}${VERSION_MINOR}"
38 !define MULTIUSER_INSTALLMODE_INSTDIR "LyX ${VERSION_MAJOR}.${VERSION_MINOR}" # Default install dir if not over-installing
40 # Retrieve default install location from following registry entry (HKCU/HKLM is chosen automatically)
41 !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "SOFTWARE\LyX"
42 !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME "InstDir${VERSION_MAJOR}${VERSION_MINOR}"
44 !include MultiUser.nsh # Header file: Installer configuration for multi-user Windows environments
45 # When MULTIUSER_INSTALLMODE_COMMANDLINE is defined, MultiUser.nsh defines ${StrStr} and ${UnStrStr} functions
47 # ============= Modern UI 2 general settings ===============
49 #!include MUI2.nsh # included in MultiUser # Header file for creating modern looking installer
50 !define MUI_ABORTWARNING # Show a message box with a warning when the user wants to close the installer.
51 !define MUI_ICON "..\icons\lyx.ico"
52 !define MUI_UNICON "..\icons\lyx.ico"
53 !define MUI_HEADERIMAGE # Display an image on the header of the page.
54 !define MUI_HEADERIMAGE_BITMAP "graphics\header.bmp"
55 !define MUI_HEADERIMAGE_RIGHT # Display header image on the right and not left
56 !define MUI_WELCOMEFINISHPAGE_BITMAP "graphics\wizard.bmp"
57 !define MUI_UNWELCOMEFINISHPAGE_BITMAP "graphics\wizard.bmp"
59 # ======== Pages definitions ==========
63 !define MUI_WELCOMEPAGE_TEXT $(TEXT_WELCOME) # Use custom welcome text
64 !insertmacro MUI_PAGE_WELCOME # Welcome page
66 !insertmacro MUI_PAGE_LICENSE "license.rtf"
68 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrepareShellCTX # Prepare shell context before the multiuser page is created, so that the installer searches for default install folder in the right context (x64/x32)
69 !insertmacro MULTIUSER_PAGE_INSTALLMODE # Multiuser page
71 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE VerifyInstDir # Custom leave-function for directory page to verify installdir
72 !insertmacro MUI_PAGE_DIRECTORY # Directory page (where to install)
74 !define MUI_PAGE_CUSTOMFUNCTION_PRE DefaultDesktopFileAssoc # Custom pre-function for components page to search for already present dictionaries (in dictionaries.nsh)
75 !insertmacro MUI_PAGE_COMPONENTS # Components page (what to install)
77 # Default startmenu folder if registry contains no information from a previous installment, same as the default install dir
78 !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${MULTIUSER_INSTALLMODE_INSTDIR}"
79 # Define registry entry to store the startmenu folder, also reads this entry in as default startmenu folder in case of over-installing
80 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" # Context dependent on what the user chooses on multiuser page
81 !define MUI_STARTMENUPAGE_REGISTRY_KEY "SOFTWARE\LyX"
82 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "SMDir${VERSION_MAJOR}${VERSION_MINOR}"
83 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrepareShellCTX # Prepare shell context before the startmenu page is created, so that the installer searches for default startmenu folder in the right context
84 !define MUI_PAGE_CUSTOMFUNCTION_SHOW RetrieveSMState # Custom show-function for startmenu page to disable startmenu dir creation in case of over-installment where previously disabled
85 !insertmacro MUI_PAGE_STARTMENU startmenuPage $StartMenuFolder # Page to choose start menu folder entry, the folder is stored in VARIABLE
88 !include "src\CustomPages\LaTeXFolder.nsdinc"
89 Page custom LatexFolder_Show LatexFolder_Leave
91 !insertmacro MUI_PAGE_INSTFILES # Progress page
93 !define MUI_FINISHPAGE_SHOWREADME # Showreadme-checkbox appears
94 !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED # Showreadme-checkbox disabled by default
95 !define MUI_FINISHPAGE_SHOWREADME_FUNCTION StartLyX # Custom function for the showreadme-checkbox (start latex instead of show readme)
96 !define MUI_FINISHPAGE_SHOWREADME_TEXT $(FinishPageRun) # Custom text for the label on the showreadme-checkbox
97 !define MUI_FINISHPAGE_LINK $(TEXT_FINISH_WEBSITE) # Text for the link on the bottom of finish page
98 !define MUI_FINISHPAGE_LINK_LOCATION "https://www.lyx.org/" # Website opens by clicking on the link on finish page
99 !insertmacro MUI_PAGE_FINISH # Finish page
103 !insertmacro MUI_UNPAGE_WELCOME # Welcome page
104 !insertmacro MUI_UNPAGE_CONFIRM # Confirmation page
106 !define MUI_PAGE_CUSTOMFUNCTION_PRE un.ComponentsPre # Custom function for components page to prepare strings for the description of a section
107 !insertmacro MUI_UNPAGE_COMPONENTS # Components page
109 !insertmacro MUI_UNPAGE_INSTFILES # Progress page
110 !insertmacro MUI_UNPAGE_FINISH # Finish page
112 # ======= Other includes =======
114 !include "src\lang\TranslatedLanguages.nsh" # languages strings
116 #!include LogicLib.nsh # included in MUI2 # Allows using logic commands (such as ${If}..${Else}..${EndIf})
117 #!include LangFile.nsh # included in MUI2 # Header file to create language files that can be included with a single command.
118 !include x64.nsh # Header file to check if target system is 64 bit or not with ${RunningX64}, also defines ${DisableX64FSRedirection} and ${EnableX64FSRedirection}
119 !include NSISList.nsh # Header file to create and work with lists in NSIS (plugin)
121 #!include StrFunc.nsh # included in MultiUser # Provides some additional string functions
122 ${StrRep} # Define this function from StrFunc.nsh for further use
123 ${StrStrAdv} # Define this function from StrFunc.nsh for further use
124 ${UnStrStrAdv} # Define this function from StrFunc.nsh for further use
125 ${UnStrRep} # Define this function from StrFunc.nsh for further use
127 # ========= Installer Attributes ===========
129 VIProductVersion "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}.${VERSION_BUILD}" # Must be X.X.X.X format
130 VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "LyX"
131 VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "LyX ${APP_VERSION} installer"
132 VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${APP_VERSION}"
133 VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "LyX - The Document Processor"
134 VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "LyX is Copyright © 1995 by Matthias Ettrich, 1995-${COPYRIGHT_YEAR} by the LyX Team"
135 VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "LyX Team"
136 VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" ""
138 #-------------------------------------------------------------
139 # - - - - - - - - - - Helper Functions - - - - - - - - - - - -
140 #-------------------------------------------------------------
142 # Forward declarations
144 !macro SearchAllRegistry resultVar resultStateIdx resultRegIdx subKey searchFor startStateIdx startRegIdx
147 Push ${startStateIdx}
149 Call SearchAllRegistry
150 Pop ${resultStateIdx}
155 !define SearchAllRegistry "!insertmacro SearchAllRegistry"
157 !macro SearchRegistry resultVar resultRegIdx subKey searchFor startRegIdx
166 !define SearchRegistry "!insertmacro SearchRegistry"
170 Function SearchAllRegistry
171 Exch $9 # startRegIdx
173 Exch $8 # startStateIdx
183 SetShellVarContext all
190 SetShellVarContext all
195 SetShellVarContext current
202 SetShellVarContext current
207 ${SearchRegistry} $5 $9 $6 $7 $9
219 Exch $9 # resultRegIdx
221 Exch $8 # resultStateIdx
224 Function SearchRegistry
225 Exch $9 # startRegIdx
234 EnumRegKey $6 SHCTX $7 $9
240 ${LoopUntil} $6 == ""
247 Exch $9 # resultRegIdx
250 !macro PrepareShellCTX
251 ${if} $MultiUser.InstallMode == "CurrentUser"
252 SetShellVarContext current
254 SetShellVarContext all
257 SetRegView ${APP_ARCHITECTURE}
261 Function PrepareShellCTX
262 !insertmacro PrepareShellCTX
265 Function un.PrepareShellCTX
266 !insertmacro PrepareShellCTX
269 #-------------------------------------------------------------
270 # - - - - - - - - - - - - Sections - - - - - - - - - - - - - -
271 #-------------------------------------------------------------
273 # ============ Installer Page Functions ============
275 Function .onInit # Callback function, called at the very beginning, when user double clicks on the installer
277 !if ${APP_ARCHITECTURE} = 64 # If 64 bit installer
278 # Abort if not 64 bit Windows
279 ${IfNot} ${RunningX64}
280 MessageBox MB_OK|MB_ICONSTOP "Cannot install a 64 bit application on 32 bit Windows, please use the 32 bit installer" /SD IDOK
285 # Check Windows version
286 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
287 ${if} $0 S<= "6.0" # Atleast Win7 is needed
288 MessageBox MB_OK|MB_ICONSTOP "LyX ${APP_VERSION} requires Windows 7 or newer." /SD IDOK
292 Call PrepareShellCTX # MULTIUSER_INIT should search in the right registry view
293 !insertmacro MULTIUSER_INIT # Verify multiuser privileges
295 # Check if the same version of LyX is installed anywhere (admin/user, x64/x32) on the computer
299 ${SearchAllRegistry} $0 $1 $2 "SOFTWARE\LyX" ${APP_VERSION_DOTLESS} $1 $2 # Helper Function from above
300 ${If} $0 == ${APP_VERSION_DOTLESS}
301 ReadRegStr $0 SHCTX "SOFTWARE\LYX\$0" ""
302 ${If} ${FileExists} "$0\Uninstall-LyX.exe"
303 ${IfCmd} MessageBox MB_YESNO|MB_DEFBUTTON2|MB_ICONEXCLAMATION "$(AlreadyInstalled)" /SD IDNO IDNO ${||} Quit ${|}
305 DeleteRegKey SHCTX "SOFTWARE\LYX\$0"
310 # Check if a newer version of the same LyX series is installed anywhere (admin/user, x64/x32) on the computer
314 ${SearchAllRegistry} $R9 $1 $2 "SOFTWARE\LyX" "${VERSION_MAJOR}${VERSION_MINOR}" $1 $2 # Helper Function from above
315 ${If} $R9 S> ${APP_VERSION_DOTLESS} # $R9 is used in $(NewerInstalled)
316 ReadRegStr $0 SHCTX "SOFTWARE\LYX\$0" ""
317 ${If} ${FileExists} "$0\Uninstall-LyX.exe"
318 MessageBox MB_OK|MB_ICONSTOP "$(NewerInstalled)" /SD IDOK
321 DeleteRegKey SHCTX "SOFTWARE\LYX\$0"
327 Function CheckIfRunning # Check that LyX in $INSTDIR is not currently running, called from Function VerifyInstDir and Section -CheckSilent (if silentinstall)
329 ${DisableX64FSRedirection} # We need the following process to be 64 bit on 64 bit system
331 nsExec::ExecToStack "powershell (Get-Process LyX).Path"
333 Pop $0 # Result string
335 ${EnableX64FSRedirection} # Need to be anabled asap or installer might crash
337 ${StrStr} $0 $0 "$INSTDIR\bin\LyX.exe"
339 MessageBox MB_OK|MB_ICONSTOP "$(UnInstallRunning)" /SD IDOK
340 Abort # Abort leaving the page (when called from the page callback) / Abort install (when called from the section)
344 Function VerifyInstDir # Custom Function, called when leaving directory page
345 # if the $INSTDIR does not contain "LyX" we must add a subfolder to avoid that LyX will e.g.
346 # be installed directly to "C:\Program Files" - the uninstaller will then delete the whole
347 # "C:\Program Files" directory
348 ${StrStr} $0 $INSTDIR LyX
350 StrCpy $INSTDIR "$INSTDIR\${MULTIUSER_INSTALLMODE_INSTDIR}" # Append e.g. "LyX 2.3" to $INSTDIR
351 ${NSD_SetText} $mui.DirectoryPage.Directory $INSTDIR # Refresh Textbox
352 Abort # Abort leaving the page
358 Function RetrieveSMState # Custom function, called after the Startmenu page has been created
359 ${IfNot} ${FileExists} "$INSTDIR\Uninstall-LyX.exe"
360 Return # Not over-installing
362 ${GetFileVersion} "$INSTDIR\Uninstall-LyX.exe" $0
363 StrCpy $0 $0 3 # get only the first 3 chars, e.g. "2.3"
364 ${If} $0 != "${VERSION_MAJOR}.${VERSION_MINOR}"
365 Return # Installing over a wrong version
369 Call PrepareShellCTX # Helper function from above
370 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "SMDir${VERSION_MAJOR}${VERSION_MINOR}"
373 StrCpy $StartMenuFolder ">$StartMenuFolder"
375 GetDlgItem $0 $mui.StartMenuPage 1005 # Get the HWND of the checkbox, MUI2 does not provide variable for that
376 ${NSD_GetState} $0 $1
377 ${If} $1 = ${BST_UNCHECKED}
378 SendMessage $0 ${BM_CLICK} 0 0 # NSIS delivers no other possibility here other than to send a click event to the checkbox
384 Function LatexFolder_Show # Custom Function, called before showing the LaTeXFolder page to create it
385 Call FindLatex # detect latex
386 Pop $0 # Result string from FindLatex
387 # $0 should contain the path to latex.exe, it is used in the fnc_LaTeXFolder_Create
388 ${StrStr} $1 $0 "\latex.exe"
389 ${If} $1 != "" # If latex was actually found
390 ${StrRep} $0 $0 $1 ""
391 # $R9 is used in $(EnterLaTeXFolder) on the page
392 ${StrStr} $1 $0 "\miktex\bin"
398 StrCpy $1 $(EnterLaTeXFolder) # $1 is used on the page
400 StrCpy $1 $(EnterLaTeXFolderNone)
403 Call fnc_LaTeXFolder_Show # In LaTeXFolder.nsdinc, defined by NSIS Dialog Designer
406 Function FindLatex # Searches latex.exe, called from pre and leave functions of latexfolder page
407 # Find "LaTeX Path" value in registry written by a previous installment of the same LyX series, prioritized, because could be user preference
415 ${SearchRegistry} $0 $1 "SOFTWARE\LyX" "${VERSION_MAJOR}${VERSION_MINOR}" $1
417 ReadRegStr $0 SHCTX "SOFTWARE\LyX\$0" "LaTeX Path"
418 StrCpy $0 "$0\latex.exe"
419 ${If} ${FileExists} $0
423 ${ElseIf} ${RunningX64}
431 nsExec::ExecToStack "where latex.exe" # Ask CMD to find "latex.exe" for us, works if latexpath is added to PATH
432 Pop $0 # Exit code: 0 = success, 1 = fail
436 Pop $0 # If search failed, this is garbage, otherwise path to latex
438 # Search the registry for TexLive
442 ${SearchAllRegistry} $0 $1 $2 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "TeXLive" $1 $2 # Helper Function from above
443 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$0" "UninstallString"
444 ${StrRep} $0 $0 '"' ""
445 ${StrRep} $0 $0 "tlpkg\installer\uninst.bat" "bin\win32\latex.exe" # TeXLive is not 64 bit yet
446 ${If} ${FileExists} $0
452 # Search the registry for MiKTex
456 ${SearchAllRegistry} $0 $1 $2 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "MiKTeX" $1 $2 # Helper Function from above
457 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$0" "InstallLocation"
458 StrCpy $0 "$0\miktex\bin\latex.exe"
459 ${If} ${FileExists} $0
463 ${If} ${RunningX64} # MiKTeX can also be x64
464 ${StrRep} $0 $0 "latex.exe" "x64\latex.exe"
465 ${If} ${FileExists} $0
477 Function LatexFolder_Leave # Custom function, called when trying to leave LatexFolder page to verify that "latex.exe" really exists in the given path
478 ${NSD_GetText} $hCtl_LaTeXFolder_DirRequest1_Txt $LatexPath
479 ${NSD_GetState} $hCtl_LaTeXFolder_CheckBox1 $0
481 ${If} $0 = ${BST_CHECKED}
483 ${ElseIfNot} ${FileExists} "$LatexPath\latex.exe"
484 MessageBox MB_OK $(InvalidLaTeXFolder)
485 Call FindLatex # Search for latex again
486 Pop $0 # Result string from FindLatex
487 ${StrStrAdv} $0 $0 "\latex.exe" ">" "<" "0" "0" "0" # Get everything before "\latex.exe"
488 ${NSD_SetText} $hCtl_LaTeXFolder_DirRequest1_Txt $0 # Refresh textbox
489 Abort # Abort leaving the page
493 # ========= Installer Sections =========
495 Section -CheckSilent # This section checks if it's a silent install and calls needed callback- and custom-pagefunctions, which are not called in this case
506 Call FindLatex # Search for latex
507 Pop $0 # Result string from FindLatex
508 ${StrStrAdv} $0 $0 "\latex.exe" ">" "<" "0" "0" "0" # Get everything before "\latex.exe"
509 ${If} ${FileExists} "$0\latex.exe"
512 MessageBox MB_OK $(InvalidLaTeXFolder)
516 Call DefaultDesktopFileAssoc
519 Section -UninstallOld
520 ${If} ${FileExists} "$INSTDIR\Uninstall-LyX.exe"
521 ${GetFileVersion} "$INSTDIR\Uninstall-LyX.exe" $0
522 StrCpy $0 $0 3 # get only the first 3 chars, e.g. "2.3"
523 ${If} $0 != "${VERSION_MAJOR}.${VERSION_MINOR}"
524 ExecWait "$INSTDIR\Uninstall-LyX.exe /S _?=$INSTDIR" # silently uninstall old LyX
525 Delete "$INSTDIR\Uninstall-LyX.exe"
530 Section -OverInstallReg # If over-installing, we need to delete the registry keys written by the previous installment
531 Call PrepareShellCTX # Helper function from above
534 EnumRegKey $2 SHCTX "SOFTWARE\LyX" $1
535 ${StrStr} $3 $2 "${VERSION_MAJOR}${VERSION_MINOR}"
536 ReadRegStr $0 SHCTX "SOFTWARE\LyX\$3" ""
538 DeleteRegKey SHCTX "SOFTWARE\LyX\$3"
539 DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX$3"
542 ${LoopUntil} $2 == ""
545 Section -ProgramFiles
547 # Install the core LyX files
549 # Initializes the plug-ins dir ($PLUGINSDIR) if not already initialized.
550 # $PLUGINSDIR is automatically deleted when the installer exits.
554 SetOutPath "$INSTDIR\bin"
555 File "${FILES_LYX}\bin\LyX.exe"
556 File "${FILES_LYX}\bin\tex2lyx.exe"
557 # Visual C++ redistributable (if native build)
558 File "${FILES_DEPS}\bin\concrt140.dll"
559 File "${FILES_DEPS}\bin\msvcp140.dll"
560 File "${FILES_DEPS}\bin\msvcp140_1.dll"
561 File "${FILES_DEPS}\bin\msvcp140_2.dll"
562 File "${FILES_DEPS}\bin\vcamp140.dll"
563 File "${FILES_DEPS}\bin\vccorlib140.dll"
564 File "${FILES_DEPS}\bin\vcomp140.dll"
565 File "${FILES_DEPS}\bin\vcruntime140.dll"
566 !if ${APP_ARCHITECTURE} = 64
567 File "${FILES_DEPS}\bin\vcruntime140_1.dll"
569 # MinGW redistributable (if cross platform with MinGW)
570 #File "${FILES_DEPS}\bin\iconv.dll"
571 #File "${FILES_DEPS}\bin\libbz2-1.dll"
572 #File "${FILES_DEPS}\bin\libfreetype-6.dll"
573 #File "${FILES_DEPS}\bin\libgcc_s_sjlj-1.dll"
574 #File "${FILES_DEPS}\bin\libglib-2.0-0.dll"
575 #File "${FILES_DEPS}\bin\libharfbuzz-0.dll"
576 #File "${FILES_DEPS}\bin\libintl-8.dll"
577 #File "${FILES_DEPS}\bin\libjpeg-62.dll"
578 #File "${FILES_DEPS}\bin\libpcre-1.dll"
579 #File "${FILES_DEPS}\bin\libpcre2-16-0.dll"
580 #File "${FILES_DEPS}\bin\libpng16-16.dll"
581 #File "${FILES_DEPS}\bin\libstdc++-6.dll"
582 #File "${FILES_DEPS}\bin\libtiff-5.dll"
583 #File "${FILES_DEPS}\bin\libwinpthread-1.dll"
584 #File "${FILES_DEPS}\bin\libwebp-7.dll"
585 #File "${FILES_DEPS}\bin\libwebpdemux-2.dll"
586 #File "${FILES_DEPS}\bin\zlib1.dll"
588 File "${FILES_DEPS}\bin\libnetpbm10.dll"
589 File "${FILES_DEPS}\bin\pnmcrop.exe"
591 File "${FILES_DEPS}\bin\rsvg-convert.exe"
593 File "${FILES_DEPS}\bin\pdfview.exe"
595 File "${FILES_QT}\bin\Qt${Qt_Version}Concurrent.dll"
596 File "${FILES_QT}\bin\Qt${Qt_Version}Core.dll"
597 File "${FILES_QT}\bin\Qt${Qt_Version}Gui.dll"
598 File "${FILES_QT}\bin\Qt${Qt_Version}Network.dll"
599 File "${FILES_QT}\bin\Qt${Qt_Version}OpenGL.dll"
600 File "${FILES_QT}\bin\Qt${Qt_Version}PrintSupport.dll"
601 File "${FILES_QT}\bin\Qt${Qt_Version}Svg.dll"
602 File "${FILES_QT}\bin\Qt${Qt_Version}Widgets.dll"
603 !if ${Qt_Version} = 5
604 File "${FILES_QT}\bin\Qt5WinExtras.dll"
606 !if ${Qt_Version} = 6
607 File "${FILES_Qt}\bin\Qt6Core5Compat.dll"
608 File "${FILES_QT}\bin\Qt6SvgWidgets.dll"
612 SetOutPath "$INSTDIR\bin\imageformats"
613 File "${FILES_QT}\bin\imageformats\qgif.dll"
614 File "${FILES_QT}\bin\imageformats\qico.dll"
615 File "${FILES_QT}\bin\imageformats\qjpeg.dll"
616 File "${FILES_QT}\bin\imageformats\qsvg.dll"
617 !if ${Qt_Version} = 5
618 File "${FILES_QT}\bin\imageformats\qicns.dll"
619 File "${FILES_QT}\bin\imageformats\qtiff.dll"
620 File "${FILES_QT}\bin\imageformats\qwbmp.dll"
621 File "${FILES_QT}\bin\imageformats\qwebp.dll"
624 SetOutPath "$INSTDIR\bin\iconengines"
625 File "${FILES_QT}\bin\iconengines\qsvgicon.dll"
627 SetOutPath "$INSTDIR\bin\platforms"
628 File "${FILES_QT}\bin\platforms\qminimal.dll"
629 File "${FILES_QT}\bin\platforms\qwindows.dll"
631 SetOutPath "$INSTDIR\bin\styles"
632 File "${FILES_QT}\bin\styles\qwindowsvistastyle.dll"
635 SetOutPath "$INSTDIR\Resources"
636 # recursively copy all files under Resources
637 File /r "${FILES_LYX}\Resources\"
638 File /r "${FILES_DEPS}\Resources\" # Already present files will be skiped
641 SetOutPath "$INSTDIR\Python"
642 # recursively copy all files under Python
643 File /r "${FILES_DEPS}\Python\"
645 # Components of ImageMagick
646 SetOutPath "$INSTDIR\imagemagick"
647 File /r "${FILES_DEPS}\imagemagick\"
649 # Components of Ghostscript
650 SetOutPath "$INSTDIR\ghostscript"
651 File /r "${FILES_DEPS}\ghostscript\"
654 SetOutPath "$INSTDIR\Python\Lib"
655 File "${FILES_DEPS}\bin\unoconv.py"
657 WriteUninstaller "$INSTDIR\Uninstall-LyX.exe"
660 Section -TexRessources # Section installs cls files from Ressources\tex and updates latex filebase
661 # First make sure that latex was found in LatexFolder_Leave function
662 ${If} $LatexPath == ""
667 ${StrStr} $0 $LatexPath "\miktex\bin"
668 ${If} $0 == "" # TexLive
669 ${StrRep} $0 $LatexPath "\bin\win32" "\texmf-dist\tex\latex\lyx"
670 ${If} ${FileExists} "$0\broadway.cls"
673 CopyFiles /SILENT "$INSTDIR\Resources\tex\*.*" $0
674 ExecWait '$LatexPath\texhash' # Update package file list
677 ${StrRep} $0 $LatexPath $0 "\tex\latex\lyx"
678 ${If} ${FileExists} "$0\broadway.cls"
681 CopyFiles /SILENT "$INSTDIR\Resources\tex\*.*" $0 # First try to put into Miktex install dir
683 ${IfNot} ${FileExists} "$0\broadway.cls" # Check if copying succeeded
684 # Didn't suceed to put into install dir, put into users dir
685 nsExec::ExecToStack "$LatexPath\mpm.exe --version" # get the Miktex version
688 ${StrStrAdv} $0 $0 "MiKTeX Package Manager " ">" ">" "0" "0" "0" # $0 contains "2.9.7420 ......" now (everything after "MiKTeX Package Manager ")
689 ${StrStrAdv} $0 $0 "." ">" "<" "0" "1" "0" # $0 contains "2.9" now (everything before the second dot)
690 SetShellVarContext current
691 ${If} ${FileExists} "$APPDATA\MiKTeX\$0\tex\latex\lyx\broadway.cls" # UserInstall-dir can not be changed in Miktex currently, so this should work
694 CopyFiles /SILENT "$INSTDIR\Resources\tex\*.*" "$APPDATA\MiKTeX\$0\tex\latex\lyx" # Put into user install dir
697 # Update package file list
698 nsExec::ExecToLog "$LatexPath\initexmf.exe --admin --update-fndb" # Try as admin
700 ${If} $0 <> 0 # Not successful
701 nsExec::ExecToLog "$LatexPath\initexmf.exe --update-fndb" # Do as user
707 Section -CompilePython
708 # Compile all Python files to byte-code
709 # The user using the scripts may not have write access
710 FileOpen $R0 "$INSTDIR\compilepy.py" w
711 FileWrite $R0 "import compileall$\r$\n"
712 FileWrite $R0 "compileall.compile_dir('$INSTDIR\python\Lib')$\r$\n"
713 FileWrite $R0 "compileall.compile_dir('$INSTDIR\Resources')$\r$\n"
715 DetailPrint $(TEXT_CONFIGURE_PYTHON)
716 nsExec::ExecToLog '"$INSTDIR\python\python.exe" "$INSTDIR\compilepy.py"'
718 Delete "$INSTDIR\compilepy.py"
722 StrCpy $pathPrefix "$LatexPath;$$LyXDir\bin;$$LyXDir\Python;$$LyXDir\Python\Lib;$$LyXDir\Python\Scripts;$$LyXDir\imagemagick;$$LyXDir\ghostscript\bin"
724 # Find additional software and add their install locations to the path_prefix
725 # This list contains all software, which write the string value "InstallLocation" in their corresponding keys in "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
726 # To add additional software matching this requirement, just append it to the string after "${List.Append} editors "
727 ${List.Create} editors
728 ${List.Append} editors "jEdit,PSPad,WinShell,TeXnicCenter,WinEdt"
729 ${List.Count} $R1 editors
732 ${List.Get} $0 editors $R2
733 ${SearchAllRegistry} $0 $1 $1 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0 0 0 # Helper Function from above
734 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$0" "InstallLocation"
736 StrCpy $1 $0 "" -1 # Get the last char
737 ${If} $1 == "\" # If ends with "\"
738 StrCpy $0 $0 -1 # Remove "\"
740 StrCpy $pathPrefix "$pathPrefix;$0"
743 ${List.Destroy} editors
745 # Following Software does not create "InstallLocation"
747 ${SearchAllRegistry} $0 $1 $1 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "Vim" 0 0 # Helper Function from above
748 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$0" "DisplayIcon"
749 ${StrStrAdv} $0 $0 "\gvim.exe" ">" "<" "0" "0" "0" # get everything before "\gvim.exe"
751 StrCpy $pathPrefix "$pathPrefix;$0"
754 # JabRef, Hard to locate, JabRef uses MSI installer, lets try to find it through the .bib extension
755 SetShellVarContext all
759 ${For} $R1 0 1 # Try as admin and then as user
760 ReadRegStr $0 SHCTX "SOFTWARE\Classes\.bib" ""
761 ReadRegStr $0 SHCTX "Software\Classes\$0\shell\open\command" ""
762 ${StrRep} $0 $0 '"' "" # Remove quotes
763 ${StrStrAdv} $0 $0 "\JabRef.exe" ">" "<" "0" "0" "0" # Get everything before "\JabRef.exe"
764 ${If} ${FileExists} "$0\JabRef.exe"
765 StrCpy $pathPrefix "$pathPrefix;$0"
768 SetShellVarContext current # Retry as user
772 SetShellVarContext all
776 ${For} $R1 0 1 # Try as admin and then as user
777 ReadRegStr $0 SHCTX "Software\Classes\Applications\gnumeric.exe\shell\Open\command" ""
778 ${StrRep} $0 $0 '"' "" # Remove quotes
779 ${StrStrAdv} $0 $0 "\gnumeric.exe" ">" "<" "0" "0" "0" # Get everything before "\gnumeric.exe"
781 StrCpy $pathPrefix "$pathPrefix;$0"
784 SetShellVarContext current # Retry as user
787 # Pandoc, same as JabRef, can only attempt to ask cmd if added to PATH, the user can't disable that while installing pandoc though
788 nsExec::ExecToStack "where pandoc.exe"
790 Pop $0 # Return sring
792 ${StrStrAdv} $0 $0 "\pandoc.exe" ">" "<" "0" "0" "0" # Get everything before "\pandoc.exe"
794 StrCpy $pathPrefix "$pathPrefix;$0"
798 ${Map.Create} softwarePathsMap # Create a map (NSISList plugin) to temp store paths of 3rd party software
801 ${SearchAllRegistry} $0 $1 $1 "SOFTWARE" "LilyPond" 0 0 # Helper Function from above
802 ReadRegStr $0 SHCTX "SOFTWARE\$0" "Install_Dir"
804 StrCpy $pathPrefix "$pathPrefix;$0\usr\bin"
805 ${Map.Set} softwarePathsMap "LilyPond" "$0\usr\bin"
809 ${SearchAllRegistry} $2 $1 $1 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" "GIMP" 0 0 # Helper Function from above
810 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$2" "InstallLocation"
812 StrCpy $pathPrefix "$pathPrefix;$0bin" # Install Location ends with '\' for Gimp in Registry
813 ReadRegStr $0 SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$2" "DisplayIcon"
814 ${StrStrAdv} $0 $0 ".exe" ">" "<" "0" "0" "0" # Get everything before the ".exe"
815 ${StrStrAdv} $0 $0 "\" "<" ">" "0" "0" "0" # Get everything after the last "\", $0 contains "gimp-10" now
816 ${Map.Set} softwarePathsMap "ImageEditor" $0
820 ${SearchAllRegistry} $0 $1 $1 "SOFTWARE" "Krita" 0 0 # Helper Function from above
821 ReadRegStr $0 SHCTX "SOFTWARE\$0" "InstallLocation"
823 StrCpy $pathPrefix "$pathPrefix;$0\bin"
824 ${Map.Set} softwarePathsMap "ImageEditor" "krita"
828 SetShellVarContext all
832 ${For} $R1 0 1 # Try as admin and then as user
833 ReadRegStr $0 SHCTX "Software\Classes\Applications\Photoshop.exe\shell\Open\command" ""
834 ${StrRep} $0 $0 '"' "" # Remove quotes
835 ${StrStrAdv} $0 $0 "\photoshop.exe" ">" "<" "0" "0" "0" # Get everything before "\photoshop.exe"
837 StrCpy $pathPrefix "$pathPrefix;$0"
840 SetShellVarContext current # Retry as user
845 FileOpen $R0 "$INSTDIR\Resources\lyxrc.dist" a
847 # set some general things
848 FileWrite $R0 '\screen_zoom 120$\r$\n'
850 FileWrite $R0 '\path_prefix "$pathPrefix"$\r$\n'
852 # use pdfview for all types of PDF files
853 FileWrite $R0 '\format "pdf5" "pdf" "PDF (LuaTeX)" "u" "pdfview" "" "document,vector,menu=export" "application/pdf"$\r$\n\
854 \format "pdf4" "pdf" "PDF (XeTeX)" "X" "pdfview" "" "document,vector,menu=export" "application/pdf"$\r$\n\
855 \format "pdf3" "pdf" "PDF (dvipdfm)" "m" "pdfview" "" "document,vector,menu=export" "application/pdf"$\r$\n\
856 \format "pdf2" "pdf" "PDF (pdflatex)" "F" "pdfview" "" "document,vector,menu=export" "application/pdf"$\r$\n\
857 \format "pdf" "pdf" "PDF (ps2pdf)" "P" "pdfview" "" "document,vector,menu=export" "application/pdf"$\r$\n'
859 # If krita or gimp was found previously
860 ${Map.Get} $0 softwarePathsMap "ImageEditor"
861 ${If} $0 != "__NULL" # If "ImageEditor" is set in map
862 FileWrite $R0 '\format "gif" "gif" "GIF" "" "auto" "$0" "" "image/gif"$\r$\n\
863 \format "jpg" "jpg, jpeg" "JPEG" "" "auto" "$0" "" "image/jpeg"$\r$\n\
864 \format "png" "png" "PNG" "" "auto" "$0" "" "image/x-png"$\r$\n'
867 FileWrite $R0 '\converter "wmf" "eps" "magick -density 300 $$$$i $$$$o" ""$\r$\n\
868 \converter "emf" "eps" "magick -density 300 $$$$i $$$$o" ""$\r$\n'
870 # If LilyPond was found previously
871 ${Map.Get} $0 softwarePathsMap "LilyPond"
872 ${If} $0 != "__NULL" # If "LilyPond" is set in map
873 FileWrite $R0 '\format "lilypond-book" "lytex" "LilyPond book (LaTeX)" "" "" "auto" "document,menu=export" ""$\r$\n\
874 \converter "lilypond-book" "pdflatex" "python \"$0\\lilypond-book.py\" --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$$$i" ""$\r$\n\
875 \converter "lilypond-book" "xetex" "python \"$0\\lilypond-book.py\" --safe --pdf --latex-program=xelatex --lily-output-dir=ly-pdf $$$$i" ""$\r$\n\
876 \converter "lilypond-book" "luatex" "python \"$0\\lilypond-book.py\" --safe --pdf --latex-program=lualatex --lily-output-dir=ly-pdf $$$$i" ""$\r$\n\
877 \converter "lilypond-book" "latex" "python \"$0\\lilypond-book.py\" --safe --lily-output-dir=ly-eps $$$$i" ""$\r$\n'
880 ${Map.Destroy} softwarePathsMap
885 MessageBox MB_OK|MB_ICONEXCLAMATION "$(ModifyingConfigureFailed)" /SD IDOK
890 Section "$(SecFileAssocTitle)" SecFileAssoc # Registry information to assiciate ".lyx" extension with this LyX installation
891 Call PrepareShellCTX # Helper function from above
893 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\LyX.exe" "" "$INSTDIR\bin\LyX.exe" # Writes in both 64 and 32 bit registry
894 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\LyX.exe" "Version" ${APP_VERSION} # Writes in both 64 and 32 bit registry
896 WriteRegStr SHCTX "Software\Classes\.lyx" "" "LyX.Document"
897 WriteRegStr SHCTX "Software\Classes\.lyx" "Content Type" "application/lyx"
899 WriteRegStr SHCTX "Software\Classes\LyX.Document" "" "LyX Document"
900 WriteRegStr SHCTX "Software\Classes\LyX.Document\DefaultIcon" "" "$INSTDIR\bin\LyX.exe,1"
901 WriteRegStr SHCTX "Software\Classes\LyX.Document\Shell\open\command" "" '"$INSTDIR\bin\LyX.exe" "%1"'
903 # we need to update also the automatically created entry about the lyx.exe
904 # otherwise .lyx-files will could be opened with an older LyX version
905 ReadRegStr $0 SHCTX "Software\Classes\Applications\LyX.exe\shell\open\command" ""
906 ${if} $0 != "" # if something was found
907 WriteRegStr SHCTX "Software\Classes\Applications\LyX.exe\shell\open\command" "" '"$INSTDIR\bin\LyX.exe" "%1"'
910 WriteRegStr SHCTX "SOFTWARE\LyX" "FileAssoc${VERSION_MAJOR}${VERSION_MINOR}" $INSTDIR # Save user preference for over-installing
913 Section "$(SecDesktopTitle)" SecDesktop
914 SetOutPath "$INSTDIR\bin" # Need to set this so that the shortcut to lyx.exe is executed in the bin folder
915 CreateShortCut "$DESKTOP\LyX ${VERSION_MAJOR}.${VERSION_MINOR}.lnk" "$INSTDIR\bin\LyX.exe" "" "" "" "" "" "LyX - The Document Processor" # Last parameter is the comment of the shortcut
917 WriteRegStr SHCTX "SOFTWARE\LyX" "Desktop${VERSION_MAJOR}${VERSION_MINOR}" $INSTDIR # Save user preference for over-installing
920 Section -StartMenuFolder # Creates starm menu shortcut and website links to lyx website and lyx wiki
921 Call PrepareShellCTX # Helper function from above, need to call be before the following macro, because the macro writes registry string (storing the default startmenu folder)
922 !insertmacro MUI_STARTMENU_WRITE_BEGIN startmenuPage # This macro also assures that the folder is not empty for us
923 SetOutPath "$INSTDIR\bin" # Need to set this so that the shortcut to lyx.exe is executed in the bin folder
924 CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
925 CreateShortCut "$SMPROGRAMS\$StartMenuFolder\LyX.lnk" "$INSTDIR\bin\LyX.exe" "" "" "" "" "" "LyX - The Document Processor" # Last parameter is the comment of the shortcut
927 CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall LyX.lnk" "$INSTDIR\Uninstall-LyX.exe"
928 WriteINIStr "$SMPROGRAMS\$StartMenuFolder\LyX Website.url" "InternetShortcut" "URL" "https://www.lyx.org/"
929 WriteINIStr "$SMPROGRAMS\$StartMenuFolder\LyX Wiki.url" "InternetShortcut" "URL" "https://wiki.lyx.org"
930 !insertmacro MUI_STARTMENU_WRITE_END
933 !include "src\dictionaries.nsh"
935 Section -SoftwareRegistry # Registry information in "SOFTWARE" subkey
936 Call PrepareShellCTX # Helper function from above
938 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "latestVersion"
939 ${If} $0 S< ${APP_VERSION_DOTLESS}
940 WriteRegStr SHCTX "SOFTWARE\LyX" "latestVersion" ${APP_VERSION_DOTLESS}
942 WriteRegStr SHCTX "SOFTWARE\LyX\${APP_VERSION_DOTLESS}" "" $INSTDIR
943 WriteRegStr SHCTX "SOFTWARE\LyX\${APP_VERSION_DOTLESS}" "LaTeX Path" $LatexPath
944 WriteRegStr SHCTX "SOFTWARE\LyX" "InstDir${VERSION_MAJOR}${VERSION_MINOR}" $INSTDIR # Remember install dir for the next over-installment of the same series
947 Section -UninstallInfoRegistry # Registry information in "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" subkey
948 Call PrepareShellCTX # Helper function from above
950 ${If} $MultiUser.InstallMode == "AllUsers"
951 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "DisplayName" "LyX ${APP_VERSION}"
953 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "DisplayName" "LyX ${APP_VERSION} $(TEXT_INSTALL_CURRENTUSER)"
956 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "UninstallString" '"$INSTDIR\Uninstall-LyX.exe"'
957 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "DisplayVersion" "${APP_VERSION}"
958 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "VersionMajor" "${VERSION_MAJOR}"
959 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "VersionMinor" "${VERSION_MINOR}"
960 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "DisplayIcon" "$INSTDIR\bin\LyX.exe"
961 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "URLUpdateInfo" "https://www.lyx.org/"
962 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "URLInfoAbout" "https://www.lyx.org/AboutLyX"
963 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "Publisher" "LyX Team"
964 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "HelpLink" "https://www.lyx.org/MailingLists"
965 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "NoModify" 0x00000001
966 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "NoRepair" 0x00000001
967 WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "InstallLocation" "$INSTDIR"
969 ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
970 IntFmt $0 "0x%08X" $0
971 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}" "EstimatedSize" $0
974 !if ${VERSION_MINOR} > 0 # Only valid for minor releases of the same major release (e.g. not valid for 3.0)
975 Section -CopyOldPreferences # Searches user's preferences (userdir) from previous minor release and copies it if necessary
977 SetShellVarContext current # Otherwise $APPDATA would return C:\ProgrammData instead of C:\Users\username\AppData\Roaming
979 IntOp $0 ${VERSION_MINOR} - 1 # only check the direct previous minor release
980 ${If} ${FileExists} "$APPDATA\LyX${VERSION_MAJOR}.$0\lyxrc.defaults"
981 ${AndIfNot} ${FileExists} "$APPDATA\LyX${VERSION_MAJOR}.${VERSION_MINOR}\lyxrc.defaults"
982 CopyFiles /SILENT "$APPDATA\LyX${VERSION_MAJOR}.$0\*.*" "$APPDATA\LyX${VERSION_MAJOR}.${VERSION_MINOR}"
987 Section -ConfigureScript # Runs the configure.py script
989 # Manipulate PATH environment of the running installer process, so that configure.py can find all the stuff needed
991 ${StrRep} $pathPrefix $pathPrefix "$$LyXDir" "$INSTDIR"
992 System::Call 'Kernel32::SetEnvironmentVariable(t "PATH", t "$pathPrefix;$0")'
995 SetShellVarContext current # Otherwise $APPDATA would return C:\ProgrammData instead of C:\Users\username\AppData\Roaming
996 SetOutPath "$APPDATA\LyX${VERSION_MAJOR}.${VERSION_MINOR}" # Need to run configure from the user dir, because it creates .lst files and some folders.
998 ${StrStr} $0 $LatexPath "\miktex\bin"
999 # R9 is used in $(TEXT_CONFIGURE_LYX)
1000 ${If} $0 == "" # TexLive
1001 StrCpy $R9 "TeXLive"
1005 DetailPrint $(TEXT_CONFIGURE_LYX) # Uses R9 to display the name of the installed latex distribution
1007 nsExec::ExecToLog '"$INSTDIR\Python\python.exe" "$INSTDIR\Resources\configure.py"'
1008 Pop $0 # Return value
1011 Function DefaultDesktopFileAssoc # Custom function, called before the components page, reads the states of SecDesktop and SecFileAssoc from registry (if overinstalling) and sets them
1013 Call CheckDictionaries # Search for already installed dictionaries, in dictionaries.nsh
1015 ${IfNot} ${FileExists} "$INSTDIR\Uninstall-LyX.exe"
1016 Return # Not over-installing
1018 ${GetFileVersion} "$INSTDIR\Uninstall-LyX.exe" $0
1019 StrCpy $0 $0 3 # get only the first 3 chars, e.g. "2.3"
1020 ${If} $0 != "${VERSION_MAJOR}.${VERSION_MINOR}"
1021 Return # Installing over a wrong version
1025 Call PrepareShellCTX
1026 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "FileAssoc${VERSION_MAJOR}${VERSION_MINOR}"
1028 SectionSetFlags ${SecFileAssoc} 0 # 0 means unselected
1030 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "Desktop${VERSION_MAJOR}${VERSION_MINOR}"
1032 SectionSetFlags ${SecDesktop} 0 # 0 means unselected
1037 ShellExecAsUser::ShellExecAsUser "" "$INSTDIR\bin\LyX.exe"
1040 # Installer Section Descriptions
1042 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
1043 !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssoc} "$(SecFileAssocDescription)"
1044 !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} "$(SecDesktopDescription)"
1045 !insertmacro MUI_DESCRIPTION_TEXT ${SecDictionaries} "$(SecDictionariesDescription)" # In dictionaries.nsh
1046 !insertmacro MUI_DESCRIPTION_TEXT ${SecThesaurus} "$(SecThesaurusDescription)" # In dictionaries.nsh
1047 !insertmacro MUI_FUNCTION_DESCRIPTION_END
1049 # ===== Uninstaller ======
1051 Function un.onInit # Callback function, called when the uninstaller initializes
1052 # Check that LyX is not currently running
1054 ${DisableX64FSRedirection} # We need the following process to be 64 bit on 64 bit system
1056 nsExec::ExecToStack "powershell (Get-Process LyX).Path"
1058 Pop $0 # Result string
1060 ${EnableX64FSRedirection} # Need to be enabled asap or installer might crash
1062 ${UnStrStr} $0 $0 "$INSTDIR\bin\LyX.exe"
1064 MessageBox MB_OK|MB_ICONSTOP "$(UnInstallRunning)" /SD IDOK
1065 Quit # Quit uninstaller
1068 Call un.PrepareShellCTX
1069 !insertmacro MULTIUSER_UNINIT
1071 # Ascertain whether the user has sufficient privileges to uninstall.
1072 # abort when LyX was installed with admin permissions but the user doesn't have administrator privileges
1073 Call un.PrepareShellCTX # Helperfunction from above
1074 ReadRegStr $0 HKLM "SOFTWARE\LyX\${APP_VERSION_DOTLESS}" ""
1075 ${If} $0 == $INSTDIR
1076 ${If} $MultiUser.Privileges != "Admin"
1077 ${AndIf} $MultiUser.Privileges != "Power"
1078 MessageBox MB_OK|MB_ICONSTOP "$(UnNotAdminLabel)" /SD IDOK
1081 StrCpy $MultiUser.InstallMode "AllUsers"
1084 ReadRegStr $0 HKCU "SOFTWARE\LyX\${APP_VERSION_DOTLESS}" ""
1086 MessageBox MB_OK|MB_ICONEXCLAMATION "$(UnNotInRegistryLabel)" /SD IDOK
1088 StrCpy $MultiUser.InstallMode "CurrentUser"
1092 # question message if the user really wants to uninstall LyX
1093 ${IfCmd} MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UnReallyRemoveLabel)" /SD IDYES IDNO ${||} Quit ${|}
1096 Function un.ComponentsPre # Callback Function, called before the components page is loaded
1097 # R9 and R8 are used in $(SecUnPreferencesDescription)
1098 SetShellVarContext current
1099 ${UnStrStrAdv} $R9 $PROFILE "\" "<" "<" "0" "0" "0" # Get everything before the last "\" of $PROFILE ("C:\Users\username") -> $R9: "C:\Users"
1100 ${UnStrRep} $R8 $APPDATA "$PROFILE\" "" # "C:\Users\username\" gets replaced with "" in "C:\Users\username\AppData\Roaming" -> $R8: "Appdata\Roaming"
1103 Section "un.LyX" un.SecUnProgramFiles # Deletes files in $INSTDIR and registry entries
1105 # LaTeX class files that were installed together with LyX
1106 # will not be uninstalled because other LyX versions will
1107 # need them and these few files don't harm to stay in LaTeX
1109 Call un.PrepareShellCTX # Helperfunction from above
1111 # Subfolders and unistaller
1112 RMDir /r "$INSTDIR\bin"
1113 RMDir /r "$INSTDIR\Resources"
1114 RMDir /r "$INSTDIR\Python"
1115 RMDir /r "$INSTDIR\imagemagick"
1116 RMDir /r "$INSTDIR\ghostscript"
1117 Delete "$INSTDIR\Uninstall-LyX.exe"
1119 SetOutPath $PLUGINSDIR
1123 !insertmacro MUI_STARTMENU_GETFOLDER startmenuPage $StartMenuFolder # Reads registry value written with macro MUI_STARTMENU_WRITE_BEGIN
1124 ShellLink::GetShortCutTarget "$SMPROGRAMS\$StartMenuFolder\LyX.lnk" # Check if the shortcut really is pointing to the current installation
1126 ${IfNot} ${FileExists} $0 # If still exists, then belongs to another lyx installment, so don't delete
1127 RMDir /r "$SMPROGRAMS\$StartMenuFolder"
1128 DeleteRegValue SHCTX "SOFTWARE\LyX" "SMDir${VERSION_MAJOR}${VERSION_MINOR}"
1132 ShellLink::GetShortCutTarget "$DESKTOP\LyX ${VERSION_MAJOR}.${VERSION_MINOR}.lnk"
1134 ${UnStrStr} $0 $0 $INSTDIR
1136 Delete "$DESKTOP\LyX ${VERSION_MAJOR}.${VERSION_MINOR}.lnk"
1138 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "Desktop${VERSION_MAJOR}${VERSION_MINOR}"
1139 ${If} $0 == $INSTDIR
1140 DeleteRegValue SHCTX "SOFTWARE\LyX" "Desktop${VERSION_MAJOR}${VERSION_MINOR}"
1144 ReadRegStr $0 SHCTX "Software\Classes\LyX.Document\DefaultIcon" ""
1145 ${UnStrStr} $0 $0 $INSTDIR
1147 DeleteRegKey SHCTX "Software\Classes\LyX.Document"
1148 DeleteRegKey SHCTX "Software\Classes\.lyx"
1150 ReadRegStr $0 SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\LyX.exe" ""
1151 ${UnStrStr} $0 $0 $INSTDIR
1153 DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\LyX.exe" # Deletes key in both 64 and 32 bit registry
1155 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "FileAssoc${VERSION_MAJOR}${VERSION_MINOR}"
1156 ${If} $0 == $INSTDIR
1157 DeleteRegValue SHCTX "SOFTWARE\LyX" "FileAssoc${VERSION_MAJOR}${VERSION_MINOR}"
1159 DeleteRegKey SHCTX "Software\Classes\Applications\LyX.exe"
1161 # Uninstaller info registry
1162 DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\LyX${APP_VERSION_DOTLESS}"
1165 DeleteRegKey SHCTX "SOFTWARE\LyX\${APP_VERSION_DOTLESS}"
1166 DeleteRegValue SHCTX "SOFTWARE\LyX" "latestVersion"
1167 ReadRegStr $0 SHCTX "SOFTWARE\LyX" "InstDir${VERSION_MAJOR}${VERSION_MINOR}"
1168 ${If} $0 == $INSTDIR
1169 DeleteRegValue SHCTX "SOFTWARE\LyX" "InstDir${VERSION_MAJOR}${VERSION_MINOR}"
1171 DeleteRegValue SHCTX "SOFTWARE\LyX" "latestVersion"
1172 # Now that "latestVersion" is gone we need to find if there is another (newest) LyX version installed and write it's verion to "latestVersion"
1173 # The keys in the registry are sorted alphabetically, so we dont need to compare, the latest found will be the newest version
1178 EnumRegKey $2 SHCTX "SOFTWARE\LyX" $0
1180 ${LoopUntil} $1 == ""
1182 WriteRegStr SHCTX "SOFTWARE\LyX" "latestVersion" $2
1184 DeleteRegKey /ifempty SHCTX "SOFTWARE\LyX"
1187 Section /o "un.$(UnLyXPreferencesTitle)" un.SecUnPreferences # Deletes user preferences folders for all users (if admin) and registry entry made by LyX to HKCU
1188 Call un.PrepareShellCTX
1189 SetShellVarContext current
1190 # If installed as user, only delete folder and registry key of current user
1191 ${If} $MultiUser.InstallMode == "CurrentUser"
1192 RMDir /r "$APPDATA\LyX${VERSION_MAJOR}.${VERSION_MINOR}"
1194 ${Else} # If installed as admin, things are a little more complicated
1195 ${UnStrStrAdv} $2 $PROFILE "\" "<" ">" "0" "0" "0" # Get everything after the last "\" of $PROFILE ("C:\Users\username") -> $2: "username"
1196 ${UnStrStrAdv} $3 $PROFILE "\" "<" "<" "0" "0" "0" # Get everything before the last "\" of $PROFILE ("C:\Users\username") -> $3: "C:\Users"
1198 FindFirst $1 $0 "$3\*" # Find any folder/file in "C:\Users"
1199 ${DoUntil} ${Errors} # Errors are set while FindFirst/FindNext if the search is completed (there are no more files)
1200 ${UnStrRep} $0 $APPDATA $2 $0 # Replace "username" in $APPDATA ("C:\Users\username\AppData\Roaming") with what was found
1201 ${If} ${FileExists} "$0\LyX${VERSION_MAJOR}.${VERSION_MINOR}\*" # Check if anything exists in the LyX userdir
1202 RMDir /r "$0\LyX${VERSION_MAJOR}.${VERSION_MINOR}"
1209 # Can only delete for current user, because Admin can't access registry of other users
1210 DeleteRegKey HKCU "Software\LyX\LyX${VERSION_MAJOR}.${VERSION_MINOR}"
1211 DeleteRegKey /ifempty HKCU "Software\LyX"
1214 # Uninstaller Section Descriptions
1216 !insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN
1217 !insertmacro MUI_DESCRIPTION_TEXT ${un.SecUnProgramFiles} "$(SecUnProgramFilesDescription)"
1218 !insertmacro MUI_DESCRIPTION_TEXT ${un.SecUnPreferences} "$(SecUnPreferencesDescription)"
1219 !insertmacro MUI_UNFUNCTION_DESCRIPTION_END