[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