Statistiques
| Révision :

root / tmp / org.txm.setups / nsis / Include / Memento.nsh @ 3144

Historique | Voir | Annoter | Télécharger (10,38 ko)

1 728 mdecorde
!verbose push
2 728 mdecorde
!verbose 3
3 728 mdecorde
4 728 mdecorde
!include LogicLib.nsh
5 728 mdecorde
!include Sections.nsh
6 728 mdecorde
7 728 mdecorde
!ifndef ___MEMENTO_NSH___
8 728 mdecorde
!define ___MEMENTO_NSH___
9 728 mdecorde
10 728 mdecorde
#####################################
11 728 mdecorde
### Memento                       ###
12 728 mdecorde
#####################################
13 728 mdecorde
14 728 mdecorde
/*
15 728 mdecorde
16 728 mdecorde
Memento is a set of macros that allow installers to remember user selection
17 728 mdecorde
across separate runs of the installer. Currently, it can remember the state
18 728 mdecorde
of sections and mark new sections as bold. In the future, it'll integrate
19 728 mdecorde
InstallOptions and maybe even the Modern UI.
20 728 mdecorde
21 728 mdecorde
A usage example can be found in `Examples\Memento.nsi`.
22 728 mdecorde
23 728 mdecorde
*/
24 728 mdecorde
25 728 mdecorde
#####################################
26 728 mdecorde
### Usage Instructions            ###
27 728 mdecorde
#####################################
28 728 mdecorde
29 728 mdecorde
/*
30 728 mdecorde
31 728 mdecorde
1. Declare usage of Memento by including Memento.nsh at the top of the script.
32 728 mdecorde
33 728 mdecorde
      !include Memento.nsh
34 728 mdecorde
35 728 mdecorde
2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key
36 728 mdecorde
   where sections' state should be saved.
37 728 mdecorde
38 728 mdecorde
      !define MEMENTO_REGISTRY_ROOT HKLM
39 728 mdecorde
      !define MEMENTO_REGISTRY_KEY \
40 728 mdecorde
                Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram
41 728 mdecorde
42 728 mdecorde
3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd}
43 728 mdecorde
   for sections that whose state should be remembered by Memento.
44 728 mdecorde
45 728 mdecorde
   For sections that should be unselected by default, use ${MementoSection}'s
46 728 mdecorde
   brother - ${MementoUnselectedSection}.
47 728 mdecorde
48 728 mdecorde
   Sections that don't already have an identifier must be assigned one.
49 728 mdecorde
50 728 mdecorde
   Section identifiers must stay the same across different versions of the
51 728 mdecorde
   installer or their state will be forgotten.
52 728 mdecorde
53 728 mdecorde
4. Use ${MementoSectionDone} after the last ${MementoSection}.
54 728 mdecorde
55 728 mdecorde
5. Add a call to ${MementoSectionRestore} to .onInit to restore the state
56 728 mdecorde
   of all sections from the registry.
57 728 mdecorde
58 728 mdecorde
      Function .onInit
59 728 mdecorde
60 728 mdecorde
        ${MementoSectionRestore}
61 728 mdecorde
62 728 mdecorde
      FunctionEnd
63 728 mdecorde
64 728 mdecorde
6. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state
65 728 mdecorde
   of all sections to the registry.
66 728 mdecorde
67 728 mdecorde
      Function .onInstSuccess
68 728 mdecorde
69 728 mdecorde
        ${MementoSectionSave}
70 728 mdecorde
71 728 mdecorde
      FunctionEnd
72 728 mdecorde
73 728 mdecorde
7. Tattoo the location of the chosen registry key on your arm.
74 728 mdecorde
75 728 mdecorde
*/
76 728 mdecorde
77 728 mdecorde
#####################################
78 728 mdecorde
### User API                      ###
79 728 mdecorde
#####################################
80 728 mdecorde
81 728 mdecorde
;
82 728 mdecorde
; ${MementoSection}
83 728 mdecorde
;
84 728 mdecorde
;   Defines a section whose state is remembered by Memento.
85 728 mdecorde
;
86 728 mdecorde
;   Usage is similar to Section.
87 728 mdecorde
;
88 728 mdecorde
;     ${MementoSection} "name" "some_id"
89 728 mdecorde
;
90 728 mdecorde
91 728 mdecorde
!define MementoSection "!insertmacro MementoSection"
92 728 mdecorde
93 728 mdecorde
;
94 728 mdecorde
; ${MementoSectionEnd}
95 728 mdecorde
;
96 728 mdecorde
;   Ends a section previously opened using ${MementoSection}.
97 728 mdecorde
;
98 728 mdecorde
;   Usage is similar to SectionEnd.
99 728 mdecorde
;
100 728 mdecorde
;     ${MementoSection} "name" "some_id"
101 728 mdecorde
;        # some code...
102 728 mdecorde
;     ${MementoSectionEnd}
103 728 mdecorde
;
104 728 mdecorde
105 728 mdecorde
;
106 728 mdecorde
; ${MementoUnselectedSection}
107 728 mdecorde
;
108 728 mdecorde
;   Defines a section whose state is remembered by Memento and is
109 728 mdecorde
;   unselected by default.
110 728 mdecorde
;
111 728 mdecorde
;   Usage is similar to Section with the /o switch.
112 728 mdecorde
;
113 728 mdecorde
;     ${MementoUnselectedSection} "name" "some_id"
114 728 mdecorde
;
115 728 mdecorde
116 728 mdecorde
!define MementoUnselectedSection "!insertmacro MementoUnselectedSection"
117 728 mdecorde
118 728 mdecorde
;
119 728 mdecorde
; ${MementoSectionEnd}
120 728 mdecorde
;
121 728 mdecorde
;   Ends a section previously opened using ${MementoSection}.
122 728 mdecorde
;
123 728 mdecorde
;   Usage is similar to SectionEnd.
124 728 mdecorde
;
125 728 mdecorde
;     ${MementoSection} "name" "some_id"
126 728 mdecorde
;        # some code...
127 728 mdecorde
;     ${MementoSectionEnd}
128 728 mdecorde
;
129 728 mdecorde
130 728 mdecorde
!define MementoSectionEnd "!insertmacro MementoSectionEnd"
131 728 mdecorde
132 728 mdecorde
;
133 728 mdecorde
; ${MementoSectionDone}
134 728 mdecorde
;
135 728 mdecorde
;   Used after all ${MementoSection} have been set.
136 728 mdecorde
;
137 728 mdecorde
;     ${MementoSection} "name1" "some_id1"
138 728 mdecorde
;        # some code...
139 728 mdecorde
;     ${MementoSectionEnd}
140 728 mdecorde
;
141 728 mdecorde
;     ${MementoSection} "name2" "some_id2"
142 728 mdecorde
;        # some code...
143 728 mdecorde
;     ${MementoSectionEnd}
144 728 mdecorde
;
145 728 mdecorde
;     ${MementoSection} "name3" "some_id3"
146 728 mdecorde
;        # some code...
147 728 mdecorde
;     ${MementoSectionEnd}
148 728 mdecorde
;
149 728 mdecorde
;     ${MementoSectionDone}
150 728 mdecorde
;
151 728 mdecorde
152 728 mdecorde
!define MementoSectionDone "!insertmacro MementoSectionDone"
153 728 mdecorde
154 728 mdecorde
;
155 728 mdecorde
; ${MementoSectionRestore}
156 728 mdecorde
;
157 728 mdecorde
;   Restores the state of all Memento sections from the registry.
158 728 mdecorde
;
159 728 mdecorde
;   Commonly used in .onInit.
160 728 mdecorde
;
161 728 mdecorde
;     Function .onInit
162 728 mdecorde
;
163 728 mdecorde
;       ${MementoSectionRestore}
164 728 mdecorde
;
165 728 mdecorde
;     FunctionEnd
166 728 mdecorde
;
167 728 mdecorde
168 728 mdecorde
!define MementoSectionRestore "!insertmacro MementoSectionRestore"
169 728 mdecorde
170 728 mdecorde
;
171 728 mdecorde
; ${MementoSectionSave}
172 728 mdecorde
;
173 728 mdecorde
;   Saves the state of all Memento sections to the registry.
174 728 mdecorde
;
175 728 mdecorde
;   Commonly used in .onInstSuccess.
176 728 mdecorde
;
177 728 mdecorde
;     Function .onInstSuccess
178 728 mdecorde
;
179 728 mdecorde
;       ${MementoSectionSave}
180 728 mdecorde
;
181 728 mdecorde
;     FunctionEnd
182 728 mdecorde
;
183 728 mdecorde
184 728 mdecorde
!define MementoSectionSave "!insertmacro MementoSectionSave"
185 728 mdecorde
186 728 mdecorde
187 728 mdecorde
#####################################
188 728 mdecorde
### Internal Defines              ###
189 728 mdecorde
#####################################
190 728 mdecorde
191 728 mdecorde
!define __MementoSectionIndex 1
192 728 mdecorde
193 728 mdecorde
#####################################
194 728 mdecorde
### Internal Macros               ###
195 728 mdecorde
#####################################
196 728 mdecorde
197 728 mdecorde
!macro __MementoCheckSettings
198 728 mdecorde
199 728 mdecorde
  !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY
