From 1facf02179f7927c959d0a34a9b05cce4500c442 Mon Sep 17 00:00:00 2001 From: chriswombat Date: Mon, 3 Aug 2009 11:07:02 +0000 Subject: [PATCH] Win32 installer work - LogicLib code for installer, new installer images, fixed a handful of incidental bugs I found during the LogicLib conversion, updated to using better core NSIS functions introduced since the installer was originally created, general clean-up, other minor things. --- packaging/win32/header.bmp | Bin 25818 -> 25818 bytes packaging/win32/header.svg | 516 +++++ packaging/win32/inkscape.nsi | 1491 ++++-------- packaging/win32/welcomefinish.bmp | Bin 0 -> 154542 bytes packaging/win32/welcomefinish.svg | 3510 +++++++++++++++++++++++++++++ 5 files changed, 4459 insertions(+), 1058 deletions(-) create mode 100644 packaging/win32/header.svg create mode 100644 packaging/win32/welcomefinish.bmp create mode 100644 packaging/win32/welcomefinish.svg diff --git a/packaging/win32/header.bmp b/packaging/win32/header.bmp index 9073d7f8fb0a6ebe76009a2f80b243ee468ff11f..d3c2972d06b0166dff1c0a0f05e02a6067f90f72 100644 GIT binary patch literal 25818 zcmeI5bySpT+rU-22ZlyEL_h>oas)v@LSX0)>7kL75FBX*K?$iL9J)(NK@dgO4(xy# z8o}<^_d?#o`KeslG8U!!Go-+j%ur3mkm@XCdk3cS{? z;fD7$Yl!gkJ50;3Zx7(@QU2CP1=}7MDn2e$dR(OPxLEaZvDy>D_N85-@uXzOlTyvG zGOe*P?Xhy5u@kyuC-laN`r{P_;}wSEl}4~hRVJh=EUDU*RAWx6u^`u4lIyIM#rVyl=o#_di>5Z7_jhsETZ}xQ5?CF@z->iCZtLDXM?TgX67q=T;-f4V!r}^dGmY4V1Ufu6_ z_2A^I2VJiocE5hq^ZL=L*N;!Xe$xMDY~aoK;G6NGH>7iK$>-maFT9-?c{_RW-PGlG z(^uY2Uwb!m{r&9C_p`U&&yBvHzw_bgy$=ibKP)`_u=wcXv&SEwjeUGR{_zF*)62D((xAD zaIurEt`s|po`sPXwyZdpm5y{;pl(~H!}S`!C5%XH@q@+|lWn;17Vm3B*JGhN6zkS9 zGBUEUv9YkQEC;YullXFx7){L`f&v1Rl#~Edh!^#!H3VV!cgOhTM(6Pc=lj(T4{Dsp8(qhn z+^&?`*C!e0h3iB(DJjeFu3NiSL|9mU(?%H)o=u`WGGYRn>S{7F(iH2~IU355JH!9C zE}cDdV5T2GdnRFSAOXqKtbVTTNuA?Jp=E2TVQZ?Wn;S)X4vwchX(uv;v7psDEV=VGwt*+IF zPoII5DUvT;)tvYJDtiGgNVqR86eCSZjBXMR1J}R}oETPCRx}#T!NCF2NKa44!brD4 zfJ2y{7fj;1b?d09D6Dli5#r6;vYaoR@V(m{O74y(b;lfyG^M7ZT)TGdiDZYFfyBAN zWF+Uknsp0Oqm!qJGzG;vQ&ZE;n>UNCNA+b}07DQ$1_lOBPELM)ejXkk;0d?1G}PQ| z%SuymgbIgRlZbW$3RO(OG^u~CnzW=A|k@a$H&gj z&cwt73YMOhT27pAqYxJtnuU*tiu`n}IQ&EBPq^6|E-e>ygWb~txpi#{xF})O#V8@F zU%M870X;D>F_1=XZf>xR3=H(l40Q4m>j9vivZRrkl&QMRZdEBoDFH4vCip9mM%B$i z9d3kxkxnV;w3-hvXkz9|F71rJ=v0F{bLQ~dWN5MgN zi=oO!G+0nN>dF)ch!5|#M@6`5^Ko;So0&P-*~v+Z4wMDY4>at0X{JSK4}qNu!l-g0vd9n zyOcJVV5H47Het8R$V>34ZWg>)836I&axcb%j+j$LzD0QZ=A&NI1Ib7)#&_+fc~WC@ zGEHA++xlhgw`9ktsX^*M*g$6jF@{C;&zY32|{zVWn+bY|KpjJY6-F znH7jCt*v@jS9kleOy+wR@FLqkKevNFrdOWWJq!h(Ed#dx<#@`F<4 zWM!nGqU2y@jPcl6ooY8oz};>NAMcKx?uX8(1f(ZwHT&8~_4bE+RM5<{pgh6Q85tRc zgoFeK2YYyUn3#M1*l$8{c66Tf@UoR=h zMMpyopMr0ng*6+5IDD*B$`Wk5^S!RrhCVzQJ9+xR>;RH$TfN>yQiH=CqK${KG>Vx4 z0(K=OB}Yfch=_=o*x0D3sDlR&re|aTJ-8*5lz^0iUkce5NY(JNvxp0DD$0ndDoDvl zO2}@K0rd;Q3?BzbghM1@p(C3ShONukbG9sSv?Xe+2M_k}TdD@>P5drC4XMs{tk(8H zrOk~}t7X45&Q+0yW+^)g#!y;XT3cJ&z|as9Ey~KuU>Lzv0-I%F19@8qwM04^QGPB} z1!*Jg?KW6FYja~4XUDz4!ESDDP@>}H;zYBsFf-80Z(NVFRx3JS+mVaAQXe^fDgnvU z{J9=sQjO)4YRkJPEUppE&gUApr|1**X+}9JsBh+Fq+1FpfD*6*Vh~lpf@^sAs|&(^ z7A8iS4I;YgigsrDI2Y?+oNIuOd+6SvgYof)Qd4|9+_g0@vJzr~JlwqOtXfJEMjeyP

GS@*z54gcO}o-`65K%QxY5i@iRzUFA_poIf&mFNHU0+cG` zPDS|Gm1IQp)Z`qDb_6(Lqi}ZkAeW?IxBb3OA+FXq8#51c<2@z@7P^`oY^>TU8%L@m zrv^b35r)5u;dr(AwIZWE`jA0eav-6N0^)Z`Nl7qwyLRn@cmj*X8X6kHHN+F}qyI{8 zz8kaIK~Du|t`+WVaKO_v#m_1|$o_Dk;{k8GeQx$4&bC&&v>@+x zB+_bfAPr&oJI~Aj!;8laX{jl|b%cl^;M>CCaNvSCIXQvDX<=buVq#)oU;tquNaJr< z!WDYU7hpnZsj2xmS=D64j4+$+^;Epgw89(>@E)e=0X8||j)hUKMbREvp`HnT9^RH% zdRkh%ztJ>Qpb$Cy-RGX}mSa(j)S8-_v9YmXVPQc*LB77eo}QkruC5SIKpbdpZf zc)$Eu|D+&qRe4z{QEsRoBDJSK!4S@n-XLJ5giw$X&B@6DjF4IL^Yioe_Wo7F2qFJ6 z#^qMh6{H}6loS;7v@~cIW_~VCNg)9U9ki7c91Jvktn?$C%?{#hkL-2HkM=5w^96wE z`+{{bD&m5iqpdMW?di|O_`r}azB_%NOvIg6gU5vE@?TlmGtWx})j)l7yMEm4L2V~=;jI}jI_}OnX zMIpJi?^Jst)!JMx#ES4TfiGHKUJe++Fy`gu-MV$_!i5VxJw5gH^#lUp@ZrPY-#}{{ zbhMR}lw@aTgUy82jAekV%uIZo91?>3TV*!x+OB4#scxpN;b~?N>TG@h=a9bFEhiF} zy)U3B^`NzpK2-Cs)<@2rO+o61--#id$A^6Br9!MAHxpo~si}#MjwTX`KYv^A-@kwH z;>FzD9En7VkB^6xDbx>ZYij``s9(r}tEec83JGdp)NIU6eLdVl{BV15UY>SV_J%tC zHl|T-wkZLwnW0`s_XU(^9dfob6X0gOR1=2uCayw{FuC4tB;S;ulMx)6rluy4MlzYa zjPb*V56c*D-nEGsKJo|l)EdE{_fYD!{4VtiaeY&1S95+4~B<&SeW zGYZ>dmmcn)8SZx^!msLhwzrc#9~Ww*axc>7y=uMs?7$}hf*_B5;Kzy9>K>&dN^m} zWAYPYkAw#{5DJ35J-FGK&z%TD&ReWz4H#ydKwsP094t4QAv`?1x3@PrIeB4W;eTSB znwlCO9v&SX1&lr2-EFO{jdiuv6~v0tlJcU0lDr&3&avWSM+jNzrCI4EN79Z)hqhLf z$LtN{WMdjA@k8qPtJ#aOGM@%8_8-G?vC)I`dFITSw6wJ6&z~=2{P^)BNaOtcJgC_l z*RKzsKYymbucxc?WNS-HLtSHaWj(RHu8dGyQdmbQs4Y5vEH1LMwkjcdA3G~kU$M{Z z89dTY^OrD$8AEV(?etMB2Z}x=C1q%6=+L1g;K6?QCv5*-(43uDYX|n0qj`r>Q|n-z?&U%y^lTpS-8yLA~Lafv%4J_SS-A z{OPvlob*Fz7KW}|_m$p6L=OKdIb5Fg1sFRsOwcF>h!sahMgS(n8OsO7ryLbEMjhk04UmY2~e17Ps!G1z|a(_o_QO;3TW`?$-F0*~etgpXu*4IR{TgPD& zR%ZI*;$o1-yxd$ci7Oc2y?y&^VPTR?8h`Zg;ho!eZ(hHB^)m5T1^_HC%m;u?8BWXR z50QCof9t%qiDvhfG-DJKeR)|Kc%)?|1Q5a%jPKvQTU=O}otm5&e=`2?K}|s}sL;xi zVpbN$+BCbF)5y%dA7thp%v5MdHbS#9RaaFGpFdY$Q~l)&OaWY4Z~+*fFD^cvooOy7 zfD=<)N`M2w6-m}Jr~Y%68o<&@ zbyXcTl>m?p#Z->B_{DjAgy9ds5ayRowt83McXP6{wlp*h4fJ<5H@$iN8Zb_iNnQ0d zjb((2;sP{^xoE%XG>kAsW(@tHGlnMGyvz0*@NjW7)Km`-4%U^I)Rq+06c?QB?JmyC zfkSM^ql~9|kXc_p_zc>Kb{z455oA911_ib^HxCV*X|Ai?b-R{0kf1DPI5p literal 25818 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/win32/inkscape.nsi b/packaging/win32/inkscape.nsi index 6a5d86048..0b7355969 100644 --- a/packaging/win32/inkscape.nsi +++ b/packaging/win32/inkscape.nsi @@ -7,27 +7,26 @@ ; DEFINES ; ####################################### !define PRODUCT_NAME "Inkscape" -!define PRODUCT_VERSION "0.45+devel" -!define PRODUCT_PUBLISHER "Inkscape Organization" -!define PRODUCT_WEB_SITE "http://www.inkscape.org" +!define PRODUCT_VERSION "0.46+devel" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\inkscape.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -;!define UNINST_EXE "uninstall.exe" - - +;!define DUMMYINSTALL ; define this to make it build quickly, not including any of the files or proper sections, for quick testing of pre-install features of the installer ; ####################################### ; MUI SETTINGS ; ####################################### ; MUI 1.67 compatible ------ SetCompressor /SOLID lzma +RequestExecutionLevel highest !include "MUI.nsh" +!include "LogicLib.nsh" !include "sections.nsh" !define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" +!define MUI_ICON "..\..\inkscape.ico";${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "header.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP "welcomefinish.bmp" !define MUI_COMPONENTSPAGE_SMALLDESC ;.................................................................................................. @@ -36,23 +35,20 @@ SetCompressor /SOLID lzma ;store the language selection, store Start Menu folder etc. ;Enter the windows uninstall reg sub key to add uninstall information to Add/Remove Programs also. -!define INSTDIR_REG_ROOT "HKLM" +!define INSTDIR_REG_ROOT HKLM !define INSTDIR_REG_KEY ${PRODUCT_UNINST_KEY} ;include the Uninstall log header !include AdvUninstLog.nsh - -;Specify the preferred uninstaller operation mode, either unattended or interactive. -;You have to type either !insertmacro UNATTENDED_UNINSTALL, or !insertmacro INTERACTIVE_UNINSTALL. -;Be aware only one of the following two macros has to be inserted, neither both, neither none. - -;!insertmacro UNATTENDED_UNINSTALL !insertmacro INTERACTIVE_UNINSTALL +;For md5dll and messagebox !addplugindir . -!include "FileFunc.nsh" -!insertmacro un.GetParent +!include FileFunc.nsh +!insertmacro GetParameters +!insertmacro GetOptions +!insertmacro un.GetParent ; Welcome page !insertmacro MUI_PAGE_WELCOME @@ -92,433 +88,96 @@ ShowUninstDetails hide ; default language first ; Language files -!include "english.nsh" +!include "english.nsh" !include "breton.nsh" !include "catalan.nsh" -!include "czech.nsh" -!include "finnish.nsh" -!include "french.nsh" -!include "galician.nsh" -!include "german.nsh" -!include "italian.nsh" +!include "czech.nsh" +!include "finnish.nsh" +!include "french.nsh" +!include "galician.nsh" +!include "german.nsh" +!include "italian.nsh" !include "japanese.nsh" -!include "polish.nsh" -!include "russian.nsh" -!include "slovak.nsh" -!include "slovenian.nsh" -!include "spanish.nsh" +!include "polish.nsh" +!include "russian.nsh" +!include "slovak.nsh" +!include "slovenian.nsh" +!include "spanish.nsh" !include "tradchinese.nsh" ReserveFile "inkscape.nsi.uninstall" ReserveFile "${NSISDIR}\Plugins\UserInfo.dll" -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;InstallOptions - +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ####################################### ; SETTINGS ; ####################################### -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -Caption $(lng_Caption) +Name "${PRODUCT_NAME}" +Caption "$(lng_Caption)" +BrandingText "$(lng_Caption)" OutFile "Inkscape-${PRODUCT_VERSION}-1.win32.exe" InstallDir "$PROGRAMFILES\Inkscape" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails hide -ShowUnInstDetails hide -var askMultiUser +Var askMultiUser +Var filename Var MultiUser -var User +Var User +Var CMDARGS ; ####################################### ; I N S T A L L E R S E C T I O N S ; ####################################### -; Turn off old selected section -; GetWindowsVersion -; -; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/ -; Updated by Joost Verburg -; Updated for Windows 98 SE by Matthew Win Tibbals 5-21-03 -; -; Returns on top of stack -; -; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003) -; or -; '' (Unknown Windows Version) -; -; Usage: -; Call GetWindowsVersion -; Pop $R0 -; ; at this point $R0 is "NT 4.0" or whatnot -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function GetWindowsVersion - - Push $R0 - Push $R1 - - ClearErrors - - ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - - IfErrors 0 lbl_winnt - - ; we are not NT - ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber - - StrCpy $R1 $R0 1 - StrCmp $R1 '4' 0 lbl_error - - StrCpy $R1 $R0 3 - - StrCmp $R1 '4.0' lbl_win32_95 - StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 - - lbl_win32_95: - StrCpy $R0 '95' - StrCpy $AskMultiUser "0" - Goto lbl_done - - lbl_win32_98: - StrCpy $R0 '98' - StrCpy $AskMultiUser "0" - Goto lbl_done - lbl_win32_ME: - StrCpy $R0 'ME' - StrCpy $AskMultiUser "0" - Goto lbl_done - - lbl_winnt: - - StrCpy $R1 $R0 1 - - StrCmp $R1 '3' lbl_winnt_x - StrCmp $R1 '4' lbl_winnt_x - - StrCpy $R1 $R0 3 - - StrCmp $R1 '5.0' lbl_winnt_2000 - StrCmp $R1 '5.1' lbl_winnt_XP - StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error - - lbl_winnt_x: - StrCpy $R0 "NT $R0" 6 - Goto lbl_done - - lbl_winnt_2000: - Strcpy $R0 '2000' - Goto lbl_done - - lbl_winnt_XP: - Strcpy $R0 'XP' - Goto lbl_done - - lbl_winnt_2003: - Strcpy $R0 '2003' - Goto lbl_done - - lbl_error: - Strcpy $R0 '' - lbl_done: - - Pop $R1 - Exch $R0 - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - ; StrStr - ; input, top of stack = string to search for - ; top of stack-1 = string to search in - ; output, top of stack (replaces with the portion of the string remaining) - ; modifies no other variables. - ; - ; Usage: - ; Push "this is a long ass string" - ; Push "ass" - ; Call StrStr - ; Pop $R0 - ; ($R0 at this point is "ass string") - - Function StrStr - Exch $R1 ; st=haystack,old$R1, $R1=needle - Exch ; st=old$R1,haystack - Exch $R2 ; st=old$R1,old$R2, $R2=haystack - Push $R3 - Push $R4 - Push $R5 - StrLen $R3 $R1 - StrCpy $R4 0 - ; $R1=needle - ; $R2=haystack - ; $R3=len(needle) - ; $R4=cnt - ; $R5=tmp - loop: - StrCpy $R5 $R2 $R3 $R4 - StrCmp $R5 $R1 done - StrCmp $R5 "" done - IntOp $R4 $R4 + 1 - Goto loop - done: - StrCpy $R1 $R2 "" $R4 - Pop $R5 - Pop $R4 - Pop $R3 - Pop $R2 - Exch $R1 - FunctionEnd - +!ifndef DUMMYINSTALL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; GetParameters - ; input, none - ; output, top of stack (replaces, with e.g. whatever) - ; modifies no other variables. - - Function GetParameters - - Push $R0 - Push $R1 - Push $R2 - Push $R3 - - StrCpy $R2 1 - StrLen $R3 $CMDLINE - - ;Check for quote or space - StrCpy $R0 $CMDLINE $R2 - StrCmp $R0 '"' 0 +3 - StrCpy $R1 '"' - Goto loop - StrCpy $R1 " " - - loop: - IntOp $R2 $R2 + 1 - StrCpy $R0 $CMDLINE 1 $R2 - StrCmp $R0 $R1 get - StrCmp $R2 $R3 get - Goto loop - - get: - IntOp $R2 $R2 + 1 - StrCpy $R0 $CMDLINE 1 $R2 - StrCmp $R0 " " get - StrCpy $R0 $CMDLINE "" $R2 - - Pop $R3 - Pop $R2 - Pop $R1 - Exch $R0 - - FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; GetParameterValue -; Chris Morgan 5/10/2004 -; -Updated 4/7/2005 to add support for retrieving a command line switch -; and additional documentation -; -; Searches the command line input, retrieved using GetParameters, for the -; value of an option given the option name. If no option is found the -; default value is placed on the top of the stack upon function return. -; -; This function can also be used to detect the existence of just a -; command line switch like /OUTPUT Pass the default and "OUTPUT" -; on the stack like normal. An empty return string "" will indicate -; that the switch was found, the default value indicates that -; neither a parameter or switch was found. -; -; Inputs - Top of stack is default if parameter isn't found, -; second in stack is parameter to search for, ex. "OUTPUT" -; Outputs - Top of the stack contains the value of this parameter -; So if the command line contained /OUTPUT=somedirectory, "somedirectory" -; will be on the top of the stack when this function returns -; -; Register usage -;$R0 - default return value if the parameter isn't found -;$R1 - input parameter, for example OUTPUT from the above example -;$R2 - the length of the search, this is the search parameter+2 -; as we have '/OUTPUT=' -;$R3 - the command line string -;$R4 - result from StrStr calls -;$R5 - search for ' ' or '"' - -Function GetParameterValue - Exch $R0 ; get the top of the stack(default parameter) into R0 - Exch ; exchange the top of the stack(default) with - ; the second in the stack(parameter to search for) - Exch $R1 ; get the top of the stack(search parameter) into $R1 - - ;Preserve on the stack the registers used in this function - Push $R2 - Push $R3 - Push $R4 - Push $R5 - - Strlen $R2 $R1+2 ; store the length of the search string into R2 - - Call GetParameters ; get the command line parameters - Pop $R3 ; store the command line string in R3 - - # search for quoted search string - StrCpy $R5 '"' ; later on we want to search for a open quote - Push $R3 ; push the 'search in' string onto the stack - Push '"/$R1=' ; push the 'search for' - Call StrStr ; search for the quoted parameter value - Pop $R4 - StrCpy $R4 $R4 "" 1 ; skip over open quote character, "" means no maxlen - StrCmp $R4 "" "" next ; if we didn't find an empty string go to next - - # search for non-quoted search string - StrCpy $R5 ' ' ; later on we want to search for a space since we - ; didn't start with an open quote '"' we shouldn't - ; look for a close quote '"' - Push $R3 ; push the command line back on the stack for searching - Push '/$R1=' ; search for the non-quoted search string - Call StrStr - Pop $R4 - - ; $R4 now contains the parameter string starting at the search string, - ; if it was found -next: - StrCmp $R4 "" check_for_switch ; if we didn't find anything then look for - ; usage as a command line switch - # copy the value after /$R1= by using StrCpy with an offset of $R2, - # the length of '/OUTPUT=' - StrCpy $R0 $R4 "" $R2 ; copy commandline text beyond parameter into $R0 - # search for the next parameter so we can trim this extra text off - Push $R0 - Push $R5 ; search for either the first space ' ', or the first - ; quote '"' - ; if we found '"/output' then we want to find the - ; ending ", as in '"/output=somevalue"' - ; if we found '/output' then we want to find the first - ; space after '/output=somevalue' - Call StrStr ; search for the next parameter - Pop $R4 - StrCmp $R4 "" done ; if 'somevalue' is missing, we are done - StrLen $R4 $R4 ; get the length of 'somevalue' so we can copy this - ; text into our output buffer - StrCpy $R0 $R0 -$R4 ; using the length of the string beyond the value, - ; copy only the value into $R0 - goto done ; if we are in the parameter retrieval path skip over - ; the check for a command line switch - -; See if the parameter was specified as a command line switch, like '/output' -check_for_switch: - Push $R3 ; push the command line back on the stack for searching - Push '/$R1' ; search for the non-quoted search string - Call StrStr - Pop $R4 - StrCmp $R4 "" done ; if we didn't find anything then use the default - StrCpy $R0 "" ; otherwise copy in an empty string since we found the - ; parameter, just didn't find a value - -done: - Pop $R5 - Pop $R4 - Pop $R3 - Pop $R2 - Pop $R1 - Exch $R0 ; put the value in $R0 at the top of the stack -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -!macro Language polng lng - SectionIn 1 2 3 - SetOutPath $INSTDIR - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a "..\..\inkscape\*.${lng}.txt" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SetOutPath $INSTDIR\locale - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\locale\${polng}" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SetOutPath $INSTDIR\lib\locale - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\lib\locale\${polng}" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SetOutPath $INSTDIR\share\clipart - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\share\clipart\*.${polng}.svg" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - ; the keyboard tables - SetOutPath $INSTDIR\share\screens - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\share\screens\*.${polng}.svg" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SetOutPath $INSTDIR\share\templates - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\share\templates\*.${polng}.svg" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SetOutPath $INSTDIR\doc - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\doc\keys.${polng}.xml" - File /nonfatal /a /r "..\..\inkscape\doc\keys.${polng}.html" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - SectionGetFlags ${SecTutorials} $R1 - IntOp $R1 $R1 & ${SF_SELECTED} - IntCmp $R1 ${SF_SELECTED} 0 skip_tutorials - SetOutPath $INSTDIR\share\tutorials - !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a "..\..\inkscape\share\tutorials\*.${polng}.*" - !insertmacro UNINSTALL.LOG_CLOSE_INSTALL - skip_tutorials: -!macroend - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;;;;;;;;;;;;;;;;;;;;;;;;;; ; Delete prefs -; code taken from the vlc project +; code originally taken from the vlc project ;;;;;;;;;;;;;;;;;;;;;;;;;; !macro delprefs StrCpy $0 0 - DetailPrint "Delete personal preferences ..." - DetailPrint "try to find all users ..." - delprefs-Loop: + DetailPrint "Delete personal preferences ..." + DetailPrint "try to find all users ..." + ${Do} ; FIXME ; this will loop through all the logged users and "virtual" windows users ; (it looks like users are only present in HKEY_USERS when they are logged in) ClearErrors EnumRegKey $1 HKU "" $0 - StrCmp $1 "" delprefs-End + ${IfThen} $1 == "" ${|} ${ExitDo} ${|} IntOp $0 $0 + 1 ReadRegStr $2 HKU "$1\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" AppData - StrCmp $2 "" delprefs-Loop - DetailPrint "$2\Inkscape will be removed" + ${IfThen} $2 == "" ${|} ${Continue} ${|} + DetailPrint "$2\Inkscape will be removed" Delete "$2\Inkscape\preferences.xml" Delete "$2\Inkscape\extension-errors.log" RMDir "$2\Inkscape" - Goto delprefs-Loop - delprefs-End: + ${Loop} !macroend ;-------------------------------- ; Installer Sections Section -removeInkscape - ; check for an old installation and clean that dlls and stuff - -FindFirstINSTDIR: - FindFirst $0 $1 $INSTDIR\*.* -FindINSTDIR: - StrCmp $1 "" FindNextDoneINSTDIR - StrCmp $1 "." FindNextINSTDIR - StrCmp $1 ".." FindNextINSTDIR - Goto FoundSomethingINSTDIR -FindNextINSTDIR: - FindNext $0 $1 - Goto FindINSTDIR -FoundSomethingINSTDIR: - MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "$(lng_ClearDirectoryBefore)" /SD IDCANCEL IDRETRY FindFirstINSTDIR - Quit -FindNextDoneINSTDIR: - - ;remove the old inkscape shortcuts from the startmenu + ; check for an old installation and clean its DLLs etc. + FindFirst $0 $1 $INSTDIR\*.* + ${Do} + ${IfThen} $1 == "" ${|} ${ExitDo} ${|} + ${If} $1 == "." + ${OrIf} $1 == ".." + FindNext $0 $1 + ${Continue} + ${EndIf} + ${If} ${Cmd} ${|} MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "$(lng_ClearDirectoryBefore)" /SD IDCANCEL IDCANCEL ${|} + FindFirst $0 $1 $INSTDIR\*.* + ${Continue} + ${Else} + ${EndIf} + ${Loop} + ;remove the old Inkscape shortcuts from the startmenu ;just in case they are still there SetShellVarContext current Delete "$SMPROGRAMS\Inkscape\Uninstall Inkscape.lnk" @@ -530,14 +189,11 @@ FindNextDoneINSTDIR: Delete "$SMPROGRAMS\Inkscape\Inkscape.lnk" RMDir "$SMPROGRAMS\Inkscape" Delete "$SMPROGRAMS\Inkscape.lnk" - SectionEnd Section $(lng_Core) SecCore - - DetailPrint "Installing Inkscape Core Files ..." - SectionIn 1 2 3 RO + DetailPrint "Installing Inkscape Core Files ..." SetOutPath $INSTDIR !insertmacro UNINSTALL.LOG_OPEN_INSTALL SetOverwrite on @@ -563,7 +219,7 @@ Section $(lng_Core) SecCore SetOutPath $INSTDIR\share\clipart !insertmacro UNINSTALL.LOG_OPEN_INSTALL File /a "..\..\inkscape\share\clipart\inkscape.logo.svg" - ;File /a "..\..\inkscape\share\clipart\inkscape.logo.classic.svg" + ;File /a "..\..\inkscape\share\clipart\inkscape.logo.classic.svg" !insertmacro UNINSTALL.LOG_CLOSE_INSTALL SetOutPath $INSTDIR\share\icons !insertmacro UNINSTALL.LOG_OPEN_INSTALL @@ -576,15 +232,13 @@ Section $(lng_Core) SecCore !insertmacro UNINSTALL.LOG_CLOSE_INSTALL SetOutPath $INSTDIR\python !insertmacro UNINSTALL.LOG_OPEN_INSTALL - File /nonfatal /a /r "..\..\inkscape\python\*.*" + File /nonfatal /a /r "..\..\inkscape\python\*.*" !insertmacro UNINSTALL.LOG_CLOSE_INSTALL SectionEnd Section $(lng_GTKFiles) SecGTK - - DetailPrint "Installing GTK Files ..." - SectionIn 1 2 3 RO + DetailPrint "Installing GTK Files ..." SetOutPath $INSTDIR !insertmacro UNINSTALL.LOG_OPEN_INSTALL SetOverwrite on @@ -594,18 +248,17 @@ Section $(lng_GTKFiles) SecGTK !insertmacro UNINSTALL.LOG_CLOSE_INSTALL SectionEnd +Section -SetCurrentUserOnly + StrCpy $MultiUser 0 + SetShellVarContext current +SectionEnd + Section $(lng_Alluser) SecAlluser ; disable this option in Win95/Win98/WinME - SectionIn 1 2 3 - StrCpy $MultiUser "1" - StrCmp $MultiUser "1" "" SingleUser - DetailPrint "admin mode, registry root will be HKLM" - SetShellVarContext all - Goto endSingleUser - SingleUser: - DetailPrint "single user mode, registry root will be HKCU" - SetShellVarContext current - endSingleUser: + SectionIn 1 2 3 + StrCpy $MultiUser 1 + DetailPrint "admin mode, registry root will be HKLM" + SetShellVarContext all SectionEnd SectionGroup $(lng_Shortcuts) SecShortcuts @@ -613,42 +266,39 @@ SectionGroup $(lng_Shortcuts) SecShortcuts Section /o $(lng_Desktop) SecDesktop ClearErrors CreateShortCut "$DESKTOP\Inkscape.lnk" "$INSTDIR\inkscape.exe" - IfErrors 0 +2 - DetailPrint "Uups! Problems creating desktop shortcuts" + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating desktop shortcuts" ${|} SectionEnd Section /o $(lng_Quicklaunch) SecQuicklaunch ClearErrors - StrCmp $QUICKLAUNCH $TEMP +2 - CreateShortCut "$QUICKLAUNCH\Inkscape.lnk" "$INSTDIR\inkscape.exe" - IfErrors 0 +2 - DetailPrint "Uups! Problems creating quicklaunch shortcuts" + ${IfThen} $QUICKLAUNCH != $TEMP ${|} CreateShortCut "$QUICKLAUNCH\Inkscape.lnk" "$INSTDIR\inkscape.exe" ${|} + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating quicklaunch shortcuts" ${|} SectionEnd -Section $(lng_SVGWriter) SecSVGWriter +Section $(lng_SVGWriter) SecSVGWriter SectionIn 1 2 3 ; create file associations, test before if needed DetailPrint "creating file associations" ClearErrors ReadRegStr $0 HKCR ".svg" "" - StrCmp $0 "" 0 +3 + ${If} $0 == "" WriteRegStr HKCR ".svg" "" "svgfile" WriteRegStr HKCR "svgfile" "" "Scalable Vector Graphics file" + ${EndIf} ReadRegStr $0 HKCR ".svgz" "" - StrCmp $0 "" 0 +3 + ${If} $0 == "" WriteRegStr HKCR ".svgz" "" "svgfile" WriteRegStr HKCR "svgfile" "" "Scalable Vector Graphics file" - IfErrors 0 +2 - DetailPrint "Uups! Problems creating file assoziations for svg writer" - + ${EndIf} + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating file assoziations for svg writer" ${|} + DetailPrint "creating default editor" ClearErrors ReadRegStr $0 HKCR ".svg" "" WriteRegStr HKCR "$0\shell\edit\command" "" '"$INSTDIR\Inkscape.exe" "%1"' ReadRegStr $0 HKCR ".svgz" "" WriteRegStr HKCR "$0\shell\edit\command" "" '"$INSTDIR\Inkscape.exe" "%1"' - IfErrors 0 +2 - DetailPrint "Uups! Problems creating default editor" + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating default editor" ${|} SectionEnd Section $(lng_ContextMenu) SecContextMenu @@ -657,31 +307,32 @@ Section $(lng_ContextMenu) SecContextMenu DetailPrint "creating file associations" ClearErrors ReadRegStr $0 HKCR ".svg" "" - StrCmp $0 "" 0 +3 + ${If} $0 == "" WriteRegStr HKCR ".svg" "" "svgfile" WriteRegStr HKCR "svgfile" "" "Scalable Vector Graphics file" + ${EndIf} + ReadRegStr $0 HKCR ".svgz" "" - StrCmp $0 "" 0 +3 + ${If} $0 == "" WriteRegStr HKCR ".svgz" "" "svgfile" WriteRegStr HKCR "svgfile" "" "Scalable Vector Graphics file" - IfErrors 0 +2 - DetailPrint "Uups! Problems creating file assoziations for context menu" - + ${EndIf} + + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating file assoziations for context menu" ${|} + DetailPrint "creating context menue" ClearErrors ReadRegStr $0 HKCR ".svg" "" WriteRegStr HKCR "$0\shell\${PRODUCT_NAME}\command" "" '"$INSTDIR\Inkscape.exe" "%1"' ReadRegStr $0 HKCR ".svgz" "" WriteRegStr HKCR "$0\shell\${PRODUCT_NAME}\command" "" '"$INSTDIR\Inkscape.exe" "%1"' - IfErrors 0 +2 - DetailPrint "Uups! Problems creating context menue integration" - + ${IfThen} ${Errors} ${|} DetailPrint "Uups! Problems creating context menue integration" ${|} SectionEnd SectionGroupEnd Section /o $(lng_DeletePrefs) SecPrefs - !insertmacro delprefs + !insertmacro delprefs SectionEnd SectionGroup $(lng_Addfiles) SecAddfiles @@ -704,294 +355,142 @@ SectionEnd SectionGroupEnd -SectionGroup /e $(lng_Languages) SecLanguages - -Section $(lng_am) SecAmharic - !insertmacro Language am am -SectionEnd - -Section $(lng_ar) SecArabic - !insertmacro Language ar ar -SectionEnd - -Section $(lng_az) SecAzerbaijani - !insertmacro Language az az -SectionEnd - -Section $(lng_be) SecByelorussian - !insertmacro Language be be -SectionEnd - -Section $(lng_bg) SecBulgarian - !insertmacro Language bg bg -SectionEnd - -Section $(lng_bn) SecBengali - !insertmacro Language bn bn -SectionEnd - -Section $(lng_br) SecBreton - !insertmacro Language br br -SectionEnd - -Section $(lng_ca) SecCatalan - !insertmacro Language ca ca -SectionEnd - -Section $(lng_ca@valencia) SecCatalanValencia - !insertmacro Language ca@valencia ca@valencia -SectionEnd - -Section $(lng_cs) SecCzech - !insertmacro Language cs cs -SectionEnd - -Section $(lng_da) SecDanish - !insertmacro Language da da -SectionEnd - -Section $(lng_de) SecGerman - !insertmacro Language 'de' 'de' -SectionEnd - -Section $(lng_dz) SecDzongkha - !insertmacro Language dz dz -SectionEnd - -Section $(lng_el) SecGreek - !insertmacro Language el el -SectionEnd - -Section $(lng_en) SecEnglish - SectionIn 1 2 3 RO -SectionEnd - -Section $(lng_en_AU) SecEnglishAustralian - !insertmacro Language en_AU en_AU -SectionEnd - -Section $(lng_en_CA) SecEnglishCanadian - !insertmacro Language en_CA en_CA -SectionEnd - -Section $(lng_en_GB) SecEnglishBritain - !insertmacro Language en_GB en_GB -SectionEnd - -Section $(lng_en_US@piglatin) SecEnglishPiglatin - !insertmacro Language en_US@piglatin en_US@Piglatin -SectionEnd - -Section $(lng_eo) SecEsperanto - !insertmacro Language eo eo -SectionEnd - -Section $(lng_es) SecSpanish - !insertmacro Language 'es' 'es' -SectionEnd - -Section $(lng_es_MX) SecSpanishMexico - !insertmacro Language 'es_MX' 'es_MX' -SectionEnd - -Section $(lng_et) SecEstonian - !insertmacro Language et et -SectionEnd - -Section $(lng_eu) SecBasque - !insertmacro Language eu eu -SectionEnd - -Section $(lng_fr) SecFrench - !insertmacro Language 'fr' 'fr' -SectionEnd - -Section $(lng_fi) SecFinnish - !insertmacro Language 'fi' 'fi' -SectionEnd - -Section $(lng_ga) SecIrish - !insertmacro Language ga ga -SectionEnd - -Section $(lng_gl) SecGallegan - !insertmacro Language gl gl - SectionIn 1 2 3 -SectionEnd - -Section $(lng_he) SecHebrew - !insertmacro Language he he - SectionIn 1 2 3 -SectionEnd - -Section $(lng_hr) SecCroatian - !insertmacro Language hr hr - SectionIn 1 2 3 -SectionEnd - -Section $(lng_hu) SecHungarian - !insertmacro Language hu hu - SectionIn 1 2 3 -SectionEnd - -Section $(lng_id) SecIndonesian - !insertmacro Language id id - SectionIn 1 2 3 -SectionEnd - -Section $(lng_it) SecItalian - !insertmacro Language it it - SectionIn 1 2 3 -SectionEnd - -Section $(lng_ja) SecJapanese - !insertmacro Language 'ja' 'jp' -SectionEnd - -Section $(lng_km) SecKhmer - !insertmacro Language km km -SectionEnd - -Section $(lng_ko) SecKorean - !insertmacro Language 'ko' 'ko' -SectionEnd - -Section $(lng_lt) SecLithuanian - !insertmacro Language 'lt' 'lt' -SectionEnd - -Section $(lng_mn) SecMongolian - !insertmacro Language mn mn -SectionEnd - -Section $(lng_mk) SecMacedonian - !insertmacro Language mk mk -SectionEnd - -Section $(lng_nb) SecNorwegianBokmal - !insertmacro Language nb nb -SectionEnd - -Section $(lng_ne) SecNepali - !insertmacro Language ne ne -SectionEnd - -Section $(lng_nl) SecDutch - !insertmacro Language nl nl -SectionEnd - -Section $(lng_nn) SecNorwegianNynorsk - !insertmacro Language nn nn -SectionEnd - -Section $(lng_pa) SecPanjabi - !insertmacro Language pa pa -SectionEnd - -Section $(lng_pl) SecPolish - !insertmacro Language pl pl -SectionEnd - -Section $(lng_pt) SecPortuguese - !insertmacro Language pt pt -SectionEnd - -Section $(lng_pt_BR) SecPortugueseBrazil - !insertmacro Language pt_BR pt_BR -SectionEnd - -Section $(lng_ro) SecRomanian - !insertmacro Language ro ro -SectionEnd - -Section $(lng_ru) SecRussian - !insertmacro Language ru ru -SectionEnd - -Section $(lng_rw) SecKinyarwanda - !insertmacro Language rw rw -SectionEnd - -Section $(lng_sk) SecSlovak - !insertmacro Language sk sk -SectionEnd - -Section $(lng_sl) SecSlovenian - !insertmacro Language sl sl -SectionEnd - -Section $(lng_sq) SecAlbanian - !insertmacro Language sq sq -SectionEnd - -Section $(lng_sr) SecSerbian - !insertmacro Language sr sr -SectionEnd - -Section $(lng_sr@latin) SecSerbianLatin - !insertmacro Language 'sr@latin' 'sr@latin' -SectionEnd - -Section $(lng_sv) SecSwedish - !insertmacro Language sv sv -SectionEnd - -Section $(lng_th) SecThai - !insertmacro Language th th -SectionEnd - -Section $(lng_tr) SecTurkish - !insertmacro Language tr tr -SectionEnd - -Section $(lng_uk) SecUkrainian - !insertmacro Language uk uk -SectionEnd - -Section $(lng_vi) SecVietnamese - !insertmacro Language vi vi -SectionEnd - -Section $(lng_zh_CN) SecChineseSimplified - !insertmacro Language zh_CN zh_CN -SectionEnd - -Section $(lng_zh_TW) SecChineseTaiwan - !insertmacro Language zh_TW zh_TW -SectionEnd - +SectionGroup $(lng_Languages) SecLanguages + !macro Language SecName lng + Section $(lng_${lng}) Sec${SecName} + SectionIn 1 2 3 + SetOutPath $INSTDIR + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a "..\..\inkscape\*.${lng}.txt" ; FIXME: remove this? No such files. + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SetOutPath $INSTDIR\locale + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\locale\${lng}" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SetOutPath $INSTDIR\lib\locale + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\lib\locale\${lng}" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SetOutPath $INSTDIR\share\clipart + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\share\clipart\*.${lng}.svg" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + ; the keyboard tables + SetOutPath $INSTDIR\share\screens + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\share\screens\*.${lng}.svg" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SetOutPath $INSTDIR\share\templates + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\share\templates\*.${lng}.svg" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SetOutPath $INSTDIR\doc + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a /r "..\..\inkscape\doc\keys.${lng}.xml" + File /nonfatal /a /r "..\..\inkscape\doc\keys.${lng}.html" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + SectionGetFlags ${SecTutorials} $R1 + IntOp $R1 $R1 & ${SF_SELECTED} + ${If} $R1 >= ${SF_SELECTED} + SetOutPath $INSTDIR\share\tutorials + !insertmacro UNINSTALL.LOG_OPEN_INSTALL + File /nonfatal /a "..\..\inkscape\share\tutorials\*.${lng}.*" + !insertmacro UNINSTALL.LOG_CLOSE_INSTALL + ${EndIf} + SectionEnd + !macroend + + !insertmacro Language Amharic am + !insertmacro Language Arabic ar + !insertmacro Language Azerbaijani az + !insertmacro Language Byelorussian be + !insertmacro Language Bulgarian bg + !insertmacro Language Bengali bn + !insertmacro Language Breton br + !insertmacro Language Catalan ca + !insertmacro Language CatalanValencia ca@valencia + !insertmacro Language Czech cs + !insertmacro Language Danish da + !insertmacro Language German de + !insertmacro Language Dzongkha dz + !insertmacro Language Greek el + !insertmacro Language EnglishAustralian en_AU + !insertmacro Language EnglishCanadian en_CA + !insertmacro Language EnglishBritain en_GB + !insertmacro Language EnglishPiglatin en_US@piglatin + !insertmacro Language Esperanto eo + !insertmacro Language Spanish es + !insertmacro Language SpanishMexico es_MX + !insertmacro Language Estonian et + !insertmacro Language Basque eu + !insertmacro Language French fr + !insertmacro Language Finnish fi + !insertmacro Language Irish ga + !insertmacro Language Gallegan gl + !insertmacro Language Hebrew he + !insertmacro Language Croatian hr + !insertmacro Language Hungarian hu + !insertmacro Language Indonesian id + !insertmacro Language Italian it + !insertmacro Language Japanese ja + !insertmacro Language Khmer km + !insertmacro Language Korean ko + !insertmacro Language Lithuanian lt + !insertmacro Language Mongolian mn + !insertmacro Language Macedonian mk + !insertmacro Language NorwegianBokmal nb + !insertmacro Language Nepali ne + !insertmacro Language Dutch nl + !insertmacro Language NorwegianNynorsk nn + !insertmacro Language Panjabi pa + !insertmacro Language Polish pl + !insertmacro Language Portuguese pt + !insertmacro Language PortugueseBrazil pt_BR + !insertmacro Language Romanian ro + !insertmacro Language Russian ru + !insertmacro Language Kinyarwanda rw + !insertmacro Language Slovak sk + !insertmacro Language Slovenian sl + !insertmacro Language Albanian sq + !insertmacro Language Serbian sr + !insertmacro Language SerbianLatin sr@latin + !insertmacro Language Swedish sv + !insertmacro Language Thai th + !insertmacro Language Turkish tr + !insertmacro Language Ukrainian uk + !insertmacro Language Vietnamese vi + !insertmacro Language ChineseSimplified zh_CN + !insertmacro Language ChineseTaiwan zh_TW SectionGroupEnd Section -FinalizeInstallation - DetailPrint "finalize installation" - StrCmp $MultiUser "1" "" SingleUser + DetailPrint "finalize installation" + ${If} $MultiUser = 1 DetailPrint "admin mode, registry root will be HKLM" SetShellVarContext all - Goto endSingleUser - SingleUser: + ${Else} DetailPrint "single user mode, registry root will be HKCU" SetShellVarContext current - endSingleUser: + ${EndIf} ; check for writing registry ClearErrors - WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\inkscape.exe" - ;IfErrors 0 +4 + WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\inkscape.exe" + ;${If} ${Errors} ; DetailPrint "fatal: failed to write to ${PRODUCT_DIR_REGKEY}" ; DetailPrint "aborting installation" - ; Abort - WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "MultiUser" "$MultiUser" - WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "askMultiUser" "$askMultiUser" - WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "User" "$User" - IfErrors 0 +2 - DetailPrint "fatal: failed to write to registry installation info" + ; Abort + ;${EndIf} + WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "MultiUser" $MultiUser + WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "askMultiUser" $askMultiUser + WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "User" $User + ${IfThen} ${Errors} ${|} DetailPrint "Fatal: failed to write to registry installation info" ${|} ; start menu entries ClearErrors CreateShortCut "$SMPROGRAMS\Inkscape.lnk" "$INSTDIR\inkscape.exe" - IfErrors 0 +2 - DetailPrint "fatal: failed to write to start menu info" + ${IfThen} ${Errors} ${|} DetailPrint "Fatal: failed to write to start menu info" ${|} ; uninstall settings ClearErrors @@ -1004,43 +503,38 @@ Section -FinalizeInstallation WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegDWORD SHCTX "${PRODUCT_UNINST_KEY}" "NoModify" "1" WriteRegDWORD SHCTX "${PRODUCT_UNINST_KEY}" "NoRepair" "1" - IfErrors 0 +2 - DetailPrint "fatal: failed to write to registry un-installation info" + ${IfThen} ${Errors} ${|} DetailPrint "fatal: failed to write to registry un-installation info" ${|} ;create/update log always within .onInstSuccess function !insertmacro UNINSTALL.LOG_UPDATE_INSTALL - - DetailPrint "create MD5 sums" - ClearErrors - FileOpen $0 $INSTDIR\uninstall.dat r - FileOpen $9 $INSTDIR\uninstall.log w - IfErrors doneinstall -readnextlineinstall: - ClearErrors - FileRead $0 $1 - IfErrors doneinstall - StrCpy $1 $1 -2 - ;DetailPrint $1 - md5dll::GetMD5File /NOUNLOAD $1 - Pop $2 - ;DetailPrint $2 - StrCmp $2 "" +2 - FileWrite $9 "$2 $1$\r$\n" - Goto readnextlineinstall -doneinstall: - FileClose $0 - FileClose $9 - ; this file is not needed anymore - Delete $INSTDIR\uninstall.dat - + + DetailPrint "Creating MD5 checksums..." + ClearErrors + FileOpen $0 $INSTDIR\Uninstall.dat r + FileOpen $9 $INSTDIR\Uninstall.log w + ${IfNot} ${Errors} + ${Do} + ClearErrors + FileRead $0 $1 + ${IfThen} ${Errors} ${|} ${ExitDo} ${|} + StrCpy $1 $1 -2 + md5dll::GetMD5File /NOUNLOAD $1 + Pop $2 + ${IfThen} $2 != "" ${|} FileWrite $9 "$2 $1$\r$\n" ${|} + ${Loop} + ${EndIf} + FileClose $0 + FileClose $9 + ; Not needed any more + Delete $INSTDIR\Uninstall.dat SectionEnd - + ; Last the Descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} $(lng_CoreDesc) !insertmacro MUI_DESCRIPTION_TEXT ${SecGTK} $(lng_GTKFilesDesc) !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} $(lng_ShortcutsDesc) - !insertmacro MUI_DESCRIPTION_TEXT ${SecAlluser} $(lng_AlluserDesc) + !insertmacro MUI_DESCRIPTION_TEXT ${SecAlluser} $(lng_AlluserDesc) !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(lng_DesktopDesc) !insertmacro MUI_DESCRIPTION_TEXT ${SecQuicklaunch} $(lng_QuicklaunchDesc) !insertmacro MUI_DESCRIPTION_TEXT ${SecSVGWriter} $(lng_SVGWriterDesc) @@ -1053,22 +547,22 @@ SectionEnd !insertmacro MUI_FUNCTION_DESCRIPTION_END !macro Parameter key Section - Push ${key} - Push "" - Call GetParameterValue - Pop $1 - StrCmp $1 "OFF" 0 +5 + ${GetOptions} $CMDARGS "/${key}=" $1 + ${If} $1 == "OFF" SectionGetFlags ${Section} $0 IntOp $2 ${SF_SELECTED} ~ IntOp $0 $0 & $2 SectionSetFlags ${Section} $0 - StrCmp $1 "ON" 0 +4 + ${EndIf} + ${If} $1 == "ON" SectionGetFlags ${Section} $0 IntOp $0 $0 | ${SF_SELECTED} SectionSetFlags ${Section} $0 + ${EndIf} !macroend Function .onInit + ${GetParameters} $CMDARGS ;prepare log always within .onInit function !insertmacro UNINSTALL.LOG_PREPARE_INSTALL @@ -1076,70 +570,63 @@ Function .onInit StrCpy $AskMultiUser "1" StrCpy $MultiUser "0" ; this resets AskMultiUser if Win95/98/ME - Call GetWindowsVersion - Pop $R0 - DetailPrint "detected operating system $R0" - ;MessageBox MB_OK "operating system: $R0; AskMultiuser: $AskMultiUser" - - ; hide all user section if win98 - StrCmp $AskMultiUser "1" +2 - SectionSetText ${SecAlluser} "" + ClearErrors + ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + ${If} ${Errors} + ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber + StrCpy $R0 $R0 1 + ${IfThen} $R0 = 4 ${|} StrCpy $AskMultiUser 0 ${|} + ${EndIf} + + ; hide all user section if ME/9x + ${IfThen} $AskMultiUser != 1 ${|} SectionSetText ${SecAlluser} "" ${|} ; hide if quick launch if not available - StrCmp $QUICKLAUNCH $TEMP 0 +2 - SectionSetText ${SecQuicklaunch} "" + ${IfThen} $QUICKLAUNCH == $TEMP ${|} SectionSetText ${SecQuicklaunch} "" ${|} ;check if user is admin ClearErrors - UserInfo::GetName - IfErrors info_Win9x - Pop $0 - StrCpy $User $0 - UserInfo::GetAccountType - Pop $1 - StrCmp $1 "Admin" info_done - - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_NO_ADMIN)$(lng_OK_CANCEL_DESC)" /SD IDOK IDOK info_done IDCANCEL +1 - Quit - - Goto info_done - - info_Win9x: - # This one means you don't need to care about admin or - # not admin because Windows 9x doesn't either - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_NOT_SUPPORTED)$(lng_OK_CANCEL_DESC)" /SD IDOK IDOK info_done IDCANCEL +1 - Quit - - info_done: + UserInfo::GetName + ${If} ${Errors} + # This one means you don't need to care about admin or + # not admin because Windows 9x doesn't either + ${IfCmd} MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_NOT_SUPPORTED)$(lng_OK_CANCEL_DESC)" /SD IDOK IDCANCEL ${||} Quit ${|} + ${Else} + Pop $User + UserInfo::GetAccountType + Pop $1 + ${If} $1 != "Admin" + ${AndIf} ${Cmd} ${|} MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_NO_ADMIN)$(lng_OK_CANCEL_DESC)" /SD IDOK IDCANCEL ${|} + Quit + ${EndIf} + ${EndIf} ;check for previous installation ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" "User" - StrCmp $0 "" +1 +2 - ReadRegStr $0 HKCU "${PRODUCT_DIR_REGKEY}" "User" + ${IfThen} $0 == "" ${|} ReadRegStr $0 HKCU "${PRODUCT_DIR_REGKEY}" "User" ${|} ;check user if applicable - StrCmp $0 "" diff_user_install_done - StrCmp $0 $User diff_user_install_done - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_DIFFERENT_USER)$(lng_OK_CANCEL_DESC)" /SD IDOK IDOK diff_user_install_done IDCANCEL +1 - Quit - diff_user_install_done: - + ${If} $0 != "" + ${AndIf} $0 != $User + ${AndIf} ${Cmd} ${|} MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_DIFFERENT_USER)$(lng_OK_CANCEL_DESC)" /SD IDOK IDCANCEL ${|} + Quit + ${EndIf} + ; call uninstall first ; code taken from the vlc project ReadRegStr $R0 HKLM ${PRODUCT_UNINST_KEY} "UninstallString" - ReadRegStr $R1 HKLM ${PRODUCT_UNINST_KEY} "DisplayName" - StrCmp $R0 "" +1 +3 - ReadRegStr $R0 HKCU ${PRODUCT_UNINST_KEY} "UninstallString" - ReadRegStr $R1 HKCU ${PRODUCT_UNINST_KEY} "DisplayName" - StrCmp $R0 "" uninstall_before_done - - MessageBox MB_YESNO|MB_ICONEXCLAMATION $(lng_WANT_UNINSTALL_BEFORE) /SD IDNO IDNO uninstall_before_done - ;Run the uninstaller - ;uninst: - DetailPrint "execute $R0 in $INSTDIR" - ClearErrors - ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file - uninstall_before_done: - + ReadRegStr $R1 HKLM ${PRODUCT_UNINST_KEY} "DisplayName" + ${If} $R0 == "" + ReadRegStr $R0 HKCU ${PRODUCT_UNINST_KEY} "UninstallString" + ReadRegStr $R1 HKCU ${PRODUCT_UNINST_KEY} "DisplayName" + ${EndIf} + ${If} $R0 != "" + ${AndIf} ${Cmd} ${|} MessageBox MB_YESNO|MB_ICONEXCLAMATION $(lng_WANT_UNINSTALL_BEFORE) /SD IDNO IDYES ${|} + ;Run the uninstaller + DetailPrint "Execute $R0 in $INSTDIR" + ClearErrors + ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file + ${EndIf} + ; proccess command line parameter !insertmacro Parameter "GTK" ${SecGTK} !insertmacro Parameter "SHORTCUTS" ${secShortcuts} @@ -1214,18 +701,16 @@ Function .onInit !insertmacro Parameter "vi" ${SecVietnamese} !insertmacro Parameter "zh_CN" ${SecChineseSimplified} !insertmacro Parameter "zh_TW" ${SecChineseTaiwan} - - Push "?" - Push "TEST" - Call GetParameterValue - Pop $1 - StrCmp $1 "TEST" +3 - MessageBox MB_OK "possible parameters for installer:$\r$\n \ + + ClearErrors + ${GetOptions} $CMDARGS "/?" $1 + ${IfNot} ${Errors} + MessageBox MB_OK "Possible parameters for installer:$\r$\n \ /?: this help screen$\r$\n \ /S: silent$\r$\n \ - /D=(directory): where to install inkscape$\r$\n \ + /D=(directory): where to install Inkscape$\r$\n \ /GTK=(OFF/ON): GTK+ Runtime environment$\r$\n \ - /SHORTCUTS=(OFF/ON): shortcuts to start inkscape$\r$\n \ + /SHORTCUTS=(OFF/ON): shortcuts to start Inkscape$\r$\n \ /ALLUSER=(OFF/ON): for all users on the computer$\r$\n \ /DESKTOP=(OFF/ON): Desktop icon$\r$\n \ /QUICKLAUNCH=(OFF/ON): quick launch icon$\r$\n \ @@ -1238,14 +723,7 @@ Function .onInit /LANGUAGES=(OFF/ON): translated menues, examples, etc.$\r$\n \ /[locale code]=(OFF/ON): e.g am, es, es_MX as in Inkscape supported" Abort -FunctionEnd - -Function .onSelChange -FunctionEnd - - -Function .onInstSuccess - + ${EndIf} FunctionEnd ; -------------------------------------------------- @@ -1257,214 +735,101 @@ Function un.CustomPageUninstall !insertmacro MUI_INSTALLOPTIONS_DISPLAY "inkscape.nsi.uninstall" !insertmacro MUI_INSTALLOPTIONS_READ $MultiUser "inkscape.nsi.uninstall" "Field 2" "State" - DetailPrint "keepfiles = $MultiUser" - ;MessageBox MB_OK "adminmode = $MultiUser MultiUserOS = $askMultiUser" + DetailPrint "keepfiles = $MultiUser" + ;MessageBox MB_OK "adminmode = $MultiUser MultiUserOS = $askMultiUser" FunctionEnd - Function un.onInit ;begin uninstall, could be added on top of uninstall section instead ;!insertmacro UNINSTALL.LOG_BEGIN_UNINSTALL - IfFileExists $INSTDIR\uninstall.log uninstalllogpresent - MessageBox MB_OK|MB_ICONEXCLAMATION "$(lng_UninstallLogNotFound)" /SD IDOK - Quit -uninstalllogpresent: + ${IfNot} ${FileExists} $INSTDIR\uninstall.log + MessageBox MB_OK|MB_ICONEXCLAMATION "$(lng_UninstallLogNotFound)" /SD IDOK + Quit + ${EndIf} ClearErrors StrCpy $User "" - UserInfo::GetName - IfErrors +3 - Pop $0 - StrCpy $User $0 - - StrCpy $askMultiUser "1" - StrCpy $MultiUser "1" - + UserInfo::GetName + ${IfNot} ${Errors} + Pop $0 + StrCpy $User $0 + ${EndIf} + StrCpy $askMultiUser 1 + StrCpy $MultiUser 1 + ; Test if this was a multiuser installation ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" "" - StrCmp $0 "$INSTDIR\inkscape.exe" 0 hkcu_user_uninstall + ${If} $0 == "$INSTDIR\inkscape.exe" ReadRegStr $MultiUser HKLM "${PRODUCT_DIR_REGKEY}" "MultiUser" ReadRegStr $askMultiUser HKLM "${PRODUCT_DIR_REGKEY}" "askMultiUser" - ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" "User" - Goto check_user_uninstall - hkcu_user_uninstall: - ReadRegStr $MultiUser HKCU "${PRODUCT_DIR_REGKEY}" "MultiUser" - ReadRegStr $askMultiUser HKCU "${PRODUCT_DIR_REGKEY}" "askMultiUser" - ReadRegStr $0 HKCU "${PRODUCT_DIR_REGKEY}" "User" + ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" "User" + ${Else} + ReadRegStr $MultiUser HKCU "${PRODUCT_DIR_REGKEY}" "MultiUser" + ReadRegStr $askMultiUser HKCU "${PRODUCT_DIR_REGKEY}" "askMultiUser" + ReadRegStr $0 HKCU "${PRODUCT_DIR_REGKEY}" "User" + ${EndIf} ;check user if applicable - check_user_uninstall: - StrCmp $0 "" diff_user_uninstall_done - StrCmp $0 $User diff_user_uninstall_done - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_DIFFERENT_USER)$(lng_OK_CANCEL_DESC)" /SD IDOK IDOK diff_user_uninstall_done IDCANCEL +1 - Quit - diff_user_uninstall_done: - - !insertmacro MUI_INSTALLOPTIONS_EXTRACT "inkscape.nsi.uninstall" - - ;check whether Multi user installation ? - SetShellVarContext all - StrCmp $MultiUser "0" 0 +2 - SetShellVarContext current - ;MessageBox MB_OK "adminmode = $MultiUser MultiUserOS = $askMultiUser" - -FunctionEnd + ${If} $0 != "" + ${AndIf} $0 != $User + ${AndIf} ${Cmd} ${|} MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(lng_DIFFERENT_USER)$(lng_OK_CANCEL_DESC)" /SD IDOK IDCANCEL ${|} + Quit + ${EndIf} -# removes a file and if the directory is empty afterwards the directory also -# push md5, push filename, call unremovefilename -Function un.RemoveFile - Var /Global filename - Var /Global md5sum - Var /Global ismd5sum - Var /Global removenever ; never remove a touched file - Var /Global removealways ; always remove files touched by user - Pop $filename - Pop $md5sum - - IfFileExists $filename +2 0 - Return - StrCmp $removealways "always" unremovefile 0 - md5dll::GetMD5File /NOUNLOAD $filename - Pop $ismd5sum ;md5 of file - StrCmp $md5sum $ismd5sum unremovefile 0 - ;DetailPrint "uups MD5 does not match" - StrCmp $removenever "never" 0 +2 - Return - ; the md5 sums does not match so we ask - messagebox::show MB_DEFBUTTON3|MB_TOPMOST "" "0,103" \ - "$(lng_FileChanged)" "$(lng_Yes)" "$(lng_AlwaysYes)" "$(lng_No)" "$(lng_AlwaysNo)" - ;DetailPrint "messagebox finished" - Pop $md5sum - ;DetailPrint "messagebox call returned... $md5sum" - StrCmp $md5sum "1" unremovefile 0 ; Yes - StrCmp $md5sum "2" 0 unremoveno ; Yes always - StrCpy $removealways "always" - ;DetailPrint "removealways" - Goto unremovefile -unremoveno: - StrCmp $md5sum "3" 0 unremovenever ; No - ;DetailPrint "No remove" - Return -unremovenever: - StrCpy $removenever "never" - ;DetailPrint "removenever" - Return -unremovefile: - ;DetailPrint "removefile" - ClearErrors - Delete $filename - ;now recursivly remove the path -unrmdir: - ${un.GetParent} $filename $filename - IfErrors 0 +2 - Return - RMDir $filename - IfErrors +2 - Goto unrmdir + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "inkscape.nsi.uninstall" + + SetShellVarContext all + ${IfThen} $MultiUser = 0 ${|} SetShellVarContext current ${|} FunctionEnd Section Uninstall - ; remove personal settings Delete "$APPDATA\Inkscape\extension-errors.log" - StrCmp $MultiUser "0" 0 endPurge ; multiuser assigned in dialog + ${If} $MultiUser = 0 DetailPrint "purge personal settings in $APPDATA\Inkscape" ;RMDir /r "$APPDATA\Inkscape" - !insertmacro delprefs - endPurge: + !insertmacro delprefs + ${EndIf} ; Remove file associations for svg editor - DetailPrint "removing file associations for svg editor" - ClearErrors - ReadRegStr $0 HKCR ".svg" "" - DetailPrint ".svg associated as $0" - IfErrors endUninstSVGEdit - ReadRegStr $1 HKCR "$0\shell\edit\command" "" - IfErrors 0 +2 - DetailPrint "svg editor is $1" - StrCmp $1 '"$INSTDIR\Inkscape.exe" "%1"' 0 +3 - DetailPrint "removing default .svg editor" - DeleteRegKey HKCR "$0\shell\edit\command" - DeleteRegKey /ifempty HKCR "$0\shell\edit" - DeleteRegKey /ifempty HKCR "$0\shell" - DeleteRegKey /ifempty HKCR "$0" - endUninstSVGEdit: - - ClearErrors - ReadRegStr $2 HKCR ".svgz" "" - DetailPrint ".svgz associated as $2" - IfErrors endUninstSVGZEdit - ReadRegStr $3 HKCR "$2\shell\edit\command" "" - IfErrors 0 +2 - DetailPrint "svgz editor is $1" - StrCmp $3 '"$INSTDIR\Inkscape.exe" "%1"' 0 +3 - DetailPrint "removing default .svgz editor" - DeleteRegKey HKCR "$2\shell\edit\command" - DeleteRegKey /ifempty HKCR "$2\shell\edit" - DeleteRegKey /ifempty HKCR "$2\shell" - DeleteRegKey /ifempty HKCR "$2" - endUninstSVGZEdit: - - ; Remove file associations for svg editor - DetailPrint "removing file associations for svg editor" - ClearErrors - ReadRegStr $0 HKCR ".svg" "" - IfErrors endUninstSVGView - ReadRegStr $1 HKCR "$0\shell\open\command" "" - IfErrors 0 +2 - DetailPrint "svg viewer is $1" - StrCmp $1 '"$INSTDIR\Inkscape.exe" "%1"' 0 +3 - DetailPrint "removing default .svg viewer" - DeleteRegKey HKCR "$0\shell\open\command" - DeleteRegKey /ifempty HKCR "$0\shell\open" - DeleteRegKey /ifempty HKCR "$0\shell" - DeleteRegKey /ifempty HKCR "$0" - endUninstSVGView: - - ClearErrors - ReadRegStr $2 HKCR ".svgz" "" - IfErrors endUninstSVGZView - ReadRegStr $3 HKCR "$2\shell\open\command" "" - IfErrors 0 +2 - DetailPrint "svgz viewer is $1" - StrCmp $3 '"$INSTDIR\Inkscape.exe" "%1"' 0 +3 - DetailPrint "removing default .svgz viewer" - DeleteRegKey HKCR "$2\shell\open\command" - DeleteRegKey /ifempty HKCR "$2\shell\open" - DeleteRegKey /ifempty HKCR "$2\shell" - DeleteRegKey /ifempty HKCR "$2" - endUninstSVGZView: - - ; Remove file associations for context menue - DetailPrint "removing file associations for svg editor" - ClearErrors - ReadRegStr $0 HKCR ".svg" "" - IfErrors endUninstSVGContext - DetailPrint "removing default .svg context menue" - DeleteRegKey HKCR "$0\shell\${PRODUCT_NAME}" - DeleteRegKey /ifempty HKCR "$0\shell" - DeleteRegKey /ifempty HKCR "$0" - endUninstSVGContext: - - ClearErrors - ReadRegStr $2 HKCR ".svgz" "" - IfErrors endUninstSVGZContext - DetailPrint "removing default .svgzcontext menue" - DeleteRegKey HKCR "$2\shell\${PRODUCT_NAME}" - DeleteRegKey /ifempty HKCR "$2\shell" - DeleteRegKey /ifempty HKCR "$2" - endUninstSVGZContext: - - ReadRegStr $1 HKCR "$0" "" - StrCmp $1 "" 0 +3 - DetailPrint "removing filetype .svg $0" - DeleteRegKey HKCR ".svg" - - ReadRegStr $3 HKCR "$2" "" - StrCmp $3 "" 0 +3 - DetailPrint "removing filetype .svgz $2" - DeleteRegKey HKCR ".svgz" - - + StrCpy $3 "svg" + ${For} $2 0 1 + ${IfThen} $2 = 1 ${|} StrCpy $3 $3z ${|} + DetailPrint "removing file associations for $3 editor" + ClearErrors + ReadRegStr $0 HKCR ".$3" "" + DetailPrint ".$3 associated as $0" + ${IfNot} ${Errors} + ReadRegStr $1 HKCR "$0\shell\edit\command" "" + ${IfNotThen} ${Errors} ${|} DetailPrint "$3 editor is $1" ${|} + ${If} $1 == '"$INSTDIR\Inkscape.exe" "%1"' + DetailPrint "removing default .$3 editor" + DeleteRegKey HKCR "$0\shell\edit\command" + ${EndIf} + + ClearErrors + ReadRegStr $1 HKCR "$0\shell\open\command" "" + ${IfNotThen} ${Errors} ${|} DetailPrint "$3 viewer is $1" ${|} + ${If} $1 == '"$INSTDIR\Inkscape.exe" "%1"' + DetailPrint "removing default .$3 viewer" + DeleteRegKey HKCR "$0\shell\open\command" + ${EndIf} + + DetailPrint "removing default .$3 context menu" + DeleteRegKey HKCR "$0\shell\${PRODUCT_NAME}" + DeleteRegKey /ifempty HKCR "$0\shell\edit" + DeleteRegKey /ifempty HKCR "$0\shell\open" + DeleteRegKey /ifempty HKCR "$0\shell" + DeleteRegKey /ifempty HKCR "$0" + + ClearErrors + ReadRegStr $1 HKCR $0 "" + ${If} ${Errors} ; Formerly ${If} $1 == "" + DetailPrint "removing filetype .$3 $0" + DeleteRegKey HKCR ".$3" + ${EndIf} + ${EndIf} + ${Next} + SetShellVarContext all DetailPrint "removing product regkey" DeleteRegKey SHCTX "${PRODUCT_DIR_REGKEY}" @@ -1495,65 +860,75 @@ Section Uninstall DetailPrint "removing uninstall info" - ;uninstall from path, must be repeated for every install logged path individual - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\lib\locale" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\locale" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\doc" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\tutorials" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\templates" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\screens" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\clipart" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\extensions" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share\icons" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\share" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\modules" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\python" - ;!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR" - - ;end uninstall, after uninstall from all logged paths has been performed - ;!insertmacro UNINSTALL.LOG_END_UNINSTALL - - ;RMDir /r "$INSTDIR" - - StrCpy $removenever "" - StrCpy $removealways "" - - InitPluginsDir - SetPluginUnload manual - - ClearErrors - FileOpen $0 $INSTDIR\uninstall.log r - IfErrors uninstallnotfound -readnextline: - ClearErrors - FileRead $0 $1 - IfErrors done - ; cat the line into md5 and filename - StrLen $2 $1 - IntCmp $2 35 readnextline readnextline - StrCpy $3 $1 32 - StrCpy $4 $1 $2-36 34 #remove trailing CR/LF - StrCpy $4 $4 -2 - Push $3 - Push $4 - Call un.RemoveFile - Goto readnextline -uninstallnotfound: - MessageBox MB_OK|MB_ICONEXCLAMATION "$(lng_UninstallLogNotFound)" /SD IDOK -done: - FileClose $0 - - Delete "$INSTDIR\uninstall.log" - Delete "$INSTDIR\uninstall.exe" - ; remove empty directories - RMDir "$INSTDIR\data" - RMDir "$INSTDIR\doc" - RMDir "$INSTDIR\modules" - RMDir "$INSTDIR\plugins" - - RMDir $INSTDIR + InitPluginsDir + SetPluginUnload manual + ClearErrors + FileOpen $0 $INSTDIR\uninstall.log r + ${If} ${Errors} ;else uninstallnotfound + MessageBox MB_OK|MB_ICONEXCLAMATION "$(lng_UninstallLogNotFound)" /SD IDOK + ${Else} + ${Do} + ClearErrors + FileRead $0 $1 + ${IfThen} ${Errors} ${|} ${ExitDo} ${|} + ; cat the line into md5 and filename + StrLen $2 $1 + ${IfThen} $2 <= 35 ${|} ${Continue} ${|} + StrCpy $3 $1 32 + StrCpy $filename $1 $2-36 34 #remove trailing CR/LF + StrCpy $filename $filename -2 + ; $3 = MD5 when installed, then deletion choice + ; $filename = file + ; $5 = MD5 now + ; $6 = "always"/"never" remove files touched by user + + ${If} ${FileExists} $filename + ${If} $6 == "always" + StrCpy $3 2 + ${Else} + md5dll::GetMD5File /NOUNLOAD $filename + Pop $5 ;md5 of file + ${If} $3 != $5 + ${AndIf} $6 != "never" + ; the md5 sums does not match so we ask + messagebox::show MB_DEFBUTTON3|MB_TOPMOST "" "0,103" \ + "$(lng_FileChanged)" "$(lng_Yes)" "$(lng_AlwaysYes)" "$(lng_No)" "$(lng_AlwaysNo)" + Pop $3 + ${IfThen} $3 = 2 ${|} StrCpy $6 "always" ${|} + ${IfThen} $3 = 4 ${|} StrCpy $6 "never" ${|} + ${EndIf} + ${EndIf} + + ${If} $3 = 1 ; yes + ${OrIf} $3 = 2 ; always + ; Remove File + ClearErrors + Delete $filename + ;now recursivly remove the path + ${Do} + ClearErrors + ${un.GetParent} $filename $filename + ${IfThen} ${Errors} ${|} ${ExitDo} ${|} + RMDir $filename + ${IfThen} ${Errors} ${|} ${ExitDo} ${|} + ${Loop} + ${EndIf} + ${EndIf} ; complaining there's no opening if + ${Loop} + ${EndIf} + FileClose $0 + Delete "$INSTDIR\uninstall.log" + Delete "$INSTDIR\uninstall.exe" + ; remove empty directories + RMDir "$INSTDIR\data" + RMDir "$INSTDIR\doc" + RMDir "$INSTDIR\modules" + RMDir "$INSTDIR\plugins" + RMDir $INSTDIR SetAutoClose false - SectionEnd - +!else +Section "This is a dummy section, which doesn't do anything" null +SectionEnd +!endif diff --git a/packaging/win32/welcomefinish.bmp b/packaging/win32/welcomefinish.bmp new file mode 100644 index 0000000000000000000000000000000000000000..65a8c44f8cc3e1300a2e67ed693e9aad5b6dbe22 GIT binary patch literal 154542 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%0Aw7@zP}qNw^dGdBY@@YJ99=w+E-etCM)Z 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ŠvKGS<$T?CAZ*`&AHKhgtiPV~wXAozNu31fB4Sln^n)1=X z+Q*nAScms}bk7PxLu2GvL*!~N`^xR>7M$3(5w9?1@`Mnpqa)8BGH!@}8*%})**n>8ieCLVKGh~*z+{iZBXfM@$vZ8;(~>nsjhKu6NEf-)iR_0B(nbxfqmX6^qj);O=5Llo7eS>P3LJLn3Ju;0u|`vA=hl3)=o#G;H#=gA%1 z5o{;lk!Utd&P6w8CLYhv!Sp#;M|qjgpGVtX@C-9P7KWto0E1mE`GF(HntWcjSEl>9 z+hO<%VfHlxjbV1X5Lh2Odib7=h2#Uk8{9LYWE9@^Ht_;20k#L>Z3s4lGe@Exgpmq&CQUMN9^tgE~ z!%$f7W@B==CO^!14ZB7h&b?#PZ9|3blAy&4Nr!@gn(Rn=707l?#+t~v)D%zQMW#-f z(%q0h6qnL3HoG8yhKzN3$_sDLM_<*4`x$esSV)>!WLi#J>LyCoysGk&fXtn@G4D|M zHIZ`-jKgE>q?XK|sU@?sCHxaTNKuYw@pJjuRu7EBrS@)T-@0NbtV5mEFpCFfpeV$2 zU>u&{ZGxBevR3;f)|D#abC-v zl+jRE`KnkinoCNK0C%4Ae##!C5HnInc3F1Y-^CidS)tcih6S_saWaC>jYZYdfe)+Fh|KAqv3$`V>y8q;f6Mvir{J$s79 z4*EGHjZN;2bJDFjDqMCCEom1**&rjQr)vNd5?~Za<9U}Xl6`Fy??yYPoB`ItPZ$vLvatj4u5WRZdcSj z*~T!EuW{rKC zT{Y?9eh)O1PEVOUdCqJaU-x^1p4UAs<&{Ngg!b&AgCcDW*o?T2h+UhTfCIoIKemgaB%P3FrRcY zk?w0}cMQZ@MRFVaM*6;c5&OnP?3+k;mA?YuX5X}!ebW-sy_vWff-I#6#Tq)p-sZ=7 zwy#`DKYQ(p`OuV>6=luy(=k@ucj=74FjzxB9DI0Q&@}}qUaswHwlOVVyK)id_O%bp z&X+`3Zd|jpEZSxySR)SKwvo|T<0PdX=}@ z_7+lm3rAA>7zHgms$CDGjYG9-a(+$T_d)Fsr_SX5M>I70)if#hef-@z*H_gUruuNI z52w_!BiFeoxs-mI(gSm@|C(OPx2R=Doduxe&B#4SBgwC+ITtnOqUKy9tY4FR6{z#q z|Db-|Z{Np2j+Cm6L)0{>`874a9*PgAp4Zg#ntEPS&+CExW>hYvU#~)E(v6YqIv;e$ zB2^ow-#iyJHlxO7RNibP{bp1?oILkIYC{TF8A%^0Ro{% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.30.2