[Gpg4win-commits] r689 - in trunk: . src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Thu Jan 24 00:40:09 CET 2008
Author: marcus
Date: 2008-01-24 00:40:08 +0100 (Thu, 24 Jan 2008)
New Revision: 689
Added:
trunk/src/Memento.nsh
Modified:
trunk/ChangeLog
Log:
2008-01-24 Marcus Brinkmann <marcus at g10code.de>
* src/Memento.nsh: New file from nsis 2.28.
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2008-01-23 22:10:11 UTC (rev 688)
+++ trunk/ChangeLog 2008-01-23 23:40:08 UTC (rev 689)
@@ -1,3 +1,7 @@
+2008-01-24 Marcus Brinkmann <marcus at g10code.de>
+
+ * src/Memento.nsh: New file from nsis 2.28.
+
2008-01-21 Marcus Brinkmann <marcus at g10code.de>
* src/installer.nsi: Include Memento.nsh, define
Added: trunk/src/Memento.nsh
===================================================================
--- trunk/src/Memento.nsh 2008-01-23 22:10:11 UTC (rev 688)
+++ trunk/src/Memento.nsh 2008-01-23 23:40:08 UTC (rev 689)
@@ -0,0 +1,526 @@
+/* FIXME: Taken from nsis 2.28. Remove when bumping version requirement. */
+
+!verbose push
+!verbose 3
+
+!include LogicLib.nsh
+!include Sections.nsh
+
+!ifndef ___MEMENTO_NSH___
+!define ___MEMENTO_NSH___
+
+#####################################
+### Memento ###
+#####################################
+
+/*
+
+Memento is a set of macros that allow installers to remember user selection
+across separate runs of the installer. Currently, it can remember the state
+of sections and mark new sections as bold. In the future, it'll integrate
+InstallOptions and maybe even the Modern UI.
+
+A usage example can be found in `Examples\Memento.nsi`.
+
+*/
+
+#####################################
+### Usage Instructions ###
+#####################################
+
+/*
+
+1. Declare usage of Memento by including Memento.nsh at the top of the script.
+
+ !include Memento.nsh
+
+2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key
+ where sections' state should be saved.
+
+ !define MEMENTO_REGISTRY_ROOT HKLM
+ !define MEMENTO_REGISTRY_KEY \
+ Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram
+
+3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd}
+ for sections that whose state should be remembered by Memento.
+
+ For sections that should be unselected by default, use ${MementoSection}'s
+ brother - ${MementoUnselectedSection}.
+
+ Sections that don't already have an identifier must be assigned one.
+
+ Section identifiers must stay the same across different versions of the
+ installer or their state will be forgotten.
+
+4. Add a call to ${MementoSectionRestore} to .onInit to restore the state
+ of all sections from the registry.
+
+ Function .onInit
+
+ ${MementoSectionRestore}
+
+ FunctionEnd
+
+5. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state
+ of all sections to the registry.
+
+ Function .onInstSuccess
+
+ ${MementoSectionSave}
+
+ FunctionEnd
+
+6. Tattoo the location of the chosen registry key on your arm.
+
+*/
+
+#####################################
+### User API ###
+#####################################
+
+;
+; ${MementoSection}
+;
+; Defines a section whose state is remembered by Memento.
+;
+; Usage is similar to Section.
+;
+; ${MementoSection} "name" "some_id"
+;
+
+!define MementoSection "!insertmacro MementoSection"
+
+;
+; ${MementoSectionEnd}
+;
+; Ends a section previously opened using ${MementoSection}.
+;
+; Usage is similar to SectionEnd.
+;
+; ${MementoSection} "name" "some_id"
+; # some code...
+; ${MementoSectionEnd}
+;
+
+;
+; ${MementoUnselectedSection}
+;
+; Defines a section whose state is remembered by Memento and is
+; unselected by default.
+;
+; Usage is similar to Section with the /o switch.
+;
+; ${MementoUnselectedSection} "name" "some_id"
+;
+
+!define MementoUnselectedSection "!insertmacro MementoUnselectedSection"
+
+;
+; ${MementoSectionEnd}
+;
+; Ends a section previously opened using ${MementoSection}.
+;
+; Usage is similar to SectionEnd.
+;
+; ${MementoSection} "name" "some_id"
+; # some code...
+; ${MementoSectionEnd}
+;
+
+!define MementoSectionEnd "!insertmacro MementoSectionEnd"
+
+;
+; ${MementoSectionDone}
+;
+; Used after all ${MementoSection} have been set.
+;
+; ${MementoSection} "name1" "some_id1"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSection} "name2" "some_id2"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSection} "name3" "some_id3"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSectionDone}
+;
+
+!define MementoSectionDone "!insertmacro MementoSectionDone"
+
+;
+; ${MementoSectionRestore}
+;
+; Restores the state of all Memento sections from the registry.
+;
+; Commonly used in .onInit.
+;
+; Function .onInit
+;
+; ${MementoSectionRestore}
+;
+; FunctionEnd
+;
+
+!define MementoSectionRestore "!insertmacro MementoSectionRestore"
+
+;
+; ${MementoSectionSave}
+;
+; Saves the state of all Memento sections to the registry.
+;
+; Commonly used in .onInstSuccess.
+;
+; Function .onInstSuccess
+;
+; ${MementoSectionSave}
+;
+; FunctionEnd
+;
+
+!define MementoSectionSave "!insertmacro MementoSectionSave"
+
+
+#####################################
+### Internal Defines ###
+#####################################
+
+!define __MementoSectionIndex 1
+
+#####################################
+### Internal Macros ###
+#####################################
+
+!macro __MementoCheckSettings
+
+ !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY
+
+ !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros"
+
+ !endif
+
+!macroend
+
+!macro __MementoSection flags name id
+
+ !insertmacro __MementoCheckSettings
+
+ !ifndef __MementoSectionIndex
+
+ !error "MementoSectionDone already used!"
+
+ !endif
+
+ !define __MementoSectionLastSectionId `${id}`
+
+ !verbose pop
+
+ Section ${flags} `${name}` `${id}`
+
+ !verbose push
+ !verbose 3
+
+!macroend
+
+#####################################
+### User Macros ###
+#####################################
+
+!macro MementoSection name id
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoSection "" `${name}` `${id}`
+
+ !verbose pop
+
+!macroend
+
+!macro MementoUnselectedSection name id
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoSection /o `${name}` `${id}`
+
+ !define __MementoSectionUnselected
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionEnd
+
+ SectionEnd
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ !ifndef __MementoSectionIndex
+
+ !error "MementoSectionDone already used!"
+
+ !endif
+
+ !define /MATH __MementoSectionIndexNext \
+ ${__MementoSectionIndex} + 1
+
+ Function __MementoSectionMarkNew${__MementoSectionIndex}
+
+ ClearErrors
+ ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
+
+ ${If} ${Errors}
+
+ !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD}
+
+ ${EndIf}
+
+ GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ Function __MementoSectionRestoreStatus${__MementoSectionIndex}
+
+ ClearErrors
+ ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
+
+ !ifndef __MementoSectionUnselected
+
+ ${If} ${Errors}
+ ${OrIf} $0 != 0
+
+ !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
+
+ ${Else}
+
+ !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
+
+ ${EndIf}
+
+ !else
+
+ !undef __MementoSectionUnselected
+
+ ${If} ${Errors}
+ ${OrIf} $0 == 0
+
+ !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
+
+ ${Else}
+
+ !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
+
+ ${EndIf}
+
+ !endif
+
+ GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ Function __MementoSectionSaveStatus${__MementoSectionIndex}
+
+ ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}`
+
+ WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 1
+
+ ${Else}
+
+ WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 0
+
+ ${EndIf}
+
+ GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ !undef __MementoSectionIndex
+ !define __MementoSectionIndex ${__MementoSectionIndexNext}
+ !undef __MementoSectionIndexNext
+
+ !undef __MementoSectionLastSectionId
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionDone
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Function __MementoSectionMarkNew${__MementoSectionIndex}
+ FunctionEnd
+
+ Function __MementoSectionRestoreStatus${__MementoSectionIndex}
+ FunctionEnd
+
+ Function __MementoSectionSaveStatus${__MementoSectionIndex}
+ FunctionEnd
+
+ !undef __MementoSectionIndex
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionRestore
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+
+ # check for first usage
+
+ ClearErrors
+
+ ReadRegStr $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed
+
+ ${If} ${Errors}
+
+ # use script defaults on first run
+ Goto done
+
+ ${EndIf}
+
+ # mark new components in bold
+
+ Call __MementoSectionMarkNew1
+
+ # mark section groups in bold
+
+ StrCpy $0 0
+ StrCpy $1 ""
+ StrCpy $2 ""
+ StrCpy $3 ""
+
+ loop:
+
+ ClearErrors
+
+ ${If} ${SectionIsBold} $0
+
+ ${If} $1 != ""
+
+ !insertmacro SetSectionFlag $1 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${If} $2 != ""
+
+ !insertmacro SetSectionFlag $2 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${If} $3 != ""
+
+ !insertmacro SetSectionFlag $3 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${ElseIf} ${Errors}
+
+ Goto loop_end
+
+ ${EndIf}
+
+ ${If} ${SectionIsSectionGroup} $0
+
+ ${If} $1 == ""
+
+ StrCpy $1 $0
+
+ ${ElseIf} $2 == ""
+
+ StrCpy $2 $0
+
+ ${ElseIf} $3 == ""
+
+ StrCpy $3 $0
+
+ ${EndIf}
+
+ ${EndIf}
+
+ ${If} ${SectionIsSectionGroupEnd} $0
+
+ ${If} $3 != ""
+
+ StrCpy $3 ""
+
+ ${ElseIf} $2 != ""
+
+ StrCpy $2 ""
+
+ ${ElseIf} $1 != ""
+
+ StrCpy $1 ""
+
+ ${EndIf}
+
+ ${EndIf}
+
+ IntOp $0 $0 + 1
+
+ Goto loop
+ loop_end:
+
+ # restore sections' status
+
+ Call __MementoSectionRestoreStatus1
+
+ # all done
+
+ done:
+
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionSave
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Push $0
+
+ WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed ""
+
+ Call __MementoSectionSaveStatus1
+
+ Pop $0
+
+ !verbose pop
+
+!macroend
+
+
+
+!endif # ___MEMENTO_NSH___
+
+!verbose pop
More information about the Gpg4win-commits
mailing list