200 728 mdecorde
201 728 mdecorde
    !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros"
202 728 mdecorde
203 728 mdecorde
  !endif
204 728 mdecorde
205 728 mdecorde
!macroend
206 728 mdecorde
207 728 mdecorde
!macro __MementoSection flags name id
208 728 mdecorde
209 728 mdecorde
  !insertmacro __MementoCheckSettings
210 728 mdecorde
211 728 mdecorde
  !ifndef __MementoSectionIndex
212 728 mdecorde
213 728 mdecorde
    !error "MementoSectionDone already used!"
214 728 mdecorde
215 728 mdecorde
  !endif
216 728 mdecorde
217 728 mdecorde
  !define __MementoSectionLastSectionId `${id}`
218 728 mdecorde
219 728 mdecorde
  !verbose pop
220 728 mdecorde
221 728 mdecorde
  Section ${flags} `${name}` `${id}`
222 728 mdecorde
223 728 mdecorde
  !verbose push
224 728 mdecorde
  !verbose 3
225 728 mdecorde
226 728 mdecorde
!macroend
227 728 mdecorde
228 728 mdecorde
#####################################
229 728 mdecorde
### User Macros                   ###
230 728 mdecorde
#####################################
231 728 mdecorde
232 728 mdecorde
!macro MementoSection name id
233 728 mdecorde
234 728 mdecorde
  !verbose push
