/* NSIS Modern User Interface Support code for all pages */ ;-------------------------------- ;Page initialization !macro MUI_PAGE_INIT !ifdef MUI_INSERT !warning "MUI_PAGE_* inserted after MUI_LANGUAGE" !endif ;Include interface settings if necessary !insertmacro MUI_INTERFACE ;Define settings for installer page !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "" ;Generate unique ID !insertmacro MUI_UNSET MUI_UNIQUEID !define MUI_UNIQUEID ${__LINE__} !macroend !macro MUI_UNPAGE_INIT !ifdef MUI_INSERT !warning "MUI_UNPAGE_* inserted after MUI_LANGUAGE" !endif ;Include interface settings !insertmacro MUI_INTERFACE ;Define prefixes for uninstaller page !insertmacro MUI_SET MUI_UNINSTALLER "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER "" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "UN" !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "un." ;Generate unique ID !insertmacro MUI_UNSET MUI_UNIQUEID !define MUI_UNIQUEID ${__LINE__} !macroend ;-------------------------------- ;Header text for standard MUI page !macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else ifdef MUI_PAGE_HEADER_TEXT !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}" !else ifdef MUI_PAGE_HEADER_SUBTEXT !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" !else !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}" !endif !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT !macroend ;-------------------------------- ;Header text for custom page !macro MUI_HEADER_TEXT TEXT SUBTEXT ;Called from script !verbose push !verbose ${MUI_VERBOSE} !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow on !endif SendMessage $mui.Header.Text ${WM_SETTEXT} 0 "STR:${TEXT}" SendMessage $mui.Header.SubText ${WM_SETTEXT} 0 "STR:${SUBTEXT}" !ifdef MUI_HEADER_TRANSPARENT_TEXT LockWindow off !endif !verbose pop !macroend ;-------------------------------- ;Custom page functions !macro MUI_PAGE_FUNCTION_CUSTOM TYPE !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE} Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}" !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE} !endif !macroend ;-------------------------------- ;Support for full window pages (like welcome/finish page) !macro MUI_PAGE_FUNCTION_FULLWINDOW !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow LockWindow on ;The branding text needs to be hidden because the full windows page ;overlaps with it. ShowWindow $mui.Branding.Background ${SW_HIDE} ShowWindow $mui.Branding.Text ${SW_HIDE} ;The texts need to be hidden because otherwise they may show through ;the page above when the Alt key is pressed. ShowWindow $mui.Header.Text ${SW_HIDE} ShowWindow $mui.Header.SubText ${SW_HIDE} ShowWindow $mui.Header.Image ${SW_HIDE} ;Show line below full width of page ShowWindow $mui.Line.Standard ${SW_HIDE} ShowWindow $mui.Line.FullWindow ${SW_NORMAL} LockWindow off FunctionEnd Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow ;Set everything back to normal again LockWindow on ShowWindow $mui.Branding.Background ${SW_NORMAL} ShowWindow $mui.Branding.Text ${SW_NORMAL} ShowWindow $mui.Header.Text ${SW_NORMAL} ShowWindow $mui.Header.SubText ${SW_NORMAL} ShowWindow $mui.Header.Image ${SW_NORMAL} ShowWindow $mui.Line.Standard ${SW_NORMAL} ShowWindow $mui.Line.FullWindow ${SW_HIDE} LockWindow off FunctionEnd !endif !macroend !macro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE _un _hwndImg _ImgPath _RetImgHandle !ifdef MUI_${_un}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH NoStretchNoCropNoAlign ; Legacy compatibility !endif !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH FitControl !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCropNoAlign" ${NSD_SetImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCrop" !insertmacro MUI_LOADANDXALIGNIMAGE ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "AspectFitHeight" !insertmacro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" !else !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" != "FitControl" !warning 'MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH set to unknown value, defaulting to FitControl' !endif ${NSD_SetStretchedImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" !endif !macroend ;-------------------------------- ;Helper macros !include Util.nsh !macro MUI_INTERNAL_LOADANDSIZEIMAGE _macro _hwndImg _ImgPath _XAlign _RetImgHandle !if "${_XAlign}" == "Auto" ${if} $(^RTL) == 1 Push "*${_ImgPath}" ${Else} Push "${_ImgPath}" ${EndIf} !else if "${_XAlign}" == "Right" Push "*${_ImgPath}" !else Push "${_ImgPath}" !endif Push "${_hwndImg}" ${CallArtificialFunction} ${_macro} !if "${_RetImgHandle}" == "Leak" !insertmacro _LOGICLIB_TEMP Pop $_LOGICLIB_TEMP !else if "${_RetImgHandle}" != "Stack" Pop ${_RetImgHandle} !endif !macroend !macro MUI_LOADANDXALIGNIMAGE _hwndImg _ImgPath _XAlign _RetImgHandle !insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ MUI_INTERNAL_LOADANDXALIGNIMAGE "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" !macroend !macro MUI_INTERNAL_LOADANDXALIGNIMAGE System::Store "S" System::Call 'USER32::GetWindowRect(psr0,@r1)' System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' IntOp $7 $7 - $5 IntOp $8 $8 - $6 Pop $1 StrCpy $3 $1 1 ${If} $3 == "*" ; Move control to the right? StrCpy $1 $1 "" 1 ${Endif} System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 Push $2 ; Return value System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap System::Call 'USER32::GetClientRect(pr0,@r1)' System::Call '*$1(i,i,i.r1,i.r2)' ${If} $3 == "*" ${AndIf} $1 < $7 ; ImgW < CtlW IntOp $3 $7 - $1 IntOp $5 $5 + $3 System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,i,i,i0x15)' ${EndIf} System::Store "L" !macroend !macro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT _hwndImg _ImgPath _XAlign _RetImgHandle !insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" !macroend !macro MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT System::Store "S" System::Call 'USER32::GetWindowRect(psr0,@r1)' System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' IntOp $7 $7 - $5 IntOp $8 $8 - $6 Pop $1 StrCpy $3 $1 1 ${If} $3 == "*" ; Move control to the right? StrCpy $1 $1 "" 1 ${Endif} System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 Push $2 ; Return value System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap System::Call 'USER32::GetClientRect(pr0,@r1)' System::Call '*$1(i,i,i.r1,i.r2)' IntOp $R7 $7 * 10000 IntOp $R8 $8 * 10000 IntOp $R1 $1 * 10000 IntOp $R2 $2 * 10000 IntOp $R3 $R1 / $2 StrCpy $R4 10000 ${If} $R1 > $R2 StrCpy $R3 10000 IntOp $R4 $R2 / $1 ${EndIf} ${DoWhile} $R2 > $R8 ; ImgH > CtlH IntOp $R1 $R1 - $R3 IntOp $R2 $R2 - $R4 ${Loop} ${DoWhile} $R2 < $R8 ; ImgH < CtlH IntOp $R1 $R1 + $R3 IntOp $R2 $R2 + $R4 ${Loop} IntOp $1 $R1 / 10000 IntOp $2 $R2 / 10000 ${If} $1 < $7 ${AndIf} $3 == "*" IntOp $R3 $7 - $1 IntOp $5 $5 + $R3 ${EndIf} ${DoWhile} $2 > $8 ; Non-aspect-maintained stretch to make it a pixel perfect match IntOp $2 $2 - 1 IntOp $1 $1 - 1 ${IfThen} $3 == "*" ${|} IntOp $5 $5 + 1 ${|} ${Loop} System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,ir1,ir2,i0x14)' System::Store "L" !macroend