summaryrefslogtreecommitdiff
path: root/Contrib
diff options
context:
space:
mode:
authorDidier Raboud <odyx@debian.org>2018-03-31 20:38:45 +0200
committerDidier Raboud <odyx@debian.org>2018-03-31 20:38:45 +0200
commitaebc9db998aa878419eaa4c02e558c8979f38d3b (patch)
tree10d3209c157339e1f409dbe7c8196a3d0f17162e /Contrib
parentfe5eccc476c65971449791086ac97473549b95d2 (diff)
Import Upstream version 3.03
Diffstat (limited to 'Contrib')
-rwxr-xr-xContrib/ExDLL/nsis_tchar.h2
-rwxr-xr-xContrib/InstallOptions/Readme.html30
-rwxr-xr-xContrib/Language files/Afrikaans.nlf2
-rwxr-xr-xContrib/Language files/Albanian.nlf2
-rwxr-xr-xContrib/Language files/Arabic.nlf2
-rwxr-xr-xContrib/Language files/Belarusian.nsh2
-rwxr-xr-xContrib/Language files/Breton.nlf2
-rwxr-xr-xContrib/Language files/Catalan.nlf2
-rwxr-xr-xContrib/Language files/Corsican.nlf2
-rwxr-xr-xContrib/Language files/Esperanto.nlf2
-rwxr-xr-xContrib/Language files/Farsi.nlf2
-rwxr-xr-xContrib/Language files/Finnish.nlf2
-rwxr-xr-xContrib/Language files/Finnish.nsh2
-rwxr-xr-xContrib/Language files/Galician.nlf2
-rwxr-xr-xContrib/Language files/German.nlf2
-rwxr-xr-xContrib/Language files/Hungarian.nlf2
-rwxr-xr-xContrib/Language files/Irish.nlf2
-rwxr-xr-xContrib/Language files/Italian.nlf108
-rwxr-xr-xContrib/Language files/Italian.nsh98
-rwxr-xr-xContrib/Language files/Korean.nlf2
-rwxr-xr-xContrib/Language files/Kurdish.nlf2
-rwxr-xr-xContrib/Language files/Lithuanian.nlf2
-rwxr-xr-xContrib/Language files/Pashto.nlf2
-rwxr-xr-xContrib/Language files/Pashto.nsh2
-rwxr-xr-xContrib/Language files/Portuguese.nlf2
-rwxr-xr-xContrib/Language files/PortugueseBR.nlf2
-rwxr-xr-xContrib/Language files/SConscript1
-rwxr-xr-xContrib/Language files/ScotsGaelic.nlf88
-rwxr-xr-xContrib/Language files/ScotsGaelic.nsh72
-rwxr-xr-xContrib/Language files/Slovenian.nlf2
-rwxr-xr-xContrib/Language files/Tatar.nlf190
-rwxr-xr-xContrib/Language files/Tatar.nsh129
-rwxr-xr-xContrib/Language files/Turkish.nlf2
-rwxr-xr-xContrib/Library/LibraryLocal/LibraryLocal.cpp121
-rwxr-xr-xContrib/Library/LibraryLocal/SConscript1
-rwxr-xr-xContrib/Library/RegTool/RegTool.cpp11
-rwxr-xr-xContrib/MakeLangId/MakeLangId.cpp15
-rwxr-xr-xContrib/Makensisw/utils.cpp1
-rwxr-xr-xContrib/Modern UI 2/License.txt2
-rwxr-xr-xContrib/Modern UI 2/Localization.nsh4
-rwxr-xr-xContrib/Modern UI 2/MUI2.nsh4
-rwxr-xr-xContrib/Modern UI 2/Readme.html114
-rwxr-xr-xContrib/Modern UI/License.txt2
-rwxr-xr-xContrib/Modern UI/Readme.html116
-rwxr-xr-xContrib/Modern UI/System.nsh8
-rwxr-xr-xContrib/MultiUser/MultiUser.nsh2
-rwxr-xr-xContrib/NSIS Menu/SConscript20
-rwxr-xr-xContrib/SubStart/substart.c2
-rwxr-xr-xContrib/System/SConscript2
-rwxr-xr-xContrib/System/Source/Call-amd64.S2
-rwxr-xr-xContrib/System/Source/Call.S6
-rwxr-xr-xContrib/System/Source/System.c314
-rwxr-xr-xContrib/System/Source/System.h32
-rwxr-xr-xContrib/System/System.html95
-rwxr-xr-xContrib/VPatch/Source/GenPat/PatchGenerator.cpp4
-rwxr-xr-xContrib/VPatch/Source/GenPat/main.cpp21
-rwxr-xr-xContrib/nsDialogs/Readme.html574
-rwxr-xr-xContrib/nsDialogs/example.nsi149
-rwxr-xr-xContrib/nsDialogs/nsDialogs.nsh529
-rwxr-xr-xContrib/nsExec/nsExec.txt4
60 files changed, 1857 insertions, 1064 deletions
diff --git a/Contrib/ExDLL/nsis_tchar.h b/Contrib/ExDLL/nsis_tchar.h
index ba05b13..d5d9f2c 100755
--- a/Contrib/ExDLL/nsis_tchar.h
+++ b/Contrib/ExDLL/nsis_tchar.h
@@ -3,7 +3,7 @@
*
* This file is a part of NSIS.
*
- * Copyright (C) 1999-2017 Nullsoft and Contributors
+ * Copyright (C) 1999-2018 Nullsoft and Contributors
*
* This software is provided 'as-is', without any express or implied
* warranty.
diff --git a/Contrib/InstallOptions/Readme.html b/Contrib/InstallOptions/Readme.html
index e7f5dfe..c01bc67 100755
--- a/Contrib/InstallOptions/Readme.html
+++ b/Contrib/InstallOptions/Readme.html
@@ -105,7 +105,7 @@
use the new nsDialogs plug-in instead.</p>
</div>
<div>
- <h2>
+ <h2 id="intro">
Introduction</h2>
<div>
<p>
@@ -119,7 +119,7 @@
The format of INI files is described in a <a href="http://en.wikipedia.org/wiki/Ini_file">
Wikipedia article</a>.</p>
</div>
- <h2>
+ <h2 id="ini">
INI file structure</h2>
<div>
<p>
@@ -649,7 +649,7 @@
</tr>
</table>
</div>
- <h2>
+ <h2 id="nsh">
Header file</h2>
<div>
<p>
@@ -659,10 +659,10 @@
!include InstallOptions.nsh
</pre>
</div>
- <h2>
+ <h2 id="dialog">
Creating dialogs</h2>
<div>
- <h3>
+ <h3 id="extract">
Extracting the INI file</h3>
<div>
<p>
@@ -685,7 +685,7 @@ Function .onInit
FunctionEnd
</pre>
</div>
- <h3>
+ <h3 id="display">
Displaying the dialog</h3>
<div>
<p>
@@ -702,7 +702,7 @@ FunctionEnd
</pre>
</div>
</div>
- <h2>
+ <h2 id="input">
User input</h2>
<div>
<p>
@@ -712,7 +712,7 @@ FunctionEnd
!insertmacro INSTALLOPTIONS_READ $VAR &quot;ioFile.ini&quot; &quot;Field #&quot; &quot;Name&quot;
</pre>
</div>
- <h2>
+ <h2 id="writing">
Writing to INI files</h2>
<div>
<p>
@@ -722,7 +722,7 @@ FunctionEnd
!insertmacro INSTALLOPTIONS_WRITE &quot;ioFile.ini&quot; &quot;Field #&quot; &quot;Name&quot; &quot;Value&quot;
</pre>
</div>
- <h2>
+ <h2 id="escape">
Escaped values</h2>
<div>
<p>
@@ -780,7 +780,7 @@ FunctionEnd
!insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
</pre>
</div>
- <h2>
+ <h2 id="validate">
Input validation</h2>
<div>
<p>
@@ -798,7 +798,7 @@ Function ValidateCustom
FunctionEnd
</pre>
</div>
- <h2>
+ <h2 id="dialogreturn">
Return value</h2>
<div>
After a dialog is created (using display or show), a return value is available:</p>
@@ -816,7 +816,7 @@ FunctionEnd
macro. The return value will be added to the stack, so you can use the Pop command
to get it.</p>
</div>
- <h2>
+ <h2 id="reserve">
Reserve files</h2>
<div>
<p>
@@ -868,7 +868,7 @@ Function FunctionName ;FunctionName defined with Page command
FunctionEnd
</pre>
</div>
- <h2>
+ <h2 id="credits">
Credits</h2>
<div>
<p>
@@ -877,13 +877,13 @@ FunctionEnd
DLL version 2 by Amir Szekely, ORTIM, Joost Verburg<br />
New documentation by Joost Verburg</p>
</div>
- <h2>
+ <h2 id="license">
License</h2>
<div>
<pre>
Original version Copyright &copy; 2001 Michael Bishop
DLL version 1 Copyright &copy; 2001-2002 Nullsoft, Inc., ORTIM
-DLL version 2 Copyright &copy; 2003-2017 Amir Szekely, Joost Verburg, Dave Laundon
+DLL version 2 Copyright &copy; 2003-2018 Amir Szekely, Joost Verburg, Dave Laundon
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/Contrib/Language files/Afrikaans.nlf b/Contrib/Language files/Afrikaans.nlf
index 922ef48..0ebfb74 100755
--- a/Contrib/Language files/Afrikaans.nlf
+++ b/Contrib/Language files/Afrikaans.nlf
@@ -11,7 +11,7 @@ NLF v6
-
# Translation by Friedel Wolff
# ^Branding
-Nullsoft Installeerstelsel %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) Installasie
# ^UninstallCaption
diff --git a/Contrib/Language files/Albanian.nlf b/Contrib/Language files/Albanian.nlf
index acb0e87..83df8b4 100755
--- a/Contrib/Language files/Albanian.nlf
+++ b/Contrib/Language files/Albanian.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Përkthimi nga Besnik Bleta, besnik@programeshqip.org
# ^Branding
-Sistemi Nullsoft për Instalime %s
+Nullsoft Install System %s
# ^SetupCaption
Rregullimi i $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Arabic.nlf b/Contrib/Language files/Arabic.nlf
index 9b876df..8157173 100755
--- a/Contrib/Language files/Arabic.nlf
+++ b/Contrib/Language files/Arabic.nlf
@@ -11,7 +11,7 @@ NLF v6
RTL
# Translation by asdfuae@msn.com, updated by Rami Kattan
# ^Branding
-نظام التنصيب نلسوفت %s
+Nullsoft Install System %s
# ^SetupCaption
تنصيب $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Belarusian.nsh b/Contrib/Language files/Belarusian.nsh
index 25d2038..91c83fe 100755
--- a/Contrib/Language files/Belarusian.nsh
+++ b/Contrib/Language files/Belarusian.nsh
@@ -1,7 +1,7 @@
;Language: Belarusian (1059)
;Translated by Sitnikov Vjacheslav [ glory_man@tut.by ]
-!insertmacro LANGFILE "Belarusian" = "Беларуская" "Byelorussian"
+!insertmacro LANGFILE "Belarusian" = "Беларуская" "Bielaruskaja" ; Biełaruskaja
!ifdef MUI_WELCOMEPAGE
${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Вас вiтае майстар ўстаноўкі $(^NameDA)"
diff --git a/Contrib/Language files/Breton.nlf b/Contrib/Language files/Breton.nlf
index 43251f3..1423026 100755
--- a/Contrib/Language files/Breton.nlf
+++ b/Contrib/Language files/Breton.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation by KAD-Korvigelloù an Drouizig (drouizig@drouizig.org)
# ^Branding
-Reizhiad staliañ Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Staliañ ha kefluniañ $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Catalan.nlf b/Contrib/Language files/Catalan.nlf
index cfd3368..8328c26 100755
--- a/Contrib/Language files/Catalan.nlf
+++ b/Contrib/Language files/Catalan.nlf
@@ -12,7 +12,7 @@ NLF v6
# Translation by falanko
# Corrections by Toni Hermoso Pulido
# ^Branding
-Sistema d'instal·lació de Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Instal·lació de l'aplicació $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Corsican.nlf b/Contrib/Language files/Corsican.nlf
index 029b672..161427d 100755
--- a/Contrib/Language files/Corsican.nlf
+++ b/Contrib/Language files/Corsican.nlf
@@ -13,7 +13,7 @@ NLF v6
# Created on April 24th, 2016 for version 3.0rc1
# Traduzzione corsa creata da Patriccollu di Santa Maria è Sichè
# ^Branding
-Sistema d'Installazione Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Assistente d'Installazione di $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Esperanto.nlf b/Contrib/Language files/Esperanto.nlf
index 3e14264..f2f9e82 100755
--- a/Contrib/Language files/Esperanto.nlf
+++ b/Contrib/Language files/Esperanto.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation v4.0.3 by Felipe Castro <fefcas@gmail.com>
# ^Branding
-Instalada Sistemo de Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Instalado de $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Farsi.nlf b/Contrib/Language files/Farsi.nlf
index 6c04648..b048e44 100755
--- a/Contrib/Language files/Farsi.nlf
+++ b/Contrib/Language files/Farsi.nlf
@@ -12,7 +12,7 @@ NLF v6
RTL
# Translation By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com, Elnaz Sarbar <elnaz@farsiweb.info>
# ^Branding
-سیستم نصب نال‌سافت %s
+Nullsoft Install System %s
# ^SetupCaption
نصب $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Finnish.nlf b/Contrib/Language files/Finnish.nlf
index e395fbb..b9fdf3b 100755
--- a/Contrib/Language files/Finnish.nlf
+++ b/Contrib/Language files/Finnish.nlf
@@ -14,7 +14,7 @@ NLF v6
# Corrections by the Mozilla.fi crew
# Upd 11/08 by WTLib Team
# ^Branding
-Nullsoftin asennusjärjestelmä %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) -ohjelman asennus
# ^UninstallCaption
diff --git a/Contrib/Language files/Finnish.nsh b/Contrib/Language files/Finnish.nsh
index 6513139..d1c1c32 100755
--- a/Contrib/Language files/Finnish.nsh
+++ b/Contrib/Language files/Finnish.nsh
@@ -60,7 +60,7 @@
${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Valitse kansio, johon haluat asentaa $(^NameDA) -ohjelman."
!endif
-!ifdef MUI_UNDIRECTORYSPAGE
+!ifdef MUI_UNDIRECTORYPAGE
${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Valitse kansio, josta poistetaan"
${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Valitse kansio, josta $(^NameDA) poistetaan."
!endif
diff --git a/Contrib/Language files/Galician.nlf b/Contrib/Language files/Galician.nlf
index 3c2bc86..1d1d4f8 100755
--- a/Contrib/Language files/Galician.nlf
+++ b/Contrib/Language files/Galician.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation v 1.0.0 by Ramon Flores <fa2ramon@usc.es>
# ^Branding
-Sistema de Instalación Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Instalación de $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/German.nlf b/Contrib/Language files/German.nlf
index 4d4c77e..7e70cf0 100755
--- a/Contrib/Language files/German.nlf
+++ b/Contrib/Language files/German.nlf
@@ -11,7 +11,7 @@ NLF v6
-
# Translation by L.King, changes by R. Bisswanger, Tim Kosse, Frederik Schwarzer
# ^Branding
-Nullsoft Installationssystem %s
+Nullsoft Install System %s
# ^SetupCaption
Installation von $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Hungarian.nlf b/Contrib/Language files/Hungarian.nlf
index f234a6d..38e92e9 100755
--- a/Contrib/Language files/Hungarian.nlf
+++ b/Contrib/Language files/Hungarian.nlf
@@ -12,7 +12,7 @@ NLF v6
# Translation by Soft-Trans Bt. (V2)
# Translation by Orfanik Kft. (V3-V6)
# ^Branding
-Nullsoft Telepítőrendszer %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) Telepítő
# ^UninstallCaption
diff --git a/Contrib/Language files/Irish.nlf b/Contrib/Language files/Irish.nlf
index fba63cd..26a0825 100755
--- a/Contrib/Language files/Irish.nlf
+++ b/Contrib/Language files/Irish.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation by Kevin P. Scannell < scannell at slu dot edu >
# ^Branding
-Córas Suiteála Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Socrú $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Italian.nlf b/Contrib/Language files/Italian.nlf
index 4c58bb6..6a289b3 100755
--- a/Contrib/Language files/Italian.nlf
+++ b/Contrib/Language files/Italian.nlf
@@ -11,33 +11,33 @@ NLF v6
-
# Translation orginally started by Orfanik - http://www.orfanik.hu
# Updated v2 to v6 by Alessandro Staltari < staltari (a) geocities.com >
-# corrected by < mdalco@gmail.com >
+# corrected by < mdalco@gmail.com > and Bovirus
# ^Branding
-Sistema di installazione Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Installazione di $(^Name)
# ^UninstallCaption
Disinstallazione di $(^Name)
# ^LicenseSubCaption
-: Licenza d'uso
+: Accordo di licenza
# ^ComponentsSubCaption
-: Opzioni di installazione
+: Opzioni installazione
# ^DirSubCaption
-: Cartella di installazione
+: Cartella installazione
# ^InstallingSubCaption
-: Installazione dei file
+: Installazione
# ^CompletedSubCaption
-: Completata
+: Installazione completata
# ^UnComponentsSubCaption
-: Opzioni di disinstallazione
+: Opzioni disinstallazione
# ^UnDirSubCaption
-: Cartella di disinstallazione
+: Cartella disinstallazione
# ^ConfirmSubCaption
: Conferma
# ^UninstallingSubCaption
-: Rimozione dei file
+: Disinstallazione
# ^UnCompletedSubCaption
-: Completata
+: Disisntallazione completata
# ^BackBtn
< &Indietro
# ^NextBtn
@@ -59,71 +59,71 @@ Annulla
# ^BrowseBtn
S&foglia...
# ^ShowDetailsBtn
-Mostra &dettagli
+Visualizza &dettagli
# ^ClickNext
-Per proseguire, scegliere Avanti.
+Per proseguire, seleziona 'Avanti'.
# ^ClickInstall
-Per avviare l'installazione, selezionare Installa.
+Per avviare l'installazione, seleziona 'Installa'.
# ^ClickUninstall
-Per avviare la disinstallazione, selezionare Disinstalla.
+Per avviare la disinstallazione, seleziona 'Disinstalla'.
# ^Name
Nome
# ^Completed
-Completata
+Installazione completata
# ^LicenseText
-Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano le condizioni di licenza, selezionare Accetto.
+Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti le condizioni della licenza, seleziona 'Accetto'.
# ^LicenseTextCB
-Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK
+Leggi licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK
# ^LicesnseTextRB
-Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK
+Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK
# ^UnLicenseText
-Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare Accetto. $_CLICK
+Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona 'Accetto'. $_CLICK
# ^UnLicenseTextCB
-Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK
+Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK
# ^UnLicesnseTextRB
-Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK
+Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK
# ^Custom
Personalizzata
# ^ComponentsText
-Selezionare i componenti che si desidera installare.
+Seleziona componenti da installare.
# ^ComponentsSubText1
-Selezionare il tipo d'installazione:
+Seleziona tipo installazione:
# ^ComponentsSubText2_NoInstTypes
-Selezionare i componenti da installare:
+Seleziona componenti da installare:
# ^ComponentsSubText2
-Oppure, selezionare i componenti opzionali che si desidera installare:
+Oppure, seleziona componenti opzionali da installare:
# ^UnComponentsText
-Selezionare i componenti che si desidera disinstallare.
+Seleziona componenti da disinstallare.
# ^UnComponentsSubText1
-Selezionare il tipo di disinstallazione:
+Seleziona tipo disinstallazione:
# ^UnComponentsSubText2_NoInstTypes
-Selezionare i componenti da disinstallare:
+Seleziona componenti da disinstallare:
# ^UnComponentsSubText2
-Oppure, selezionare i componenti opzionali che si desidera disinstallare :
+Oppure, seleziona componenti opzionali da disinstallare :
# ^DirText
-Questa procedura installerà $(^NameDA) nella cartella seguente. Per installare in una cartella diversa, selezionare Sfoglia e sceglierne un'altra. $_CLICK
+Questa procedura installerà $(^NameDA) in questa cartella.\r\nPer installare in una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK
# ^DirSubText
-Cartella di destinazione
+Cartella destinazione
# ^DirBrowseText
-Selezionare la cartella dove installare $(^NameDA):
+Seleziona la cartella dove installare $(^NameDA):
# ^UnDirText
-Questa procedura disinstallerà $(^NameDA) nella cartella seguente. Per disinstallare da una cartella diversa, selezionare Sfoglia e sceglierene un'altra. $_CLICK
+Questa procedura disinstallerà $(^NameDA) da questa cartella.\r\nPer disinstallare da una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK
# ^UnDirSubText
""
# ^UnDirBrowseText
-Selezionare la cartella dalla quale disinstallare $(^NameDA):
+Seleziona la cartella dalla quale disinstallare $(^NameDA):
# ^SpaceAvailable
"Spazio disponibile: "
# ^SpaceRequired
"Spazio richiesto: "
# ^UninstallingText
-$(^NameDA) verrà disinstallato dalla cartella seguente. $_CLICK
+$(^NameDA) verrà disinstallato da questa cartella.\r\n$_CLICK
# ^UninstallingSubText
Rimozione da:
# ^FileError
-Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona Termina per interrompere l'installazione,\r\nsu Riprova per ritentare, oppure\r\nsu Ignora per saltare questo file.
+Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Termina' per interrompere l'installazione,\r\n'Riprova' per ritentare, oppure\r\n'Ignora' per saltare questo file.
# ^FileError_NoIgnore
-Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona Riprova per ritentare, oppure\r\nsu Termina per interrompere l'installazione
+Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Riprova' per ritentare, oppure\r\n'Termina' per interrompere l'installazione
# ^CantWrite
"Impossibile scrivere: "
# ^CopyFailed
@@ -131,57 +131,57 @@ Copia fallita
# ^CopyTo
"Copia in "
# ^Registering
-"Registrazione in corso: "
+"Registrazione di: "
# ^Unregistering
-"Deregistrazione in corso: "
+"Deregistrazione di: "
# ^SymbolNotFound
"Impossibile trovare il simbolo: "
# ^CouldNotLoad
"Impossibile caricare: "
# ^CreateFolder
-"Crea cartella: "
+"Creazione cartella: "
# ^CreateShortcut
-"Crea collegamento: "
+"Creazione collegamento: "
# ^CreatedUninstaller
-"Creato il programma di disinstallazione: "
+"Creazione programma disinstallazione: "
# ^Delete
-"Elimina file: "
+"Eliminazione file: "
# ^DeleteOnReboot
"Elimina al riavvio: "
# ^ErrorCreatingShortcut
"Errore nella creazione del collegamento: "
# ^ErrorCreating
-"Errore nella creazione: "
+"Errore nella creazione di: "
# ^ErrorDecompressing
-Errore nella decompressione dei dati! Programma di installazione corrotto?
+Errore nella decompressione dei dati! Probabile programma di installazione corrotto.
# ^ErrorRegistering
Errore nella registrazione della DLL
# ^ExecShell
"ExecShell: "
# ^Exec
-"Esecuzione: "
+"Esecuzione di: "
# ^Extract
-"Estrazione: "
+"Estrazione di: "
# ^ErrorWriting
-"Estrazione: errore nella scrittura sul file "
+"Estrazione: errore nella scrittura nel file "
# ^InvalidOpcode
Programma di installazione corrotto: opcode non valido
# ^NoOLE
"Nessuna OLE per: "
# ^OutputFolder
-"Cartella di destinazione: "
+"Cartella destinazione: "
# ^RemoveFolder
-"Rimuovi cartella: "
+"Rimozione cartella: "
# ^RenameOnReboot
-"Rinomina al riavvio: "
+"Al riavvio rinomina: "
# ^Rename
Rinomina
# ^Skipped
"Saltato: "
# ^CopyDetails
-Copia i dettagli negli appunti
+Copia i dettagli negli Appunti
# ^LogInstall
-Log del processo di installazione
+Registro eventi processo installazione
# ^Byte
B
# ^Kilo
diff --git a/Contrib/Language files/Italian.nsh b/Contrib/Language files/Italian.nsh
index 2792d6c..0b1f81e 100755
--- a/Contrib/Language files/Italian.nsh
+++ b/Contrib/Language files/Italian.nsh
@@ -6,112 +6,112 @@
!insertmacro LANGFILE "Italian" = "Italiano" =
!ifdef MUI_WELCOMEPAGE
- ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvenuti nel programma di installazione di $(^NameDA)"
- ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Questo programma installerà $(^NameDA) nel vostro computer.$\r$\n$\r$\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetterà al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\r$\n$\r$\n$_CLICK"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Installazione di $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Questo programma installerà $(^NameDA) nel computer.$\r$\n$\r$\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetterà al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\r$\n$\r$\n$_CLICK"
!endif
!ifdef MUI_UNWELCOMEPAGE
- ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvenuti nella procedura guidata di disinstallazione di $(^NameDA)"
- ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Questa procedura vi guiderà nella disinstallazione di $(^NameDA).$\r$\n$\r$\nPrima di iniziare la disinstallazione, assicuratevi che $(^Name) non sia in esecuzione.$\r$\n$\r$\n$_CLICK"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Disinstallazione di $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Questa programma ti guiderà nella disinstallazione di $(^NameDA).$\r$\n$\r$\nPrima di iniziare la disinstallazione, assicurati che $(^Name) non sia in esecuzione.$\r$\n$\r$\n$_CLICK"
!endif
!ifdef MUI_LICENSEPAGE
- ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenza d'uso"
- ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prego leggere le condizioni della licenza d'uso prima di installare $(^NameDA)."
- ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se si accettano i termini della licenza d'uso scegliere Accetto per continuare. È necessario accettare i termini della licenza d'uso per installare $(^NameDA)."
- ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se si accettano i termini della licenza d'uso, selezionare la casella sottostante. È necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK"
- ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante. È necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Accordo di licenza"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK"
!endif
!ifdef MUI_UNLICENSEPAGE
- ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenza d'uso"
- ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prego leggere le condizioni della licenza d'uso prima di disinstallare $(^NameDA)."
- ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se si accettano i termini della licenza d'uso scegliere Accetto per continuare. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA)."
- ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se si accettano i termini della licenza d'uso, selezionare la casella sottostante. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK"
- ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Accordo di licenza"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK"
!endif
!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
- ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premere Pag giù per vedere il resto della licenza d'uso."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premi 'PagGiù' per visualizzare il resto dell'accordo di licenza."
!endif
!ifdef MUI_COMPONENTSPAGE
- ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selezione dei componenti"
- ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Selezionare i componenti di $(^NameDA) che si desidera installare."
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selezione componenti"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da installare."
!endif
!ifdef MUI_UNCOMPONENTSPAGE
${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selezione componenti"
- ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Scegliere i componenti di $(^NameDA) che si desidera disinstallare."
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da disinstallare."
!endif
!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrizione"
!ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
- ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posizionare il puntatore del mouse sul componente per vederne la descrizione."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posiziona il puntatore del mouse sul componente per visualizzare la relativa descrizione."
!else
- ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selezionare un componente per vederne la descrizione."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleziona un componente per visualizzare la relativa descrizione."
!endif
!endif
!ifdef MUI_DIRECTORYPAGE
- ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Scelta della cartella di installazione"
- ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Scegliere la cartella nella quale installare $(^NameDA)."
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selezione cartella installazione"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Seleziona la cartella nella quale installare $(^NameDA)."
!endif
!ifdef MUI_UNDIRECTORYPAGE
- ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Scelta della cartella da cui disinstallare"
- ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Scegliere la cartella dalla quale disinstallare $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selezione cartella da cui disinstallare"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Seleziona la cartella dalla quale disinstallare $(^NameDA)."
!endif
!ifdef MUI_INSTFILESPAGE
- ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione in corso"
- ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prego attendere mentre $(^NameDA) viene installato."
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Attendi il completamento dell'installazione di $(^NameDA)."
${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione completata"
- ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installazione è stata completata con successo."
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installazione è stata completata correttamente."
${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta"
${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installazione non è stata completata correttamente."
!endif
!ifdef MUI_UNINSTFILESPAGE
- ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione in corso"
- ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prego attendere mentre $(^NameDA) viene disinstallato."
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Attendi il completamento della disinstallazione di $(^NameDA)."
${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione completata"
- ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La disinstallazione è stata completata con successo."
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La disinstallazione è stata completata correttamente."
${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta"
${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La disintallazione non è stata completata correttamente."
!endif
!ifdef MUI_FINISHPAGE
- ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completamento dell'installazione di $(^NameDA)."
- ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) è stato installato sul vostro computer.$\r$\n$\r$\nScegliere Fine per chiudere il programma di installazione."
- ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installazione di $(^NameDA) completata."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) è stato installato.$\r$\n$\r$\nScegli 'Chiudi' per chiudere il programma di installazione."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Per completare l'installazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?"
!endif
!ifdef MUI_UNFINISHPAGE
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completamento della disinstallazione di $(^NameDA)"
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) è stato disinstallato dal computer.$\r$\n$\r$\nSelezionare Fine per terminare questa procedura."
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Disinstallazione di $(^NameDA) completata."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) è stato disinstallato.$\r$\n$\r$\nSeleziona 'Chiudi' per chiudere questa procedura."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Per completare la disinstallazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?"
!endif
!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
- ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Riavvia adesso"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Riavvia ora"
${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Preferisco riavviarlo manualmente più tardi"
${LangFileString} MUI_TEXT_FINISH_RUN "Esegui $(^NameDA)"
- ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Mostra il file Readme"
- ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fine"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Visualizza il file Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Chiudi"
!endif
!ifdef MUI_STARTMENUPAGE
- ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Scelta della cartella del menu Start"
- ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Scegliere una cartella del menu Start per i collegamenti del programma."
- ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Scegliere la cartella del menu Start in cui verranno creati i collegamenti del programma. È possibile inserire un nome per creare una nuova cartella."
- ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non creare i collegamenti al programma."
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selezione cartella menu Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Seleziona la cartella del menu Start in cui creare i collegamenti del programma."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleziona la cartella del menu Start in cui verranno creati i collegamenti del programma. È possibile inserire un nome per creare una nuova cartella."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non creare i collegamenti del programma."
!endif
!ifdef MUI_UNCONFIRMPAGE
- ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstalla $(^NameDA)"
- ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Rimuove $(^NameDA) dal computer."
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstallazione"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Disinstalla il programma $(^NameDA)."
!endif
!ifdef MUI_ABORTWARNING
@@ -123,9 +123,9 @@
!endif
!ifdef MULTIUSER_INSTALLMODEPAGE
- ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Scelta degli Utenti"
- ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Scegliete per quali utenti volete installare $(^NameDA)."
- ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Scegliete se volete installare $(^NameDA) solo per voi o per tutti gli utenti di questo sistema. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Configurazione profilo utenti"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Seleziona per quali utenti vuoi installare $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleziona se vuoi installare $(^NameDA) solo per questo utente o per tutti gli utenti di questo sistema. $(^ClickNext)"
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installazione per tutti gli utenti"
- ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installazione personale"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installazione per il singolo utente"
!endif
diff --git a/Contrib/Language files/Korean.nlf b/Contrib/Language files/Korean.nlf
index 42f0180..6a04a97 100755
--- a/Contrib/Language files/Korean.nlf
+++ b/Contrib/Language files/Korean.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation by dTomoyo dtomoyo@empal.com ( ~V2.0 BETA2 ) / By hardkoder@gmail.com (V2.0 BETA3 ~ )
# ^Branding
-널소프트 설치 시스템 %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) 설치
# ^UninstallCaption
diff --git a/Contrib/Language files/Kurdish.nlf b/Contrib/Language files/Kurdish.nlf
index 2790dee..94070c5 100755
--- a/Contrib/Language files/Kurdish.nlf
+++ b/Contrib/Language files/Kurdish.nlf
@@ -11,7 +11,7 @@ NLF v6
-
# Translation by Rêzan Tovjîn(chagy) (retovjin@hotmail.com.com)
# ^Branding
-Nullsoft Pergala Sazkirinê %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) Sazkirin
# ^UninstallCaption
diff --git a/Contrib/Language files/Lithuanian.nlf b/Contrib/Language files/Lithuanian.nlf
index 19dac52..8a489a7 100755
--- a/Contrib/Language files/Lithuanian.nlf
+++ b/Contrib/Language files/Lithuanian.nlf
@@ -12,7 +12,7 @@ NLF v6
# Translation by Vytautas Krivickas (Vytautas)
# Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.03.24
# ^Branding
-Nullsoft instaliavimo sistema %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) Įdiegimas
# ^UninstallCaption
diff --git a/Contrib/Language files/Pashto.nlf b/Contrib/Language files/Pashto.nlf
index bb4fbda..054bf30 100755
--- a/Contrib/Language files/Pashto.nlf
+++ b/Contrib/Language files/Pashto.nlf
@@ -12,7 +12,7 @@ NLF v6
RTL
# Translation by Pakhtosoft (www.pakhtosoft.com)
# ^Branding
-%s نلسافټ لګاو غونډال
+Nullsoft Install System %s
# ^SetupCaption
امسته $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Pashto.nsh b/Contrib/Language files/Pashto.nsh
index d1055c1..d6d9811 100755
--- a/Contrib/Language files/Pashto.nsh
+++ b/Contrib/Language files/Pashto.nsh
@@ -38,7 +38,7 @@
${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE ".کومې ځانګړتياوې چې لګول غواړﺉ، خوښ يې کړﺉ $(^NameDA) د"
!endif
-!ifdef MUI_UNCOMPONENETSPAGE
+!ifdef MUI_UNCOMPONENTSPAGE
${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "رغتوکي خوښ کړﺉ"
${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE ".کومې ځانګړتياوې چې نالګول غواړﺉ، خوښ يې کړﺉ $(^NameDA) د"
!endif
diff --git a/Contrib/Language files/Portuguese.nlf b/Contrib/Language files/Portuguese.nlf
index 64bafa9..82da2e8 100755
--- a/Contrib/Language files/Portuguese.nlf
+++ b/Contrib/Language files/Portuguese.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation v4.0.3 by DragonSoull <dragonsoull@madalien.tk> with help from Dre` - Updated by Ramon
# ^Branding
-Sistema de Instalação Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Instalação de $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/PortugueseBR.nlf b/Contrib/Language files/PortugueseBR.nlf
index 88c3fc0..17d3809 100755
--- a/Contrib/Language files/PortugueseBR.nlf
+++ b/Contrib/Language files/PortugueseBR.nlf
@@ -12,7 +12,7 @@ NLF v6
-
# Translation by Diego Pedroso and Felipe, reviewed by Georger Araújo
# ^Branding
-Sistema de Instalação Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Instalação do $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/SConscript b/Contrib/Language files/SConscript
index c0079a5..242d45a 100755
--- a/Contrib/Language files/SConscript
+++ b/Contrib/Language files/SConscript
@@ -57,6 +57,7 @@ languages = Split("""
Spanish
SpanishInternational
Swedish
+ Tatar
Thai
TradChinese
Turkish
diff --git a/Contrib/Language files/ScotsGaelic.nlf b/Contrib/Language files/ScotsGaelic.nlf
index ea3a470..60c3aae 100755
--- a/Contrib/Language files/ScotsGaelic.nlf
+++ b/Contrib/Language files/ScotsGaelic.nlf
@@ -12,11 +12,11 @@ NLF v6
-
# Translation by GunChleoc
# ^Branding
-Siostam stàlaidh %s aig Nullsoft
+Nullsoft Install System %s
# ^SetupCaption
-A' stàladh $(^Name)
+A’ stàladh $(^Name)
# ^UninstallCaption
-A' dì-stàladh $(^Name)
+A’ dì-stàladh $(^Name)
# ^LicenseSubCaption
: Aonta ceadachais
# ^ComponentsSubCaption
@@ -24,9 +24,9 @@ A' dì-stàladh $(^Name)
# ^DirSubCaption
: Pasgan an stàlaidh
# ^InstallingSubCaption
-: Ga stàladh
+: ’Ga stàladh
# ^CompletedSubCaption
-: Coileanta
+: Deiseil
# ^UnComponentsSubCaption
: Roghainnean an dì-stàlaidh
# ^UnDirSubCaption
@@ -34,9 +34,9 @@ A' dì-stàladh $(^Name)
# ^ConfirmSubCaption
: Dearbhadh
# ^UninstallingSubCaption
-: Ga dì-stàladh
+: ’Ga dhì-stàladh
# ^UnCompletedSubCaption
-: Coileanta
+: Deiseil
# ^BackBtn
< Air ai&s
# ^NextBtn
@@ -56,35 +56,35 @@ Sguir dheth
# ^CloseBtn
&Dùin
# ^BrowseBtn
-&Rùraich...
+&Rùraich…
# ^ShowDetailsBtn
-Seall &mion-fhiosrachadh
+&Mion-fhiosrachadh
# ^ClickNext
-Briog air "Air adhart" gus leantainn air adhart.
+Briog air “Air adhart” gus leantainn air adhart.
# ^ClickInstall
-Briog air "Stàlaich" gus tòiseachadh air an stàladh.
+Briog air “Stàlaich” gus tòiseachadh air an stàladh.
# ^ClickUninstall
-Briog air "Dì-stàlaich" gus tòiseachadh air an dì-stàladh.
+Briog air “Dì-stàlaich” gus tòiseachadh air an dì-stàladh.
# ^Name
Ainm
# ^Completed
Coileanta
# ^LicenseText
-Feuch an toir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm aig an aonta, briog air "Gabhaidh mi ris".
+Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, briog air “Gabhaidh mi ris”.
# ^LicenseTextCB
-Feuch an toir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm an aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK
+Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK
# ^LicenseTextRB
-Feuch an toir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm an aonta, tagh a' chiad roghainn gu h-ìosal. $_CLICK
+Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK
# ^UnLicenseText
-Feuch an toir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm an aonta, Briog air "Gabhaidh mi ris".
+Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, Briog air “Gabhaidh mi ris”.
# ^UnLicenseTextCB
-Feuch an toir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm an aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK
+Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK
# ^UnLicenseTextRB
-Feuch an toir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm an aonta, tagh a' chiad roghainn gu h-ìosal. $_CLICK
+Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK
# ^Custom
Gnàthaichte
# ^ComponentsText
-Thoir cromag sa bhogsa leis na co-phàirtean a tha thu airson stàladh is thoir air falbh i leis na co-phàirtean nach eil thu airson stàladh. $_CLICK
+Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean nach eil thu ag iarraidh. $_CLICK
# ^ComponentsSubText1
Tagh an seòrsa dhen stàladh:
# ^ComponentsSubText2_NoInstTypes
@@ -92,7 +92,7 @@ Tagh na co-phàirtean a tha thu airson stàladh:
# ^ComponentsSubText2
No tagh na co-phàirtean roghainneil a tha thu airson stàladh:
# ^UnComponentsText
-Thoir cromag sa bhogsa leis na co-phàirtean a tha thu airson dì-stàladh is thoir air falbh i leis na co-phàirtean a tha thu airson cumail. $_CLICK
+Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson dì-stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean a tha thu airson cumail. $_CLICK
# ^UnComponentsSubText1
Tagh an seòrsa dhen dì-stàladh:
# ^UnComponentsSubText2_NoInstTypes
@@ -100,43 +100,43 @@ Tagh na co-phàirtean a tha thu airson dì-stàladh:
# ^UnComponentsSubText2
No tagh na co-phàirtean roghainneil a tha thu airson dì-stàladh:
# ^DirText
-Thèid $(^NameDA) a stàladh sa phasgan seo. Gus stàladh ann am pasgan eile, briog air "Rùraich" is tagh pasgan eile. $_CLICK
+Thèid $(^NameDA) a stàladh sa phasgan seo. Gus stàladh ann am pasgan eile, briog air “Rùraich” is tagh pasgan eile. $_CLICK
# ^DirSubText
Pasgan-uidhe
# ^DirBrowseText
-Tagh am pasgan sa thèid $(^NameDA) a stàladh:
+Tagh am pasgan san dèid $(^NameDA) a stàladh:
# ^UnDirText
-Thèid $(^NameDA) a dhì-stàladh on phasgan seo. Gus dì-stàladh o phasgan eile, briog air "Rùraich" is tagh pasgan eile. $_CLICK
+Thèid $(^NameDA) a dhì-stàladh on phasgan seo. Gus dì-stàladh o phasgan eile, briog air “Rùraich” is tagh pasgan eile. $_CLICK
# ^UnDirSubText
""
# ^UnDirBrowseText
Tagh am pasgan on a tha thu airson $(^NameDA) a dhì-stàladh:
# ^SpaceAvailable
-"Rum ri làimh: "
+"Àite ri fhaighinn: "
# ^SpaceRequired
-"Rum air a bheil feum: "
+"Àite air a bheil feum: "
# ^UninstallingText
Thèid $(^NameDA) a dhì-stàladh on phasgan seo. $_CLICK
# ^UninstallingSubText
-Ga dhì-stàladh o:
+’Ga dhì-stàladh o:
# ^FileError
-Thachair mearachd a' fosgladh an fhaidhle airson sgrìobhadh: \r\n\r\n$0\r\n\r\nBriog air "Sguir dheth" gus sgur dhen stàladh, air\r\n"Feuch ris a-rithist" gus feuchainn ris a-rithist no air\r\n"Leig seachad" gus gearr leum thairis air an fhaidhle seo.
+Thachair mearachd a’ fosgladh an fhaidhle a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Sguir dheth” gus sgur dhen stàladh, air\r\n“Feuch ris a-rithist” gus feuchainn ris a-rithist no air\r\n“Leig seachad” gus leum a ghearradh thairis air an fhaidhle seo.
# ^FileError_NoIgnore
-Thachair mearachd a' fosgladh an fhaidhle seo airson sgrìobhadh: \r\n\r\n$0\r\n\r\nBriog air "Feuch ris a-rithist" gus feuchainn ris a-rithist no air\r\n"Sguir dheth" gus sgur dhen stàladh.
+Thachair mearachd a’ fosgladh an fhaidhle seo a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Feuch ris a-rithist” gus feuchainn ris a-rithist no air\r\n“Sguir dheth” gus sgur dhen stàladh.
# ^CantWrite
-"Cha ghabh sgrìobhadh: "
+"Cha ghabh sgrìobhadh ann: "
# ^CopyFailed
-Dh'fhàillig le lethbhreac a dhèanamh
+Cha deach leinn lethbhreac dheth a dhèanamh
# ^CopyTo
-"Cuir lethbhreac an-seo: "
+"Cuir lethbhreac gu "
# ^Registering
-"A' clàradh: "
+"A’ clàradh: "
# ^Unregistering
-"A' neo-chlàradh: "
+"A’ neo-chlàradh: "
# ^SymbolNotFound
-"Cha deach samhla a lorg: "
+"Cha deach an samhla a lorg: "
# ^CouldNotLoad
-"Cha b' urrainn dhuinn luchdadh: "
+"Cha b’ urrainn dhuinn a luchdadh: "
# ^CreateFolder
"Cruthaich pasgan: "
# ^CreateShortcut
@@ -146,13 +146,13 @@ Dh'fhàillig le lethbhreac a dhèanamh
# ^Delete
"Sguab às dhan fhaidhle: "
# ^DeleteOnReboot
-"Sguab às le ath-thòiseachadh: "
+"Sguab às leis an ath-thòiseachadh: "
# ^ErrorCreatingShortcut
-"Mearachd le cruthachadh an ath-ghoirid: "
+"Mearachd le cruthachadh na h-ath-ghoirid: "
# ^ErrorCreating
"Mearachd le cruthachadh: "
# ^ErrorDecompressing
-Thachair mearachd a' dì-dhùmhlachadh an dàta! Stàlaichear coirbte, 's dòcha?
+Thachair mearachd a’ dì-dhùmhlachadh an dàta! ’S dòcha gu bheil an t-inneal-stàlaidh coirbte.
# ^ErrorRegistering
Mearachd le clàradh DLL
# ^ExecShell
@@ -162,25 +162,25 @@ Mearachd le clàradh DLL
# ^Extract
"Dì-dhùmhlaich: "
# ^ErrorWriting
-"Dì-dhùmhlachadh: mearachd a' sgrìobhadh gu faidhle "
+"Dì-dhùmhlachadh: mearachd a’ sgrìobhadh gu faidhle "
# ^InvalidOpcode
Stàlaichear coirbte: opcode mì-dhligheach
# ^NoOLE
-"OLE a dhìth airson: "
+"Chan eil OLE ann airson: "
# ^OutputFolder
-"Pasgan às-chur: "
+"Pasgan às-chuir: "
# ^RemoveFolder
"Thoir pasgan air falbh: "
# ^RenameOnReboot
-"Cuir ainm ùr air le ath-thòiseachadh: "
+"Cuir ainm ùr air leis an ath-thòiseachadh: "
# ^Rename
"Cuir ainm ùr air: "
# ^Skipped
-"Air gearr leum: "
+"Air leum a ghearradh: "
# ^CopyDetails
Cuir lethbhreac dhen mhion-fhiosrachadh san stòr-bhòrd
# ^LogInstall
-Dèan loga air an stàladh
+Dèan loga dhen stàladh
# ^Byte
B
# ^Kilo
diff --git a/Contrib/Language files/ScotsGaelic.nsh b/Contrib/Language files/ScotsGaelic.nsh
index a2fa54d..0c0be44 100755
--- a/Contrib/Language files/ScotsGaelic.nsh
+++ b/Contrib/Language files/ScotsGaelic.nsh
@@ -4,29 +4,29 @@
!insertmacro LANGFILE "ScotsGaelic" "Scottish Gaelic" "Gàidhlig" "Gaidhlig"
!ifdef MUI_WELCOMEPAGE
- ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fàilte dhan draoidh stàlaidh aig $(^NameDA)"
- ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Stiùiridh an draoidh seo tron stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMholamaid gun dùin thu a h-uile aplacaid eile mus tòisich thu air an stàladh. Mar sin, 's urrainn dhuinn faidhlichean an t-siostam iomchaidh ùrachadh gun fheum air ath-thòiseachadh a' choimpiutair agad.$\r$\n$\r$\n$_CLICK"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fàilte gu stàladh $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMholamaid gun dùin thu a h-uile aplacaid eile mus tòisich thu air an stàladh. Mar sin, ’s urrainn dhuinn faidhlichean iomchaidh an t-siostaim ùrachadh gun fheum air ath-thòiseachadh a’ choimpiutair agad.$\r$\n$\r$\n$_CLICK"
!endif
!ifdef MUI_UNWELCOMEPAGE
- ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fàilte dhan draoidh dì-stàlaidh aig $(^NameDA)"
- ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Stiùiridh an draoidh seo tron dì-stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMus tòisich thu air an dì-stàladh, dèan cinnteach nach eil $(^NameDA) a' ruith.$\r$\n$\r$\n$_CLICK"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fàilte gun dì-stàladh aig $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron dì-stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMus tòisich thu air an dì-stàladh, dèan cinnteach nach eil $(^NameDA) a’ ruith.$\r$\n$\r$\n$_CLICK"
!endif
!ifdef MUI_LICENSEPAGE
${LangFileString} MUI_TEXT_LICENSE_TITLE "Aonta ceadachais"
- ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "An toir thu sùil air teirmichean a' cheadachais mus stàlaich thu $(^NameDA)?"
- ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air $\"Gabhaidh mi ris$\" gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh."
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus stàlaich thu $(^NameDA)?"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris” gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh."
${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, thoir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK"
- ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a' chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK"
!endif
!ifdef MUI_UNLICENSEPAGE
${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Aonta ceadachais"
- ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "An toir thu sùil air teirmichean a' cheadachais mus dì-stàlaich thu $(^NameDA)?"
- ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air $\"Gabhaidh mi ris$\" gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh."
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus dì-stàlaich thu $(^NameDA)?"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris” gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh."
${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, cuir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK"
- ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a' chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK"
!endif
!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
@@ -35,12 +35,12 @@
!ifdef MUI_COMPONENTSPAGE
${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Tagh co-phàirtean"
- ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Tagh na feartan aig $(^NameDA) a tha thu airson stàladh."
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson stàladh."
!endif
!ifdef MUI_UNCOMPONENTSPAGE
${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Tagh co-phàirtean"
- ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Tagh na co-phàirtean aig $(^NameDA) a tha thu airson dì-stàladh."
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson dì-stàladh."
!endif
!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
@@ -54,7 +54,7 @@
!ifdef MUI_DIRECTORYPAGE
${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Tagh ionad an stàlaidh"
- ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Tagh am pasgan sa thèid $(^NameDA) a stàladh."
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Tagh am pasgan san dèid $(^NameDA) a stàladh."
!endif
!ifdef MUI_UNDIRECTORYPAGE
@@ -63,47 +63,47 @@
!endif
!ifdef MUI_INSTFILESPAGE
- ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ga stàladh"
- ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fuirich ort fhad 's a tha $(^NameDA) ga stàladh."
- ${LangFileString} MUI_TEXT_FINISH_TITLE "Stàladh coileanta"
- ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Chaidh an stàladh a choileanadh gu soirbheachail."
- ${LangFileString} MUI_TEXT_ABORT_TITLE "Air sgur dhen stàladh"
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "’Ga stàladh"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga stàladh."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Stàladh deiseil"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Tha an stàladh deiseil."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Chaidh sgur dhen stàladh"
${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Cha deach an stàladh a choileanadh."
!endif
!ifdef MUI_UNINSTFILESPAGE
- ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ga dhì-stàladh"
- ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fuirich ort fhad 's a tha $(^NameDA) ga dhì-stàladh."
- ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dì-stàladh coileanta"
- ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Chaidh an dì-stàladh a choileanadh gu soirbheachail."
- ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Air sgur dhen dì-stàladh"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "’Ga dhì-stàladh"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga dhì-stàladh."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dì-stàladh deiseil"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Chaidh a dhì-stàladh."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Chaidh sgur dhen dì-stàladh"
${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Cha deach an dì-stàladh a choileanadh."
!endif
!ifdef MUI_FINISHPAGE
- ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A' coileanadh an draoidh stàlaidh aig $(^NameDA)"
- ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a stàladh air a' choimpiutair agad.$\r$\n$\r$\nBriog air $\"Crìochnaich$\" gus an draoidh seo a dhùnadh."
- ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a' choimpiutair agad gus an stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A’ coileanadh an stàlaidh aig $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a stàladh air a’ choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich” gus an t-inneal-stàlaidh a dhùnadh."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?"
!endif
!ifdef MUI_UNFINISHPAGE
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A' coileanadh an draoidh dì-stàlaidh aig $(^NameDA)"
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a dhì-stàladh on choimpiutair agad.$\r$\n$\r$\nBriog air "Crìochnaich" gus an draoidh seo a dhùnadh."
- ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a' choimpiutair agad gus an dì-stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A’ coileanadh an dì-stàlaidh aig $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a dhì-stàladh on choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich” gus an t-inneal-stàlaidh a dhùnadh."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an dì-stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?"
!endif
!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ath-tòisich an-dràsta"
- ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nì mi fhìn ath-thòiseachadh a làimh àm eile"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nì mi fhìn ath-thòiseachadh a làimh uaireigin eile"
${LangFileString} MUI_TEXT_FINISH_RUN "&Ruith $(^NameDA)"
- ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Seall am faidhle Leughmi"
- ${LangFileString} MUI_BUTTONTEXT_FINISH "&Crìochnaich"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Seall am faidhle “Leughmi”"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Crìochnaich"
!endif
!ifdef MUI_STARTMENUPAGE
${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tagh pasgan sa chlàr-taice tòiseachaidh"
${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tagh pasgan sa chlàr-taice tòiseachaidh airson na h-ath-ghoiridean aig $(^NameDA)."
- ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Tagh pasgan sa chlàr-taice tòiseachaidh sa bheil thu airson na h-ath-ghoiridean aig a' phrògram a chruthachadh. 'S urrainn dhut cuideachd ainm a chur a-steach gus pasgan ùr a chruthachadh."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Tagh pasgan sa chlàr-taice tòiseachaidh sa bheil thu airson na h-ath-ghoiridean aig a’ phrògram a chruthachadh. ’S urrainn dhut cuideachd ainm a chur a-steach gus pasgan ùr a chruthachadh."
${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Na cruthaich ath-ghoiridean"
!endif
@@ -122,8 +122,8 @@
!ifdef MULTIUSER_INSTALLMODEPAGE
${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Tagh cleachdaichean"
- ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Tagh na cleachdaichean 's tu airson $(^NameDA) a stàladh air an son."
- ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Tagh an stàlaich thu $(^NameDA) air do shon fhèin a-mhàin no airson a h-uile cleachdaiche air a' choimpiutair seo. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Tagh na cleachdaichean dhan a thèid $(^NameDA) a stàladh."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Tagh an stàlaich thu $(^NameDA) air do shon fhìn a-mhàin no airson a h-uile cleachdaiche air a’ choimpiutair seo. $(^ClickNext)"
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Stàlaich airson duine sam bith a chleachdas an coimpiutair seo"
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Na stàlaich ach air mo shon-sa"
-!endif \ No newline at end of file
+!endif
diff --git a/Contrib/Language files/Slovenian.nlf b/Contrib/Language files/Slovenian.nlf
index b85f628..581b149 100755
--- a/Contrib/Language files/Slovenian.nlf
+++ b/Contrib/Language files/Slovenian.nlf
@@ -11,7 +11,7 @@ NLF v6
-
# Translation by Janez Dolinar, edited by Martin Srebotnjak - Lugos.si
# ^Branding
-Namestitveni sistem Nullsoft %s
+Nullsoft Install System %s
# ^SetupCaption
Namestitev $(^Name)
# ^UninstallCaption
diff --git a/Contrib/Language files/Tatar.nlf b/Contrib/Language files/Tatar.nlf
new file mode 100755
index 0000000..bcbf3b3
--- /dev/null
+++ b/Contrib/Language files/Tatar.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1092
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ASCII code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Bulat Azat uly [ bulat_ibrahim@mail.ru ]
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Урнаштыру $(^Name)
+# ^UninstallCaption
+Бетерү $(^Name)
+# ^LicenseSubCaption
+: Лицензия килешүе
+# ^ComponentsSubCaption
+: Урнаштыру шартлары
+# ^DirSubCaption
+: Урнаштыру папкасы
+# ^InstallingSubCaption
+: Файлларны күчермәләү
+# ^CompletedSubCaption
+: Гамәл тәмамланды
+# ^UnComponentsSubCaption
+: Бетерү шартлары
+# ^UnDirSubCaption
+: Бетерү папкасы
+# ^ConfirmSubCaption
+: Раслау
+# ^UninstallingSubCaption
+: Файлларны бетерү
+# ^UnCompletedSubCaption
+: Гамәл тәмамланды
+# ^BackBtn
+< &Артка
+# ^NextBtn
+&Алга >
+# ^AgreeBtn
+Кабул ит&әм
+# ^AcceptBtn
+Мин &килешү шартларын кабул итәм
+# ^DontAcceptBtn
+Мин &килешү шартларын кабул итими
+# ^InstallBtn
+&Урнаштырырга
+# ^UninstallBtn
+Бе&терергә
+# ^CancelBtn
+Баш тарту
+# ^CloseBtn
+&Ябарга
+# ^BrowseBtn
+К&арарга...
+# ^ShowDetailsBtn
+&Тулырак...
+# ^ClickNext
+Дәвам итү өчен 'Алга' төймәсенә басыгыз.
+# ^ClickInstall
+Программаны урнаштыру өчен 'Урнаштырырга' төймәсенә басыгыз.
+# ^ClickUninstall
+Программаны бетерү өчен 'Бетерергә' төймәсенә басыгыз.
+# ^Name
+Исем
+# ^Completed
+Әзер
+# ^LicenseText
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, 'Кабул итәм' төймәсенә басыгыз.
+# ^LicenseTextCB
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $_CLICK
+# ^LicenseTextRB
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $_CLICK
+# ^UnLicenseText
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, 'Кабул итәм' төймәсенә басыгыз.
+# ^UnLicenseTextCB
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $_CLICK
+# ^UnLicenseTextRB
+$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $_CLICK
+# ^Custom
+Сайлап кына
+# ^ComponentsText
+Программаның урнаштырырга теләгән компонентларын сайлагыз. $_CLICK
+# ^ComponentsSubText1
+Урнаштыру төрен сайлагыз:
+# ^ComponentsSubText2_NoInstTypes
+Урнаштыру өчен программаның компонентларын сайлагыз:
+# ^ComponentsSubText2
+яки урнаштыру өчен өстәмә компонентлар сайлагыз:
+# ^UnComponentsText
+Бетерергә теләгән компонентларны сайлагыз. $_CLICK
+# ^UnComponentsSubText1
+Бетерү төрен сайлагыз:
+# ^UnComponentsSubText2_NoInstTypes
+Бетерү өчен компонентларны сайлагыз:
+# ^UnComponentsSubText2
+яки бетерү өчен өстәмә компонентларны сайлагыз:
+# ^DirText
+Программа $(^NameDA) программасын күрсәтерлән папкага урнаштырачак. Башка папкага урнаштыру өчен, 'Карарга' төймәсенә басыгыз һәм урын күрсәтегез. $_CLICK
+# ^DirSubText
+Урнаштыру папкасы
+# ^DirBrowseText
+$(^NameDA) урнаштыру өчен папка сайлагыз:
+# ^UnDirText
+Программа $(^NameDA) программасын күрсәтелгән папкадан бетерәчәк. Башка папкадан бетерү өчен, 'Карарга' төймәсенә басыгыз һәм урын күрсәтегез. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA) бетерергә кирәк булган папканы күрсәтегез:
+# ^SpaceAvailable
+"Дискта буш урын: "
+# ^SpaceRequired
+"Дискта кирәк урын: "
+# ^UninstallingText
+$(^NameDA) программасы санагыгыздан бетереләчәк. $_CLICK
+# ^UninstallingSubText
+Моннан бетерү:
+# ^FileError
+Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Туктату': урнаштыруны туктатырга;\r\n"Кабатлау": омтылышны кабатларга;\r\n"Калдыру": бу гамәлне төшереп калдырырга.
+# ^FileError_NoIgnore
+Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Кабатлау': омтылышны кабатларга;\r\n'Баш тарту': урнаштыру барышын туктатырга.
+# ^CantWrite
+"Яздырып булмый: "
+# ^CopyFailed
+Күчермә ясауда хата
+# ^CopyTo
+"Монда күчермәләү: "
+# ^Registering
+"Теркәлү: "
+# ^Unregistering
+"Теркәүдән баш тарту: "
+# ^SymbolNotFound
+"Символны табып булмый: "
+# ^CouldNotLoad
+"Йөкләп булмый: "
+# ^CreateFolder
+"Папка ясау: "
+# ^CreateShortcut
+"Сылтама ясау: "
+# ^CreatedUninstaller
+"Бетерү программасын ясау: "
+# ^Delete
+"Файлны бетерү: "
+# ^DeleteOnReboot
+"Санак сүндереп кабызылганда бетерү: "
+# ^ErrorCreatingShortcut
+"Сылтама ясауда хата: "
+# ^ErrorCreating
+"Ясауда хата: "
+# ^ErrorDecompressing
+Мәгълүматларны чыгаруда хата! Урнаштыручы бозык булуы мөмкин.
+# ^ErrorRegistering
+DLL теркәүдә хата
+# ^ExecShell
+"Тышча командасын башкару: "
+# ^Exec
+"Башкару: "
+# ^Extract
+"Чыгару: "
+# ^ErrorWriting
+"Чыгару: файл яздыруда хата "
+# ^InvalidOpcode
+Урнаштыручы бозылган: мөмкин булмаган код
+# ^NoOLE
+"OLE моның өчен юк: "
+# ^OutputFolder
+"Урнаштыру папкасы: "
+# ^RemoveFolder
+"Папканы бетерү: "
+# ^RenameOnReboot
+"Санак сүндереп кабызылганда исемен үзгәртү: "
+# ^Rename
+"Исемен үзгәртү: "
+# ^Skipped
+"Калдыру: "
+# ^CopyDetails
+Мәгълүматларны алмашыну буферына күчермәләргә
+# ^LogInstall
+Урнаштыру хисабын алып барырга
+# byte (байт)
+# kilo
+ К
+# mega
+ М
+# giga
+ Г \ No newline at end of file
diff --git a/Contrib/Language files/Tatar.nsh b/Contrib/Language files/Tatar.nsh
new file mode 100755
index 0000000..1149472
--- /dev/null
+++ b/Contrib/Language files/Tatar.nsh
@@ -0,0 +1,129 @@
+;Language: Tatar (1092)
+;Translation by Bulat Azat uly [bulat_ibrahim@mail.ru]
+
+!insertmacro LANGFILE "Tatar" = "Татарча" "Tatarcha"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) урнаштыручыга рәхим итегез"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программасын санагыгызга урнаштырыр.$\r$\n$\r$\nУрнаштыру алдыннан бөтен ачык кушымталарны ябарга тәкъдим ителә. Бу урнаштыру программасына система файлларын санакны сүндереп кабызмыйча яңартырга мөмкинлек бирә.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) бетерүчегә рәхим итегез"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программасын санагыгыздан бетерер.$\r$\n$\r$\nДәвам итү алдыннан $(^NameDA) җибәрелмәгәнлеген тикшерегез.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензия килешүе"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итсәгез, $\"Кабул итәм$\" төймәсенә басыгыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензия килешүе"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) бетерү алдыннан лицензия килешүе белән танышыгыз."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итсәгез, $\"Кабул итәм$\" төймәсенә басыгыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Текст буенча күчү өчен, $\"PageUp$\" һәм $\"PageDown$\" төймәләренә басыгыз."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Урнаштырылучы программаның компонентлары"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Урнаштырырга теләгән $(^NameDA) компонентларын сайлагыз."
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Программа компонентлары"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Бетерергә теләгән $(^NameDA) компонентларын сайлагыз."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Тасвирлама"
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның тасвирламасын уку өчен, аның исеменә тычкан курсорын китерегез."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның тасвирламасын уку өчен, аны билгеләгез."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Урнаштыру папкасын сайлау"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) урнаштыру өчен папка сайлагыз."
+!endif
+
+!ifdef MUI_UNDIRECTORYPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Бетерү папкасын сайлау"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) бетерергә кирәк булган папканы сайлагыз."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Файлларны күчермәләү"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) файллары күчермәләнә, көтегез..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Урнаштыру тәмамланды"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Урнаштыру уңышлы тәмамланды."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Урнаштыру туктатылды"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Урнаштыру уңышсыз тәмамланды."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Бетерү"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) файллары бетерелә, көтегез..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Бетерү тәмамланды"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Программаны бетерү уңышлы тәмамланды."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Бетерү туктатылды"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Бетерү тулысынча башкарылмады."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) урнаштыручы эшен тәмамлау"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) санагыгызга урнаштырылды.$\r$\n$\r$\nУрнаштыру программасыннан чыгу өчен $\"Тәмам$\" төймәсенә басыгыз."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) урнаштыруын тәмамлау өчен, санакны сүндереп кабызырга кирәк. Аны хәзер башкарыргамы?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) бетерүче эшен тәмамлау"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) санагыгыздан бетерелде.$\r$\n$\r$\nБетерү программасыннан чыгу өчен $\"Тәмам$\" төймәсенә басыгыз."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) бетерүен тәмамлау өчен, санакны сүндереп кабызырга кирәк. Аны хәзер башкарыргамы?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Әйе, санакны хәзер сүндереп кабызырга"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Юк, мин соңрак сүндереп кабызырмын"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) программасын җибәр&ергә"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ReadMe файлын күрсәтергә"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Тәмам"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "$\"Башлау$\" менюсында папка"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$\"Башлау$\" менюсында программа сылтамаларын урнаштыру өчен папка сайлагыз."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Башлау$\" менюсында программа сылтамалары урнаштырылачак папканы сайлагыз. Шулай ук папкага башка исем бирә аласыз."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Сылтамалар ясамаска"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) бетерү"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Санактан $(^NameDA) бетерү."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Чыннан да $(^Name) урнаштыруын туктатыргамы?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Чыннан да $(^Name) бетерүен туктатыргамы?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Урнаштыру режимы"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Кайсы кулланучылар өчен $(^NameDA) урнаштырырга телисез, сайлагыз."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA) программасын үзегезгә генә яки бөтен кулланучылар өчен дә урнаштырачагыгызны сайлагыз. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Бөтен кулланучылар өчен урнаштырырга"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Минем өчен генә урнаштырырга"
+!endif
diff --git a/Contrib/Language files/Turkish.nlf b/Contrib/Language files/Turkish.nlf
index c959f2c..163d154 100755
--- a/Contrib/Language files/Turkish.nlf
+++ b/Contrib/Language files/Turkish.nlf
@@ -13,7 +13,7 @@ NLF v6
# Translation by ?atay Dilsiz(chagy) (amigos_cagi@hotmail.com)
# Corrections by Mozilla Türkiye Yerelleştirme Topluluğu tarafından çevrilmiştir. http://mozilla.org.tr
# ^Branding
-Nullsoft Kurulum Sistemi %s
+Nullsoft Install System %s
# ^SetupCaption
$(^Name) Kurulumu
# ^UninstallCaption
diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.cpp b/Contrib/Library/LibraryLocal/LibraryLocal.cpp
index 1151a15..d7847fe 100755
--- a/Contrib/Library/LibraryLocal/LibraryLocal.cpp
+++ b/Contrib/Library/LibraryLocal/LibraryLocal.cpp
@@ -3,7 +3,9 @@
LibraryLocal - used by the Library.nsh macros
Get the version of local DLL and TLB files
Written by Joost Verburg
- Unicode support by Jim Park -- 07/27/2007
+ POSIX DLL version support by kichik -- 20070415
+ Unicode support by Jim Park -- 20070727
+ POSIX TLB version support by anders_k -- 20170929
*/
@@ -14,6 +16,7 @@
#include <iostream>
#include <fstream>
+#include "../../../Source/BinInterop.h"
#include "../../../Source/util.h"
#include "../../../Source/winchar.h"
@@ -22,139 +25,79 @@ using namespace std;
int g_noconfig=0; // TODO: Not used?
NSISRT_DEFINEGLOBALS();
-int GetTLBVersion(tstring& filepath, DWORD& high, DWORD & low)
-{
-#ifdef _WIN32
-
- int found = 0;
-
- TCHAR fullpath[1024];
- TCHAR *p;
- if (!GetFullPathName(filepath.c_str(), COUNTOF(fullpath), fullpath, &p))
- return 0;
-
- ITypeLib* typeLib;
- HRESULT hr;
-
-#ifdef _UNICODE
- hr = LoadTypeLib(fullpath, &typeLib);
-#else
- // If built without UNICODE, we still need to convert this string to a Unicode string.
- WCHAR *ole_filename = (WCHAR*) WinWStrDupFromTChar(fullpath);
- if (!ole_filename) return 0;
- hr = LoadTypeLib(ole_filename, &typeLib);
- free(ole_filename);
-#endif //~ _UNICODE
-
- if (SUCCEEDED(hr)) {
-
- TLIBATTR* typelibAttr;
-
- hr = typeLib->GetLibAttr(&typelibAttr);
-
- if (SUCCEEDED(hr)) {
-
- high = typelibAttr->wMajorVerNum;
- low = typelibAttr->wMinorVerNum;
-
- found = 1;
-
- }
-
- typeLib->Release();
-
- }
-
- return found;
-
-#else
-
- return 0;
-
-#endif //~ _WIN32
-}
+enum {
+ EC_SUCCESS = 0,
+ EC_NO_VERSION_PRESENT = 1,
+ EC_UNSUPPORTED_FORMAT = 10, // TODO: POSIX should return this for 16-bit NE files
+ EC_FILE_NOT_FOUND = 15,
+ EC_INVALID_PARAMETER = 20,
+ EC_FILE_IO_ERROR = 50,
+ EC_UNKNOWN_ERROR = 99
+};
NSIS_ENTRYPOINT_TMAIN
int _tmain(int argc, TCHAR* argv[])
{
- if (!NSISRT_Initialize()) return 1;
-
- // Parse the command line
+ if (!NSISRT_Initialize()) return EC_UNKNOWN_ERROR;
- tstring cmdline;
-
- tstring mode;
- tstring filename;
- tstring filepath;
-
- int filefound = 0;
+ tstring appmode;
+ const TCHAR *filename;
+ int filefound = 0, exitcode = EC_INVALID_PARAMETER;
if (argc != 4)
- return 1;
-
- // Get the full path of the local file
+ return EC_INVALID_PARAMETER;
- mode = argv[1];
+ appmode = argv[1];
filename = argv[2];
// Validate filename
-
- FILE*fIn = FOPEN(filename.c_str(), ("rb"));
+ FILE*fIn = FOPEN(filename, ("rb"));
filefound = !!fIn;
if (fIn)
fclose(fIn);
- // Work
-
int versionfound = 0;
DWORD low = 0, high = 0;
if (filefound)
{
-
- // Get version
-
- // DLL / EXE
-
- if (mode.compare(_T("D")) == 0)
+ // DLL/EXE version
+ if (appmode.compare(_T("D")) == 0)
{
-
versionfound = GetDLLVersion(filename, high, low);
-
}
- // TLB
-
- if (mode.compare(_T("T")) == 0)
+ // TLB version
+ if (appmode.compare(_T("T")) == 0)
{
-
versionfound = GetTLBVersion(filename, high, low);
-
}
-
}
- // Write the version to an NSIS header file
-
+ // Write the version to a NSIS header file
FILE*fHdr = FOPEN(argv[3], ("wt"));
- if (!fHdr) return 1;
+ if (!fHdr) return EC_FILE_IO_ERROR;
+
+ fputs("!warning \"LibraryLocal is deprecated, use !getdllversion /packed\"\n", fHdr);
// File content is always ASCII so we don't use TCHAR
if (!filefound)
{
fputs("!define LIBRARY_VERSION_FILENOTFOUND\n", fHdr);
+ exitcode = EC_FILE_NOT_FOUND;
}
else if (!versionfound)
{
fputs("!define LIBRARY_VERSION_NONE\n", fHdr);
+ exitcode = EC_NO_VERSION_PRESENT;
}
else
{
fprintf(fHdr, "!define LIBRARY_VERSION_HIGH %lu\n", static_cast<unsigned long>(high));
fprintf(fHdr, "!define LIBRARY_VERSION_LOW %lu\n", static_cast<unsigned long>(low));
+ exitcode = EC_SUCCESS;
}
fclose(fHdr);
- return 0;
-
+ return exitcode;
}
diff --git a/Contrib/Library/LibraryLocal/SConscript b/Contrib/Library/LibraryLocal/SConscript
index c2e732e..cb315d6 100755
--- a/Contrib/Library/LibraryLocal/SConscript
+++ b/Contrib/Library/LibraryLocal/SConscript
@@ -6,6 +6,7 @@ files = Split("""
required_files = Split("""
#Source/ResourceEditor.cpp
+ #Source/BinInterop.cpp
#Source/util.cpp
#Source/winchar.cpp
""")
diff --git a/Contrib/Library/RegTool/RegTool.cpp b/Contrib/Library/RegTool/RegTool.cpp
index 724ddcc..7de36d4 100755
--- a/Contrib/Library/RegTool/RegTool.cpp
+++ b/Contrib/Library/RegTool/RegTool.cpp
@@ -46,6 +46,13 @@ template<class T> HANDLE CreateFile(const T*p1,DWORD p2,DWORD p3,LPSECURITY_ATTR
template<class T> BOOL CreateProcess(const T*p1,const T*p2,LPSECURITY_ATTRIBUTES p3,LPSECURITY_ATTRIBUTES p4,BOOL p5,DWORD p6,LPVOID p7,const T*p8,STARTUPINFO*p9,LPPROCESS_INFORMATION p10) { return sizeof(T) > 1 ? ::CreateProcessW(WP(p1),WP(p2),p3,p4,p5,p6,p7,WP(p8),(STARTUPINFOW*)p9,p10) : ::CreateProcessA(NP(p1),NP(p2),p3,p4,p5,p6,p7,NP(p8),(STARTUPINFOA*)p9,p10); }
}
+#if defined(_MSC_VER) && _MSC_VER >= 1200
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;
+#define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase )
+#define HINST_APPLICATION HINST_THISCOMPONENT
+#else
+#define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) )
+#endif
static bool IsWinNT()
{
@@ -239,7 +246,7 @@ template<class T> void RegFile(T cmd, const T *file, BOOL x64)
}
else if (!x64)
{
- if (CALL(GetModuleFileName)(GetModuleHandle(NULL), self, STR_SIZE))
+ if (CALL(GetModuleFileName)(HINST_APPLICATION, self, STR_SIZE))
{
CALL_wsprintf(cmdline, MKSTR("\"%s\" /%c%s"), self, cmd, file);
ready++;
@@ -385,7 +392,7 @@ template<class T> int RegTool()
}
{
- if (CALL(GetModuleFileName)(GetModuleHandle(NULL), file, STR_SIZE))
+ if (CALL(GetModuleFileName)(HINST_APPLICATION, file, STR_SIZE))
{
DeleteFileOnReboot(file);
}
diff --git a/Contrib/MakeLangId/MakeLangId.cpp b/Contrib/MakeLangId/MakeLangId.cpp
index 1b119a6..6945321 100755
--- a/Contrib/MakeLangId/MakeLangId.cpp
+++ b/Contrib/MakeLangId/MakeLangId.cpp
@@ -38,9 +38,18 @@ https://wayback.archive.org/web/20021221200122/http://msdn.microsoft.com/library
#define LOCALE_SNATIVEDISPLAYNAME 0x0073
#endif
#ifndef CB_SETCUEBANNER
-#define CB_SETCUEBANNER (0x1700+3)
+#define CB_SETCUEBANNER (0x1700+3)
#endif
+#if defined(_MSC_VER) && _MSC_VER >= 1200
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;
+#define HINST_THISCOMPONENT ( (HINSTANCE) &__ImageBase )
+#define HINST_APPLICATION HINST_THISCOMPONENT
+#else
+#define HINST_APPLICATION ( (HINSTANCE) GetModuleHandle(NULL) )
+#endif
+
+
static INT_PTR StrToIntptr(LPCTSTR s, bool ForceHex = false)
{
UINT_PTR val = 0;
@@ -273,7 +282,7 @@ static void InitIntLangList(HWND hCtl)
#else
LPCTSTR name = g_IntLang[i].name;
#endif
- AddLocale(hCtl, name, g_IntLang[i].id);
+ AddLocale(hCtl, name, g_IntLang[i].id);
}
}
@@ -372,7 +381,7 @@ NSIS_ENTRYPOINT_GUINOCRT
EXTERN_C void NSISWinMainNOCRT()
{
InitCommonControls();
- HINSTANCE hInst = GetModuleHandle(0);
+ HINSTANCE hInst = HINST_APPLICATION;
HANDLE hIco = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_SHARED);
INT_PTR retval = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc, (LPARAM) hIco);
ExitProcess((UINT) retval);
diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp
index e4a1357..a350d24 100755
--- a/Contrib/Makensisw/utils.cpp
+++ b/Contrib/Makensisw/utils.cpp
@@ -595,6 +595,7 @@ int InitBranding() {
}
szBuf[dwRead] = 0, ppi = &pi;
int len = lstrlenA(szBuf);
+ while(len && ((szBuf[len - 1] == '\n')|(szBuf[len - 1] == '\r'))) szBuf[--len] = '\0';
if (!len) retval = 0;
g_sdata.branding = (TCHAR*) MemAlloc((len+6)*sizeof(TCHAR)); // LEAKED
wsprintf(g_sdata.branding, _T("NSIS %hs"), szBuf);
diff --git a/Contrib/Modern UI 2/License.txt b/Contrib/Modern UI 2/License.txt
index c3de19e..9a2044b 100755
--- a/Contrib/Modern UI 2/License.txt
+++ b/Contrib/Modern UI 2/License.txt
@@ -1,4 +1,4 @@
-Copyright 2002-2017 Joost Verburg
+Copyright 2002-2018 Joost Verburg
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/Contrib/Modern UI 2/Localization.nsh b/Contrib/Modern UI 2/Localization.nsh
index 798c94c..8be131f 100755
--- a/Contrib/Modern UI 2/Localization.nsh
+++ b/Contrib/Modern UI 2/Localization.nsh
@@ -31,7 +31,9 @@ Localization
!verbose push ${MUI_VERBOSE}
!ifndef MUI_PAGE_UNINSTALLER_PREFIX
- !warning "MUI_LANGUAGE[EX] should be inserted after the MUI_[UN]PAGE_* macros"
+ !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages
+ !warning "MUI_LANGUAGE[EX] should be inserted after the MUI_[UN]PAGE_* macros"
+ !endif
!endif
!insertmacro MUI_INSERT
diff --git a/Contrib/Modern UI 2/MUI2.nsh b/Contrib/Modern UI 2/MUI2.nsh
index 4068b34..76213c6 100755
--- a/Contrib/Modern UI 2/MUI2.nsh
+++ b/Contrib/Modern UI 2/MUI2.nsh
@@ -1,7 +1,7 @@
/*
NSIS Modern User Interface - Version 2.1
-Copyright 2002-2017 Joost Verburg
+Copyright 2002-2018 Joost Verburg
Contributors: Amir Szekely, Anders Kjersem
*/
@@ -11,7 +11,7 @@ Contributors: Amir Szekely, Anders Kjersem
!define MUI_INCLUDED
!define MUI_SYSVERSION "2.1"
!verbose pop
-!echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2017 Joost Verburg"
+!echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2018 Joost Verburg"
;--------------------------------
!verbose push 3
diff --git a/Contrib/Modern UI 2/Readme.html b/Contrib/Modern UI 2/Readme.html
index d4b0986..66203be 100755
--- a/Contrib/Modern UI 2/Readme.html
+++ b/Contrib/Modern UI 2/Readme.html
@@ -80,7 +80,7 @@
}
.toggle
{
- display: none;
+ display: block;
}
.options
{
@@ -98,33 +98,25 @@
image_open.src = "images/open.gif";
var image_closed = new Image();
image_closed.src = "images/closed.gif";
-
+
+ function GEBY(d, i) { return d.getElementById ? d.getElementById(i) : document.all ? document.all[i] : 0 }
+
function toggle(image, section) {
-
- if(document.all) {
- if(document.all[section].style.display == "block") {
- document.all[section].style.display = "none";
- document.all[image].src = image_closed.src;
- }
- else
- {
- document.all[section].style.display = "block";
- document.all[image].src = image_open.src;
- }
- }
- else
+
+ if (section = GEBY(document, section))
{
- if(document.getElementById(section).style.display == "block") {
- document.getElementById(section).style.display = "none";
- document.getElementById(image).src = image_closed.src;
+ image = GEBY(document, image);
+ if (section.style.display != "none")
+ {
+ section.style.display = "none";
+ image.src = image_closed.src;
}
- else
- {
- document.getElementById(section).style.display = "block";
- document.getElementById(image).src = image_open.src;
+ else
+ {
+ section.style.display = "block";
+ image.src = image_open.src;
}
}
-
}
function expandall() {
@@ -151,11 +143,17 @@
}
+ function onDocLoad() {
+
+ toggle('trigger_scr', 'toggle_scr');
+ toggle('trigger_lic', 'toggle_lic');
+ }
+
//]]>
</script>
</head>
-<body>
+<body onLoad="onDocLoad()">
<table width="750" class="maintable" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
@@ -180,14 +178,12 @@
the setup wizard is closed (for example, whether the application should be started
immediately). A finish page can also be used to ask for a system restart is necessary.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_scr" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_scr" src="images/open.gif"
onclick="toggle('trigger_scr', 'toggle_scr');" />
Screenshots</h3>
<div class="toggle" id="toggle_scr">
- <p>
- <img src="images/screen1.png" width="503" height="393" alt="" /></p>
- <p>
- <img src="images/screen2.png" width="503" height="393" alt="" /></p>
+ <p><img src="images/screen1.png" width="503" height="393" alt="" /></p>
+ <p><img src="images/screen2.png" width="503" height="393" alt="" /></p>
</div>
</div>
<h1>
@@ -254,12 +250,12 @@
!define MUI_INSTFILESPAGE_COLORS &quot;FFFFFF 000000&quot; ;Two colors
</pre>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_in" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_in" src="images/open.gif"
onclick="toggle('trigger_in', 'toggle_in');" />
Interface settings</h3>
<div class="toggle" id="toggle_in">
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ingen" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ingen" src="images/open.gif"
onclick="toggle('trigger_ingen', 'toggle_ingen');" />
Page header</h3>
<div class="toggle" id="toggle_ingen">
@@ -345,7 +341,7 @@
user interfaces that set a bigger header image.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inres" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inres" src="images/open.gif"
onclick="toggle('trigger_inres', 'toggle_inres');" />
Interface resources</h3>
<div class="toggle" id="toggle_inres">
@@ -376,7 +372,7 @@
<em>Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inwf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inwf" src="images/open.gif"
onclick="toggle('trigger_inwf', 'toggle_inwf');" />
Installer welcome/finish page</h3>
<div class="toggle" id="toggle_inwf">
@@ -391,7 +387,7 @@
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inuwf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inuwf" src="images/open.gif"
onclick="toggle('trigger_inuwf', 'toggle_inuwf');" />
Uninstaller welcome/finish page</h3>
<div class="toggle" id="toggle_inuwf">
@@ -406,7 +402,7 @@
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inl" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inl" src="images/open.gif"
onclick="toggle('trigger_inl', 'toggle_inl');" />
License page</h3>
<div class="toggle" id="toggle_inl">
@@ -419,7 +415,7 @@
<em>Default: /windows</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inc" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inc" src="images/open.gif"
onclick="toggle('trigger_inc', 'toggle_inc');" />
Components page</h3>
<div class="toggle" id="toggle_inc">
@@ -436,7 +432,7 @@
No description area.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ind" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ind" src="images/open.gif"
onclick="toggle('trigger_ind', 'toggle_ind');" />
Directory page</h3>
<div class="toggle" id="toggle_ind">
@@ -445,7 +441,7 @@
The background color for the directory textbox.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ins" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ins" src="images/open.gif"
onclick="toggle('trigger_ins', 'toggle_ins');" />
Start Menu folder page</h3>
<div class="toggle" id="toggle_ins">
@@ -454,7 +450,7 @@
The background color for the startmenu directory list and textbox.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ini" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ini" src="images/open.gif"
onclick="toggle('trigger_ini', 'toggle_ini');" />
Installation page</h3>
<div class="toggle" id="toggle_ini">
@@ -470,7 +466,7 @@
<em>Default: smooth</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inf" src="images/open.gif"
onclick="toggle('trigger_inf', 'toggle_inf');" />
Installer finish page</h3>
<div class="toggle" id="toggle_inf">
@@ -480,7 +476,7 @@
log.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_uinf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_uinf" src="images/open.gif"
onclick="toggle('trigger_uinf', 'toggle_uinf');" />
Uninstaller finish page</h3>
<div class="toggle" id="toggle_uinf">
@@ -490,7 +486,7 @@
log.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inaw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inaw" src="images/open.gif"
onclick="toggle('trigger_inaw', 'toggle_inaw');" />
Abort warning</h3>
<div class="toggle" id="toggle_inaw">
@@ -507,7 +503,7 @@
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inuaw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inuaw" src="images/open.gif"
onclick="toggle('trigger_inuaw', 'toggle_inuaw');" />
Uninstaller abort warning</h3>
<div class="toggle" id="toggle_inuaw">
@@ -566,7 +562,7 @@ Var StartMenuFolder
MUI_UNPAGE_INSTFILES<br />
MUI_UNPAGE_FINISH</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pg" src="images/open.gif"
onclick="toggle('trigger_pg', 'toggle_pg');" />
Page settings</h3>
<div class="toggle" id="toggle_pg">
@@ -596,7 +592,7 @@ Var PLUGINS_FOLDER
In all text settings, the doublequote character (&quot;) should be escaped in the
following form: $\&quot;</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgg" src="images/open.gif"
onclick="toggle('trigger_pgg', 'toggle_pgg');" />
General page settings</h3>
<div class="toggle" id="toggle_pgg">
@@ -608,7 +604,7 @@ Var PLUGINS_FOLDER
Subtext to display on the header of the page.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgw" src="images/open.gif"
onclick="toggle('trigger_pgw', 'toggle_pgw');" />
Welcome page settings</h3>
<div class="toggle" id="toggle_pgw">
@@ -623,7 +619,7 @@ Var PLUGINS_FOLDER
Text to display on the page.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgl" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgl" src="images/open.gif"
onclick="toggle('trigger_pgl', 'toggle_pgl');" />
License page settings</h3>
<div class="toggle" id="toggle_pgl">
@@ -658,7 +654,7 @@ Var PLUGINS_FOLDER
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgc" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgc" src="images/open.gif"
onclick="toggle('trigger_pgc', 'toggle_pgc');" />
Components page settings</h3>
<div class="toggle" id="toggle_pgc">
@@ -679,7 +675,7 @@ Var PLUGINS_FOLDER
Text to display inside the description box when no section is selected.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgd" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgd" src="images/open.gif"
onclick="toggle('trigger_pgd', 'toggle_pgd');" />
Directory page settings</h3>
<div class="toggle" id="toggle_pgd">
@@ -699,7 +695,7 @@ Var PLUGINS_FOLDER
GetInstDirError in the leave function to handle an invalid folder.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgs" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgs" src="images/open.gif"
onclick="toggle('trigger_pgs', 'toggle_pgs');" />
Start Menu folder page settings</h3>
<div class="toggle" id="toggle_pgs">
@@ -731,7 +727,7 @@ Var PLUGINS_FOLDER
</pre>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgi" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgi" src="images/open.gif"
onclick="toggle('trigger_pgi', 'toggle_pgi');" />
Installation page settings</h3>
<div class="toggle" id="toggle_pgi">
@@ -753,7 +749,7 @@ Var PLUGINS_FOLDER
been aborted.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgf" src="images/open.gif"
onclick="toggle('trigger_pgf', 'toggle_pgf');" />
Finish page settings</h3>
<div class="toggle" id="toggle_pgf">
@@ -845,7 +841,7 @@ Var PLUGINS_FOLDER
this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgu" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgu" src="images/open.gif"
onclick="toggle('trigger_pgu', 'toggle_pgu');" />
Uninstall confirm page settings</h3>
<div class="toggle" id="toggle_pgu">
@@ -961,7 +957,7 @@ FunctionEnd
<p>
This macro can also be used in the un.onInit function.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lss" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lss" src="images/open.gif"
onclick="toggle('trigger_lss', 'toggle_lss');" />
Settings for registry storage of selected language</h3>
<div class="toggle" id="toggle_lss">
@@ -987,7 +983,7 @@ FunctionEnd
</pre>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lsin" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lsin" src="images/open.gif"
onclick="toggle('trigger_lsin', 'toggle_lsin');" />
Interface settings for selection dialog</h3>
<div class="toggle" id="toggle_lsin">
@@ -1057,7 +1053,7 @@ FunctionEnd</pre>
<p>
Modern UI pages can also customized using custom functions.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_cfg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_cfg" src="images/open.gif"
onclick="toggle('trigger_cfg', 'toggle_cfg');" />
General Custom Functions</h3>
<div class="toggle" id="toggle_cfg">
@@ -1076,7 +1072,7 @@ FunctionEnd</pre>
used, regular .onMouseOverSection and un.onMouseOverSection must be used.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_cfpg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_cfpg" src="images/open.gif"
onclick="toggle('trigger_cfpg', 'toggle_cfpg');" />
Page Custom Functions</h3>
<div class="toggle" id="toggle_cfpg">
@@ -1126,12 +1122,12 @@ FunctionEnd</pre>
<p>
The zlib/libpng license applies to the Modern UI.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lic" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lic" src="images/open.gif"
onclick="toggle('trigger_lic', 'toggle_lic');" />
License Terms</h3>
<div class="toggle" id="toggle_lic">
<pre>
-Copyright &copy; 2002-2017 Joost Verburg
+Copyright &copy; 2002-2018 Joost Verburg
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/Contrib/Modern UI/License.txt b/Contrib/Modern UI/License.txt
index e7c6ff5..6c7105a 100755
--- a/Contrib/Modern UI/License.txt
+++ b/Contrib/Modern UI/License.txt
@@ -1,4 +1,4 @@
-Copyright 2002-2017 Joost Verburg
+Copyright 2002-2018 Joost Verburg
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/Contrib/Modern UI/Readme.html b/Contrib/Modern UI/Readme.html
index 2f54f4e..3b01eda 100755
--- a/Contrib/Modern UI/Readme.html
+++ b/Contrib/Modern UI/Readme.html
@@ -80,7 +80,7 @@
}
.toggle
{
- display: none;
+ display: block;
}
.options
{
@@ -98,33 +98,25 @@
image_open.src = "images/open.gif";
var image_closed = new Image();
image_closed.src = "images/closed.gif";
-
+
+ function GEBY(d, i) { return d.getElementById ? d.getElementById(i) : document.all ? document.all[i] : 0 }
+
function toggle(image, section) {
-
- if(document.all) {
- if(document.all[section].style.display == "block") {
- document.all[section].style.display = "none";
- document.all[image].src = image_closed.src;
- }
- else
- {
- document.all[section].style.display = "block";
- document.all[image].src = image_open.src;
- }
- }
- else
+
+ if (section = GEBY(document, section))
{
- if(document.getElementById(section).style.display == "block") {
- document.getElementById(section).style.display = "none";
- document.getElementById(image).src = image_closed.src;
+ image = GEBY(document, image);
+ if (section.style.display != "none")
+ {
+ section.style.display = "none";
+ image.src = image_closed.src;
}
- else
- {
- document.getElementById(section).style.display = "block";
- document.getElementById(image).src = image_open.src;
+ else
+ {
+ section.style.display = "block";
+ image.src = image_open.src;
}
}
-
}
function expandall() {
@@ -151,11 +143,17 @@
}
+ function onDocLoad() {
+
+ toggle('trigger_scr', 'toggle_scr');
+ toggle('trigger_lic', 'toggle_lic');
+ }
+
//]]>
</script>
</head>
-<body>
+<body onLoad="onDocLoad()">
<table width="750" class="maintable" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
@@ -180,14 +178,12 @@
the setup wizard is closed (for example, whether the application should be started
immediately). A finish page can also be used to ask for a system restart is necessary.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_scr" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_scr" src="images/open.gif"
onclick="toggle('trigger_scr', 'toggle_scr');" />
Screenshots</h3>
<div class="toggle" id="toggle_scr">
- <p>
- <img src="images/screen1.png" width="503" height="393" alt="" /></p>
- <p>
- <img src="images/screen2.png" width="503" height="393" alt="" /></p>
+ <p><img src="images/screen1.png" width="503" height="393" alt="" /></p>
+ <p><img src="images/screen2.png" width="503" height="393" alt="" /></p>
</div>
</div>
<h1>
@@ -227,12 +223,12 @@
!define MUI_INSTFILESPAGE_COLORS &quot;FFFFFF 000000&quot; ;Two colors
</pre>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_in" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_in" src="images/open.gif"
onclick="toggle('trigger_in', 'toggle_in');" />
Interface settings</h3>
<div class="toggle" id="toggle_in">
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ingen" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ingen" src="images/open.gif"
onclick="toggle('trigger_ingen', 'toggle_ingen');" />
Page header</h3>
<div class="toggle" id="toggle_ingen">
@@ -317,7 +313,7 @@
user interfaces that set a bigger header image.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inres" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inres" src="images/open.gif"
onclick="toggle('trigger_inres', 'toggle_inres');" />
Interface resources</h3>
<div class="toggle" id="toggle_inres">
@@ -348,7 +344,7 @@
<em>Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inwf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inwf" src="images/open.gif"
onclick="toggle('trigger_inwf', 'toggle_inwf');" />
Installer welcome/finish page</h3>
<div class="toggle" id="toggle_inwf">
@@ -370,7 +366,7 @@
<em>Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inuwf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inuwf" src="images/open.gif"
onclick="toggle('trigger_inuwf', 'toggle_inuwf');" />
Uninstaller welcome/finish page</h3>
<div class="toggle" id="toggle_inuwf">
@@ -392,7 +388,7 @@
<em>Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inl" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inl" src="images/open.gif"
onclick="toggle('trigger_inl', 'toggle_inl');" />
License page</h3>
<div class="toggle" id="toggle_inl">
@@ -405,7 +401,7 @@
<em>Default: /windows</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inc" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inc" src="images/open.gif"
onclick="toggle('trigger_inc', 'toggle_inc');" />
Components page</h3>
<div class="toggle" id="toggle_inc">
@@ -422,7 +418,7 @@
No description area.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ind" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ind" src="images/open.gif"
onclick="toggle('trigger_ind', 'toggle_ind');" />
Directory page</h3>
<div class="toggle" id="toggle_ind">
@@ -431,7 +427,7 @@
The background color for the directory textbox.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ins" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ins" src="images/open.gif"
onclick="toggle('trigger_ins', 'toggle_ins');" />
Start Menu folder page</h3>
<div class="toggle" id="toggle_ins">
@@ -440,7 +436,7 @@
The background color for the startmenu directory list and textbox.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_ini" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_ini" src="images/open.gif"
onclick="toggle('trigger_ini', 'toggle_ini');" />
Installation page</h3>
<div class="toggle" id="toggle_ini">
@@ -456,7 +452,7 @@
<em>Default: smooth</em></p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inf" src="images/open.gif"
onclick="toggle('trigger_inf', 'toggle_inf');" />
Installer finish page</h3>
<div class="toggle" id="toggle_inf">
@@ -466,7 +462,7 @@
log.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_uinf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_uinf" src="images/open.gif"
onclick="toggle('trigger_uinf', 'toggle_uinf');" />
Uninstaller finish page</h3>
<div class="toggle" id="toggle_uinf">
@@ -476,7 +472,7 @@
log.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inaw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inaw" src="images/open.gif"
onclick="toggle('trigger_inaw', 'toggle_inaw');" />
Abort warning</h3>
<div class="toggle" id="toggle_inaw">
@@ -493,7 +489,7 @@
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_inuaw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_inuaw" src="images/open.gif"
onclick="toggle('trigger_inuaw', 'toggle_inuaw');" />
Uninstaller abort warning</h3>
<div class="toggle" id="toggle_inuaw">
@@ -552,7 +548,7 @@ Var StartMenuFolder
MUI_UNPAGE_INSTFILES<br />
MUI_UNPAGE_FINISH</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pg" src="images/open.gif"
onclick="toggle('trigger_pg', 'toggle_pg');" />
Page settings</h3>
<div class="toggle" id="toggle_pg">
@@ -582,7 +578,7 @@ Var PLUGINS_FOLDER
In all text settings, the doublequote character (&quot;) should be escaped in the
following form: $\&quot;</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgg" src="images/open.gif"
onclick="toggle('trigger_pgg', 'toggle_pgg');" />
General page settings</h3>
<div class="toggle" id="toggle_pgg">
@@ -594,7 +590,7 @@ Var PLUGINS_FOLDER
Subtext to display on the header of the page.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgw" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgw" src="images/open.gif"
onclick="toggle('trigger_pgw', 'toggle_pgw');" />
Welcome page settings</h3>
<div class="toggle" id="toggle_pgw">
@@ -611,7 +607,7 @@ Var PLUGINS_FOLDER
Text to display on the page.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgl" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgl" src="images/open.gif"
onclick="toggle('trigger_pgl', 'toggle_pgl');" />
License page settings</h3>
<div class="toggle" id="toggle_pgl">
@@ -646,7 +642,7 @@ Var PLUGINS_FOLDER
</div>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgc" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgc" src="images/open.gif"
onclick="toggle('trigger_pgc', 'toggle_pgc');" />
Components page settings</h3>
<div class="toggle" id="toggle_pgc">
@@ -667,7 +663,7 @@ Var PLUGINS_FOLDER
Text to display inside the description box when no section is selected.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgd" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgd" src="images/open.gif"
onclick="toggle('trigger_pgd', 'toggle_pgd');" />
Directory page settings</h3>
<div class="toggle" id="toggle_pgd">
@@ -687,7 +683,7 @@ Var PLUGINS_FOLDER
GetInstDirError in the leave function to handle an invalid folder.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgs" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgs" src="images/open.gif"
onclick="toggle('trigger_pgs', 'toggle_pgs');" />
Start Menu folder page settings</h3>
<div class="toggle" id="toggle_pgs">
@@ -719,7 +715,7 @@ Var PLUGINS_FOLDER
</pre>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgi" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgi" src="images/open.gif"
onclick="toggle('trigger_pgi', 'toggle_pgi');" />
Installation page settings</h3>
<div class="toggle" id="toggle_pgi">
@@ -741,7 +737,7 @@ Var PLUGINS_FOLDER
been aborted.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgf" src="images/open.gif"
onclick="toggle('trigger_pgf', 'toggle_pgf');" />
Finish page settings</h3>
<div class="toggle" id="toggle_pgf">
@@ -835,7 +831,7 @@ Var PLUGINS_FOLDER
this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_pgu" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_pgu" src="images/open.gif"
onclick="toggle('trigger_pgu', 'toggle_pgu');" />
Uninstall confirm page settings</h3>
<div class="toggle" id="toggle_pgu">
@@ -952,7 +948,7 @@ FunctionEnd
<p>
This macro can also be used in the un.onInit function.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lss" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lss" src="images/open.gif"
onclick="toggle('trigger_lss', 'toggle_lss');" />
Settings for registry storage of selected language</h3>
<div class="toggle" id="toggle_lss">
@@ -978,7 +974,7 @@ FunctionEnd
</pre>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lsin" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lsin" src="images/open.gif"
onclick="toggle('trigger_lsin', 'toggle_lsin');" />
Interface settings for selection dialog</h3>
<div class="toggle" id="toggle_lsin">
@@ -1048,7 +1044,7 @@ Function myGUIInit
FunctionEnd
</pre>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_cfg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_cfg" src="images/open.gif"
onclick="toggle('trigger_cfg', 'toggle_cfg');" />
General Custom Functions</h3>
<div class="toggle" id="toggle_cfg">
@@ -1067,7 +1063,7 @@ FunctionEnd
used, regular .onMouseOverSection and un.onMouseOverSection must be used.</p>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_cfpg" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_cfpg" src="images/open.gif"
onclick="toggle('trigger_cfpg', 'toggle_cfpg');" />
Page Custom Functions</h3>
<div class="toggle" id="toggle_cfpg">
@@ -1087,7 +1083,7 @@ FunctionEnd
</ul>
</div>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_cfwf" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_cfwf" src="images/open.gif"
onclick="toggle('trigger_cfwf', 'toggle_cfwf');" />
Welcome/Finish Page Custom Functions</h3>
<div class="toggle" id="toggle_cfwf">
@@ -1125,12 +1121,12 @@ FunctionEnd
<p>
The zlib/libpng license applies to the Modern UI.</p>
<h3>
- <img class="trigger" alt="Open/Close section" id="trigger_lic" src="images/closed.gif"
+ <img class="trigger" alt="Open/Close section" id="trigger_lic" src="images/open.gif"
onclick="toggle('trigger_lic', 'toggle_lic');" />
License Terms</h3>
<div class="toggle" id="toggle_lic">
<pre>
-Copyright &copy; 2002-2017 Joost Verburg
+Copyright &copy; 2002-2018 Joost Verburg
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/Contrib/Modern UI/System.nsh b/Contrib/Modern UI/System.nsh
index d64ec5f..93d4b6e 100755
--- a/Contrib/Modern UI/System.nsh
+++ b/Contrib/Modern UI/System.nsh
@@ -1,12 +1,12 @@
/*
NSIS Modern User Interface - Version 1.8
-Copyright 2002-2017 Joost Verburg
+Copyright 2002-2018 Joost Verburg
*/
!ifndef MUI_INCLUDED
-!echo "NSIS Modern User Interface version 1.8 - Copyright 2002-2017 Joost Verburg"
+!echo "NSIS Modern User Interface version 1.8 - Copyright 2002-2018 Joost Verburg"
;--------------------------------
!verbose push 3
@@ -2100,7 +2100,9 @@ Var MUI_TEMP2
; MUI_PAGE_UNINSTALLER_PREFIX is undefined by uninstaller pages so we check MUI_UNINSTALLER as well
!ifndef MUI_PAGE_UNINSTALLER_PREFIX && MUI_UNINSTALLER
- !warning "MUI_LANGUAGE should be inserted after the MUI_[UN]PAGE_* macros"
+ !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages
+ !warning "MUI_LANGUAGE should be inserted after the MUI_[UN]PAGE_* macros"
+ !endif
!endif
!insertmacro MUI_INSERT
diff --git a/Contrib/MultiUser/MultiUser.nsh b/Contrib/MultiUser/MultiUser.nsh
index 4235ce4..86530be 100755
--- a/Contrib/MultiUser/MultiUser.nsh
+++ b/Contrib/MultiUser/MultiUser.nsh
@@ -4,7 +4,7 @@ MultiUser.nsh
Installer configuration for multi-user Windows environments
-Copyright 2008-2017 Joost Verburg
+Copyright 2008-2018 Joost Verburg
*/
diff --git a/Contrib/NSIS Menu/SConscript b/Contrib/NSIS Menu/SConscript
index 6968ce6..9fa3481 100755
--- a/Contrib/NSIS Menu/SConscript
+++ b/Contrib/NSIS Menu/SConscript
@@ -81,20 +81,20 @@ if env['PLATFORM'] != 'win32' and WhereIs('wx-config') or \
nsis_menu[0].env.ParseConfig('wx-config --cxxflags --libs')
# install menu files
-
- env.DistributeMenu(html, alias='install-utils')
- env.DistributeMenu(images, path='images', alias='install-utils')
- if env['PLATFORM'] != 'win32':
- env.DistributeBin(resources);
-
-else:
-
+
+ env.DistributeMenu(html, alias='install-utils')
+ env.DistributeMenu(images, path='images', alias='install-utils')
+ if env['PLATFORM'] != 'win32':
+ env.DistributeBin(resources);
+
+else:
+
# no wxWidgets
def err(target, source, env):
if env['PLATFORM'] == 'win32':
- print '*** error: WXWIN must be set to build NSIS Menu!'
+ print('*** error: WXWIN must be set to build NSIS Menu!')
else:
- print '*** error: wx-config must be in the PATH to build NSIS Menu!'
+ print('*** error: wx-config must be in the PATH to build NSIS Menu!')
return 1
cmd = env.Command(target, files, Action(err, ''))
diff --git a/Contrib/SubStart/substart.c b/Contrib/SubStart/substart.c
index 82e7986..dd03a79 100755
--- a/Contrib/SubStart/substart.c
+++ b/Contrib/SubStart/substart.c
@@ -2,7 +2,7 @@
* substart.c - This app runs the executable of the same name in the 'Bin'
* sub-folder and passes along the command line options.
*
- * Copyright (c) 2013-2017 Anders Kjersem
+ * Copyright (c) 2013-2018 Anders Kjersem
*
* Licensed under the zlib/libpng license (the "License");
* you may not use this file except in compliance with the License.
diff --git a/Contrib/System/SConscript b/Contrib/System/SConscript
index f86dea2..ef2ca3f 100755
--- a/Contrib/System/SConscript
+++ b/Contrib/System/SConscript
@@ -50,7 +50,7 @@ elif (not msvc) and conf.TryCompile(src_ascpp, '.S'):
elif (not msvc) and conf.TryCompile(src_ascpp, '.sx'):
files += ['Source/'+filename+'CPP.sx']
else:
- print 'WARNING: System.dll: unable to find assembler for '+filename+'.S'
+ print('WARNING: System.dll: unable to find assembler for '+filename+'.S')
conf.Finish()
BuildPlugin(
diff --git a/Contrib/System/Source/Call-amd64.S b/Contrib/System/Source/Call-amd64.S
index c564f4b..eccb3dc 100755
--- a/Contrib/System/Source/Call-amd64.S
+++ b/Contrib/System/Source/Call-amd64.S
@@ -1,7 +1,7 @@
;#
;# This file is a part of NSIS.
;#
-;# Copyright (C) 2014-2017 Anders Kjersem
+;# Copyright (C) 2014-2018 Anders Kjersem
;#
;# Licensed under the zlib/libpng license (the "License");
;# you may not use this file except in compliance with the License.
diff --git a/Contrib/System/Source/Call.S b/Contrib/System/Source/Call.S
index d60cd17..ec42dc2 100755
--- a/Contrib/System/Source/Call.S
+++ b/Contrib/System/Source/Call.S
@@ -1,5 +1,5 @@
;# Copyright (c) 2008 Thomas Gaugler <thomas@dadie.net>
-;# Copyright (c) 2008-2017 NSIS Contributors
+;# Copyright (c) 2008-2018 NSIS Contributors
;#
;# Permission is hereby granted, free of charge, to any person
;# obtaining a copy of this software and associated documentation
@@ -513,7 +513,7 @@ params_loop:
cmp dword ptr [eax+esi],2
jne params_default
- ;# Long type
+ ;# Long type 'L'/'l' (64-bit)
push dword ptr [eax+ebx]
params_default:
@@ -782,7 +782,7 @@ FUNC_DECL _RealCallBack
mov dword ptr [ebp-8],ebp
add dword ptr [ebp-8],8
- ;# Our callback proc
+ ;# Our callback proc is in eax (set by the thunk created in CreateCallback)
mov dword ptr [ebp-4],eax
IFDEF SYSTEM_LOG_DEBUG
diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c
index dbe8cf4..a3eb5d2 100755
--- a/Contrib/System/Source/System.c
+++ b/Contrib/System/Source/System.c
@@ -42,14 +42,14 @@ const int ParamSizeByType[8] = {
0 // PAT_REGMEM //BUGBUG64?
};
-// Thomas needs to look at this.
+// The size of the base type when used in a struct with the '&' syntax (multiply by (Option - PAO_ARRBASE) to get the real size)
static const int ByteSizeByType[8] = {
1, // PAT_VOID
1, // PAT_INT
1, // PAT_LONG
1, // PAT_STRING
- 2, // PAT_WSTRING (special case for &wN notation: N is a number of WCHAR, not a number of bytes)
- 1, // PAT_GUID
+ 2, // PAT_WSTRING (Special case for &wN notation: N is a number of WCHAR, not a number of bytes)
+ 1, // PAT_GUID (Must stay 1 for compatibility with the old '*(&g16,i)i.s' syntax)
1, // PAT_CALLBACK
1 // PAT_REGMEM
};
@@ -66,15 +66,29 @@ HINSTANCE g_hInstance;
char retexpr[4]; //BUGBUG64?
HANDLE retaddr;
-TCHAR *GetResultStr(SystemProc *proc)
+static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf)
{
- TCHAR *buf = AllocString();
- if (proc->ProcResult == PR_OK) lstrcpy(buf, _T("ok"));
- else if (proc->ProcResult == PR_ERROR) lstrcpy(buf, _T("error"));
- else if (proc->ProcResult == PR_CALLBACK) wsprintf(buf, _T("callback%d"), proc->CallbackIndex);
+ if (proc->ProcResult == PR_OK)
+ lstrcpy(buf, _T("ok"));
+ else if (proc->ProcResult == PR_ERROR)
+ lstrcpy(buf, _T("error"));
+ else if (proc->ProcResult == PR_CALLBACK)
+ {
+ INT_PTR id = proc->CallbackIndex;
+#ifdef POPT_SYNTAX2
+ if (proc->Options & POPT_SYNTAX2)
+ id = (INT_PTR) GetAssociatedSysProcFromCallbackThunkPtr(proc->Proc);
+#endif
+ wsprintf(buf, sizeof(void*) > 4 ? _T("callback%Id") : _T("callback%d"), id); // "%d" must match format used by system_pushintptr() in Get() because script will StrCmp!
+ }
return buf;
}
+TCHAR *AllocResultStr(SystemProc *proc)
+{
+ return MakeResultStr(proc, AllocString());
+}
+
#ifdef SYSTEM_LOG_DEBUG
#ifndef COUNTOF
@@ -253,19 +267,20 @@ PLUGINFUNCTION(Get)
SYSTEM_LOG_ADD(proc->ProcName);
//SYSTEM_LOG_ADD(_T("\n"));
SYSTEM_LOG_POST;
- if ((proc->Options & POPT_ALWRETURN) != 0)
+ if (proc->Options & POPT_ALWRETURN)
{
// Always return flag set -> return separate proc and result
system_pushintptr((INT_PTR) proc);
- GlobalFree(system_pushstring(GetResultStr(proc)));
- } else
+ GlobalFree(system_pushstring(AllocResultStr(proc)));
+ }
+ else
{
if (proc->ProcResult != PR_OK)
{
// No always return flag and error result - return result
- GlobalFree(system_pushstring(GetResultStr(proc)));
+ GlobalFree(system_pushstring(AllocResultStr(proc)));
// If proc is permanent?
- if ((proc->Options & POPT_PERMANENT) == 0)
+ if (!(proc->Options & POPT_PERMANENT))
GlobalFree((HGLOBAL) proc); // No, free it
}
else // Ok result, return proc
@@ -283,7 +298,7 @@ SystemProc* CallBack(SystemProc *proc)
proc->ProcResult = PR_ERROR;
return proc;
}
-#endif // ~_WIN64
+#endif //~ _WIN64
PLUGINFUNCTION(Call)
@@ -319,11 +334,11 @@ PLUGINFUNCTION(Call)
}
// Process output
- if ((proc->Options & POPT_ALWRETURN) != 0)
+ if (proc->Options & POPT_ALWRETURN)
{
// Always return flag set - return separate return and result
ParamsOut(proc);
- GlobalFree(system_pushstring(GetResultStr(proc)));
+ GlobalFree(system_pushstring(AllocResultStr(proc)));
}
else
{
@@ -332,8 +347,10 @@ PLUGINFUNCTION(Call)
ProcParameter pp = proc->Params[0]; // Save old return param
// Return result instead of return value
- proc->Params[0].Value = (INT_PTR) GetResultStr(proc);
+ TCHAR resstr[50];
+ proc->Params[0].Value = (INT_PTR) MakeResultStr(proc, resstr);
proc->Params[0].Type = PAT_TSTRING;
+ proc->Params[0].allocatedBlock = NULL;
ParamsOut(proc); // Return all params
proc->Params[0] = pp; // Restore old return param
@@ -355,7 +372,7 @@ PLUGINFUNCTION(Call)
}
// If proc is permanent?
- if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HGLOBAL) proc); // No, free it
+ if (!(proc->Options & POPT_PERMANENT)) GlobalFree((HGLOBAL) proc); // No, free it
} PLUGINFUNCTIONEND
PLUGINFUNCTIONSHORT(Int64Op)
@@ -402,7 +419,7 @@ PLUGINFUNCTIONSHORT(Int64Op)
case _T('~'): i1 = ~i1; break;
case _T('!'): i1 = !i1; break;
case _T('<'): if (op[1] == _T('<')) i1 = i1 << i2; else i1 = i1 < i2; break;
- case _T('>'): if (op[1] == _T('>')) i1 = i1 >> i2; else i1 = i1 > i2; break;
+ case _T('>'): if (op[1] == _T('>')) i1 = op[2] == _T('>') ? (UINT64)i1 >> (UINT64)i2 : i1 >> i2; else i1 = i1 > i2; break;
case _T('='): i1 = (i1 == i2); break;
}
@@ -436,7 +453,12 @@ SystemProc *PrepareProc(BOOL NeedForCall)
BOOL param_defined = FALSE;
SystemProc *proc = NULL;
TCHAR *ibuf, *ib, *sbuf, *cbuf, *cb;
- unsigned int UsedTString = 0;
+ unsigned int UsedTString = 0, aligntype;
+#ifdef POPT_SYNTAX2
+ const UINT alignflag = PAT_ALIGNFLAG;
+#else
+ const UINT alignflag = 0;
+#endif
#ifdef __GNUC__
temp3 = 0; // "warning: 'temp3' may be used uninitialized in this function": temp3 is set to 0 when we start parsing a new parameter
@@ -472,7 +494,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
case _T('('):
SectionType = PST_PARAMS;
// fake-real parameter: for COM interfaces first param is Interface Pointer
- ParamIndex = ((ProcType == PT_VTABLEPROC)?(2):(1));
+ ParamIndex = ((ProcType == PT_VTABLEPROC)?(2):(1));
temp3 = temp = 0;
param_defined = FALSE;
break;
@@ -526,13 +548,13 @@ SystemProc *PrepareProc(BOOL NeedForCall)
if (pr != NULL) pr->Clone = NULL;
// Never Redefine?
- if ((proc->Options & POPT_NEVERREDEF) != 0)
+ if (proc->Options & POPT_NEVERREDEF)
{
- // Create new proc as copy
- proc = GlobalCopy(proc);
- // NeverRedef options is never inherited
- proc->Options &= (~POPT_NEVERREDEF) & (~POPT_PERMANENT);
- } else proc->Options |= POPT_PERMANENT; // Proc is old -> permanent
+ proc = GlobalCopy(proc); // Create new proc as copy
+ proc->Options &= ~(POPT_NEVERREDEF|POPT_PERMANENT); // NeverRedef options is never inherited
+ }
+ else
+ proc->Options |= POPT_PERMANENT; // Proc is old -> permanent
}
break;
case PT_PROC:
@@ -571,7 +593,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
// Is it '::'
if ((*(ib) == _T('-')) && (*(ib+1) == _T('>')))
{
- ProcType = PT_VTABLEPROC;
+ ProcType = PT_VTABLEPROC;
} else
{
if ((*(ib+1) != _T(':')) || (*(ib) == _T('-'))) break;
@@ -601,6 +623,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
ParamIndex = 0; // Uses the same logic as PST_PARAMS section
case PST_PARAMS:
temp2 = -1; temp4 = 0; // Our type placeholder
+ aligntype = FALSE;
switch (*ib)
{
case _T(' '):
@@ -623,38 +646,44 @@ SystemProc *PrepareProc(BOOL NeedForCall)
param_defined = TRUE;
break;
case _T('&'):
- temp = 1; break; // Special parameter option
+ temp = PAO_ARRBASE; break; // Special parameter option
case _T('*'):
- temp = -1; break; // Pointer parameter option
+ temp = PAO_PTRFLAG; break; // Pointer parameter option
// Types
case _T('@'): temp2 = PAT_REGMEM; break;
- case _T('v'):
- case _T('V'): temp2 = PAT_VOID; break;
-
+ case _T('V'): // No extra alignment for void padding
+ case _T('v'): temp2 = PAT_VOID; break;
+ case 'B': aligntype += alignflag ? 1 : 0;
+ case 'b': temp2 = PAT_INT, temp = sizeof(BYTE) + 1; break; // INT8/BYTE/BOOLEAN alias for &1
+ case 'H': aligntype += alignflag ? 1 : 0;
+ case 'h': temp2 = PAT_INT, temp = sizeof(WORD) + 1; break; // INT16/WORD/SHORT alias for &2 with 'h' AKA printf type length specifier
+#ifndef _WIN64
+ case _T('P'):
+#endif
+ case _T('I'): aligntype += alignflag ? 1 : 0;
#ifndef _WIN64
case _T('p'):
#endif
- case _T('i'):
- case _T('I'): temp2 = PAT_INT; break;
+ case _T('i'): temp2 = PAT_INT; break; // INT32
+#ifdef _WIN64
+ case _T('P'):
+#endif
+ case _T('L'): aligntype += alignflag ? 1 : 0;
#ifdef _WIN64
case _T('p'):
#endif
- case _T('l'):
- case _T('L'): temp2 = PAT_LONG; break;
- case _T('m'):
- case _T('M'): temp2 = PAT_STRING; break;
- case _T('t'):
- case _T('T'):
- temp2 = PAT_TSTRING;
- ++UsedTString;
- break;
- case _T('g'):
- case _T('G'): temp2 = PAT_GUID; break;
- case _T('w'):
- case _T('W'): temp2 = PAT_WSTRING; break;
- case _T('k'):
- case _T('K'): temp2 = PAT_CALLBACK; break;
+ case _T('l'): temp2 = PAT_LONG; break; // INT64
+ case _T('M'): // 1 byte, no extra alignment
+ case _T('m'): temp2 = PAT_STRING; break;
+ case _T('T'): aligntype += (alignflag && sizeof(TCHAR) > 1) ? 1 : 0;
+ case _T('t'): temp2 = PAT_TSTRING, ++UsedTString; break;
+ case _T('G'): aligntype += alignflag ? 1 : 0;
+ case _T('g'): temp2 = PAT_GUID; break;
+ case _T('W'): aligntype += alignflag ? 1 : 0;
+ case _T('w'): temp2 = PAT_WSTRING; break;
+ case _T('K'): aligntype += alignflag ? 1 : 0;
+ case _T('k'): temp2 = PAT_CALLBACK; break;
// Input output specifiers
case _T('.'): temp3++; break; // skip specifier
@@ -695,7 +724,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
break;
case _T('s'):
- case _T('S'): temp4 = -1; break; // Stack
+ case _T('S'): temp4 = -1; break; // Stack
case _T('c'):
case _T('C'): temp4 = INST_CMDLINE+1; break;
case _T('d'):
@@ -713,11 +742,11 @@ SystemProc *PrepareProc(BOOL NeedForCall)
{
const int psbt = ParamSizeByType[temp2];
param_defined = TRUE;
- proc->Params[ParamIndex].Type = temp2;
+ proc->Params[ParamIndex].Type = temp2 | (alignflag && aligntype ? alignflag : 0);
proc->Params[ParamIndex].Size = // Pointer sized or from type
- (temp == -1)?(PARAMSIZEBYTYPE_PTR):((psbt>0)?(psbt):(1)); //BUGBUG64: Is it safe to fallback to 1 for CALLBACK?
- // Get the parameter real special option value
- if (temp == 1) temp = ((int) GetIntFromString(&ib)) + 1;
+ ParamOptionIsPointer(temp) ? (PARAMSIZEBYTYPE_PTR) : ((psbt>0) ? (psbt) : (1)); //BUGBUG64: Is it safe to fallback to 1 for CALLBACK?
+ if (temp == PAO_ARRBASE) temp =
+ PAO_ARRBASE + ((int) GetIntFromString(&ib)); // Read '&' array count specification
proc->Params[ParamIndex].Option = temp;
proc->Params[ParamIndex].Value = 0;
proc->Params[ParamIndex].Input = IOT_NONE;
@@ -749,36 +778,27 @@ SystemProc *PrepareProc(BOOL NeedForCall)
temp2 = 0;
switch (*ib)
{
- case _T(' '):
- break;
+ case _T(' '): break;
case _T('!'): temp = -temp; break;
case _T('c'):
#ifndef _WIN64
- temp2 = POPT_CDECL;
+ temp2 = POPT_CDECL; // Only x86 cares, just eat the option for everything else
#endif
break;
- case _T('r'):
- temp2 = POPT_ALWRETURN;
- break;
- case _T('n'):
- temp2 = POPT_NEVERREDEF;
- break;
- case _T('s'):
- temp2 = POPT_GENSTACK;
- break;
- case _T('e'):
- temp2 = POPT_ERROR;
- break;
- case _T('u'):
- temp2 = POPT_UNLOAD;
- break;
+ case _T('r'): temp2 = POPT_ALWRETURN; break;
+ case _T('n'): temp2 = POPT_NEVERREDEF; break;
+ case _T('s'): temp2 = POPT_GENSTACK; break;
+ case _T('e'): temp2 = POPT_ERROR; break;
+ case _T('u'): temp2 = POPT_UNLOAD; break;
+#ifdef POPT_SYNTAX2
+ case _T('2'): temp2 = POPT_SYNTAX2; break;
+#endif
}
// New Options
if (temp2 != 0)
{
- if (temp == 1) proc->Options |= temp2;
- else proc->Options &= ~temp2;
+ if (temp == 1) proc->Options |= temp2; else proc->Options &= ~temp2;
// Back to default (turn on nothing) state
temp = 1; temp2 = 0;
}
@@ -889,10 +909,10 @@ SystemProc *PrepareProc(BOOL NeedForCall)
void ParamAllocate(SystemProc *proc)
{
- int i;
- for (i = 0; i <= proc->ParamCount; i++)
- if (!proc->Params[i].Value && proc->Params[i].Option == -1)
- proc->Params[i].Value = (INT_PTR) GlobalAlloc(GPTR, 4*ParamSizeByType[proc->Params[i].Type]);
+ UINT i, c;
+ for (i = 0, c = proc->ParamCount; i <= c; i++)
+ if (!proc->Params[i].Value && ParamIsPointer(proc->Params[i]))
+ proc->Params[i].Value = (INT_PTR) GlobalAlloc(GPTR, ParamSizeByType[GetParamType(proc->Params[i])] * 4);
}
void ParamsIn(SystemProc *proc)
@@ -903,11 +923,14 @@ void ParamsIn(SystemProc *proc)
#ifndef _UNICODE
LPWSTR wstr;
#endif
-
+#if !defined(_WIN64) && defined(C_ASSERT)
+ C_ASSERT(FIELD_OFFSET(ProcParameter, Value) + sizeof(int) == FIELD_OFFSET(ProcParameter, _value)); // Make sure PAT_LONG writes to the correct places
+#endif
i = (proc->ParamCount > 0)?(1):(0);
while (TRUE)
{
ProcParameter *par = &proc->Params[i];
+ UINT partype;
// Step 1: retrive value
if ((par->Input == IOT_NONE) || (par->Input == IOT_INLINE))
realbuf = AllocStr(_T(""));
@@ -922,14 +945,13 @@ void ParamsIn(SystemProc *proc)
}
// Retreive pointer to place
- if (par->Option == -1) place = (HGLOBAL*) par->Value;
- else place = (HGLOBAL*) &(par->Value);
+ place = ParamIsPointer(*par) ? (HGLOBAL*) par->Value : (HGLOBAL*) &(par->Value);
// by default no blocks are allocated
par->allocatedBlock = NULL;
// Step 2: place it
- switch (par->Type)
+ switch (partype = GetParamType(*par))
{
case PAT_VOID:
par->Value = 0;
@@ -960,7 +982,7 @@ void ParamsIn(SystemProc *proc)
case PAT_GUID:
wstr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, realbuf, g_stringsize, wstr, g_stringsize);
- if (par->Type == PAT_GUID)
+ if (partype == PAT_GUID)
{
*place = par->allocatedBlock = GlobalAlloc(GPTR, 16);
CLSIDFromString(wstr, *(LPCLSID*)place);
@@ -992,7 +1014,7 @@ void ParamsIn(SystemProc *proc)
#ifndef _WIN64
hi32 = par->_value;
#endif
- wsprintf(buf, _T("\t\t\tParam In %d:\tType=%d Value=")SYSFMT_HEXPTR _T(" hi32=0x%08X"), i,
+ wsprintf(buf, _T("\t\t\tParam In %d:\tType=%#x Value=") SYSFMT_HEXPTR _T(" hi32=0x%08X"), i,
par->Type, par->Value, hi32);
SYSTEM_LOG_ADD(buf);
SYSTEM_LOG_POST;
@@ -1008,31 +1030,36 @@ void ParamsDeAllocate(SystemProc *proc)
{
int i;
for (i = proc->ParamCount; i >= 0; i--)
- if (proc->Params[i].Value && proc->Params[i].Option == -1)
+ if (proc->Params[i].Value && ParamIsPointer(proc->Params[i]))
{
GlobalFree((HGLOBAL) (proc->Params[i].Value));
proc->Params[i].Value = 0;
}
}
+#define GetSpecialParamTypeSize(par) ( (((par).Option)-PAO_ARRBASE) * ByteSizeByType[GetParamType(par)] ) // Option must be > PAO_ARRBASE!
+static const int g_intmask[4] = { 0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF };
+#define GetMaskedInt32Value(val, size) ( (val) & g_intmask[((UINT)(size) < 4) ? (size) : (0)] )
+#define GetSpecialParamInt32Value(par, size) GetMaskedInt32Value((par).Value, (size))
+
void ParamsOut(SystemProc *proc)
{
INT_PTR *place;
LPWSTR wstr;
- int i;
+ int i, partype, intval, typsiz;
TCHAR *realbuf = AllocString();
i = proc->ParamCount;
do
{
// Retreive pointer to place
- if (proc->Params[i].Option == -1)
+ if (ParamIsPointer(proc->Params[i]))
place = (INT_PTR*) proc->Params[i].Value;
else
place = (INT_PTR*) &(proc->Params[i].Value);
// Step 1: retrive value
- switch (proc->Params[i].Type)
+ switch (partype = GetParamType(proc->Params[i]))
{
case PAT_VOID:
*realbuf = _T('\0');
@@ -1041,7 +1068,13 @@ void ParamsOut(SystemProc *proc)
case PAT_REGMEM:
#endif
case PAT_INT:
- wsprintf(realbuf, _T("%d"), (int)(*((INT_PTR*) place)));
+ intval = (int)(*((INT_PTR*) place));
+ if (proc->Params[i].Option > 0) // Note: We don't handle '*' pointers, "*h" and "*b" are not supported, use "*i" even on smaller types
+ {
+ typsiz = GetSpecialParamTypeSize(proc->Params[i]);
+ intval = GetMaskedInt32Value(intval, typsiz);
+ }
+ wsprintf(realbuf, _T("%d"), intval);
break;
#ifdef _WIN64
case PAT_REGMEM:
@@ -1054,7 +1087,7 @@ void ParamsOut(SystemProc *proc)
MultiByteToWideChar(CP_ACP, 0, *((char**) place), g_stringsize, realbuf, g_stringsize-1);
realbuf[g_stringsize-1] = _T('\0'); // make sure we have a null terminator
#else
- lstrcpyn(realbuf,*((TCHAR**) place), g_stringsize); // note: lstrcpyn always include a null terminator (unlike strncpy)
+ lstrcpyn(realbuf,*((TCHAR**) place), g_stringsize); // note: lstrcpyn always includes a null terminator (unlike strncpy)
#endif
break;
case PAT_GUID:
@@ -1078,13 +1111,14 @@ void ParamsOut(SystemProc *proc)
#endif
break;
case PAT_CALLBACK:
- wsprintf(realbuf, _T("%d"), BUGBUG64(proc->Params[i].Value));
+ wsprintf(realbuf, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), proc->Params[i].Value);
break;
}
// memory cleanup
- if ((proc->Params[i].allocatedBlock != NULL) && ((proc->ProcType != PT_STRUCT)
- || (proc->Params[i].Option > 0)))
+ if ((proc->Params[i].allocatedBlock != NULL)
+ && ((proc->ProcType != PT_STRUCT) || ParamIsArray(proc->Params[i]))
+ )
GlobalFree(proc->Params[i].allocatedBlock);
SYSTEM_LOG_ADD(_T("\t\t\tParam Out("));
@@ -1107,7 +1141,7 @@ void ParamsOut(SystemProc *proc)
#ifdef SYSTEM_LOG_DEBUG
{
TCHAR dbgbuf[99];
- wsprintf(dbgbuf, _T(")\t%d:\tType=%d Optn=%d Size=%d Data="),
+ wsprintf(dbgbuf, _T(")\t%d:\tType=%#x Optn=%d Size=%d Data="),
i, proc->Params[i].Type, proc->Params[i].Option, proc->Params[i].Size);
SYSTEM_LOG_ADD(dbgbuf);
SYSTEM_LOG_ADD(realbuf);
@@ -1158,36 +1192,60 @@ HANDLE CreateCallback(SystemProc *cbproc)
#endif
}
+#ifdef POPT_SYNTAX2
+static UINT GetStructParamAlignment(const ProcParameter *par)
+{
+ int partype = GetParamType(*par), isarr = ParamIsArray(*par);
+// &l is used to get the final struct size "*(p, &l.r0)"
+// but it also allows you to write the struct size to the struct as a int<8|16|32|64> "*(p, &l4)"
+// so we can't stop that with: "if ((par->Type & PAT_ALIGNFLAG) && (!isarr || partype != PAT_LONG))"
+ if (par->Type & PAT_ALIGNFLAG)
+ {
+ if ((partype == PAT_STRING) | (partype == PAT_WSTRING)) return ByteSizeByType[partype];
+ if (partype == PAT_GUID) return 16;
+ return !isarr ? (par->Size * 4) : GetSpecialParamTypeSize(*par);
+ }
+ return 0;
+}
+#endif
+
void CallStruct(SystemProc *proc)
{
- BOOL ssflag;
- int i, structsize = 0, size = 0;
+ BOOL ssflag; // "&l" struct size syntax
+ UINT i, paramcount = proc->ParamCount, structsize = 0, size = 0, partype;
char *st, *ptr;
+#ifdef POPT_SYNTAX2
+ BOOL tryalign = proc->Options & POPT_SYNTAX2;
+#endif
SYSTEM_LOG_ADD(_T("\t\tStruct..."));
// Calculate the structure size
- for (i = 1; i <= proc->ParamCount; i++)
+ for (i = 1; i <= paramcount; i++)
{
+ partype = GetParamType(proc->Params[i]);
// Emulate g as &g16
// (Changing ByteSizeByType would break compatibility with '*(&g16,i)i.s')
- if (PAT_GUID==proc->Params[i].Type && 0==proc->Params[i].Option)
- {
- proc->Params[i].Option = 1 + 16;
- }
+ if (PAT_GUID==partype && ParamIsSimple(proc->Params[i]))
+ proc->Params[i].Option = PAO_ARRBASE + 16;
- if (proc->Params[i].Option < 1)
- structsize += proc->Params[i].Size * 4;
+ if (!ParamIsArray(proc->Params[i]))
+ size = proc->Params[i].Size * 4;
else
- structsize += ByteSizeByType[proc->Params[i].Type] * (proc->Params[i].Option - 1);
+ size = GetParamArrayTypeSize(proc->Params[i]);
+
+#ifdef POPT_SYNTAX2
+ if (tryalign)
+ structsize = SYS_ALIGNON(structsize, GetStructParamAlignment(&proc->Params[i]));
+#endif
+ structsize += size;
}
-
+
// Struct exists?
- if (proc->Proc == NULL)
- // No. Allocate struct memory
+ if (proc->Proc == NULL) // No. Allocate struct memory
proc->Proc = (HANDLE) GlobalAlloc(GPTR, structsize);
- else // In case of zero size defined structure use mapped size
- if (structsize == 0) structsize = (int) GlobalSize((HGLOBAL) proc->Proc);
+ else if (structsize == 0) // In case of zero size defined structure use mapped size
+ structsize = (int) GlobalSize((HGLOBAL) proc->Proc);
#ifdef SYSTEM_LOG_DEBUG
{
@@ -1200,52 +1258,58 @@ void CallStruct(SystemProc *proc)
// Pointer to current data
st = (char*) proc->Proc;
- for (i = 1; i <= proc->ParamCount; i++)
+ for (i = 1; i <= paramcount; i++)
{
ssflag = FALSE;
+ partype = GetParamType(proc->Params[i]);
// Normal or special block?
- if (proc->Params[i].Option < 1)
+ if (!ParamIsArray(proc->Params[i]))
{
// Normal
- size = proc->Params[i].Size*4;
+ size = proc->Params[i].Size * 4;
ptr = (char*) &(proc->Params[i].Value);
}
else
{
- const int intmask[4] = {0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF};
-
// Special
- size = (proc->Params[i].Option-1) * ByteSizeByType[proc->Params[i].Type];
+ size = GetParamArrayTypeSize(proc->Params[i]);
ptr = NULL;
- switch (proc->Params[i].Type)
+ switch (partype)
{
- case PAT_VOID: break;
- case PAT_LONG:
+ case PAT_VOID:
+ break;
+ case PAT_LONG:
// real structure size
proc->Params[i].Value = structsize;
#ifndef _WIN64
proc->Params[i]._value = 0;
#endif
ssflag = TRUE; // System::Call '*(...,&l.r0)'
+ // [[fallthrough]]
case PAT_INT:
- // clear unused value bits
- proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)];
+ proc->Params[i].Value = GetSpecialParamInt32Value(proc->Params[i], size); // clears unused value bits
// pointer
ptr = (char*) &(proc->Params[i].Value);
break;
- case PAT_STRING:
- case PAT_GUID:
- case PAT_WSTRING:
+ case PAT_STRING:
+ case PAT_WSTRING:
+ case PAT_GUID:
// Jim Park: Pointer for memcopy, so keep as char*
- ptr = (char*) proc->Params[i].Value; break;
+ ptr = (char*) proc->Params[i].Value;
+ break;
}
}
// Process them!
if (ptr != NULL)
{
+#ifdef POPT_SYNTAX2
+ if (tryalign)
+ st = (char*) SYS_ALIGNON((INT_PTR) st, GetStructParamAlignment(&proc->Params[i]));
+#endif
+
// Input
if ((proc->Params[i].Input != IOT_NONE) || (ssflag))
copymem(st, ptr, size);
diff --git a/Contrib/System/Source/System.h b/Contrib/System/Source/System.h
index d7a6d9e..ca51a12 100755
--- a/Contrib/System/Source/System.h
+++ b/Contrib/System/Source/System.h
@@ -31,6 +31,10 @@
# define SYSTEM_API __declspec(dllimport) // BUGBUG: This is a plugin, who is going to import the functions directly?
#endif
+#define SYS_ALIGNUP(num, al) ( ((num)+((al)-1)) & ~((al)-1) )
+#define SYS_UNSAFEALIGNON(num, al) ( (num) % (al) == 0 ? (num) : SYS_ALIGNUP((num), (al)) ) // al CANNOT be 0!
+#define SYS_ALIGNON(num, al) ( (al) ? SYS_UNSAFEALIGNON((num), (al)) : (num) )
+
#define NEW_STACK_SIZE 256*256
// Proc types:
@@ -59,6 +63,7 @@
#define PAT_TSTRING PAT_STRING
#endif
#define PAT_PTR ( (4==sizeof(void*)) ? PAT_INT : PAT_LONG )
+#define PAT_ALIGNFLAG 0x8000 // Type is aligned to its natural alignment
// Input/Output Source/Destination
#define IOT_NONE 0
@@ -75,13 +80,18 @@
#define POPT_GENSTACK 0x10 // Use general stack (non temporary for callback)
#define POPT_ERROR 0x20 // Call GetLastError after proc and push it to stack
#define POPT_UNLOAD 0x40 // unload dll after call
-#define POPT_CLONE 0x80 // This is clone callback
+#define POPT_CLONE 0x80 // Callback clone
+#define POPT_SYNTAX2 0x100 // "?2" syntax mode (direct callback ids and aligned uppercased types)
+
+// Proc argument (ProcParameter) options
+#define PAO_PTRFLAG -1 // Could be changed to 0x80000000 if we need to support "*&iN"
+#define PAO_ARRBASE 1
+#define ParamOptionIsPointer(opt) ( (opt) < 0 )
-// Our single proc parameter
typedef struct
{
- int Type;
- int Option; // -1 -> Pointer, 1-... -> Special+1
+ int Type; // Can be ORed with PAT_ALIGNFLAG to request alignment in structs
+ int Option; // PAO_PTRFLAG -> Pointer, PAO_ARRBASE-... -> Special+PAO_ARRBASE
INT_PTR Value; // it can hold any pointer sized value
#ifndef _WIN64
int _value; // Upper 32 bits of Value when type is 64 bit (2 pushes)
@@ -92,6 +102,16 @@ typedef struct
HGLOBAL allocatedBlock; // block allocated for passing string, wstring or guid param
} ProcParameter;
+#define ParamIsSimple(par) ( (par).Option == 0 )
+#define ParamIsPointer(par) ParamOptionIsPointer((par).Option)
+#define ParamIsArray(par) ( (par).Option > 0 ) // AKA special
+#define GetParamArrayTypeSize GetSpecialParamTypeSize
+#ifdef POPT_SYNTAX2
+#define GetParamType(par) ( (BYTE) (par).Type )
+#else
+#define GetParamType(par) ( (par).Type )
+#endif
+
// Our single proc (Since the user will free proc with GlobalFree,
// I've declared all variables as statics)
typedef struct tag_SystemProc SystemProc;
@@ -157,9 +177,9 @@ extern void ParamsOut(SystemProc *proc);
#ifdef SYSTEM_AMD64
extern SystemProc* CallProc2(SystemProc *proc, UINT_PTR ParamCount);
#define CallProc(p) CallProc2((p), (p)->ParamCount) // ParamCount is passed as a parameter so CallProc2 can determine the required stack size without a function call
-#else // !SYSTEM_AMD64
+#else //! SYSTEM_AMD64
extern SystemProc* CallProc(SystemProc *proc);
-#endif // ~SYSTEM_AMD64
+#endif //~ SYSTEM_AMD64
#ifndef SYSTEM_NOCALLBACKS
extern SystemProc* CallBack(SystemProc *proc);
extern SystemProc* RealCallBack();
diff --git a/Contrib/System/System.html b/Contrib/System/System.html
index 19bb8d4..a10845b 100755
--- a/Contrib/System/System.html
+++ b/Contrib/System/System.html
@@ -7,7 +7,7 @@
<body>
<h1>NSIS System Plug-in</h1>
<p>
-<i>Copyright &copy; 2002 brainsucker (Nik Medved)</i><br><i>Copyright &copy; 2002-2017 NSIS Contributors</i>
+<i>Copyright &copy; 2002 brainsucker (Nik Medved)</i><br><i>Copyright &copy; 2002-2018 NSIS Contributors</i>
</p>
<h2>Table of Contents</h2>
@@ -254,12 +254,20 @@ DetailPrint $4
<td>pointer (and other pointer sized types like handles and HWNDs)</td>
</tr>
<tr>
+<th>b</th>
+<td>int8, byte</td>
+</tr>
+<tr>
+<th>h</th>
+<td>int16, short</td>
+</tr>
+<tr>
<th>i</th>
-<td>int (includes char, byte, short and so on)</td>
+<td>int32 (includes char, byte, short and so on when used as a pointer)</td>
</tr>
<tr>
<th>l</th>
-<td>large integer, int64</td>
+<td>int64, large integer</td>
</tr>
<tr>
<th>m</th>
@@ -299,22 +307,22 @@ DetailPrint $4
</tr>
<tr>
<th>&amp;t<i>N</i></th>
-<td>array of <i>N</i> text characters TCHAR (structures only)</td>
+<td>array of <i>N</i> TCHAR text characters (structures only)</td>
</tr>
<tr>
<th>&amp;m<i>N</i></th>
-<td>array of <i>N</i> ANSI characters CHAR (structures only)</td>
+<td>array of <i>N</i> CHAR ANSI characters (structures only)</td>
</tr>
<tr>
<th>&amp;w<i>N</i></th>
-<td>array of <i>N</i> Unicode characters WCHAR (structures only)</td>
+<td>array of <i>N</i> WCHAR Unicode characters (structures only)</td>
</tr>
<tr>
-<th>&amp;g<i>N</i></th>
-<td><i>N</i> bytes of GUID (structures only)</td>
+<th>&amp;g<i>16</i></th>
+<td><i>16</i> bytes of GUID (structures only)</td>
</tr>
</table>
-<p>Additionally, each type can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `p' with no asterisk. A <a href="#pointer">usage example</a> is available. <a href="#memfuncs">Alloc</a> returns addresses and its return value should therefore be used with `p', without an asterisk.</p>
+<p>Additionally, each type (except <i>b</i>, <i>h</i>, <i>k</i> and <i>@</i>) can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `p' with no asterisk. A <a href="#pointer">usage example</a> is available. <a href="#memfuncs">Alloc</a> returns addresses and its return value should therefore be used with `p', without an asterisk.</p>
</blockquote>
<h4>Available Sources and Destinations</h4>
@@ -381,7 +389,7 @@ DetailPrint $4
<h4>Callbacks</h4>
<blockquote>
-<p>Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, <a href="https://msdn.microsoft.com/en-us/library/ms633494">EnumChildWindows</a> uses a <a href="https://msdn.microsoft.com/en-us/library/ms633493p">callback function</a>. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.</p>
+<p>Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, <a href="https://msdn.microsoft.com/en-us/library/ms633494">EnumChildWindows</a> uses a <a href="https://msdn.microsoft.com/en-us/library/ms633493">callback function</a>. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.</p>
<p>Creation of callback functions is done using <a href="#callfuncs">Get</a> and the callback creation syntax. As you will not call the callbacks yourself, the source of the parameters should be omitted using a dot. When the callback is called, the destination of the parameters will be filled with the values passed on to the callback. The value the callback will return is set by the source of the return "parameter". The destination of the return "parameter" should always be set as that's where System will notify you the callback was called.</p>
@@ -464,9 +472,20 @@ System::Free $0
<th>u</th>
<td>Unload DLL after call (using FreeLibrary, so you'll be able to delete it for example).</td>
</tr>
+<tr>
+<th>2</th>
+<td>Experimental v2 syntax</td>
+</tr>
</table>
</blockquote>
+<h4>Experimental v2 syntax</h4>
+
+<ul>
+<li>Struct types in <a href="#v2typealign">uppercase are aligned</a> to their natural alignment. Lowercased types are packed without alignment.
+<li><a href="#v2callback">Callback id</a> based on the allocated callback
+</ul>
+
<h4>Usage Examples</h4>
<blockquote><pre>
@@ -508,6 +527,19 @@ System::<b>Call</b> "*$0(i .r1)"
System::Free $0
DetailPrint $1
</pre></blockquote>
+<a name="structsize"></a><blockquote><pre>
+System::Call '*0(p, <b>&amp;l.r2,</b> &amp;t2)' ; &amp;l. is not part of the struct
+DetailPrint "Struct size=$2"
+</pre></blockquote>
+<a name="structsizemember"></a><blockquote><pre>
+System::Call '*(<b>&amp;l4</b>,i,i,i,i,&amp;t128)p.r1' ; Fills dwOSVersionInfoSize with the struct size as a int32
+${If} $1 Z&lt;&gt; 0
+ System::Call 'kernel32::GetVersionEx(pr1)i.r0'
+ System::Call '*$1(i,i.R1,i.R2,i.R3)'
+ System::Free $1
+ ${IfThen} $0 &lt;&gt; 0 ${|} DetailPrint "v$R1.$R2.$R3" ${|}
+${EndIf}
+</pre></blockquote>
<blockquote><pre>
<a name="directvarmemparam"></a>System::<b>Call</b> "user32::GetClientRect(p $hwndparent, @ r0)"
System::<b>Call</b> "*$0(i,i,i.r1,i.r2)"
@@ -534,8 +566,7 @@ end:
</pre></blockquote>
<blockquote><pre>
InitPluginsDir
-SetOutPath $PLUGINSDIR
-File MyDLL.dll
+File "/oname=$PLUGINSDIR\MyDLL.dll" MyDLL.dll
System::<b>Call</b> "MyDLL::MyFunc(i 5) ? u"
Delete $PLUGINSDIR\MyDLL.dll
</pre></blockquote>
@@ -556,6 +587,29 @@ loop:
done:
System::Free $R0
</pre></blockquote>
+<a name="v2callback"></a><blockquote><pre>
+System::Get '(m.r1)ir2r0 <b>?2</b>' ; v2 syntax
+Pop $9
+System::Call 'kernel32::EnumSystemLocalesA(k r9, i 0)'
+loop:
+ StrCmp <b>$0 "callback$9"</b> 0 done
+ DetailPrint "Locale: $1"
+ StrCpy $2 1 ; EnumLocalesProc return value
+ System::Call $9 ; return from EnumLocalesProc
+ Goto loop
+done:
+System::Free $9
+</pre></blockquote>
+<a name="v2typealign"></a><blockquote><pre>
+System::Call '*(&amp;t50 "!")p.r2' ; DecimalSep
+System::Call '*(&amp;t50 "`")p.r3' ; ThousandSep
+System::Call '*(i 2, i 0, i 3, <b>P r2, P r3</b>, i 1)p.r1 <b>?2</b>'
+System::Call 'kernel32::GetNumberFormat(i 0, i 0, t "1337.666" r4, p r1, t.r5, i ${NSIS_MAX_STRLEN})'
+DetailPrint "Custom formated $4: $5"
+System::Free $3
+System::Free $2
+System::Free $1
+</pre></blockquote>
<blockquote><pre>
<a name="repeat"></a>!define MB "user32::MessageBox(p$HWNDPARENT,t,t'NSIS System Plug-in',i0)"
System::<b>Call</b> "${MB}(,'my message',,)"
@@ -585,7 +639,7 @@ good:
<ul>
<li>
-<b>Int64Op</b> <i>ARG1</i> <i>OP</i> [<i>ARG2</i>]
+<b id="Int64Op">Int64Op</b> <i>ARG1</i> <i>OP</i> [<i>ARG2</i>]
<blockquote>
<p>Performs <i>OP</i> on <i>ARG1</i> and optionally <i>ARG2</i> and returns the result on the stack. Both <i>ARG1</i> and <i>ARG2</i> are 64-bit integers. This means they can range between -2^63 and 2^63 - 1.</p>
<h4>Available Operations</h4>
@@ -595,18 +649,19 @@ good:
<li>Multiplication -- <b>*</b></li>
<li>Division -- <b>/</b></li>
<li>Modulo -- <b>%</b></li>
-<li>Shift right -- <b>&gt;&gt;</b></li>
<li>Shift left -- <b>&lt;&lt;</b></li>
+<li>Arithmetic shift right -- <b>&gt;&gt;</b></li>
+<li>Logical shift right -- <b>&gt;&gt;&gt;</b></li>
<li>Bitwise or -- <b>|</b></li>
<li>Bitwise and -- <b>&amp;</b></li>
<li>Bitwise xor -- <b>^</b></li>
+<li>Bitwise not (one argument) -- <b>~</b></li>
+<li>Logical not (one argument) -- <b>!</b></li>
<li>Logical or -- <b>||</b></li>
<li>Logical and -- <b>&amp;&amp;</b></li>
<li>Less than -- <b>&lt;</b></li>
<li>Equals -- <b>=</b></li>
<li>Greater than -- <b>&gt;</b></li>
-<li>Bitwise not (one argument) -- <b>~</b></li>
-<li>Logical not (one argument) -- <b>!</b></li>
</ul>
<h4>Usage Examples</h4>
@@ -645,6 +700,14 @@ DetailPrint "1 &lt;&lt; 62 = $0" # 4611686018427387904
System::<b>Int64Op</b> 0x4000000000000000 &gt;&gt; 62
Pop $0
DetailPrint "0x4000000000000000 &gt;&gt; 62 = $0" # 1
+
+System::<b>Int64Op</b> 0x8000000000000000 &gt;&gt; 1
+Pop $0
+DetailPrint "0x8000000000000000 &gt;&gt; 1 = $0" # -4611686018427387904 (0xC000000000000000)
+
+System::<b>Int64Op</b> 0x8000000000000000 &gt;&gt;&gt; 1
+Pop $0
+DetailPrint "0x8000000000000000 &gt;&gt;&gt; 1 = $0" # 4611686018427387904 (0x4000000000000000)
</pre></blockquote>
<blockquote><pre>
System::<b>Int64Op</b> 0xF0F0F0F | 0xF0F0FFF
diff --git a/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp b/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
index 172c96e..22f1369 100755
--- a/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
+++ b/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
@@ -88,7 +88,9 @@ void PatchGenerator::execute(vector<SameBlock*>& sameBlocks) {
}
// we need to update the memory cache of target
- tout << _T("[CacheReload] File position = ") << static_cast<unsigned int>(targetCDataBaseOffset) << _T("\n");
+ if (beVerbose) {
+ tout << _T("[CacheReload] File position = ") << static_cast<unsigned int>(targetCDataBaseOffset) << _T("\n");
+ }
target.seekg(targetCDataBaseOffset,ios::beg);
target.read(reinterpret_cast<char*>(targetCData),targetCDataSize);
diff --git a/Contrib/VPatch/Source/GenPat/main.cpp b/Contrib/VPatch/Source/GenPat/main.cpp
index 787c5bd..03ae8c8 100755
--- a/Contrib/VPatch/Source/GenPat/main.cpp
+++ b/Contrib/VPatch/Source/GenPat/main.cpp
@@ -275,23 +275,24 @@ int _tmain( int argc, TCHAR * argv[] ) {
*iter = NULL;
}
- patch.close();
+ patch.close(); // Close the temporary patch file so we can open it again for reading
TFileOffset patchSize = POSIX::getFileSize(tempFileName.c_str());
+ char* buf = new char[patchSize];
+ if (!buf) throw _T("Out of memory"); // In case we switch to nothrow_t
// finally: copy the temporary file to the actual patch
bifstream tempF;
tempF.open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::in);
+ tempF.read(buf,patchSize);
+ if (tempF.fail()) throw _T("Could not read temp file");
+ tempF.close();
+ bofstream().open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::out); // empty the temporary file
+
bofstream patchF;
patchF.open(patchFileName.c_str(), std::ios_base::binary | std::ios_base::out);
- char* buf = new char[patchSize];
- tempF.read(buf,patchSize);
patchF.write(buf,patchSize);
+ if (patchF.fail()) throw _T("Could not write patch file");
delete[] buf;
- tempF.close();
-
- // now empty the temporary file
- bofstream clearF;
- clearF.open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::out);
}
catch(tstring s) {
terr << _T("Error thrown: ") << s.c_str();
@@ -301,6 +302,10 @@ int _tmain( int argc, TCHAR * argv[] ) {
terr << _T("Error thrown: ") << s;
return 2;
}
+ catch(...) {
+ terr << _T("Error thrown: Unknown error!\n");
+ return 2;
+ }
} else {
terr << _T("There was a problem opening the files.\n");
return 2;
diff --git a/Contrib/nsDialogs/Readme.html b/Contrib/nsDialogs/Readme.html
index 1cd06f0..3077f0a 100755
--- a/Contrib/nsDialogs/Readme.html
+++ b/Contrib/nsDialogs/Readme.html
@@ -4,16 +4,12 @@
<title>nsDialogs</title>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css">
-b
-{
- color: red;
-}
-code
-{
- margin-left: 20px;
- padding: 7px;
- background-color: rgb(240,240,240);
-}
+body { color: #000000; background-color: #ffffff; }
+b { color: red; }
+code { margin-left: 1.2em; padding: 0.5em; background-color: #f0f0f0; }
+span.inlcod i { padding: 0px 0.2em; color: #222222; font-family: monospace; font-style: normal; }
+blockquote pre { background-color: #fcfcfc; font-family: monospace; }
+abbr { font-variant: none; cursor: help; }
</style>
</head>
<body>
@@ -28,10 +24,7 @@ code
<li>
<a href="#step">Step-by-Step Tutorial</a>
<ul>
-<li><a href="#step-basic">Basic Script</a></li>
<li><a href="#step-page">Custom Page</a></li>
-<li><a href="#step-create">Creating Page</a></li>
-<li><a href="#step-show">Showing Page</a></li>
<li><a href="#step-add">Adding Controls</a></li>
<li><a href="#step-state">Control State</a></li>
<li><a href="#step-notify">Real-time Notification</a></li>
@@ -61,38 +54,76 @@ code
<a href="#mref">Macro Reference</a>
<ul>
<li><a href="#mref-create">NSD_Create*</a></li>
-<li><a href="#mref-onback">NSD_OnBack</a></li>
-<li><a href="#mref-onchange">NSD_OnChange</a></li>
-<li><a href="#mref-onclick">NSD_OnClick</a></li>
-<li><a href="#mref-onnotify">NSD_OnNotify</a></li>
-<li><a href="#mref-createtimer">NSD_CreateTimer</a></li>
-<li><a href="#mref-killtimer">NSD_KillTimer</a></li>
-<li><a href="#mref-addstyle">NSD_AddStyle</a></li>
-<li><a href="#mref-addexstyle">NSD_AddExStyle</a></li>
-<li><a href="#mref-gettext">NSD_GetText</a></li>
-<li><a href="#mref-settext">NSD_SetText</a></li>
-<li><a href="#mref-settextlimit">NSD_SetTextLimit</a></li>
-<li><a href="#mref-getstate">NSD_GetState</a></li>
-<li><a href="#mref-setstate">NSD_SetState</a></li>
-<li><a href="#mref-check">NSD_Check</a></li>
-<li><a href="#mref-uncheck">NSD_Uncheck</a></li>
-<li><a href="#mref-cbaddstring">NSD_CB_AddString</a></li>
-<li><a href="#mref-cbselectstring">NSD_CB_SelectString</a></li>
-<li><a href="#mref-lbaddstring">NSD_LB_AddString</a></li>
-<li><a href="#mref-lbdelstring">NSD_LB_DelString</a></li>
-<li><a href="#mref-lbclear">NSD_LB_Clear</a></li>
-<li><a href="#mref-lbgetcount">NSD_LB_GetCount</a></li>
-<li><a href="#mref-lbselectstring">NSD_LB_SelectString</a></li>
-<li><a href="#mref-lbgetselection">NSD_LB_GetSelection</a></li>
+<li><a href="#mref-onback">NSD_OnBack</a>, <a href="#mref-onchange">NSD_OnChange</a>, <a href="#mref-onclick">NSD_OnClick</a>, <a href="#mref-onnotify">NSD_OnNotify</a></li>
<li><a href="#mref-setfocus">NSD_SetFocus</a></li>
-<li><a href="#mref-setimage">NSD_SetImage</a></li>
-<li><a href="#mref-setsimage">NSD_SetStretchedImage</a></li>
-<li><a href="#mref-seticon">NSD_SetIcon</a></li>
-<li><a href="#mref-seticonfrominstaller">NSD_SetIconFromInstaller</a></li>
-<li><a href="#mref-clearimage">NSD_ClearImage</a></li>
-<li><a href="#mref-clearicon">NSD_ClearIcon</a></li>
-<li><a href="#mref-freeimage">NSD_FreeImage</a></li>
-<li><a href="#mref-freeicon">NSD_FreeIcon</a></li>
+<li><a href="#mref-createtimer">NSD_CreateTimer</a>, <a href="#mref-killtimer">NSD_KillTimer</a></li>
+<li><a href="#mref-addstyle">NSD_AddStyle</a>, <a href="#mref-addexstyle">NSD_AddExStyle</a></li>
+<li><a href="#mref-gettext">NSD_GetText</a>, <a href="#mref-settext">NSD_SetText</a></li>
+<li>Text, Password &amp; Number:
+<a href="#mref-settextlimit">NSD_Edit_SetTextLimit</a>,
+<a href="#mref-edsetro">NSD_Edit_SetReadOnly</a>,
+<a href="#mref-edsetcuebanner">NSD_Edit_SetCueBannerText</a>
+</li>
+<li>RichEdit:
+<a href="#mref-richsettextlimit">NSD_RichEd_SetTextLimit</a>,
+<a href="#mref-richseteventmask">NSD_RichEd_SetEventMask</a>,
+<a href="#mref-richsetbkclr">NSD_RichEd_SetCustomBackgroundColor</a>
+</li>
+<li>CheckBox &amp; RadioButton:
+<a href="#mref-getstate">NSD_GetState</a>,
+<a href="#mref-setstate">NSD_SetState</a>,
+<a href="#mref-check">NSD_Check</a>,
+<a href="#mref-uncheck">NSD_Uncheck</a>
+</li>
+<li>ComboBox &amp; DropList:
+<a href="#mref-cbaddstring">NSD_CB_AddString</a>,
+<a href="#mref-cbinsstring">NSD_CB_PrependString, NSD_CB_AppendString, NSD_CB_InsertString</a>,
+<a href="#mref-cbselectstring">NSD_CB_SelectString</a>,
+<a href="#mref-cbgetcount">NSD_CB_GetCount</a>
+</li>
+<li>ListBox:
+<a href="#mref-lbaddstring">NSD_LB_AddString</a>,
+<a href="#mref-lbinsstring">NSD_LB_PrependString, NSD_LB_AppendString, NSD_LB_InsertString</a>,
+<a href="#mref-lbdelstring">NSD_LB_DelString</a>,
+<a href="#mref-lbdelitem">NSD_LB_DelItem</a>,
+<a href="#mref-lbclear">NSD_LB_Clear</a>,
+<a href="#mref-lbgetcount">NSD_LB_GetCount</a>,
+<a href="#mref-lbselectstring">NSD_LB_SelectString</a>,
+<a href="#mref-lbgetselection">NSD_LB_GetSelection</a>
+</li>
+<li>Animation:
+<a href="#mref-animopenfile">NSD_Anim_OpenFile</a>,
+<a href="#mref-animplay">NSD_Anim_Play</a>,
+<a href="#mref-animstop">NSD_Anim_Stop</a>
+</li>
+<li>HTrackBar &amp; VTrackBar:
+<a href="#mref-trackgetpos">NSD_TrackBar_GetPos</a>,
+<a href="#mref-tracksetpos">NSD_TrackBar_SetPos</a>,
+<a href="#mref-tracksetrmin">NSD_TrackBar_SetRangeMin</a>,
+<a href="#mref-tracksetrmax">NSD_TrackBar_SetRangeMax</a>,
+<a href="#mref-tracksetticfr">NSD_TrackBar_SetTicFreq</a>
+</li>
+<li>UpDown:
+<a href="#mref-udsetbuddy">NSD_UD_SetBuddy</a>,
+<a href="#mref-udgetpos">NSD_UD_GetPos</a>,
+<a href="#mref-udsetpos">NSD_UD_SetPos</a>,
+<a href="#mref-udsetpackedrange">NSD_UD_SetPackedRange</a>
+</li>
+<li>HotKey:
+<a href="#mref-hkgethk">NSD_HK_GetHotKey</a>, <a href="#mref-hksethk">NSD_HK_SetHotKey</a>
+</li>
+<li>Bitmap:
+<a href="#mref-setimage">NSD_SetImage</a>,
+<a href="#mref-setsimage">NSD_SetStretchedImage</a>,
+<a href="#mref-clearimage">NSD_ClearImage</a>,
+<a href="#mref-freeimage">NSD_FreeImage</a>
+</li>
+<li>Icon:
+<a href="#mref-seticon">NSD_SetIcon</a>,
+<a href="#mref-seticonfrominstaller">NSD_SetIconFromInstaller</a>,
+<a href="#mref-clearicon">NSD_ClearIcon</a>,
+<a href="#mref-freeicon">NSD_FreeIcon</a>
+</li>
</ul>
</li>
<li><a href="#faq">FAQ</a></li>
@@ -102,135 +133,63 @@ code
<p>nsDialogs allows creation of custom pages in the installer. On top of the built-in pages, nsDialogs can create pages with any type of controls in any order and arrangement. It can create everything from a simple page with one label to form which reacts to user's actions. <a href="../Modern UI 2/Readme.html">Modern UI 2</a>, for example, uses nsDialogs to create the welcome and finish pages.</p>
-<p>nsDialogs is a new NSIS plug-in, introduced in version 2.29 as a replacement for <a href="../InstallOptions/Readme.html">InstallOptions</a>. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.</p>
+<p>nsDialogs is a NSIS plug-in, introduced in version 2.29 as a replacement for <a href="../InstallOptions/Readme.html">InstallOptions</a>. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.</p>
-<p>The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the core functionality by modifying the library or simply avoid using it.</p>
+<p>The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the <a href="http://msdn.microsoft.com/en-us/library/bb773169">core functionality</a> by modifying the library or simply avoid using it.</p>
<h2><a name="step"></a>Step-by-Step Tutorial</h2>
-<h3><a name="step-basic"></a>Basic Script</h3>
-
-<p>Before using nsDialogs, lets first create a basic script as our skeleton.</p>
-
-<blockquote><pre>Name nsDialogs
-OutFile nsDialogs.exe
-
-XPStyle on
-
-Page instfiles
-
-Section
-
- DetailPrint "hello world"
-
-SectionEnd</pre></blockquote>
-
<h3><a name="step-page"></a>Custom Page</h3>
-<p>Next, we'll add a custom page where we can use nsDialogs. nsDialogs cannot be used in sections or any other function but a custom page's function.</p>
-
-<blockquote><pre>Name nsDialogs
-OutFile nsDialogs.exe
-
-XPStyle on
-
-<b>Page custom nsDialogsPage</b>
-Page instfiles
-
-<b>Function nsDialogsPage
-FunctionEnd</b>
-
-Section
-
- DetailPrint "hello world"
-
-SectionEnd</pre></blockquote>
-
-<h3><a name="step-create"></a>Creating Page</h3>
-
-<p>Now that the foundations are laid, it's time to use nsDialogs. The first call must always be to nsDialogs::Create. It will create a new dialog in the page and return its <i>HWND</i> on the stack. The result must be popped from the stack to prevent stack corruption. If the result is <i>error</i>, the dialog couldn't be created.</p>
-
-<p>nsDialogs::Create accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.</p>
-
-<p><i>HWND</i> is a number that uniquely identifies the dialog and can be used with SendMessage, SetCtlColors and Win32 API.</p>
+<p>Before you can start adding controls you need to create a nsDialogs custom page. nsDialogs pages can only be created in a custom page's creator function, not in sections nor regular functions. Lets create a basic script with a empty nsDialogs page as our skeleton:</p>
<blockquote><pre><b>!include LogicLib.nsh</b>
Name nsDialogs
OutFile nsDialogs.exe
-
XPStyle on
-<b>Var Dialog</b>
-
-Page custom nsDialogsPage
-Page instfiles
-
-Function nsDialogsPage
<b>
- nsDialogs::Create 1018
- Pop $Dialog
-
- ${If} $Dialog == error
- Abort
- ${EndIf}
-</b>
-FunctionEnd
-
-Section
-
- DetailPrint "hello world"
-
-SectionEnd</pre></blockquote>
-
-<h3><a name="step-show"></a>Showing Page</h3>
-
-<p>Now that the page is created, it's time to show it. This is done with nsDialogs::Show. This function will not return until the user clicks Next, Back or Cancel.</p>
-
-<blockquote><pre>!include LogicLib.nsh
-
-Name nsDialogs
-OutFile nsDialogs.exe
-
-XPStyle on
-
Var Dialog
-Page custom nsDialogsPage
+Page custom nsDialogsPage</b>
Page instfiles
-Function nsDialogsPage
+<b>Function nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
-<b>
+
nsDialogs::Show
-</b>
-FunctionEnd
+FunctionEnd</b>
Section
-
- DetailPrint "hello world"
-
SectionEnd</pre></blockquote>
+<span class="inlcod">
+<p>The first call must always be to <i>nsDialogs::Create</i>. It will create a new dialog in the page and return its <i>HWND</i> on the stack. The result must be popped from the stack to prevent stack corruption. If the result is <i>error</i>, the dialog couldn't be created and the page must be aborted!</p>
+<p><i>nsDialogs::Create</i> accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.</p>
+<p><i>HWND</i> is a number that uniquely identifies the dialog and can be used with <i>SendMessage</i>, <i>SetCtlColors</i> and Win32 API functions.</p>
+<p>The dialog is not fully constructed at this point and you can make modifications to it before it is displayed. To finalize and display the dialog you must call <i>nsDialogs::Show</i>. This function will not return until the user clicks Next, Back or Cancel.</p>
+</span>
+
<h3><a name="step-add"></a>Adding Controls</h3>
-<p>Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use <a href="#mref-create">${NSD_Create*}</a> macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's HWND. Like the dialogs HWND, it must be popped from the stack and saved.</p>
+<span class="inlcod">
+<p>Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use <a href="#mref-create">${NSD_Create*}</a> macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's <i>HWND</i>. Like the dialogs <i>HWND</i>, it must be popped from the stack and saved.</p>
<p>Each of the measurements that the macros take can use one of three unit types - pixels, dialog units or percentage of the dialog's size. It can also be negative to indicate it should be measured from the end. To use dialog units, the measurement must be suffixed with the letter <i>u</i>. To use percentage, the measurement must be suffixed with the percentage sign - <i>%</i>. Any other suffix, or no suffix, means pixels.</p>
-<p>Dialog units allow creation of dialogs that scale well when different fonts or DPI is used. Its size in pixels is determined on runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.</p>
-
+<p>Dialog units allow creation of dialogs that scale well when different fonts or <abbr title="Dots per Inch">DPI</abbr> is used. Its size in pixels is determined on runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.</p>
+</span>
<blockquote><pre><b>!include nsDialogs.nsh</b>
!include LogicLib.nsh
Name nsDialogs
OutFile nsDialogs.exe
-
XPStyle on
Var Dialog
@@ -260,48 +219,51 @@ Function nsDialogsPage
FunctionEnd
Section
-
- DetailPrint "hello world"
-
SectionEnd</pre></blockquote>
-<p>Available control types that can be created with <a href="#mref-create">${NSD_Create*}</a> are:</p>
-
-<ul>
-<li>HLine</li>
-<li>VLine</li>
-<li>Label</li>
-<li>Icon</li>
-<li>Bitmap</li>
-<li>BrowseButton</li>
-<li>Link</li>
-<li>Button</li>
-<li>GroupBox</li>
-<li>CheckBox</li>
-<li>RadioButton</li>
-<li>Text</li>
-<li>Password</li>
-<li>Number</li>
-<li>FileRequest</li>
-<li>DirRequest</li>
-<li>ComboBox</li>
-<li>DropList</li>
-<li>ListBox</li>
-<li>ProgressBar</li>
-</ul>
+<p>Available control types that can be created with <a href="#mref-create">${NSD_Create*}</a> are:
+HLine,
+VLine,
+Label,
+Icon,
+Bitmap,
+BrowseButton,
+Link,
+Button,
+GroupBox,
+CheckBox,
+RadioButton,
+Text,
+Password,
+Number,
+FileRequest,
+DirRequest,
+RichEdit,
+ComboBox,
+DropList,
+ListBox,
+SortedListBox,
+ProgressBar,
+Animation,
+HTrackBar,
+VTrackBar,
+UpDown,
+HotKey,
+IPAddress.
+</p>
<h3><a name="step-state"></a>Control State</h3>
-<p>Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a <i>leave callback</i> function to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the <a href="#mref-gettext">${NSD_GetText}</a> macro. Use the <a href="#mref-getstate">${NSD_GetState}</a> macro for RadioButton and CheckBox controls.</p>
+<span class="inlcod">
+<p>Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a "leave callback function" to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the <a href="#mref-gettext">${NSD_GetText}</a> macro. Use the <a href="#mref-getstate">${NSD_GetState}</a> macro for RadioButton and CheckBox controls.</p>
<p>Note that not all controls support <a href="#mref-gettext">${NSD_GetText}</a> and some require special handling with specific messages defined in WinMessages.nsh. For example, the ListBox control requires usage of <i>LB_GETCURSEL</i> and <i>LB_GETTEXT</i>. With time, the library of macros in nsDialogs.nsh will fill with more and more macros that'll handle more cases like this.</p>
-
+</span>
<blockquote><pre>!include nsDialogs.nsh
!include LogicLib.nsh
Name nsDialogs
OutFile nsDialogs.exe
-
XPStyle on
Var Dialog
@@ -338,25 +300,22 @@ FunctionEnd
FunctionEnd</b>
Section
-
- DetailPrint "hello world"
-
SectionEnd</pre></blockquote>
<h3><a name="step-notify"></a>Real-time Notification</h3>
+<span class="inlcod">
<p>One of the more exciting new features of nsDialogs is callback function notification of changes to the dialog. nsDialogs can call a function defined in a script in response to a user action such as changing of a text field or click of a button. To make nsDialogs notify us of events, we'll use <a href="#mref-onclick">${NSD_OnClick}</a> and <a href="#mref-onchange">${NSD_OnChange}</a>. Not every control supports both of the events. For example, there is nothing to notify about label changes, only clicks.</p>
-<p>When the callback function is called, the control's HWND will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the HWND can shed some light on which control originated the event.</p>
-
-<p>The new example will respond to the user type <i>hello</i> in the text box.</p>
+<p>When the callback function is called, the control's <i>HWND</i> will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the <i>HWND</i> can shed some light on which control originated the event.</p>
+<p>The new example will respond to the user typing "hello" in the text box.</p>
+</span>
<blockquote><pre>!include nsDialogs.nsh
!include LogicLib.nsh
Name nsDialogs
OutFile nsDialogs.exe
-
XPStyle on
Var Dialog
@@ -408,9 +367,6 @@ FunctionEnd
FunctionEnd</b>
Section
-
- DetailPrint "hello world"
-
SectionEnd</pre></blockquote>
<h3><a name="step-memory"></a>Memory</h3>
@@ -424,7 +380,6 @@ SectionEnd</pre></blockquote>
Name nsDialogs
OutFile nsDialogs.exe
-
XPStyle on
Var Dialog
@@ -481,149 +436,93 @@ Function nsDialogsPageLeave
FunctionEnd
Section
-
- DetailPrint "hello world"
-
SectionEnd</pre></blockquote>
<h2><a name="ref"></a>Function Reference</h2>
<h3><a name="ref-create"></a>Create</h3>
-
<p><code>nsDialogs::Create <i>rect</i></code></p>
-
<p>Creates a new dialog. <i>rect</i> specific the identifier of the control whose location will be mimiced. This should usually be 1018, which is control mimiced for creation of built-in pages. The Modern UI also has control 1044 for the welcome and the finish page.</p>
-
<p>Returns the new dialog's HWND on the stack or <i>error</i>.</p>
<h3><a name="ref-createcontrol"></a>CreateControl</h3>
-
<p><code>nsDialogs::CreateControl <i>class</i> <i>style</i> <i>extended_style</i> <i>x</i> <i>y</i> <i>width</i> <i>height</i> <i>text</i></code></p>
-
<p>Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.</p>
-
<p>Returns the new control's HWND on the stack or <i>error</i>.</p>
<h3><a name="ref-show"></a>Show</h3>
-
<p><code>nsDialogs::Show</code></p>
-
<p>Displays the page. Call this once finished with nsDialogs::Create, nsDialogs::CreateControl and the rest.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-selectfiledialog"></a>SelectFileDialog</h3>
-
<p><code>nsDialogs::SelectFileDialog <i>mode</i> <i>initial_selection</i> <i>filter</i></code></p>
-
<p>Displays a file selection dialog to the user. If <i>mode</i> is set to <i>save</i>, displays a file save dialog. If <i>mode</i> is set to <i>open</i>, displays a file open dialog. <i>filter</i> is a list of available file filters separated by pipes. If an empty string is passed, the default is used - <i>All Files|*.*</i>.</p>
-
<p><i>initial_selection</i> can be used to provide the user with a default file to look for and/or a default folder to look in. If <i>initial_selection</i> is empty no default filename will be provided for the user and the dialog will start in the current working directory. If <i>initial_selection</i> specifies just a filename, for example "test.exe", the dialog will be set up to look for a file called test.exe in the current working directory. If <i>initial_selection</i> specifies just a directory, for example "C:\Program Files", the dialog starts in the provided directory with no file name provided. If <i>initial_selection</i> specifies a directory and a filename, for example "C:\Windows\System32\calc.exe", the dialog will be set up to look for a file called calc.exe in the directory C:\Windows\System32.</p>
-
<p>Returns the selected file on the stack or an empty string if the user canceled the operation.</p>
<h3><a name="ref-selectfolderdialog"></a>SelectFolderDialog</h3>
-
<p><code>nsDialogs::SelectFolderDialog <i>title</i> <i>initial_selection</i></code></p>
-
<p>Displays a directory selection dialog to the user.</p>
-
<p>Returns the selected directory on the stack or "error" in case the user canceled the operation or an error occured.</p>
<h3><a name="ref-setrtl"></a>SetRTL</h3>
-
<p><code>nsDialogs::SetRTL <i>rtl_setting</i></code></p>
-
<p>Sets right-to-left mode on or off. If <i>rtl_setting</i> is 0, it's set to off. If <i>rtl_setting</i> is 1, it's set to on. This function must be called before any calls to nsDialogs::CreateControl.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-getuserdata"></a>GetUserData</h3>
-
<p><code>nsDialogs::GetUserData <i>control_HWND</i></code></p>
-
<p>Returns user data associated with the control on the stack. Use nsDialogs::SetUserData to set this data.</p>
<h3><a name="ref-setuserdata"></a>SetUserData</h3>
-
<p><code>nsDialogs::SetUserData <i>control_HWND</i> <i>data</i></code></p>
-
<p>Associates <i>data</i> with the control. Use nsDialogs::GetUserData to get this data.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-onback"></a>OnBack</h3>
-
<p><code>nsDialogs::OnBack <i>function_address</i></code></p>
-
<p>Sets the callback function for the Back button. This function will be called when the user clicks the back button. Call Abort in this function to prevent the user from going back to the last page.</p>
-
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-onchange"></a>OnChange</h3>
-
<p><code>nsDialogs::OnChange <i>control_HWND</i> <i>function_address</i></code></p>
-
<p>Sets a change notification callback function for the given control. Whenever the control changes, the function will be called and the control's HWND will be waiting on its stack.</p>
-
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-onclick"></a>OnClick</h3>
-
<p><code>nsDialogs::OnClick <i>control_HWND</i> <i>function_address</i></code></p>
-
<p>Sets a click notification callback function for the given control. Whenever the control is clicked, the function will be called and the control's HWND will be waiting on its stack.</p>
-
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-onnotify"></a>OnNotify</h3>
-
<p><code>nsDialogs::OnNotify <i>control_HWND</i> <i>function_address</i></code></p>
-
-<p>Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the MNHDR structure will be waiting on its stack.</p>
-
+<p>Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the NMHDR structure will be waiting on its stack.</p>
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-createtimer"></a>CreateTimer</h3>
-
<p><code>nsDialogs::CreateTimer <i>function_address</i> <i>timer_interval</i></code></p>
-
<p>Sets a timer that'd call the callback function for the given control every in a constant interval. Interval times are specified in milliseconds.</p>
-
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h3><a name="ref-killtimer"></a>KillTimer</h3>
-
<p><code>nsDialogs::KillTimer <i>function_address</i></code></p>
-
<p>Kills a previously set timer.</p>
-
<p>Use GetFunctionAddress to get the address of the desired callback function.</p>
-
<p>Returns nothing.</p>
<h2><a name="mref"></a>Macro Reference</h2>
-
<p>nsDialogs.nsh contains a lot of macros that can make nsDialogs usage a lot easier. Below is a description of each of those macros including purpose, syntax, input and output.</p>
<h3><a name="mref-create"></a>NSD_Create*</h3>
-
<p><code>${NSD_Create*} <i>x</i> <i>y</i> <i>width</i> <i>height</i> <i>text</i></code></p>
-
<p>Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.</p>
-
<p>Available variants:</p>
-
<ul>
<li>${NSD_CreateHLine}</li>
<li>${NSD_CreateVLine}</li>
@@ -641,189 +540,220 @@ SectionEnd</pre></blockquote>
<li>${NSD_CreateNumber}</li>
<li>${NSD_CreateFileRequest}</li>
<li>${NSD_CreateDirRequest}</li>
+<li>${NSD_CreateRichEdit}</li>
<li>${NSD_CreateComboBox}</li>
<li>${NSD_CreateDropList}</li>
<li>${NSD_CreateListBox}</li>
+<li>${NSD_CreateSortedListBox}</li>
<li>${NSD_CreateProgressBar}</li>
+<li>${NSD_CreateAnimation}</li>
+<li>${NSD_CreateHTrackBar}</li>
+<li>${NSD_CreateVTrackBar}</li>
+<li>${NSD_CreateUpDown}</li>
+<li>${NSD_CreateHotKey}</li>
+<li>${NSD_CreateIPAddress} <small>(Requires <abbr title="Internet Explorer">IE</abbr>4)</small></li>
</ul>
-
<p>Returns the new control's HWND on the stack or <i>error</i></p>
<h3><a name="mref-onback"></a>NSD_OnBack</h3>
-
<p><code>${NSD_OnBack} <i>function_name</i></code></p>
-
<p>See <a href="#ref-onback">OnBack</a> for more details.</p>
<p></p>
<h3><a name="mref-onchange"></a>NSD_OnChange</h3>
-
<p><code>${NSD_OnChange} <i>control_HWND</i> <i>function_name</i></code></p>
-
<p>See <a href="#ref-onchange">OnChange</a> for more details.</p>
-
<p>See <a href="#step-notify">Real-time Notification</a> for usage example.</p>
<h3><a name="mref-onclick"></a>NSD_OnClick</h3>
-
<p><code>${NSD_OnClick} <i>control_HWND</i> <i>function_name</i></code></p>
-
<p>See <a href="#ref-onclick">OnClick</a> for more details.</p>
<h3><a name="mref-onnotify"></a>NSD_OnNotify</h3>
-
<p><code>${NSD_OnNotify} <i>control_HWND</i> <i>function_name</i></code></p>
-
<p>See <a href="#ref-onnotify">OnNotify</a> for more details.</p>
-<h3><a name="mref-createtimer"></a>NSD_CreateTimer</h3>
+<h3><a name="mref-setfocus"></a>NSD_SetFocus</h3>
+<p><code>${NSD_SetFocus} <i>control_HWND</i></code></p>
+<p>Sets focus to a control.</p>
+<h3><a name="mref-createtimer"></a>NSD_CreateTimer</h3>
<p><code>${NSD_CreateTimer} <i>function_name</i> <i>timer_interval</i></code></p>
-
<p>See <a href="#ref-createtimer">CreateTimer</a> for more details.</p>
<h3><a name="mref-killtimer"></a>NSD_KillTimer</h3>
-
<p><code>${NSD_KillTimer} <i>function_name</i></code></p>
-
<p>See <a href="#ref-killtimer">KillTimer</a> for more details.</p>
<h3><a name="mref-addstyle"></a>NSD_AddStyle</h3>
-
<p><code>${NSD_AddStyle} <i>control_HWND</i> <i>style</i></code></p>
-
-<p>Adds one or more window style to a control. Multiple styles should be separated with pipes `|'.</p>
-
-<p>See MSDN for style description.</p>
+<p>Adds one or more window styles to a control. Multiple styles should be separated with pipes `|'.</p>
+<p>See MSDN for shared and per-control style descriptions.</p>
<h3><a name="mref-addexstyle"></a>NSD_AddExStyle</h3>
-
<p><code>${NSD_AddExStyle} <i>control_HWND</i> <i>style</i></code></p>
-
-<p>Adds one or more extended window style to a control. Multiple styles should be separated with pipes `|'.</p>
-
-<p>See MSDN for style description.</p>
+<p>Adds one or more extended window styles to a control. Multiple styles should be separated with pipes `|'.</p>
+<p>See <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543">MSDN</a> for style descriptions.</p>
<h3><a name="mref-gettext"></a>NSD_GetText</h3>
-
-<p><code>${NSD_GetText} <i>control_HWND</i> <i>output_variable</i></code></p>
-
+<p><code>${NSD_GetText} <i>control_HWND</i> <i>$output_variable</i></code></p>
<p>Retrieves the text of a control and stores it into <i>output_variable</i>. Especially useful for textual controls.</p>
-
<p>See <a href="#step-state">Control State</a> for usage example.</p>
<h3><a name="mref-settext"></a>NSD_SetText</h3>
-
<p><code>${NSD_SetText} <i>control_HWND</i> <i>text</i></code></p>
-
<p>Sets the text of a control.</p>
-<h3><a name="mref-settextlimit"></a>NSD_SetTextLimit</h3>
+<h3><a name="mref-settextlimit"></a>NSD_Edit_SetTextLimit</h3>
+<p><code>${NSD_Edit_SetTextLimit} <i>control_HWND</i> <i>limit</i></code></p>
+<p>Sets the input length limit for a text control.</p>
-<p><code>${NSD_SetTextLimit} <i>control_HWND</i> <i>limit</i></code></p>
+<h3><a name="mref-edsetro"></a>NSD_Edit_SetReadOnly</h3>
+<p><code>${NSD_Edit_SetReadOnly} <i>control_HWND</i> <i>readonly</i></code></p>
+<p>1 to make the text control read-only or 0 to allow the user to input data.</p>
-<p>Sets input size limit for a text control.</p>
+<h3><a name="mref-edsetcuebanner"></a>NSD_Edit_SetCueBannerText</h3>
+<p><code>${NSD_Edit_SetCueBannerText} <i>control_HWND</i> <i>displaywhenfocused</i> <i>text</i></code></p>
+<p>Set a text hint displayed when the control is empty. The text is only visible on WinXP and later. Requires <i>XPStyle on</i>.</p>
-<h3><a name="mref-getstate"></a>NSD_GetState</h3>
+<h3><a name="mref-richsettextlimit"></a>NSD_RichEd_SetTextLimit</h3>
+<p><code>${NSD_RichEd_SetTextLimit} <i>control_HWND</i> <i>limit</i></code></p>
+<p>Sets the input length limit.</p>
-<p><code>${NSD_GetState} <i>control_HWND</i> <i>output_variable</i></code></p>
+<h3><a name="mref-richseteventmask"></a>NSD_RichEd_SetEventMask</h3>
+<p><code>${NSD_RichEd_SetEventMask} <i>control_HWND</i> <i>eventmask</i></code></p>
-<p>Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.</p>
+<h3><a name="mref-richsetbkclr"></a>NSD_RichEd_SetCustomBackgroundColor</h3>
+<p><code>${NSD_RichEd_SetCustomBackgroundColor} <i>control_HWND</i> <i>COLORREF</i></code></p>
+<h3><a name="mref-getstate"></a>NSD_GetState</h3>
+<p><code>${NSD_GetState} <i>control_HWND</i> <i>$output_variable</i></code></p>
+<p>Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.</p>
<p>See <a href="#step-memory">Memory</a> for usage example.</p>
<h3><a name="mref-setstate"></a>NSD_SetState</h3>
-
<p><code>${NSD_SetState} <i>control_HWND</i> <i>state</i></code></p>
-
<p>Sets the state of a check box or a radio button control. Possible values for <i>state</i> are ${BST_CHECKED} and ${BST_UNCHECKED}.</p>
-
<p>See <a href="#step-memory">Memory</a> for usage example.</p>
<h3><a name="mref-check"></a>NSD_Check</h3>
-
<p><code>${NSD_Check} <i>control_HWND</i></code></p>
-
<p>Checks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_CHECKED}.</p>
<h3><a name="mref-uncheck"></a>NSD_Uncheck</h3>
-
<p><code>${NSD_Uncheck} <i>control_HWND</i></code></p>
-
<p>Unchecks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_UNCHECKED}.</p>
-
<p>See <a href="#step-memory">Memory</a> for usage example.</p>
<h3><a name="mref-cbaddstring"></a>NSD_CB_AddString</h3>
-
<p><code>${NSD_CB_AddString} <i>combo_HWND</i> <i>string</i></code></p>
-
<p>Adds a string to a combo box.</p>
-<h3><a name="mref-cbselectstring"></a>NSD_CB_SelectString</h3>
+<h3><a name="mref-cbinsstring"></a>NSD_CB_InsertString</h3>
+<p><code>${NSD_CB_InsertString} <i>combo_HWND</i> <i>index</i> <i>string</i></code></p>
+<p><code>${NSD_CB_PrependString} <i>combo_HWND</i> <i>string</i></code></p>
+<p><code>${NSD_CB_AppendString} <i>combo_HWND</i> <i>string</i></code></p>
+<p>Insert a string in a specified position in a combo box.</p>
+<h3><a name="mref-cbselectstring"></a>NSD_CB_SelectString</h3>
<p><code>${NSD_CB_SelectString} <i>combo_HWND</i> <i>string</i></code></p>
-
<p>Selects a string in a combo box.</p>
-<h3><a name="mref-lbaddstring"></a>NSD_LB_AddString</h3>
+<h3><a name="mref-cbgetcount">NSD_CB_GetCount</a></h3>
+<p><code>${NSD_CB_GetCount} <i>combo_HWND</i> <i>$output_variable</i></code></p>
+<h3><a name="mref-lbaddstring"></a>NSD_LB_AddString</h3>
<p><code>${NSD_LB_AddString} <i>listbox_HWND</i> <i>string</i></code></p>
-
<p>Adds a string to a list box.</p>
-<h3><a name="mref-lbdelstring"></a>NSD_LB_DelString</h3>
+<h3><a name="mref-lbinsstring"></a>NSD_LB_InsertString</h3>
+<p><code>${NSD_LB_InsertString} <i>listbox_HWND</i> <i>index</i> <i>string</i></code></p>
+<p><code>${NSD_LB_PrependString} <i>listbox_HWND</i> <i>string</i></code></p>
+<p><code>${NSD_LB_AppendString} <i>listbox_HWND</i> <i>string</i></code></p>
+<p>Insert a string in a specified position in a list box.</p>
+<h3><a name="mref-lbdelstring"></a>NSD_LB_DelString</h3>
<p><code>${NSD_LB_DelString} <i>listbox_HWND</i> <i>string</i></code></p>
-
<p>Deletes a string from a list box.</p>
-<h3><a name="mref-lbcleqar">NSD_LB_Clear</a></h3>
+<h3><a name="mref-lbdelitem"></a>NSD_LB_DelItem</h3>
+<p><code>${NSD_LB_DelItem} <i>listbox_HWND</i> <i>itemindex</i></code></p>
+<p>Deletes a string from a list box.</p>
+<h3><a name="mref-lbclear">NSD_LB_Clear</a></h3>
<p><code>${NSD_LB_Clear} <i>listbox_HWND</i></code></p>
-
<p>Deletes all strings from a list box.</p>
<h3><a name="mref-lbgetcount">NSD_LB_GetCount</a></h3>
-
-<p><code>${NSD_LB_GetCount} <i>listbox_HWND</i> <i>output_variable</i></code></p>
-
+<p><code>${NSD_LB_GetCount} <i>listbox_HWND</i> <i>$output_variable</i></code></p>
<p>Retrieves the number of strings from a list box.</p>
<h3><a name="mref-lbselectstring"></a>NSD_LB_SelectString</h3>
-
<p><code>${NSD_LB_SelectString} <i>listbox_HWND</i> <i>string</i></code></p>
-
<p>Selects a string in a list box.</p>
<h3><a name="mref-lbgetselection">NSD_LB_GetSelection</a></h3>
+<p><code>${NSD_LB_GetSelection} <i>listbox_HWND</i> <i>$output_variable</i></code></p>
+<p>Retrieves the selected stringed from a list box. Returns an empty string if no string is selected.</p>
-<p><code>${NSD_LB_GetSelection} <i>listbox_HWND</i> <i>output_variable</i></code></p>
+<h3><a name="mref-animopenfile">NSD_Anim_OpenFile</a></h3>
+<p><code>${NSD_Anim_OpenFile} <i>anim_HWND</i> <i>avi_path</i></code></p>
+<p>Opens the specified (silent) .AVI movie clip.</p>
-<p>Retrieves the selected stringed from a list box. Returns an empty string if no string is selected.</p>
+<h3><a name="mref-animplay">NSD_Anim_Play</a></h3>
+<p><code>${NSD_Anim_Play} <i>anim_HWND</i></code></p>
+<p>Plays the movie clip repeatedly.</p>
-<h3><a name="mref-setfocus"></a>NSD_SetFocus</h3>
+<h3><a name="mref-animstop">NSD_Anim_Stop</a></h3>
+<p><code>${NSD_Anim_Stop} <i>anim_HWND</i></code></p>
+<p>Stops playback.</p>
-<p><code>${NSD_SetFocus} <i>control_HWND</i></code></p>
+<h3><a name="mref-trackgetpos">NSD_TrackBar_GetPos</a></h3>
+<p><code>${NSD_TrackBar_GetPos} <i>track_HWND</i> <i>$output</i></code></p>
-<p>Sets focus to a control.</p>
+<h3><a name="mref-tracksetpos">NSD_TrackBar_SetPos</a></h3>
+<p><code>${NSD_TrackBar_SetPos} <i>track_HWND</i> <i>pos</i></code></p>
-<h3><a name="mref-setimage"></a>NSD_SetImage</h3>
+<h3><a name="mref-tracksetrmin">NSD_TrackBar_SetRangeMin</a></h3>
+<p><code>${NSD_TrackBar_SetRangeMin} <i>track_HWND</i> <i>minpos</i></code></p>
-<p><code>${NSD_SetImage} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>
+<h3><a name="mref-tracksetrmax">NSD_TrackBar_SetRangeMax</a></h3>
+<p><code>${NSD_TrackBar_SetRangeMax} <i>track_HWND</i> <i>maxpos</i></code></p>
-<p>Loads a bitmap from <i>image_path</i> and displays it on <i>control_HWND</i> created by <a href="#mref-create">${NSD_CreateBitmap}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href="#mref-freeimage">${NSD_FreeImage}</a> once no longer necessary.</p>
+<h3><a name="mref-tracksetticfr">NSD_TrackBar_SetTicFreq</a></h3>
+<p><code>${NSD_TrackBar_SetTicFreq} <i>track_HWND</i> <i>frequency</i></code></p>
+<p>Sets the interval frequency for tick marks.</p>
-<p>The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.</p>
+<h3><a name="mref-udsetbuddy">NSD_UD_SetBuddy</a></h3>
+<p><code>${NSD_UD_SetBuddy} <i>ud_HWND</i> <i>buddy_HWND</i></code></p>
+
+<h3><a name="mref-udgetpos">NSD_UD_GetPos</a></h3>
+<p><code>${NSD_UD_GetPos} <i>ud_HWND</i> <i>$output</i></code></p>
+
+<h3><a name="mref-udsetpos">NSD_UD_SetPos</a></h3>
+<p><code>${NSD_UD_SetPos} <i>ud_HWND</i> <i>pos</i></code></p>
+<h3><a name="mref-udsetpackedrange">NSD_UD_SetPackedRange</a></h3>
+<p><code>${NSD_UD_SetPackedRange} <i>ud_HWND</i> <i>packedrange</i></code></p>
+<p>Sets the min-max range. Two signed 16-bit numbers packed into 32-bits.</p>
+
+<h3><a name="mref-hkgethk">NSD_HK_GetHotKey</a></h3>
+<p><code>${NSD_HK_GetHotKey} <i>hk_HWND</i> <i>$output</i></code></p>
+<p>Bits 0..7 specify the virtual key code and bits 8..15 specify the HOTKEYF modifier flags.</p>
+
+<h3><a name="mref-hksethk">NSD_HK_SetHotKey</a></h3>
+<p><code>${NSD_HK_SetHotKey} <i>hk_HWND</i> <i>packedhotkey</i></code></p>
+
+<h3><a name="mref-setimage"></a>NSD_SetImage</h3>
+<p><code>${NSD_SetImage} <i>control_HWND</i> <i>image_path</i> <i>$output_variable</i></code></p>
+<p>Loads a bitmap from <i>image_path</i> and displays it on <i>control_HWND</i> created by <a href="#mref-create">${NSD_CreateBitmap}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href="#mref-freeimage">${NSD_FreeImage}</a> once no longer necessary.</p>
+<p>The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.</p>
<blockquote><pre>!include nsDialogs.nsh
Name nsDialogs
OutFile nsDialogs.exe
-XPStyle on
-
Page custom nsDialogsImage
Page instfiles
@@ -832,14 +762,11 @@ Var Image
Var ImageHandle
Function .onInit
-
InitPluginsDir
File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
-
FunctionEnd
Function nsDialogsImage
-
nsDialogs::Create 1018
Pop $Dialog
@@ -854,52 +781,37 @@ Function nsDialogsImage
nsDialogs::Show
${NSD_FreeImage} $ImageHandle
-
FunctionEnd
Section
SectionEnd</pre></blockquote>
<h3><a name="mref-setsimage"></a>NSD_SetStretchedImage</h3>
-
-<p><code>${NSD_SetStretchedImage} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>
-
+<p><code>${NSD_SetStretchedImage} <i>control_HWND</i> <i>image_path</i> <i>$output_variable</i></code></p>
<p>Loads and displays a bitmap just like <a href="#mref-setimage">${NSD_SetImage}</a>, but stretched the image to fit the control.</p>
-<h3><a name="mref-seticon"></a>NSD_SetIcon</h3>
+<h3><a name="mref-clearimage"></a>NSD_ClearImage</h3>
+<p><code>${NSD_ClearImage} <i>control_HWND</i></code></p>
+<p>Clears an image from a control.</p>
-<p><code>${NSD_SetIcon} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>
+<h3><a name="mref-freeimage"></a>NSD_FreeImage</h3>
+<p><code>${NSD_FreeImage} <i>image_handle</i></code></p>
+<p>Frees an image handle previously loaded with <a href="#mref-setimage">${NSD_SetImage}</a> or <a href="#mref-setsimage">${NSD_SetStretchedImage}</a>.</p>
+<h3><a name="mref-seticon"></a>NSD_SetIcon</h3>
+<p><code>${NSD_SetIcon} <i>control_HWND</i> <i>image_path</i> <i>$output_variable</i></code></p>
<p>Same as <a href="#mref-setimage">${NSD_SetImage}</a>, but used for loading and setting an icon in a control created by <a href="#mref-create">${NSD_CreateIcon}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href="#mref-freeicon">${NSD_FreeIcon}</a> once no longer necessary.</p>
<h3><a name="mref-seticonfrominstaller"></a>NSD_SetIconFromInstaller</h3>
-
-<p><code>${NSD_SetIconFromInstaller} <i>control_HWND</i> <i>output_variable</i></code></p>
-
+<p><code>${NSD_SetIconFromInstaller} <i>control_HWND</i> <i>$output_variable</i></code></p>
<p>Loads the icon used in the installer and displays it on <i>control_HWND</i> created by <a href="#mref-create">${NSD_CreateIcon}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href="#mref-freeicon">${NSD_FreeIcon}</a> once no longer necessary.</p>
-<h3><a name="mref-clearimage"></a>NSD_ClearImage</h3>
-
-<p><code>${NSD_ClearImage} <i>control_HWND</i></code></p>
-
-<p>Clears an image from a control.</p>
-
<h3><a name="mref-clearicon"></a>NSD_ClearIcon</h3>
-
<p><code>${NSD_ClearIcon} <i>control_HWND</i></code></p>
-
<p>Clears an icon from a control.</p>
-<h3><a name="mref-freeimage"></a>NSD_FreeImage</h3>
-
-<p><code>${NSD_FreeImage} <i>image_handle</i></code></p>
-
-<p>Frees an image handle previously loaded with <a href="#mref-setimage">${NSD_SetImage}</a> or <a href="#mref-setsimage">${NSD_SetStretchedImage}</a>.</p>
-
<h3><a name="mref-freeicon"></a>NSD_FreeIcon</h3>
-
<p><code>${NSD_FreeIcon} <i>icon_handle</i></code></p>
-
<p>Frees an icon handle previously loaded with <a href="#mref-seticon">${NSD_SetIcon}</a> or <a href="#mref-seticonfrominstaller">${NSD_SetIconFromInstaller}</a>.</p>
@@ -912,7 +824,7 @@ SectionEnd</pre></blockquote>
<li>
<b>Q:</b> Can nsDialogs handle InstallOptions INI files?
<blockquote>
-<p><b>A:</b> nsDialogs.nsh contains a function called <i>CreateDialogFromINI</i> that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notification yet. <i>Examples\nsDialogs\InstallOptions.nsi</i> shows a usage example of this function.</p><p>In the future there'll also be a function that creates the script itself.
+<p><b>A:</b> nsDialogs.nsh contains a function called <i>CreateDialogFromINI</i> that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notifications. <i>Examples\nsDialogs\InstallOptions.nsi</i> shows a usage example of this function.</p>
</blockquote>
</li>
diff --git a/Contrib/nsDialogs/example.nsi b/Contrib/nsDialogs/example.nsi
index 5373c4e..93dbc99 100755
--- a/Contrib/nsDialogs/example.nsi
+++ b/Contrib/nsDialogs/example.nsi
@@ -1,16 +1,22 @@
!include nsDialogs.nsh
!include LogicLib.nsh
+!include WinCore.nsh ; MAKELONG
Name "nsDialogs Example"
OutFile "nsDialogs Example.exe"
+Caption "$(^Name)"
XPStyle on
RequestExecutionLevel user
-LicenseText "All the action takes place on the next page..."
+LicenseText "All the action takes place on the next page..." "Start"
+SubCaption 0 ": Ready?"
Page license
Page custom nsDialogsPage
+Page custom LBPage
+Page custom RangesPage
+Page custom NotifyPage
!pragma warning disable 8000 ; "Page instfiles not used, no sections will be executed!"
Var BUTTON
@@ -18,7 +24,6 @@ Var EDIT
Var CHECKBOX
Function nsDialogsPage
-
nsDialogs::Create 1018
Pop $0
@@ -34,6 +39,7 @@ Function nsDialogsPage
Pop $EDIT
GetFunctionAddress $0 OnChange
nsDialogs::OnChange $EDIT $0
+ ${NSD_Edit_SetCueBannerText} $EDIT 0 "Type 'hello there' and get a free surprise"
${NSD_CreateCheckbox} 0 -50 100% 8u Test
Pop $CHECKBOX
@@ -44,42 +50,159 @@ Function nsDialogsPage
Pop $0
nsDialogs::Show
-
FunctionEnd
Function OnClick
-
Pop $0 # HWND
-
MessageBox MB_OK clicky
-
FunctionEnd
Function OnChange
-
Pop $0 # HWND
System::Call user32::GetWindowText(p$EDIT,t.r0,i${NSIS_MAX_STRLEN})
-
${If} $0 == "hello there"
MessageBox MB_OK "right back at ya"
${EndIf}
-
FunctionEnd
Function OnBack
-
MessageBox MB_YESNO "are you sure?" IDYES +2
Abort
-
FunctionEnd
Function OnCheckbox
-
Pop $0 # HWND
-
MessageBox MB_OK "checkbox clicked"
+FunctionEnd
+
+!macro BeginControlsTestPage title
+ nsDialogs::Create 1018
+ Pop $0
+ ${NSD_SetText} $hWndParent "$(^Name): ${title}"
+!macroend
+
+!macro CreateButton x y w h txt var handler data
+ ${NSD_CreateButton} ${x} ${y} ${w} ${h} "${txt}"
+ Pop ${var}
+ nsDialogs::SetUserData ${var} ${data}
+ ${NSD_OnClick} ${var} ${handler}
+!macroend
+
+
+Function LBPage
+ !insertmacro BeginControlsTestPage "ListBox"
+
+ ${NSD_CreateSortedListBox} 1u 0 -2u 70u ""
+ Pop $1
+ ${NSD_LB_AddString} $1 "Foo"
+ ${NSD_LB_AddString} $1 "Bar"
+
+ StrCpy $9 1
+ ${NSD_CreateText} 1u 75u -2u 12u "New item #$9"
+ Pop $EDIT
+ !insertmacro CreateButton 1u 90u 50u 12u "Add (&Sorted)" $0 LBAction Add
+ !insertmacro CreateButton 53u 90u 50u 12u "&Prepend" $0 LBAction Prepend
+ !insertmacro CreateButton 105u 90u 50u 12u "&Append" $0 LBAction Append
+ !insertmacro CreateButton 160u 90u 50u 12u "&Delete Last" $0 LBAction DL
+ !insertmacro CreateButton 215u 90u 50u 12u "&Clear" $0 LBAction Clear
+
+ nsDialogs::Show
+FunctionEnd
+
+Function LBAction
+ Pop $0
+ nsDialogs::GetUserData $0
+ Pop $0
+ ${NSD_GetText} $EDIT $8
+
+ ${Select} $0
+ ${Case} "Add"
+ ${NSD_LB_AddString} $1 $8
+ ${Case} "Prepend"
+ ${NSD_LB_PrependString} $1 $8
+ ${Case} "Append"
+ ${NSD_LB_AppendString} $1 $8
+ ${Case} "DL"
+ ${NSD_LB_GetCount} $1 $8
+ ${If} $8 U> 0
+ IntOp $8 $8 - 1
+ ${NSD_LB_DelItem} $1 $8
+ ${EndIf}
+ Return
+ ${Case} "Clear"
+ ${NSD_LB_Clear} $1
+ Return
+ ${EndSelect}
+
+ IntOp $9 $9 + 1
+ ${NSD_SetText} $EDIT "New item #$9"
+FunctionEnd
+
+Function RangesPage
+ !insertmacro BeginControlsTestPage "Ranges"
+
+ ${NSD_CreateHTrackBar} 1 0 -2 20u ""
+ Pop $1
+ ${NSD_TrackBar_SetRangeMax} $1 10
+ ${NSD_TrackBar_SetTicFreq} $1 1
+ ${NSD_TrackBar_SetPos} $1 3
+
+ StrCpy $9 20 ; Progress pos
+ ${NSD_CreateProgressBar} 1 25u -2 8u ""
+ Pop $2
+ ${NSD_CreateTimer} RangesTimer 1000
+
+ ${NSD_CreateNumber} 1 40u 50u 12u "42"
+ Pop $3
+ ${NSD_CreateUpDown} 0 0 0 0 ""
+ Pop $4
+ ${NSD_UD_SetBuddy} $4 $3
+ ${MAKELONG} $5 $0 50 0 ; 0..50
+ ${NSD_UD_SetPackedRange} $4 $5
+
+ nsDialogs::Show
+FunctionEnd
+
+Function RangesTimer
+ IntOp $9 $9 + 5
+ ${IfThen} $9 > 100 ${|} StrCpy $9 0 ${|}
+ ${NSD_ProgressBar_SetPos} $2 $9
+FunctionEnd
+
+
+Function NotifyPage
+ !insertmacro BeginControlsTestPage "WM_NOTIFY"
+
+ ${NSD_CreateRichEdit} 1 1 -2 -2 ""
+ Pop $9
+ ${NSD_OnNotify} $9 OnNotify
+ ${NSD_RichEd_SetEventMask} $9 ${ENM_LINK}
+ SendMessage $9 ${EM_AUTOURLDETECT} 1 0
+ ${NSD_SetText} $9 "{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard http://nsis.sf.net\par {\b Click the link}...} "
+
+ nsDialogs::Show
+FunctionEnd
+
+Function OnNotify
+ Pop $1 ; HWND
+ Pop $2 ; Code
+ Pop $3 ; NMHDR*
+ ${IfThen} $2 <> ${EN_LINK} ${|} Return ${|}
+ System::Call '*$3(p,p,p,p.r2,p,p,i.r4,i.r5)' ; Extract from ENLINK*
+ ${IfThen} $2 <> ${WM_LBUTTONDOWN} ${|} Return ${|}
+ IntOp $2 $5 - $4
+ System::Call '*(ir4,ir5,l,&t$2,i)p.r2' ; Create TEXTRANGE and a text buffer
+ ${If} $2 P<> 0
+ IntPtrOp $3 $2 + 16 ; Find buffer
+ System::Call '*$2(i,i,p$3)' ; Set buffer in TEXTRANGE
+ SendMessage $1 ${EM_GETTEXTRANGE} "" $2 $4
+ ${If} $4 <> 0
+ System::Call 'SHELL32::ShellExecute(p$hWndParent, p0, pr3, p0, p0, i 1)'
+ ${EndIf}
+ System::Free $2
+ ${EndIf}
FunctionEnd
Section
diff --git a/Contrib/nsDialogs/nsDialogs.nsh b/Contrib/nsDialogs/nsDialogs.nsh
index 6d703c0..ee67d1f 100755
--- a/Contrib/nsDialogs/nsDialogs.nsh
+++ b/Contrib/nsDialogs/nsDialogs.nsh
@@ -6,8 +6,8 @@ Header file for creating custom installer pages with nsDialogs
*/
!ifndef NSDIALOGS_INCLUDED
+!verbose push 2
!define NSDIALOGS_INCLUDED
-!verbose push
!verbose 3
!include LogicLib.nsh
@@ -58,6 +58,7 @@ Header file for creating custom installer pages with nsDialogs
!define ES_READONLY 0x00000800
!define ES_WANTRETURN 0x00001000
!define ES_NUMBER 0x00002000
+!define ES_SAVESEL 0x00008000
!define SS_LEFT 0x00000000
!define SS_CENTER 0x00000001
@@ -152,6 +153,39 @@ Header file for creating custom installer pages with nsDialogs
!define LBS_NOSEL 0x4000
!define LBS_COMBOBOX 0x8000
+!define ACS_CENTER 0x0001
+!define ACS_TRANSPARENT 0x0002 ; The parent of the animation control must not have the WS_CLIPCHILDREN style
+!define ACS_AUTOPLAY 0x0004
+!define ACS_TIMER 0x0008 ; < CC6
+
+!define TBS_AUTOTICKS 0x0001
+!define TBS_VERT 0x0002
+!define TBS_HORZ 0x0000
+!define TBS_TOP 0x0004
+!define TBS_BOTTOM 0x0000
+!define TBS_LEFT 0x0004
+!define TBS_RIGHT 0x0000
+!define TBS_BOTH 0x0008
+!define TBS_NOTICKS 0x0010
+!define TBS_ENABLESELRANGE 0x0020
+!define TBS_FIXEDLENGTH 0x0040
+!define TBS_NOTHUMB 0x0080
+!define TBS_TOOLTIPS 0x0100 ; IE3
+!define TBS_REVERSED 0x0200 ; IE5
+!define TBS_DOWNISLEFT 0x0400 ; _WIN32_IE >= 0x0501
+!define TBS_NOTIFYBEFOREMOVE 0x0800 ; IE6?
+!define TBS_TRANSPARENTBKGND 0x1000 ; Vista
+
+!define UDS_WRAP 0x0001
+!define UDS_SETBUDDYINT 0x0002
+!define UDS_ALIGNRIGHT 0x0004
+!define UDS_ALIGNLEFT 0x0008
+!define UDS_AUTOBUDDY 0x0010
+!define UDS_ARROWKEYS 0x0020
+!define UDS_HORZ 0x0040
+!define UDS_NOTHOUSANDS 0x0080
+!define UDS_HOTTRACK 0x0100 ; 98+
+
!define /ifndef LR_DEFAULTCOLOR 0x0000
!define /ifndef LR_MONOCHROME 0x0001
!define /ifndef LR_COLOR 0x0002
@@ -174,6 +208,16 @@ Header file for creating custom installer pages with nsDialogs
!define /ifndef GWL_STYLE -16
!define /ifndef GWL_EXSTYLE -20
+!define /ifndef ICC_BAR_CLASSES 0x0004
+!define /ifndef ICC_UPDOWN_CLASS 0x0010
+!define /ifndef ICC_HOTKEY_CLASS 0x0040
+!define /ifndef ICC_ANIMATE_CLASS 0x0080
+!define /ifndef ICC_DATE_CLASSES 0x0100
+!define /ifndef ICC_USEREX_CLASSES 0x0200
+!define /ifndef ICC_INTERNET_CLASSES 0x0800
+!define /ifndef ICC_LINK_CLASS 0x8000
+
+
!define DEFAULT_STYLES ${WS_CHILD}|${WS_VISIBLE}|${WS_CLIPSIBLINGS}
!define __NSD_HLine_CLASS STATIC
@@ -240,6 +284,18 @@ Header file for creating custom installer pages with nsDialogs
!define __NSD_DirRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}
!define __NSD_DirRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+!define __NSD_RichEdit_CLASS_10 "RICHEDIT" ; 1.0 (Riched32.dll) Win95/NT4
+!define __NSD_RichEdit_CLASS_20A "RICHEDIT20A" ; 2.0 (Riched20.dll) Win98/NT4 (NSIS makes sure this is registered even on Windows 95)
+!define __NSD_RichEdit_CLASS_20W "RICHEDIT20W"
+!define __NSD_RichEdit_CLASS_41W "RICHEDIT50W" ; 4.1 (MsftEdit.DLL) WinXP.SP1
+!ifdef NSIS_UNICODE
+!define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20W}
+!else
+!define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20A}
+!endif
+!define __NSD_RichEdit_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_AUTOVSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_SAVESEL}|${WS_HSCROLL}|${WS_VSCROLL}
+!define __NSD_RichEdit_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
!define __NSD_ComboBox_CLASS COMBOBOX
!define __NSD_ComboBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWN}
!define __NSD_ComboBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
@@ -252,16 +308,46 @@ Header file for creating custom installer pages with nsDialogs
!define __NSD_ListBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY}
!define __NSD_ListBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+!define __NSD_SortedListBox_CLASS LISTBOX
+!define __NSD_SortedListBox_STYLE ${__NSD_ListBox_STYLE}|${LBS_SORT}
+!define __NSD_SortedListBox_EXSTYLE ${__NSD_ListBox_EXSTYLE}
+
!define __NSD_ProgressBar_CLASS msctls_progress32
!define __NSD_ProgressBar_STYLE ${DEFAULT_STYLES}
!define __NSD_ProgressBar_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
-!macro __NSD_DefineControl NAME
+!define __NSD_Animation_CLASS SysAnimate32
+!define __NSD_Animation_STYLE ${DEFAULT_STYLES}|${ACS_TRANSPARENT}|${ACS_AUTOPLAY}
+!define __NSD_Animation_EXSTYLE 0
- !define NSD_Create${NAME} "nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}"
+!define __NSD_HTrackBar_CLASS msctls_trackbar32
+!define __NSD_HTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_HORZ}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS}
+!define __NSD_HTrackBar_EXSTYLE 0
-!macroend
+!define __NSD_VTrackBar_CLASS msctls_trackbar32
+!define __NSD_VTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_VERT}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS}
+!define __NSD_VTrackBar_EXSTYLE 0
+
+!define __NSD_UpDown_CLASS msctls_updown32
+!define __NSD_UpDown_STYLE ${DEFAULT_STYLES}|${UDS_SETBUDDYINT}|${UDS_ARROWKEYS}|${UDS_NOTHOUSANDS}|${UDS_ALIGNRIGHT}
+!define __NSD_UpDown_EXSTYLE 0
+
+!define __NSD_AutoUpDown_CLASS msctls_updown32
+!define __NSD_AutoUpDown_STYLE ${__NSD_UpDown_STYLE}|${UDS_AUTOBUDDY}
+!define __NSD_AutoUpDown_EXSTYLE ${__NSD_UpDown_EXSTYLE}
+!define __NSD_HotKey_CLASS msctls_hotkey32
+!define __NSD_HotKey_STYLE ${DEFAULT_STYLES}
+!define __NSD_HotKey_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_IPAddress_CLASS SysIPAddress32 ; IE4+/CC4.71+
+!define __NSD_IPAddress_STYLE ${DEFAULT_STYLES}
+!define __NSD_IPAddress_EXSTYLE 0
+
+
+!macro __NSD_DefineControl NAME
+ !define NSD_Create${NAME} "nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}"
+!macroend
!insertmacro __NSD_DefineControl HLine
!insertmacro __NSD_DefineControl VLine
!insertmacro __NSD_DefineControl Label
@@ -278,13 +364,22 @@ Header file for creating custom installer pages with nsDialogs
!insertmacro __NSD_DefineControl Number
!insertmacro __NSD_DefineControl FileRequest
!insertmacro __NSD_DefineControl DirRequest
+!insertmacro __NSD_DefineControl RichEdit
!insertmacro __NSD_DefineControl ComboBox
!insertmacro __NSD_DefineControl DropList
!insertmacro __NSD_DefineControl ListBox
+!insertmacro __NSD_DefineControl SortedListBox
!insertmacro __NSD_DefineControl ProgressBar
+!insertmacro __NSD_DefineControl Animation
+!insertmacro __NSD_DefineControl HTrackBar
+!insertmacro __NSD_DefineControl VTrackBar
+!insertmacro __NSD_DefineControl UpDown
+!insertmacro __NSD_DefineControl AutoUpDown
+!insertmacro __NSD_DefineControl HotKey
+!insertmacro __NSD_DefineControl IPAddress
-!macro __NSD_OnControlEvent EVENT HWND FUNCTION
+!macro __NSD_OnControlEvent EVENT HWND FUNCTION
Push $0
Push $1
@@ -295,213 +390,454 @@ Header file for creating custom installer pages with nsDialogs
Pop $1
Pop $0
-
!macroend
!macro __NSD_DefineControlCallback EVENT
-
- !define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT}`
-
+ !define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT} `
!macroend
!macro __NSD_OnDialogEvent EVENT FUNCTION
-
Push $0
GetFunctionAddress $0 "${FUNCTION}"
nsDialogs::On${EVENT} $0
Pop $0
-
!macroend
!macro __NSD_DefineDialogCallback EVENT
-
- !define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT}`
-
+ !define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT} `
!macroend
-
!insertmacro __NSD_DefineControlCallback Click
!insertmacro __NSD_DefineControlCallback Change
!insertmacro __NSD_DefineControlCallback Notify
!insertmacro __NSD_DefineDialogCallback Back
-!macro _NSD_CreateTimer FUNCTION INTERVAL
+!define __NSD_MkCtlCmd "!insertmacro __NSD_MkCtlCmd "
+!macro __NSD_MkCtlCmd msg wp lp hCtl
+SendMessage ${hCtl} ${${msg}} ${wp} ${lp}
+!macroend
+!define __NSD_MkCtlCmd_WP "!insertmacro __NSD_MkCtlCmd_WP "
+!macro __NSD_MkCtlCmd_WP msg lp hCtl wp
+SendMessage ${hCtl} ${${msg}} ${wp} ${lp}
+!macroend
+!define __NSD_MkCtlCmd_LP "!insertmacro __NSD_MkCtlCmd_LP "
+!macro __NSD_MkCtlCmd_LP msg wp hCtl lp
+SendMessage ${hCtl} ${${msg}} ${wp} ${lp}
+!macroend
+!define __NSD_MkCtlCmd_WPLP "!insertmacro __NSD_MkCtlCmd_WPLP "
+!macro __NSD_MkCtlCmd_WPLP msg hCtl wp lp
+SendMessage ${hCtl} ${${msg}} ${wp} ${lp}
+!macroend
+!define __NSD_MkCtlCmd_RV "!insertmacro __NSD_MkCtlCmd_RV "
+!macro __NSD_MkCtlCmd_RV msg wp lp hCtl VAR
+SendMessage ${hCtl} ${${msg}} ${wp} ${lp} ${VAR}
+!macroend
+
+
+!define NSD_InitCommonControlsEx "!insertmacro __NSD_InitCommonControlsEx "
+!macro __NSD_InitCommonControlsEx ICC
+System::Int64Op ${ICC} << 32
+System::Int64Op 0x08 |
+System::Call 'COMCTL32::InitCommonControlsEx(*ls)' ; INITCOMMONCONTROLSEX as UINT64
+!macroend
+
+
+!define NSD_CreateTimer `!insertmacro _NSD_CreateTimer `
+!macro _NSD_CreateTimer FUNCTION INTERVAL
Push $0
GetFunctionAddress $0 "${FUNCTION}"
nsDialogs::CreateTimer $0 "${INTERVAL}"
Pop $0
-
!macroend
-!define NSD_CreateTimer `!insertmacro _NSD_CreateTimer`
+!define NSD_KillTimer `!insertmacro _NSD_KillTimer `
!macro _NSD_KillTimer FUNCTION
-
Push $0
GetFunctionAddress $0 "${FUNCTION}"
nsDialogs::KillTimer $0
Pop $0
-
!macroend
-!define NSD_KillTimer `!insertmacro _NSD_KillTimer`
+!define NSD_AddStyle "!insertmacro _NSD_GWLAddFlags ${GWL_STYLE} "
+!define NSD_AddExStyle "!insertmacro _NSD_GWLAddFlags ${GWL_EXSTYLE} "
!macro _NSD_GWLAddFlags GWL HWND DATA
-
System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s"
System::Int64Op "${DATA}" |
System::Call "user32::SetWindowLong(p${HWND},p${GWL},ps)"
+!macroend
+!define NSD_GetStyle "!insertmacro _NSD_GWLGetFlags ${GWL_STYLE} "
+!define NSD_GetExStyle "!insertmacro _NSD_GWLGetFlags ${GWL_EXSTYLE} "
+!macro _NSD_GWLGetFlags GWL HWND RET
+System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s"
+Pop ${RET}
!macroend
-!define NSD_AddStyle "!insertmacro _NSD_GWLAddFlags ${GWL_STYLE} "
-!define NSD_AddExStyle "!insertmacro _NSD_GWLAddFlags ${GWL_EXSTYLE} "
+!macro __NSD_GetStyleBit GWL BIT HWND RET
+!insertmacro _NSD_GWLGetFlags ${GWL} ${HWND} ${RET}
+IntOp ${RET} ${RET} & ${BIT}
+!macroend
+
+
+!define NSD_SetFocus `!insertmacro __NSD_SetFocus `
+!macro __NSD_SetFocus HWND
+ System::Call "user32::SetFocus(p${HWND})"
+!macroend
-!macro __NSD_GetText CONTROL VAR
+!define NSD_GetText "!insertmacro __NSD_GetText "
+!macro __NSD_GetText CONTROL VAR
System::Call user32::GetWindowText(p${CONTROL},t.s,i${NSIS_MAX_STRLEN})
Pop ${VAR}
-
!macroend
-!define NSD_GetText `!insertmacro __NSD_GetText`
+!define NSD_SetText "!insertmacro __NSD_SetText "
!macro __NSD_SetText CONTROL TEXT
-
SendMessage ${CONTROL} ${WM_SETTEXT} 0 `STR:${TEXT}`
+!macroend
+
+### Edit ###
+
+!define NSD_Edit_GetTextLimit `${__NSD_MkCtlCmd_RV} EM_GETLIMITTEXT 0 0 `
+!define NSD_Edit_SetTextLimit `${__NSD_MkCtlCmd_WP} EM_SETLIMITTEXT 0 `
+!define NSD_Edit_SetPasswordChar `${__NSD_MkCtlCmd_WP} EM_SETPASSWORDCHAR 0 `
+!define NSD_Edit_GetReadOnly `!insertmacro __NSD_GetStyleBit ${GWL_STYLE} ${ES_READONLY} ` ; Non-zero if read-only
+!define NSD_Edit_SetReadOnly `${__NSD_MkCtlCmd_WP} EM_SETREADONLY 0 ` ; Toggles the ES_READONLY style
+!define NSD_Edit_GetModify `${__NSD_MkCtlCmd_RV} EM_GETMODIFY 0 0 `
+!define NSD_Edit_SetModify `${__NSD_MkCtlCmd_WP} EM_SETMODIFY 0 `
+!define NSD_Edit_EmptyUndoBuffer `${__NSD_MkCtlCmd} EM_EMPTYUNDOBUFFER 0 0 `
+!define NSD_Edit_CanUndo `${__NSD_MkCtlCmd_RV} EM_CANUNDO 0 0 `
+!define NSD_Edit_ScrollCaret `${__NSD_MkCtlCmd} EM_SCROLLCARET 0 0 `
+!define NSD_Edit_SetSel `${__NSD_MkCtlCmd_WPLP} EM_SETSEL ` ; WP:Start LP:End
+
+!define NSD_Edit_SetCueBannerText "!insertmacro __NSD_Edit_SetCueBannerText " ; CC6+
+!macro __NSD_Edit_SetCueBannerText CONTROL SHOWWHENFOCUSED TEXT
+!if ${NSIS_CHAR_SIZE} > 1
+ SendMessage ${CONTROL} ${EM_SETCUEBANNER} ${SHOWWHENFOCUSED} `STR:${TEXT}`
+!else
+ System::Call 'USER32::SendMessage(p${CONTROL},i${EM_SETCUEBANNER},p${SHOWWHENFOCUSED},ws)' `${TEXT}` ; Must be PWSTR
+!endif
!macroend
-!define NSD_SetText `!insertmacro __NSD_SetText`
+!define NSD_SetTextLimit `${NSD_Edit_SetTextLimit} ` ; Legacy alias
-!macro _NSD_SetTextLimit CONTROL LIMIT
- SendMessage ${CONTROL} ${EM_SETLIMITTEXT} ${LIMIT} 0
+### RichEdit ###
-!macroend
+!define NSD_RichEd_SetTextLimit `${__NSD_MkCtlCmd_LP} EM_EXLIMITTEXT 0 `
+!define NSD_RichEd_GetEventMask `${__NSD_MkCtlCmd_RV} EM_GETEVENTMASK 0 0 `
+!define NSD_RichEd_SetEventMask `${__NSD_MkCtlCmd_LP} EM_SETEVENTMASK 0 ` ; LP:ENM_*
+!define NSD_RichEd_SetSystemBackgroundColor `${__NSD_MkCtlCmd} EM_SETBKGNDCOLOR 1 0 ` ; COLOR_WINDOW
+!define NSD_RichEd_SetCustomBackgroundColor `${__NSD_MkCtlCmd_LP} EM_SETBKGNDCOLOR 0 ` ; LP:COLORREF
+!define NSD_RichEd_SetHideSelection `${__NSD_MkCtlCmd_WP} EM_HIDESELECTION 0 ` ; WP(BOOL):HideSelWithoutFocus (Toggles ES_NOHIDESEL & TXTBIT_HIDESELECTION)
-!define NSD_SetTextLimit "!insertmacro _NSD_SetTextLimit"
-!macro __NSD_GetState CONTROL VAR
+### CheckBox ###
+!define NSD_GetState `!insertmacro __NSD_GetState `
+!macro __NSD_GetState CONTROL VAR
SendMessage ${CONTROL} ${BM_GETCHECK} 0 0 ${VAR}
-
!macroend
-!define NSD_GetState `!insertmacro __NSD_GetState`
+!define NSD_SetState `!insertmacro __NSD_SetState `
!macro __NSD_SetState CONTROL STATE
-
SendMessage ${CONTROL} ${BM_SETCHECK} ${STATE} 0
-
!macroend
-!define NSD_SetState `!insertmacro __NSD_SetState`
-
+!define NSD_Check `!insertmacro __NSD_Check `
!macro __NSD_Check CONTROL
-
${NSD_SetState} ${CONTROL} ${BST_CHECKED}
-
!macroend
-!define NSD_Check `!insertmacro __NSD_Check`
+!define NSD_Uncheck `!insertmacro __NSD_Uncheck `
!macro __NSD_Uncheck CONTROL
-
${NSD_SetState} ${CONTROL} ${BST_UNCHECKED}
-
!macroend
-!define NSD_Uncheck `!insertmacro __NSD_Uncheck`
+!define NSD_GetChecked `!insertmacro __NSD_GetState `
+!define NSD_SetChecked `!insertmacro __NSD_SetState `
-!macro __NSD_SetFocus HWND
- System::Call "user32::SetFocus(p${HWND})"
-
+### ComboBox ###
+
+!define NSD_CB_AddString "!insertmacro _NSD_CB_AddString "
+!macro _NSD_CB_AddString CONTROL STRING
+ SendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}`
!macroend
-!define NSD_SetFocus `!insertmacro __NSD_SetFocus`
-!macro _NSD_CB_AddString CONTROL STRING
+!define NSD_CB_InsertString "!insertmacro _NSD_CB_InsertString "
+!macro _NSD_CB_InsertString CONTROL INDEX STRING
+SendMessage ${CONTROL} ${CB_INSERTSTRING} ${INDEX} `STR:${STRING}`
+!macroend
- SendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}`
+!define NSD_CB_PrependString "!insertmacro _NSD_CB_PrependString "
+!macro _NSD_CB_PrependString CONTROL STRING
+SendMessage ${CONTROL} ${CB_INSERTSTRING} 0 `STR:${STRING}`
+!macroend
+!define NSD_CB_AppendString "!insertmacro _NSD_CB_AppendString "
+!macro _NSD_CB_AppendString CONTROL STRING
+SendMessage ${CONTROL} ${CB_INSERTSTRING} -1 `STR:${STRING}`
!macroend
-!define NSD_CB_AddString "!insertmacro _NSD_CB_AddString"
+!define NSD_CB_SelectString "!insertmacro _NSD_CB_SelectString "
!macro _NSD_CB_SelectString CONTROL STRING
-
SendMessage ${CONTROL} ${CB_SELECTSTRING} -1 `STR:${STRING}`
+!macroend
+
+!define NSD_CB_GetSelectionIndex `!insertmacro __NSD_CB_GetSelectionIndex `
+!macro __NSD_CB_GetSelectionIndex CONTROL VAR
+ SendMessage ${CONTROL} ${CB_GETCURSEL} 0 0 ${VAR}
!macroend
-!define NSD_CB_SelectString "!insertmacro _NSD_CB_SelectString"
-!macro _NSD_LB_AddString CONTROL STRING
+!define NSD_CB_SetSelectionIndex `!insertmacro __NSD_CB_SetSelectionIndex `
+!macro __NSD_CB_SetSelectionIndex CONTROL INDEX
+ SendMessage ${CONTROL} ${CB_SETCURSEL} ${INDEX} 0
+!macroend
- SendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}`
+!define NSD_CB_GetItemData `!insertmacro __NSD_CB_GetItemData `
+!macro NSD_CB_GetItemData CONTROL INDEX VAR
+SendMessage ${CONTROL} ${CB_GETITEMDATA} ${INDEX} 0 ${VAR}
!macroend
-!define NSD_LB_AddString "!insertmacro _NSD_LB_AddString"
-!macro __NSD_LB_DelString CONTROL STRING
+!define NSD_CB_SetItemData `!insertmacro __NSD_CB_SetItemData `
+!macro NSD_CB_SetItemData CONTROL INDEX DATA
+SendMessage ${CONTROL} ${CB_SETITEMDATA} ${INDEX} ${DATA}
+!macroend
- Push $0
+!define NSD_CB_DelItem `${__NSD_MkCtlCmd_WP} CB_DELETESTRING 0 `
+!define NSD_CB_LimitText `${__NSD_MkCtlCmd_WP} CB_LIMITTEXT 0 `
+!define /IfNDef NSD_CB_Clear `${__NSD_MkCtlCmd} CB_RESETCONTENT 0 0 `
+!define /IfNDef NSD_CB_GetCount `${__NSD_MkCtlCmd_RV} CB_RESETCONTENT 0 0 `
+;define /IfNDef NSD_CB_DelString ; /IfNDef to try to stay compatible with
+;define /IfNDef NSD_CB_GetSelection ; the ListView header from the Wiki.
- SendMessage ${CONTROL} ${LB_FINDSTRINGEXACT} -1 `STR:${STRING}` $0
- SendMessage ${CONTROL} ${LB_DELETESTRING} $0 0
- Pop $0
+### ListBox ###
+!define NSD_LB_AddString "!insertmacro _NSD_LB_AddString "
+!macro _NSD_LB_AddString CONTROL STRING
+ SendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}`
!macroend
-!define NSD_LB_DelString `!insertmacro __NSD_LB_DelString`
-!macro __NSD_LB_Clear CONTROL VAR
+!define NSD_LB_InsertString "!insertmacro _NSD_LB_InsertString "
+!macro _NSD_LB_InsertString CONTROL INDEX STRING
+SendMessage ${CONTROL} ${LB_INSERTSTRING} ${INDEX} `STR:${STRING}`
+!macroend
- SendMessage ${CONTROL} ${LB_RESETCONTENT} 0 0 ${VAR}
+!define NSD_LB_PrependString "!insertmacro _NSD_LB_PrependString "
+!macro _NSD_LB_PrependString CONTROL STRING
+SendMessage ${CONTROL} ${LB_INSERTSTRING} 0 `STR:${STRING}`
+!macroend
+!define NSD_LB_AppendString "!insertmacro _NSD_LB_AppendString "
+!macro _NSD_LB_AppendString CONTROL STRING
+SendMessage ${CONTROL} ${LB_INSERTSTRING} -1 `STR:${STRING}`
!macroend
-!define NSD_LB_Clear `!insertmacro __NSD_LB_Clear`
-!macro __NSD_LB_GetCount CONTROL VAR
+!define NSD_LB_DelString `!insertmacro __NSD_LB_DelString `
+!macro __NSD_LB_DelString CONTROL STRING
+ System::Call 'USER32::SendMessage(p${CONTROL},i${LB_FINDSTRINGEXACT},p-1,ts)p.s' `${STRING}`
+ System::Call 'USER32::SendMessage(p${CONTROL},i${LB_DELETESTRING},ps,p0)'
+!macroend
- SendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR}
+!define NSD_LB_DelItem "!insertmacro __NSD_LB_DelItem "
+!macro __NSD_LB_DelItem CONTROL INDEX
+ SendMessage ${CONTROL} ${LB_DELETESTRING} ${INDEX} 0
!macroend
-!define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount`
-!macro _NSD_LB_SelectString CONTROL STRING
+!define NSD_LB_Clear `${__NSD_MkCtlCmd} LB_RESETCONTENT 0 0 `
- SendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}`
+!define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount `
+!macro __NSD_LB_GetCount CONTROL VAR
+ SendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR}
!macroend
-!define NSD_LB_SelectString "!insertmacro _NSD_LB_SelectString"
-!macro __NSD_LB_GetSelection CONTROL VAR
+!define NSD_LB_SelectString "!insertmacro _NSD_LB_SelectString "
+!macro _NSD_LB_SelectString CONTROL STRING
+ SendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}`
+!macroend
+
+!define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection `
+!macro __NSD_LB_GetSelection CONTROL VAR
SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR}
System::Call 'user32::SendMessage(p ${CONTROL}, i ${LB_GETTEXT}, p ${VAR}, t .s)'
Pop ${VAR}
+!macroend
+
+!define NSD_LB_GetSelectionIndex `!insertmacro __NSD_LB_GetSelectionIndex `
+!macro __NSD_LB_GetSelectionIndex CONTROL VAR
+ SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR}
!macroend
-!define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection`
+!define NSD_LB_SetSelectionIndex `!insertmacro __NSD_LB_SetSelectionIndex `
+!macro __NSD_LB_SetSelectionIndex CONTROL INDEX
+ SendMessage ${CONTROL} ${LB_SETCURSEL} ${INDEX} 0
+!macroend
+
+
+!define NSD_LB_GetSelectionCount `!insertmacro __NSD_LB_GetSelectionCount `
+!macro __NSD_LB_GetSelectionCount CONTROL VAR
+ SendMessage ${CONTROL} ${LB_GETSELCOUNT} 0 0 ${VAR}
+!macroend
+
+
+!define NSD_LB_GetItemText `!insertmacro __NSD_LB_GetItemText `
+!macro __NSD_LB_GetItemText CONTROL INDEX VAR
+ System::Call 'user32::SendMessage(p${CONTROL}, i${LB_GETTEXT}, p${INDEX}, t.s)'
+ Pop ${VAR}
+!macroend
+
+
+!define NSD_LB_GetItemData `!insertmacro __NSD_LB_GetItemData `
+!macro NSD_LB_GetItemData CONTROL INDEX VAR
+SendMessage ${CONTROL} ${LB_GETITEMDATA} ${INDEX} 0 ${VAR}
+!macroend
+
+
+!define NSD_LB_SetItemData `!insertmacro __NSD_LB_SetItemData `
+!macro NSD_LB_SetItemData CONTROL INDEX DATA
+SendMessage ${CONTROL} ${LB_SETITEMDATA} ${INDEX} ${DATA}
+!macroend
+
+
+!define NSD_LB_FindStringPrefix `!insertmacro __NSD_LB_FindStringPrefix `
+!macro __NSD_LB_FindStringPrefix CONTROL STRING VAR
+ SendMessage ${CONTROL} ${LB_FINDSTRING} -1 `STR:${STRING}` ${VAR}
+!macroend
-!macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE
+!define NSD_LB_FindStringExact `!insertmacro __NSD_LB_FindStringExact `
+!macro __NSD_LB_FindStringExact CONTROL STRING VAR
+ SendMessage ${CONTROL} ${LB_FINDSTRINGEXACT} -1 `STR:${STRING}` ${VAR}
+!macroend
+
+
+### ProgressBar ###
+
+!define NSD_ProgressBar_SetPos `${__NSD_MkCtlCmd_WP} PBM_SETPOS 0 `
+!define NSD_ProgressBar_SetStep `${__NSD_MkCtlCmd_WP} PBM_SETSTEP 0 `
+!define NSD_ProgressBar_StepIt `${__NSD_MkCtlCmd} PBM_STEPIT 0 0 `
+!define NSD_ProgressBar_AdvanceBy `${__NSD_MkCtlCmd_WP} PBM_DELTAPOS 0 `
+!define NSD_ProgressBar_SetPackedRange `${__NSD_MkCtlCmd_LP} PBM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max)
+!define NSD_ProgressBar_SetRange32 `${__NSD_MkCtlCmd_WPLP} PBM_SETRANGE32 ` ; [IE3+] WP:min LP:max
+!define NSD_ProgressBar_GetPos `${__NSD_MkCtlCmd_RV} PBM_GETPOS 0 0 ` ; [IE3+]
+
+
+### Animation ###
+
+!define NSD_Anim_Close `${__NSD_MkCtlCmd} ACM_OPEN 0 0 `
+!define NSD_Anim_Play `${__NSD_MkCtlCmd} ACM_PLAY -1 0xFFFF0000 `
+!define NSD_Anim_PlayLoops `${__NSD_MkCtlCmd_WP} ACM_PLAY 0xFFFF0000 ` ; WP(UINT16):LoopCount
+!define NSD_Anim_Stop `${__NSD_MkCtlCmd} ACM_STOP 0 0 `
+!define NSD_Anim_IsPlaying `${__NSD_MkCtlCmd_RV} ACM_ISPLAYING 0 0 `
+
+!define NSD_Anim_OpenFile `!insertmacro __NSD_Anim_OpenFile `
+!macro __NSD_Anim_OpenFile CONTROL PATH
+ SendMessage ${CONTROL} ${ACM_OPEN} 0 "STR:${PATH}"
+!macroend
+
+!define NSD_Anim_OpenResource `!insertmacro __NSD_Anim_OpenResource `
+!macro __NSD_Anim_OpenResource CONTROL HINSTANCE_CC471 RESID
+ SendMessage ${CONTROL} ${ACM_OPEN} "${HINSTANCE_CC471}" "${RESID}"
+!macroend
+
+
+### TrackBar ###
+
+!define NSD_TrackBar_GetPos `${__NSD_MkCtlCmd_RV} TBM_GETPOS 0 0 `
+!define NSD_TrackBar_SetPos `${__NSD_MkCtlCmd_LP} TBM_SETPOS 1 `
+!define NSD_TrackBar_SetRangeMin `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMIN 1 `
+!define NSD_TrackBar_SetRangeMax `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMAX 1 `
+!define NSD_TrackBar_GetLineSize `${__NSD_MkCtlCmd_RV} TBM_GETLINESIZE 0 0 `
+!define NSD_TrackBar_SetLineSize `${__NSD_MkCtlCmd_LP} TBM_SETLINESIZE 0 `
+!define NSD_TrackBar_GetPageSize `${__NSD_MkCtlCmd_RV} TBM_GETPAGESIZE 0 0 `
+!define NSD_TrackBar_SetPageSize `${__NSD_MkCtlCmd_LP} TBM_SETPAGESIZE 0 `
+!define NSD_TrackBar_ClearTics `${__NSD_MkCtlCmd} TBM_CLEARTICS 0 0 `
+!define NSD_TrackBar_GetNumTics `${__NSD_MkCtlCmd_RV} TBM_GETNUMTICS 0 0 `
+!define NSD_TrackBar_SetTic `${__NSD_MkCtlCmd_LP} TBM_SETTIC 0 `
+!define NSD_TrackBar_SetTicFreq `${__NSD_MkCtlCmd_WP} TBM_SETTICFREQ 0 `
+!define NSD_TrackBar_GetThumbLength `${__NSD_MkCtlCmd_RV} TBM_GETTHUMBLENGTH 0 0 `
+!define NSD_TrackBar_SetBuddy `${__NSD_MkCtlCmd_WPLP} TBM_SETBUDDY ` ; WP(BOOL):Left/Right LP:HWND
+
+
+### UpDown ###
+
+!define NSD_UD_SetBuddy `${__NSD_MkCtlCmd_WP} UDM_SETBUDDY 0 `
+!define NSD_UD_GetPos `${__NSD_MkCtlCmd_RV} UDM_GETPOS 0 0 `
+!define NSD_UD_SetPos `${__NSD_MkCtlCmd_LP} UDM_SETPOS 0 `
+!define NSD_UD_GetPackedRange `${__NSD_MkCtlCmd_RV} UDM_GETRANGE 0 0 `
+!define NSD_UD_SetPackedRange `${__NSD_MkCtlCmd_LP} UDM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max)
+!define NSD_UD_GetPos32 `${__NSD_MkCtlCmd_RV} UDM_GETPOS32 0 0 `
+!define NSD_UD_SetPos32 `${__NSD_MkCtlCmd_LP} UDM_SETPOS32 0 `
+!define NSD_UD_SetRange32 `${__NSD_MkCtlCmd_WPLP} UDM_SETRANGE32 ` ; WP(INT32):min LP(INT32):max
+
+!define NSD_UD_GetRange32 `!insertmacro __NSD_UD_GetRange32 `
+!macro __NSD_UD_GetRange32 CONTROL OUTLO OUTHI
+ System::Call 'USER32::SendMessage(p${CONTROL},i${UDM_GETRANGE32},*i.s,*i.s)'
+ Pop ${OUTLO}
+ Pop ${OUTHI}
+!macroend
+
+!define NSD_UD_SetStaticRange `!insertmacro __NSD_UD_SetStaticRange `
+!macro __NSD_UD_SetStaticRange CONTROL MI MA
+ !define /redef /math MI ${MI} << 16
+ !define /redef /math MA ${MA} & 0xffff
+ !define /redef /math MA ${MI} | ${MA}
+ SendMessage ${CONTROL} ${UDM_SETRANGE} 0 ${MA}
+!macroend
+
+
+### HotKey ###
+
+!define NSD_HK_GetHotKey `${__NSD_MkCtlCmd_RV} HKM_GETHOTKEY 0 0 ` ; RV(WORD):MAKEWORD(VK,HOTKEYF)
+!define NSD_HK_SetHotKey `${__NSD_MkCtlCmd_WP} HKM_SETHOTKEY 0 `
+!define NSD_HK_SetRules `${__NSD_MkCtlCmd_WPLP} HKM_SETRULES `
+
+
+### IP Address ###
+
+!define NSD_IPAddress_Clear `${__NSD_MkCtlCmd} IPM_CLEARADDRESS 0 0 `
+!define NSD_IPAddress_SetPackedIPv4 `${__NSD_MkCtlCmd_LP} IPM_SETADDRESS 0 `
+!define NSD_IPAddress_IsBlank `${__NSD_MkCtlCmd_RV} IPM_ISBLANK 0 0 `
+
+!define NSD_IPAddress_GetPackedIPv4 `!insertmacro __NSD_IPAddress_GetPackedIPv4 `
+!macro __NSD_IPAddress_GetPackedIPv4 CONTROL VAR
+System::Call 'USER32::SendMessage(p${CONTROL},i${IPM_GETADDRESS},p0,*i0s)'
+Pop ${VAR}
+!macroend
+
+
+### Static ###
+
+!macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE
Push $0
Push $R0
@@ -521,7 +857,6 @@ Header file for creating custom installer pages with nsDialogs
Exch $0
Pop ${HANDLE}
-
!macroend
!macro __NSD_SetIconFromExeResource CONTROL IMAGE HANDLE
@@ -532,16 +867,16 @@ Header file for creating custom installer pages with nsDialogs
!insertmacro __NSD_SetIconFromExeResource "${CONTROL}" "#103" ${HANDLE}
!macroend
-!define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 "${LR_LOADFROMFILE}"`
-!define NSD_SetBitmap `${NSD_SetImage}`
+!define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 "${LR_LOADFROMFILE}" `
+!define NSD_SetBitmap `${NSD_SetImage} `
-!define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 "${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}"`
-!define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource`
-!define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller`
+!define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 "${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}" `
+!define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource `
+!define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller `
+!define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage `
!macro __NSD_SetStretchedImage CONTROL IMAGE HANDLE
-
Push $0
Push $R0
@@ -559,67 +894,55 @@ Header file for creating custom installer pages with nsDialogs
Exch $0
Pop ${HANDLE}
-
!macroend
-!define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage`
+!define NSD_FreeImage `!insertmacro __NSD_FreeImage `
+!define NSD_FreeBitmap `${NSD_FreeImage} `
!macro __NSD_FreeImage IMAGE
-
${If} ${IMAGE} P<> 0
System::Call gdi32::DeleteObject(ps) ${IMAGE}
${EndIf}
-
!macroend
-!define NSD_FreeImage `!insertmacro __NSD_FreeImage`
-!define NSD_FreeBitmap `${NSD_FreeImage}`
+!define NSD_FreeIcon `!insertmacro __NSD_FreeIcon `
!macro __NSD_FreeIcon IMAGE
System::Call user32::DestroyIcon(ps) ${IMAGE}
!macroend
-!define NSD_FreeIcon `!insertmacro __NSD_FreeIcon`
+!define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP} `
+!define NSD_ClearBitmap `${NSD_ClearImage} `
+!define NSD_ClearIcon `!insertmacro __NSD_ClearImage ${IMAGE_ICON } `
!macro __NSD_ClearImage _IMGTYPE CONTROL
-
SendMessage ${CONTROL} ${STM_SETIMAGE} ${_IMGTYPE} 0
-
!macroend
-!define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP}`
-!define NSD_ClearIcon `!insertmacro __NSD_ClearImage ${IMAGE_ICON}`
+### INI ###
-!define NSD_Debug `System::Call kernel32::OutputDebugString(ts)`
+!define /IfNDef NSD_Debug `System::Call kernel32::OutputDebugString(ts)`
!macro __NSD_ControlCase TYPE
-
${Case} ${TYPE}
${NSD_Create${TYPE}} $R3u $R4u $R5u $R6u $R7
Pop $R9
${Break}
-
!macroend
!macro __NSD_ControlCaseEx TYPE
-
${Case} ${TYPE}
Call ${TYPE}
${Break}
-
!macroend
!macro NSD_FUNCTION_INIFILE
-
!insertmacro NSD_INIFILE ""
-
!macroend
!macro NSD_UNFUNCTION_INIFILE
-
!insertmacro NSD_INIFILE un.
-
!macroend
!macro NSD_INIFILE UNINSTALLER_FUNCPREFIX
diff --git a/Contrib/nsExec/nsExec.txt b/Contrib/nsExec/nsExec.txt
index c98113f..41c2bab 100755
--- a/Contrib/nsExec/nsExec.txt
+++ b/Contrib/nsExec/nsExec.txt
@@ -7,14 +7,18 @@ without opening a dos box.
Usage
-----
nsExec::Exec [/OEM] [/TIMEOUT=x] path
+Pop $0
-or-
nsExec::ExecToLog [/OEM] [/TIMEOUT=x] path
+Pop $0
-or-
nsExec::ExecToStack [/OEM] [/TIMEOUT=x] path
+Pop $0 ; Return
+Pop $1 ; Output
All functions are the same except ExecToLog will print the output
to the log window and ExecToStack will push up to ${NSIS_MAX_STRLEN}