235 728 mdecorde
  !verbose 3
236 728 mdecorde
237 728 mdecorde
  !insertmacro __MementoSection "" `${name}` `${id}`
238 728 mdecorde
239 728 mdecorde
  !verbose pop
240 728 mdecorde
241 728 mdecorde
!macroend
242 728 mdecorde
243 728 mdecorde
!macro MementoUnselectedSection name id
244 728 mdecorde
245 728 mdecorde
  !verbose push
246 728 mdecorde
  !verbose 3
247 728 mdecorde
248 728 mdecorde
  !insertmacro __MementoSection /o `${name}` `${id}`
249 728 mdecorde
250 728 mdecorde
  !define __MementoSectionUnselected
251 728 mdecorde
252 728 mdecorde
  !verbose pop
253 728 mdecorde
254 728 mdecorde
!macroend
255 728 mdecorde
256 728 mdecorde
!macro MementoSectionEnd
257 728 mdecorde
258 728 mdecorde
  SectionEnd
259 728 mdecorde
260 728 mdecorde
  !verbose push
261 728 mdecorde
  !verbose 3
262 728 mdecorde
263 728 mdecorde
  !insertmacro __MementoCheckSettings
264 728 mdecorde
265 728 mdecorde
  !ifndef __MementoSectionIndex
266 728 mdecorde
267 728 mdecorde
    !error "MementoSectionDone already used!"
268 728 mdecorde
269 728 mdecorde
  !endif
270 728 mdecorde
271 728 mdecorde
  !define /MATH __MementoSectionIndexNext \
272 728 mdecorde
      ${__MementoSectionIndex} + 1
273 728 mdecorde
274 728 mdecorde
  Function __MementoSectionMarkNew${__MementoSectionIndex}
275 728 mdecorde
276 728 mdecorde
    ClearErrors
277 728 mdecorde
    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
278 728 mdecorde
279 728 mdecorde
    ${If} ${Errors}
280 728 mdecorde
281 728 mdecorde
      !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD}
282 728 mdecorde
283 728 mdecorde
    ${EndIf}
284 728 mdecorde
285 728 mdecorde
    GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext}
286 728 mdecorde
    Goto $0
287 728 mdecorde
288 728 mdecorde
  FunctionEnd
289 728 mdecorde
290 728 mdecorde
  Function __MementoSectionRestoreStatus${__MementoSectionIndex}
291 728 mdecorde
292 728 mdecorde
    ClearErrors
293 728 mdecorde
    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
294 728 mdecorde
295 728 mdecorde
    !ifndef __MementoSectionUnselected
296 728 mdecorde
297 728 mdecorde
      ${If} ${Errors}
298 728 mdecorde
      ${OrIf} $0 != 0
299 728 mdecorde
300 728 mdecorde
        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
301 728 mdecorde
302 728 mdecorde
      ${Else}
303 728 mdecorde
304 728 mdecorde
        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
305 728 mdecorde
306 728 mdecorde
      ${EndIf}
307 728 mdecorde
308 728 mdecorde
    !else
309 728 mdecorde
310 728 mdecorde
      !undef __MementoSectionUnselected
311 728 mdecorde
312 728 mdecorde
      ${If} ${Errors}
313 728 mdecorde
      ${OrIf} $0 == 0
314 728 mdecorde
315 728 mdecorde
        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
316 728 mdecorde
317 728 mdecorde
      ${Else}
318 728 mdecorde
319 728 mdecorde
        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
320 728 mdecorde
321 728 mdecorde
      ${EndIf}
322 728 mdecorde
323 728 mdecorde
    !endif
324 728 mdecorde
325 728 mdecorde
    GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext}
326 728 mdecorde
    Goto $0
327 728 mdecorde
328 728 mdecorde
  FunctionEnd
329 728 mdecorde
330 728 mdecorde
  Function __MementoSectionSaveStatus${__MementoSectionIndex}
331 728 mdecorde
332 728 mdecorde
    ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}`
333 728 mdecorde
334 728 mdecorde
      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 1
335 728 mdecorde
336 728 mdecorde
    ${Else}
337 728 mdecorde
338 728 mdecorde
      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 0
339 728 mdecorde
340 728 mdecorde
    ${EndIf}
341 728 mdecorde
342 728 mdecorde
    GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext}
343 728 mdecorde
    Goto $0
344 728 mdecorde
345 728 mdecorde
  FunctionEnd
346 728 mdecorde
347 728 mdecorde
  !undef __MementoSectionIndex
348 728 mdecorde
  !define __MementoSectionIndex ${__MementoSectionIndexNext}
349 728 mdecorde
  !undef __MementoSectionIndexNext
350 728 mdecorde
351 728 mdecorde
  !undef __MementoSectionLastSectionId
352 728 mdecorde
353 728 mdecorde
  !verbose pop
354 728 mdecorde
355 728 mdecorde
!macroend
356 728 mdecorde
357 728 mdecorde
!macro MementoSectionDone
358 728 mdecorde
359 728 mdecorde
  !verbose push
360 728 mdecorde
  !verbose 3
361 728 mdecorde
362 728 mdecorde
  !insertmacro __MementoCheckSettings
363 728 mdecorde
364 728 mdecorde
  Function __MementoSectionMarkNew${__MementoSectionIndex}
365 728 mdecorde
  FunctionEnd
366 728 mdecorde
367 728 mdecorde
  Function __MementoSectionRestoreStatus${__MementoSectionIndex}
368 728 mdecorde
  FunctionEnd
369 728 mdecorde
370 728 mdecorde
  Function __MementoSectionSaveStatus${__MementoSectionIndex}
371 728 mdecorde
  FunctionEnd
372 728 mdecorde
373 728 mdecorde
  !undef __MementoSectionIndex
374 728 mdecorde
375 728 mdecorde
  !verbose pop
376 728 mdecorde
377 728 mdecorde
!macroend
378 728 mdecorde
379 728 mdecorde
!macro MementoSectionRestore
380 728 mdecorde
381 728 mdecorde
  !verbose push
382 728 mdecorde
  !verbose 3
383 728 mdecorde
384 728 mdecorde
  !insertmacro __MementoCheckSettings
385 728 mdecorde
386 728 mdecorde
  Push $0
387 728 mdecorde
  Push $1
388 728 mdecorde
  Push $2
389 728 mdecorde
  Push $3
390 728 mdecorde
391 728 mdecorde
    # check for first usage
392 728 mdecorde
393 728 mdecorde
    ClearErrors
394 728 mdecorde
395 728 mdecorde
    ReadRegStr $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed
396 728 mdecorde
397 728 mdecorde
    ${If} ${Errors}
398 728 mdecorde
399 728 mdecorde
      # use script defaults on first run
400 728 mdecorde
      Goto done
401 728 mdecorde
402 728 mdecorde
    ${EndIf}
403 728 mdecorde
404 728 mdecorde
    # mark new components in bold
405 728 mdecorde
406 728 mdecorde
    Call __MementoSectionMarkNew1
407 728 mdecorde
408 728 mdecorde
    # mark section groups in bold
409 728 mdecorde
410 728 mdecorde
    StrCpy $0 0
411 728 mdecorde
    StrCpy $1 ""
412 728 mdecorde
    StrCpy $2 ""
413 728 mdecorde
    StrCpy $3 ""
414 728 mdecorde
415 728 mdecorde
    loop:
416 728 mdecorde
417 728 mdecorde
      ClearErrors
418 728 mdecorde
419 728 mdecorde
      ${If} ${SectionIsBold} $0
420 728 mdecorde
421 728 mdecorde
        ${If} $1 != ""
422 728 mdecorde
423 728 mdecorde
          !insertmacro SetSectionFlag $1 ${SF_BOLD}
424 728 mdecorde
425 728 mdecorde
        ${EndIf}
426 728 mdecorde
427 728 mdecorde
        ${If} $2 != ""
428 728 mdecorde
429 728 mdecorde
          !insertmacro SetSectionFlag $2 ${SF_BOLD}
430 728 mdecorde
431 728 mdecorde
        ${EndIf}
432 728 mdecorde
433 728 mdecorde
        ${If} $3 != ""
434 728 mdecorde
435 728 mdecorde
          !insertmacro SetSectionFlag $3 ${SF_BOLD}
436 728 mdecorde
437 728 mdecorde
        ${EndIf}
438 728 mdecorde
439 728 mdecorde
      ${ElseIf} ${Errors}
440 728 mdecorde
441 728 mdecorde
        Goto loop_end
442 728 mdecorde
443 728 mdecorde
      ${EndIf}
444 728 mdecorde
445 728 mdecorde
      ${If} ${SectionIsSectionGroup} $0
446 728 mdecorde
447 728 mdecorde
        ${If} $1 == ""
448 728 mdecorde
449 728 mdecorde
          StrCpy $1 $0
450 728 mdecorde
451 728 mdecorde
        ${ElseIf} $2 == ""
452 728 mdecorde
453 728 mdecorde
          StrCpy $2 $0
454 728 mdecorde
455 728 mdecorde
        ${ElseIf} $3 == ""
456 728 mdecorde
457 728 mdecorde
          StrCpy $3 $0
458 728 mdecorde
459 728 mdecorde
        ${EndIf}
460 728 mdecorde
461 728 mdecorde
      ${EndIf}
462 728 mdecorde
463 728 mdecorde
      ${If} ${SectionIsSectionGroupEnd} $0
464 728 mdecorde
465 728 mdecorde
        ${If} $3 != ""
466 728 mdecorde
467 728 mdecorde
          StrCpy $3 ""
468 728 mdecorde
469 728 mdecorde
        ${ElseIf} $2 != ""
470 728 mdecorde
471 728 mdecorde
          StrCpy $2 ""
472 728 mdecorde
473 728 mdecorde
        ${ElseIf} $1 != ""
474 728 mdecorde
475 728 mdecorde
          StrCpy $1 ""
476 728 mdecorde
477 728 mdecorde
        ${EndIf}
478 728 mdecorde
479 728 mdecorde
      ${EndIf}
480 728 mdecorde
481 728 mdecorde
      IntOp $0 $0 + 1
482 728 mdecorde
483 728 mdecorde
    Goto loop
484 728 mdecorde
    loop_end:
485 728 mdecorde
486 728 mdecorde
    # restore sections' status
487 728 mdecorde
488 728 mdecorde
    Call __MementoSectionRestoreStatus1
489 728 mdecorde
490 728 mdecorde
  # all done
491 728 mdecorde
492 728 mdecorde
  done:
493 728 mdecorde
494 728 mdecorde
  Pop $3
495 728 mdecorde
  Pop $2
496 728 mdecorde
  Pop $1
497 728 mdecorde
  Pop $0
498 728 mdecorde
499 728 mdecorde
  !verbose pop
500 728 mdecorde
501 728 mdecorde
!macroend
502 728 mdecorde
503 728 mdecorde
!macro MementoSectionSave
504 728 mdecorde
505 728 mdecorde
  !verbose push
506 728 mdecorde
  !verbose 3
507 728 mdecorde
508 728 mdecorde
  !insertmacro __MementoCheckSettings
509 728 mdecorde
510 728 mdecorde
  Push $0
511 728 mdecorde
512 728 mdecorde
    WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed ""
513 728 mdecorde
514 728 mdecorde
    Call __MementoSectionSaveStatus1
515 728 mdecorde
516 728 mdecorde
  Pop $0
517 728 mdecorde
518 728 mdecorde
  !verbose pop
519 728 mdecorde
520 728 mdecorde
!macroend
521 728 mdecorde
522 728 mdecorde
523 728 mdecorde
524 728 mdecorde
!endif # ___MEMENTO_NSH___
525 728 mdecorde
526 728 mdecorde
!verbose pop