From fcd2c166854aeccab74de74dd146d129455f8e5d Mon Sep 17 00:00:00 2001 From: kichik Date: Sun, 4 Jan 2004 17:05:03 +0000 Subject: [PATCH] - fixed limit on LangStrings and user variables number which was lower than designed. limit is now 16383 for both. - made log window respond to the context menu key and not just right click - set back the default style for the next after it's re-enabled - set focus on main controls for every page (can still hit enter for next) - added code to prevent weird usage of WM_COMMAND which can cause weird behavior such as disabled next button on the components page - eccles fixed a bug which caused beeping when the space key is hit on the components tree git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3351 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/NSISdl/nsisdl.cpp | 20 +-- Contrib/StartMenu/StartMenu.c | 5 +- Plugins/StartMenu.dll | Bin 6656 -> 6656 bytes Plugins/nsisdl.dll | Bin 13312 -> 13312 bytes Source/build.cpp | 31 +++-- Source/build.h | 1 + Source/exehead/Ui.c | 237 +++++++++++++++++++++------------- Source/exehead/config.h | 17 --- Source/exehead/fileform.h | 31 +++-- Source/exehead/state.h | 2 +- Source/exehead/ui.h | 2 +- Source/exehead/util.c | 72 +++++------ Source/exehead/util.h | 5 +- Source/lang.cpp | 29 ++++- Source/script.cpp | 2 +- 15 files changed, 266 insertions(+), 188 deletions(-) diff --git a/Contrib/NSISdl/nsisdl.cpp b/Contrib/NSISdl/nsisdl.cpp index f7ffb036..78468b98 100644 --- a/Contrib/NSISdl/nsisdl.cpp +++ b/Contrib/NSISdl/nsisdl.cpp @@ -112,6 +112,7 @@ static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LP while ( !TryEnterCS() ) Sleep(0); if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL) { + SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_SETSTATE, FALSE, 0); g_cancelled = 1; } else @@ -308,10 +309,7 @@ __declspec(dllexport) void download (HWND parent, // enable the cancel button wasen=EnableWindow(GetDlgItem(parent,IDCANCEL),TRUE); - SendMessage(parent, DM_SETDEFID, IDCANCEL, 0); - // remove the BS_DEFPUSHBUTTON style from IDOK - SendMessage(GetDlgItem(parent, IDOK), BM_SETSTYLE, BS_PUSHBUTTON, TRUE); - SetFocus(GetDlgItem(parent,IDCANCEL)); + SendMessage(parent, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(parent, IDCANCEL), TRUE); } { WSADATA wsaData; @@ -387,10 +385,16 @@ __declspec(dllexport) void download (HWND parent, if (hwndB) ShowWindow(hwndB,SW_SHOWNA); if (hwndL) ShowWindow(hwndL,SW_SHOWNA); - - SetWindowPos(childwnd,0,0,0,orig_childRc.right-orig_childRc.left,orig_childRc.bottom-orig_childRc.top,SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE); - - if (wasen) EnableWindow(GetDlgItem(parent,IDCANCEL),FALSE); + + SetWindowPos( + childwnd,0,0,0, + orig_childRc.right-orig_childRc.left, + orig_childRc.bottom-orig_childRc.top, + SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE + ); + + if (wasen) + EnableWindow(GetDlgItem(parent, IDCANCEL), FALSE); } if ( !error ) error = "cancel"; diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index 43ad48b1..5c5262d9 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -308,7 +308,10 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); ShowWindow(hwndDlg, SW_SHOWNA); - SetFocus(GetDlgItem(hwParent, IDOK)); + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) + SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwCheckBox, TRUE); + else + SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwLocation, TRUE); } break; case WM_COMMAND: diff --git a/Plugins/StartMenu.dll b/Plugins/StartMenu.dll index eefb99783daeb423432670b76e1ee61afa9f94f6..0ea07a91f7ef1b90f40eb46f1d446afece0b392b 100644 GIT binary patch delta 1194 zcmc(fZAep57{||i)xRh6H74d8WS}8EH`22MnqBUbWe%0^)|b%v2W^uvm?@M_~W~aU7O36 zLoCEMSSefYvvJLrq&|2((rlR=H40pE&~=TCCpOSG%&oQS2i1gl%4BO7YtZhbS6Huh ztF{Ebpew*8v)n;BKYOV`8{r8k)vgo+qnQ{m#r zeagA6M)pLvpVoKlXQ`LX>DSX*W;E=w)g#y@a2W}?k(p#se!#WIkE&)T4LP))bs5rV zJL@-Wg8kA^K&zO>n6XCbP$KcZtbVrBsN@_oI*`+16l$sw^%mmkJhD}pT1uI&!=aLD z`V=JiIDW816zl@%eozV~vCo8#K$X>sx@vG}x&Aw1DhDBJK@4^Q z^bn{7HQ*fZgKlsK^gGB!@({*zFbSr?4={q_LC_0sfJ@*U;1E+5x7>hY*TQc~hpzHj z&`>dawpG48N|W%Fuku~tn9982f4@Q2zr8{Dg}I4_4<|`@7d-C74_UDPs=tX9*)u*Q}|Gv{{v+@a%h`4YZ@Kfz0UBj3v3;_vZ&{3Cvd TkMSS)M5o=EUYxt6QiP_~F`bpo8;QlxdsLY#z9(F&p$C`5EdL`g^(Nlk(Tsc!$fw4!f)>Wm-%=k@HI=fY{uY|iY= zrNe%Q+$5F`kIKIplbhg&UbM?qQ2KdN-UICljYPCBJRH&DLkHYy5BY1k3J58pIx=`< zbjw0&g2dWPG@1|rk;I?THCCuu_5E|Qv0ox&2b>|kliD>-%Ke%QZ6bWXErAEAf#&ij zG?~uw8G4L92prO!rvq9C)mJ4Fvu|Y&cj~s8FT&0Ux?HYv1(PmC?By49w$)b$8?|KD-bRBgiDl=$thWUjvhW1T~9}Nf!=29*Ah}*qKMtR zUcZ@k@;?0{+iTj;`+hcxklLI_ajhR=+@CVnwg%%`-@=Y`qQV#UIa;8* zXJ03LnSEVWs*IN@Udf`2zrT$#UseZ_9)e%GlGR&4%u1-Fy+vxnL=>@^pE4v{Pomt2Pv{|$bBQf{vq`O~FxgRa(&XG*gRFZiMpv$g z>a9IXr}kk}k7lYIQdx=4L8%$0dlBZda1D=PKB|c71|B+}5R2g9EA>NoQp{D_5qKQK zs6WlnlqM0957aehBP2SB5DQoZrs3y73&CD60e=H@6soQ+^m#$meE(PE1Un(i!8-5` zej&69c)(F`26TgK;Fg^ciV zF^oTA686Bg$%;Q>#p*#3tN0a*BBYmpi%t07bJ+0ja|k?)J4}UAP02y8Tz{bPNFX!5 zj;1cW1aEOwirX&m0{$y7p^gAAK{)Viv7HWBv|8#6=&bQ{eRvaPMi$4Gu(eEPyI3jP g&)n=N^Rr9r3L9YeSctu0-`TS4)a=Y`ycu_X04KLM>i_@% diff --git a/Plugins/nsisdl.dll b/Plugins/nsisdl.dll index bbd0b7b5ad6f06ee9d663408262447026769427a..7142f325382efadd21d692ef524da644c87a85a3 100644 GIT binary patch delta 2243 zcmc(geM}Tb6u@T=kONOVEeG;(zyTtP@}WT4yZvaZhnLop(^C`ywN-JwRD;c(Vk=?` zSaGF-V;ihQu~LJrA?ne_8beY1Kx>uQMvUS|)HJIYi;DDO3EMY!XKMfKU)|)l^WK{` zvv1yeySqu;B-XLGtDc)NXV+lV6nBH=A9h*7L2vCpV@ZT@{f&c`WEdX~@3BmV@yfME z&p2o0QjxAfzRPMxXci7Yg2i2bZ&grS7D9_*YJe2rLOf7!h$7usts0Ic*KrcAaAB2# zNgdYi@V8)~>S3bE#XlJd>1-=pD5)8X?JDsVL3>`BU;uY#;WLATrWnSRpIwtC&vz}@F`b^?huBcSB0nI zX3`j5fa}O$xWTqM7$Nak1=7mPsMKNuX(5#k&j-m$r90a}%B50QB}golj(rT$R4QHj z45Va`YOBlsR1~WmP3+@#>-Au%G4~d{w3Y^WJpQ5{%Se0#lj#e)_WQDDit=E!8X=}w zEoC*pX(X;0?xU;H{1CE<18*U%4GOR5c9QK82}N}<2iewuO;&W zI7!!MLZ|1G1GAh zc^We@6hkvry0J6OCXVxjF(gkQX|c)p3|SC6Y2+6Wr>WDSvC2nDZEPWA??LP>+(NqI zGWFih3hfJMKV0ZJ0L_s+eGo$Cnn{Ggpc?s{u!h_c+6qkZeaA?<+S5I>;b)qTAs znVaolDdtA2WNu1Z5?e~U&i5x&cJi#fiid>yXRy=1A4xleER2s+H-aGb%PYvI@q6)R5}!~Ncu^VOMyC%X%&kD^dL}}T zfr|jWwoOH-0cZve11EqBz%^hKFbHU-AruBA0hz!XKq=T40(XE}0KL8f`?o+la0R#v zxB-87Rw$5^4!3N;0xSYbfsH^N&;+ysWw1a5ih!-;NaD;qF~hq(z2|{dn~qT1E4B_; z1-*tAykZ*$8v>ig7aCowf!|SEdc7g6;(tv-CQAM9NpQ_g+KgSlPsqb?2to7LMuQnCCex7roY;wla>Tlbm!d2xtoKTU?z>pVP-PRnDq={ zb}@UI+st!DZ=7W0jkAp<#x=$*#vhGc#;3+$Q>tl^soKd-e zEZ)W!@N4*W{8oNHe~@qE&+xzS*ZDhqKmVK`=0k)7!Xe?Pa7<_yP74==ZsDrXE8G=i P;ju6vyl@$&-o$?cs52F2 delta 2190 zcmc(gYfw{16o7ZbD?pT}gf}5P1Qe@)pxor%+_4%OpA(IuR#00-Z&PfgCW;RV3bbNM zRn|H>QlCr*JE)97%e0*q-;dF%w1U&YM+QNT;ZRZiO?d1kef`#3$S~8Y$R#MN(Iu9%Qz8lb#-Hk ztGz9F7Mbatg=1V>yhAWPK@Rwg#t+DKpA_sOeLll+28r`c8uM;6Le!yLR+&9gwt`%l zJ!;Xy1(!}MQI50Q>08mfVW>@Ek#m^aIC(ND@@*fqGYTQ6yNptYk6cdP@-q*b@QP&& zIq7E}dM}dsRM4REoe*lVTE0otO6%bD17>?>u}Zd+LS-RdMLLuT_y$q>C*y-8&0mK% zl3D%}1I9-nRMBkTBWII+{^jw9!aWh}WYcPO*{V>#dCgp;~IVmC7%RQI5og~)+q=@MQ4h~guu+yYUIq&t@Lf0sBG( zF(JL7vDU%>gruetq?VU6sm=;g9+Mj8f@EdVy{#ZkX41tnkVGamtp_QSNw+=*DFvje zilQf!TI3jF3)>T|152f;ef~@9Du0j1Gv=|J#D#Mi17TO4D0)okpIej&ad}E-W)0lN zDb&FjR6f-UA*dk-2rQmZ57yLs@VqG1Fy7$X_*5^6o6WCytHpC${sE69&a<+V$c@eHbHJi!ch$LK2#znj*vdvDR6viskE(>*Z z(Y7j669|2@&6&BuWA9g6t4z%vd#mJzh?%RVhIB-X#YH4EQXfQmf8W<+a4Tu`X_hBNc+ip^otHmC{&AnzrcqDSCrQXj3u`^nX4U39}EN}bc)(qizC z5A`cA+n|92XfpyD;4Kx+jvwR*V%BPXb3v6Ck^*gl;&~6L)=tDhq*Xg2__tn4%iP#8 z#wvw*-qt4vl3_8)_%PvPMh32ha13YcDvP|E6viyT^T^ehJGh?I>oQ>cMW^vgf&-wJ z$a7t+;!zLL#bz&K)#vg$?SVF>r(sx?xjeaFA8041sn!;fVydw?P5V=z_EsyT8fwaF z#^p8Ihe1YJ>NKoZ2a?R?^*H=4n0kufCn)=qE3qlz#~{aCo*TYV_92iDx$psn?~q$I z5OrKgn4yPK=;E%8#i}8YXveT+WyNZRLq+Ds>6H87U}u-Sl$6Bn!(}8UzMOm+Kf8nu z?}CNDG7wV0hxH!J?Aeiy(0-sEXaddxExpchcVyTY>kza;`9g*>GHw?w$6C4Phh z<|wTB_U!kUI99o?Cs}YB{9%ghb_H-dXa}SiU>@j;0STy!M<{R%LTf-SC38mXIX-f+ zU&*DchgnauUSvgciQH6fHn)T;B0hG zxv)mqBvcCrh3|xGLaXqr&^1x`TNq>%jJZa;ah= VAR_CODES_START) { - *out++ = (char)255; + if (i >= NS_CODES_START) { + *out++ = (char)NS_SKIP_CODE; } *out++=i; } @@ -511,8 +513,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A p=np; // Test for characters extending into the variable codes - if (i >= VAR_CODES_START) { - *out++ = (char)255; + if (i >= NS_CODES_START) { + *out++ = (char)NS_SKIP_CODE; } else if (i == '$') { @@ -541,8 +543,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A // which is also memory wasting // So the line below must be commented !?? //m_UserVarNames.inc_reference(idxUserVar); - *out++ = (unsigned int) VAR_CODES_START; // Named user variable; - *(WORD*)out = (WORD) ((idxUserVar + 1) | 0x8000); + *out++ = (unsigned int) NS_VAR_CODE; // Named user variable; + *(WORD*)out = CODE_SHORT(idxUserVar); out += sizeof(WORD); p += pUserVarName-p; bProceced = true; @@ -564,7 +566,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A { int CSIDL_Value_current = m_ShellConstants.get_value1(idxConst); int CSIDL_Value_all = m_ShellConstants.get_value2(idxConst); - *out++=(unsigned int)SHELL_CODES_START; // Constant code identifier + *out++=(unsigned int)NS_SHELL_CODE; // Constant code identifier *out++=(char)CSIDL_Value_current; *out++=(char)CSIDL_Value_all; p = pShellConstName; @@ -585,8 +587,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A idx = DefineLangString(cp); if (idx < 0) { - *out++ = (unsigned int)LANG_CODES_START; // Next word is lang-string Identifier - *(WORD*)out= (WORD) idx; + *out++ = (unsigned int)NS_LANG_CODE; // Next word is lang-string Identifier + *(WORD*)out= CODE_SHORT(-idx-1); out += sizeof(WORD); p += strlen(cp) + 2; bProceced = true; @@ -2231,7 +2233,8 @@ int CEXEBuild::write_output(void) init_res_editor(); VerifyDeclaredUserVarRefs(&m_UserVarNames); int MaxUserVars = m_UserVarNames.getnum(); - if (!res_editor->AddExtraVirtualSize2PESection(VARS_SECTION_NAME, (MaxUserVars-TOTAL_COMPATIBLE_STATIC_VARS_COUNT) * sizeof(NSIS_STRING))) + // -1 because the default size is 1 + if (!res_editor->AddExtraVirtualSize2PESection(VARS_SECTION_NAME, (MaxUserVars - 1) * sizeof(NSIS_STRING))) { ERROR_MSG("Internal compiler error #12346: invalid exehead cannot find section \"%s\"!\n", VARS_SECTION_NAME); return PS_ERROR; @@ -3218,9 +3221,9 @@ int CEXEBuild::DeclaredUserVar(const char *szVarName) } m_UserVarNames.add(szVarName); - if ( m_UserVarNames.getnum() > MAX_NAMED_USER_VARS ) + if (m_UserVarNames.getnum() > MAX_CODED) { - ERROR_MSG("Error: too many user variables declared!\n"); + ERROR_MSG("Error: too many user variables declared. Maximum allowed is %u.\n", MAX_CODED - m_iBaseVarsNum); return PS_ERROR; } return PS_OK; @@ -3252,9 +3255,9 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token) void CEXEBuild::VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList) { - for ( int i = TOTAL_COMPATIBLE_STATIC_VARS_COUNT; i < pVarsStringList->getnum(); i++ ) + for (int i = m_iBaseVarsNum; i < pVarsStringList->getnum(); i++) { - if ( !pVarsStringList->get_reference(i) ) + if (!pVarsStringList->get_reference(i)) { warning("Variable \"%s\" not referenced, wasting memory!", pVarsStringList->idx2name(i)); } diff --git a/Source/build.h b/Source/build.h index fdcca62c..97bbb938 100644 --- a/Source/build.h +++ b/Source/build.h @@ -254,6 +254,7 @@ class CEXEBuild { int GetUserVarIndex(LineParser &line, int token); // Added by ramon 3 jun 2003 UserVarsStringList m_UserVarNames; + int m_iBaseVarsNum; int DeclaredUserVar(const char *VarName); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index e9c02668..6e7595a3 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -81,17 +81,39 @@ static DWORD WINAPI install_thread(LPVOID p); HWND insthwnd, insthwnd2, insthwndbutton; -static HWND m_curwnd, m_bgwnd, m_hwndOK, m_hwndCancel; +HWND m_curwnd; +static HWND m_bgwnd, m_hwndOK, m_hwndCancel; static BOOL NSISCALL SetDlgItemTextFromLang_(HWND dlg, int id, int lid) { return my_SetDialogItemText(dlg,id+1000,GetNSISStringTT(lid)); } +static void NSISCALL SetNextDef() +{ + SendMessage(g_exec_flags.abort ? m_hwndCancel : m_hwndOK, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); +} + +static void NSISCALL EnableNext(BOOL e) +{ + EnableWindow(m_hwndOK, e); +} + +static void NSISCALL SetActiveCtl(HWND hDlg, HWND hCtl) +{ + SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM) hCtl, TRUE); +} + +static void NSISCALL NotifyCurWnd(UINT uNotifyCode) +{ + if (m_curwnd) + SendMessage(m_curwnd, uNotifyCode, 0, 0); +} + #define SetDlgItemTextFromLang(dlg,id,lid) SetDlgItemTextFromLang_(dlg,(id)-1000,lid) #define SetUITextFromLang(it,la) SetDlgItemTextFromLang_(hwndDlg,(it)-1000,la) #define SetUITextNT(it,text) my_SetDialogItemText(hwndDlg,it,text) -#define GetUIText(it,s,ss) my_GetDialogItemText(hwndDlg,it,s,ss) +#define GetUIText(it,s) my_GetDialogItemText(it,s) #define GetUIItem(it) GetDlgItem(hwndDlg,it) #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT @@ -183,7 +205,7 @@ lang_again: } } -int NSISCALL ui_doinstall(void) +__forceinline int NSISCALL ui_doinstall(void) { header *header = g_header; static WNDCLASS wc; // richedit subclassing and bgbg creation @@ -359,7 +381,7 @@ static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lPara { if (uMsg==BFFM_INITIALIZED) { - my_GetDialogItemText(m_curwnd,IDC_DIR,(char*)lpData,NSIS_MAX_STRLEN); + my_GetDialogItemText(IDC_DIR,(char*)lpData); SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)1,lpData); } if (uMsg==BFFM_SELCHANGED) @@ -418,14 +440,14 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) // But if quit called we must exit now if (m_delta==1) if (ExecuteCodeSegment(this_page->leavefunc,NULL)) return !g_quit_flag; #endif - + // if the last page was a custom page, wait for it to finish by itself. // if it doesn't, it's a BAD plugin. // plugins should react to WM_NOTIFY_OUTER_NEXT. if (!this_page->dlg_id) return 0; } - SendMessage(m_curwnd, WM_NOTIFY_INIGO_MONTOYA, 0, 0); + NotifyCurWnd(WM_NOTIFY_INIGO_MONTOYA); nextPage: m_page+=m_delta; @@ -451,22 +473,32 @@ nextPage: SetDlgItemTextFromLang(hwndDlg, IDOK, this_page->next); SetDlgItemTextFromLang(hwndDlg, IDC_BACK, this_page->back); SetDlgItemTextFromLang(hwndDlg, IDCANCEL, this_page->cancel); - + hwndtmp = GetDlgItem(hwndDlg, IDC_BACK); + if (g_exec_flags.abort) { pflags &= ~(PF_BACK_ENABLE | PF_NEXT_ENABLE); pflags |= PF_CANCEL_ENABLE; - SendMessage(hwndDlg, DM_SETDEFID, IDCANCEL, 0); } - else SendMessage(hwndDlg, DM_SETDEFID, IDOK, 0); - - SetWindowLong(hwndtmp, GWL_STYLE, GetWindowLong(hwndtmp, GWL_STYLE) & ~BS_DEFPUSHBUTTON); + ShowWindow(hwndtmp, pflags & PF_BACK_SHOW);// SW_HIDE = 0, PF_BACK_SHOW = SW_SHOWNA = 8 EnableWindow(hwndtmp, pflags & PF_BACK_ENABLE); - EnableWindow(m_hwndOK, pflags & PF_NEXT_ENABLE); + EnableNext(pflags & PF_NEXT_ENABLE); EnableWindow(m_hwndCancel, pflags & PF_CANCEL_ENABLE); + SendMessage(hwndtmp, BM_SETSTYLE, BS_PUSHBUTTON, TRUE); + + if (g_exec_flags.abort) + { + SendMessage(hwndDlg, DM_SETDEFID, IDCANCEL, 0); + SetActiveCtl(hwndDlg, m_hwndCancel); + } + else + { + SetActiveCtl(hwndDlg, m_hwndOK); + } + mystrcpy(g_tmp,g_caption); GetNSISString(g_tmp+mystrlen(g_tmp),this_page->caption); my_SetWindowText(hwndDlg,g_tmp); @@ -478,12 +510,15 @@ nextPage: } #endif //NSIS_SUPPORT_CODECALLBACKS - if (this_page->wndproc_id != PWP_COMPLETED) DestroyWindow(m_curwnd); + if (this_page->wndproc_id != PWP_COMPLETED) + { + DestroyWindow(m_curwnd); + } else { - if (g_exec_flags.abort) SetFocus(m_hwndCancel); - else if (g_exec_flags.autoclose) goto nextPage; - else SetFocus(m_hwndOK); // without focus button, the system Beeps every time user press one key - goto skipPage; + if (!g_exec_flags.abort && g_exec_flags.autoclose) + goto nextPage; + // no need to go to skipPage because PWP_COMPLETED always follows PWP_INSTFILES + return FALSE; } // update g_this_page for the dialog proc @@ -509,15 +544,8 @@ nextPage: ExecuteCodeSegment(this_page->showfunc,NULL); #endif //NSIS_SUPPORT_CODECALLBACKS ShowWindow(m_curwnd,SW_SHOWNA); - SendMessage(m_curwnd,WM_NOTIFY_START,0,0); + NotifyCurWnd(WM_NOTIFY_START); } - - //XGE 5th September 2002 - Do *not* move the focus to the OK button if we are - //on the license page, instead we want the focus left alone because in - //WM_INITDIALOG it is given to the richedit control. - if ((pflags & PF_NO_NEXT_FOCUS) == 0) - SetFocus(m_hwndOK); - //XGE End } } @@ -525,7 +553,7 @@ skipPage: if (!ui_dlg_visible && m_curwnd) { - ShowWindow(hwndDlg, SW_SHOW); + ShowWindow(hwndDlg, SW_SHOWDEFAULT); ui_dlg_visible = 1; } @@ -559,8 +587,12 @@ skipPage: { int id = LOWORD(wParam); HWND hCtl = GetDlgItem(hwndDlg, id); - if (hCtl && !IsWindowEnabled(hCtl)) - return 0; + if (hCtl) + { + SendMessage(hCtl, BM_SETSTATE, FALSE, 0); + if (!IsWindowEnabled(hCtl)) + return 0; + } if (id == IDOK) { @@ -621,6 +653,7 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM { page *m_this_page=g_this_page; HWND hwLicense; + static int ignoreWMCommand; if (uMsg == WM_INITDIALOG) { @@ -636,10 +669,11 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM SetUITextFromLang(IDC_LICENSEAGREE,this_page->parms[2]); SetUITextFromLang(IDC_LICENSEDISAGREE,this_page->parms[3]); - SendMessage(GetUIItem(IDC_LICENSEAGREE+!selected),BM_SETCHECK,BST_CHECKED,0); - EnableWindow(m_hwndOK,selected); + CheckDlgButton(hwndDlg,IDC_LICENSEAGREE+!selected,BST_CHECKED); + EnableNext(selected); hwLicense=GetUIItem(IDC_EDIT1); + SetActiveCtl(hwndDlg, hwLicense); SendMessage(hwLicense,EM_AUTOURLDETECT,TRUE,0); #define lbg g_header->license_bg SendMessage(hwLicense,EM_SETBKGNDCOLOR,0,lbg>=0?lbg:GetSysColor(-lbg)); @@ -648,20 +682,16 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM dwRead=0; SendMessage(hwLicense,EM_EXLIMITTEXT,0,mystrlen(l)); SendMessage(hwLicense,EM_STREAMIN,lt,(LPARAM)&es); - //XGE 5th September 2002 - place the initial focus in the richedit control - SetFocus(hwLicense); + ignoreWMCommand = 0; return FALSE; - //End Xge } - if (uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { + if (uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && !ignoreWMCommand) { if (m_this_page->flags & PF_LICENSE_FORCE_SELECTION) { int is = SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED; m_this_page->flags &= ~PF_LICENSE_SELECTED; m_this_page->flags |= is; - EnableWindow( - m_hwndOK, - is - ); + EnableNext(is); + SetNextDef(); } } if (uMsg == WM_NOTIFY) { @@ -712,6 +742,10 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM #undef enlink #undef msgfilter } + if (uMsg == WM_NOTIFY_INIGO_MONTOYA) + { + ignoreWMCommand++; + } return HandleStaticBkColor(); } #endif @@ -750,7 +784,7 @@ static char * NSISCALL inttosizestr(int kb, char *str) return str; } -static int NSISCALL getreqsize() +static int NSISCALL _sumsecsfield(int idx) { int x,total; section *sections = g_sections; @@ -759,19 +793,22 @@ static int NSISCALL getreqsize() #ifdef NSIS_CONFIG_COMPONENTPAGE if (sections[x].flags & SF_SELECTED) #endif - total += sections[x].size_kb; + total += sections[x].fields[idx]; } return total; } +#define sumsecsfield(x) _sumsecsfield(SECTION_OFFSET(x)) + static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + static int dontsetdefstyle; page *thispage = g_this_page; char *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { - GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); + GetUIText(IDC_DIR,dir); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #ifndef NSIS_CONFIG_LOG_ODS @@ -795,6 +832,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar SetUITextNT(IDC_DIR,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); + SetActiveCtl(hwndDlg, GetUIItem(IDC_DIR)); } if (uMsg == WM_COMMAND) { @@ -805,11 +843,10 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } if (id == IDC_BROWSE) { - char name[MAX_PATH]; BROWSEINFO bi = {0,}; ITEMIDLIST *idlist; bi.hwndOwner = hwndDlg; - bi.pszDisplayName = name; + bi.pszDisplayName = g_tmp; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISStringTT(browse_text); @@ -821,19 +858,20 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if (idlist) { // Get and free idlist - my_PIDL2Path(name, idlist); + my_PIDL2Path(g_tmp, idlist); if (g_header->install_directory_auto_append) { const char *post_str=ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // name gives just the folder name - if (lstrcmpi(post_str,name)) + if (lstrcmpi(post_str,g_tmp)) { lstrcat(addtrailingslash(dir),post_str); } } + dontsetdefstyle++; SetUITextNT(IDC_DIR,dir); } } @@ -846,7 +884,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar int total, available=-1; DWORD spc,bps,fc,tc; - GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); + GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; @@ -862,7 +900,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar available=(int)r; } - total = getreqsize(); + total = sumsecsfield(size_kb); if ((unsigned int)available < (unsigned int)total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; @@ -885,7 +923,10 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; - EnableWindow(m_hwndOK, !error); + EnableNext(!error); + if (!error && !dontsetdefstyle) + SetNextDef(); + dontsetdefstyle = 0; } return HandleStaticBkColor(); } @@ -901,7 +942,7 @@ static int NSISCALL SetChildrenStates(HWND hwTree, HTREEITEM hItem, int iChecked int iCheckedChildren = 0, iChildren = 0, *pFlags, iState = 1; HTREEITEM hItrItem; TVITEM tvItem; - + hItrItem = TreeView_GetChild(hwTree, hItem); while (hItrItem) { @@ -909,12 +950,12 @@ static int NSISCALL SetChildrenStates(HWND hwTree, HTREEITEM hItem, int iChecked iChildren++; hItrItem = TreeView_GetNextSibling(hwTree, hItrItem); } - + tvItem.hItem = hItem; tvItem.mask = TVIF_PARAM | TVIF_STATE; tvItem.stateMask = TVIS_STATEIMAGEMASK; TreeView_GetItem(hwTree, &tvItem); - + pFlags = &(g_sections[tvItem.lParam].flags); if (*pFlags & SF_RO) @@ -995,10 +1036,10 @@ HTREEITEM NSISCALL TreeHitTest(HWND tree) ht.pt.x = GET_X_LPARAM(dwpos); ht.pt.y = GET_Y_LPARAM(dwpos); - MapWindowPoints(HWND_DESKTOP, tree, &ht.pt, 1); + ScreenToClient(tree, &ht.pt); TreeView_HitTest(tree, &ht); - + if (ht.flags & (TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM)) return ht.hItem; @@ -1009,9 +1050,9 @@ static LONG oldTreeWndProc; static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static LPARAM last_item=-1; - if (uMsg == WM_KEYDOWN && wParam == VK_SPACE) + if (uMsg == WM_CHAR && wParam == VK_SPACE) { - SendMessage(m_curwnd,WM_TREEVIEW_KEYHACK,0,0); + NotifyCurWnd(WM_TREEVIEW_KEYHACK); } #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) if (uMsg == WM_DESTROY) { @@ -1020,9 +1061,9 @@ static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l if (uMsg == WM_MOUSEMOVE) { TVITEM tvItem; - if (GetWindowLong(hwnd, GWL_STYLE) & WS_VISIBLE) { + if (IsWindowVisible(hwnd)) { tvItem.hItem = TreeHitTest(hwnd); - + lParam = -1; if (tvItem.hItem) @@ -1030,7 +1071,7 @@ static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l tvItem.mask = TVIF_PARAM; TreeView_GetItem(hwnd, &tvItem); - + lParam = tvItem.lParam; } uMsg = WM_NOTIFY_SELCHANGE; @@ -1062,6 +1103,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar HWND hwndTree1 = GetUIItem(IDC_TREE1); extern HWND g_SectionHack; section *sections=g_sections; + int *install_types=g_header->install_types; if (uMsg == WM_INITDIALOG) { int doLines=0; @@ -1071,14 +1113,11 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar g_SectionHack=hwndDlg; - if (hTreeItems) GlobalFree(hTreeItems); hTreeItems=(HTREEITEM*)my_GlobalAlloc(sizeof(HTREEITEM)*num_sections); hBMcheck1=LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); - oldTreeWndProc=SetWindowLong(hwndTree1,GWL_WNDPROC,(DWORD)newTreeWndProc); - - if (hImageList) ImageList_Destroy(hImageList); + oldTreeWndProc=SetWindowLong(hwndTree1,GWL_WNDPROC,(long)newTreeWndProc); hImageList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 6, 0); ImageList_AddMasked(hImageList,hBMcheck1,RGB(255,0,255)); @@ -1099,11 +1138,11 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar for (i = 0; i < NSIS_MAX_INST_TYPES+1; i++) { - if (g_header->install_types[i]) + if (install_types[i]) { int j; if (i != NSIS_MAX_INST_TYPES) noCombo = 0; - GetNSISString(g_tmp,g_header->install_types[i]); + GetNSISString(g_tmp,install_types[i]); j=SendMessage(hwndCombo1,CB_ADDSTRING,0,(LPARAM)g_tmp); SendMessage(hwndCombo1,CB_SETITEMDATA,j,i); if (i == g_exec_flags.cur_insttype) @@ -1111,9 +1150,6 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } } - if (!noCombo) - ShowWindow(hwndCombo1,SW_SHOW); - SetUITextFromLang(IDC_TEXT1,this_page->parms[1+noCombo]); SetUITextFromLang(IDC_TEXT2,this_page->parms[2+noCombo]); @@ -1177,6 +1213,14 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } SendMessage(hwndTree1,WM_VSCROLL,SB_TOP,0); + if (!noCombo) + { + ShowWindow(hwndCombo1, SW_SHOW); + SetActiveCtl(hwndDlg, hwndCombo1); + } + else + SetActiveCtl(hwndDlg, hwndTree1); + uMsg = g_exec_flags.insttype_changed ? WM_NOTIFY_INSTTYPE_CHANGE : WM_IN_UPDATEMSG; } if (uMsg == WM_NOTIFY_SECTEXT) // update text @@ -1280,7 +1324,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if (uMsg == WM_NOTIFY_INSTTYPE_CHANGE || (uMsg == WM_COMMAND && LOWORD(wParam)==IDC_COMBO1 && HIWORD(wParam)==CBN_SELCHANGE)) { - int t=SendMessage(hwndCombo1,CB_GETCURSEL,0,0); + int t=SendMessage(hwndCombo1,CB_GETCURSEL,0,0); if (uMsg == WM_NOTIFY_INSTTYPE_CHANGE || t != CB_ERR) { int whichcfg=SendMessage(hwndCombo1,CB_GETITEMDATA,t,0); @@ -1291,7 +1335,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } else lParam = 1; - if (whichcfg == CB_ERR || !(g_header->install_types[whichcfg])) + if (whichcfg == CB_ERR || !(install_types[whichcfg])) whichcfg = NSIS_MAX_INST_TYPES; if (whichcfg != NSIS_MAX_INST_TYPES) // not custom @@ -1336,8 +1380,9 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar { if (hImageList) ImageList_Destroy(hImageList); if (hTreeItems) GlobalFree(hTreeItems); - hTreeItems=0; - g_SectionHack=0; + hImageList=NULL; + hTreeItems=NULL; + g_SectionHack=NULL; } if (uMsg == WM_IN_UPDATEMSG) { @@ -1362,7 +1407,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar section *t=sections; x=num_sections; - if (!g_header->install_types[r]) continue; + if (!install_types[r]) continue; while (x--) { @@ -1387,8 +1432,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } // end of typecheckshit if (LANG_STR_TAB(LANG_SPACE_REQ)) { - char s[128]; - SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(getreqsize(),GetNSISString(s,LANG_SPACE_REQ))); + SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(sumsecsfield(size_kb),GetNSISString(g_tmp,LANG_SPACE_REQ))); + } } @@ -1448,14 +1493,18 @@ static DWORD WINAPI install_thread(LPVOID p) } #endif - while (m_inst_seclb_bg,lb_fg=g_header->lb_fg; - int x=num_sections; insthwndbutton=GetUIItem(IDC_SHOWDETAILS); insthwnd2=GetUIItem(IDC_INTROTEXT); linsthwnd=insthwnd=GetUIItem(IDC_LIST1); - progress_bar_len=0; + progress_bar_len=sumsecsfield(code_size); progress_bar_pos=0; log_printf3("New install of \"%s\" to \"%s\"",GetNSISStringTT(LANG_NAME),state_install_directory); - while (x--) - { - if (g_sections[x].flags&SF_SELECTED) - progress_bar_len+=g_sections[x].code_size; - } GetClientRect(linsthwnd, &r); lvc.cx = r.right - GetSystemMetrics(SM_CXHSCROLL); @@ -1543,6 +1586,7 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { ShowWindow(insthwndbutton,SW_HIDE); ShowWindow(linsthwnd,SW_SHOWNA); + SetNextDef(); } if (uMsg == WM_NOTIFY_INSTPROC_DONE) { @@ -1562,22 +1606,33 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa //>>>Ximon Eighteen aka Sunjammer 30th August 2002 //+++Popup "Copy Details To Clipboard" menu when RMB clicked in DetailView //+++Currently this has no language support for the popup menu tex - if (uMsg == WM_NOTIFY && ((NMHDR*)lParam)->code == NM_RCLICK) + if (uMsg == WM_CONTEXTMENU && wParam == (WPARAM) linsthwnd) { int count = ListView_GetItemCount(linsthwnd); if (count > 0) { - DWORD pos = GetMessagePos(); HMENU menu = CreatePopupMenu(); + POINT pt; AppendMenu(menu,MF_STRING,1,GetNSISStringTT(LANG_COPYDETAILS)); + if (lParam == ((UINT)-1)) + { + RECT r; + GetWindowRect(linsthwnd, &r); + pt.x = r.left; + pt.y = r.top; + } + else + { + pt.x = GET_X_LPARAM(lParam); + pt.y = GET_Y_LPARAM(lParam); + } if (1==TrackPopupMenu( menu, TPM_NONOTIFY|TPM_RETURNCMD, - GET_X_LPARAM(pos), - GET_Y_LPARAM(pos), + pt.x, + pt.y, 0,linsthwnd,0)) { - char textBuf[1024]; int i,total = 1; // 1 for the null char LVITEM item; HGLOBAL memory; @@ -1585,8 +1640,8 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa // 1st pass - determine clipboard memory required. item.iSubItem = 0; - item.pszText = textBuf; - item.cchTextMax = 1023; + item.pszText = g_tmp; + item.cchTextMax = sizeof(g_tmp) - 1; i = count; while (i--) // Add 2 for the CR/LF combination that must follow every line. diff --git a/Source/exehead/config.h b/Source/exehead/config.h index baeee928..3cd1d7c5 100644 --- a/Source/exehead/config.h +++ b/Source/exehead/config.h @@ -391,27 +391,10 @@ #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif -// This is the old static var count that occupies memory -// From $0 to $PLUGINSDIR, $_CLICK -#define USER_VARS_COUNT 28 - -// This is the total number of old static var -// From $0 to $HWNDPARENT -#ifdef NSIS_CONFIG_PLUGIN_SUPPORT - #define TOTAL_COMPATIBLE_STATIC_VARS_COUNT 32 -#else - #define TOTAL_COMPATIBLE_STATIC_VARS_COUNT 31 -#endif - #define VARS_SECTION_NAME ".ndata" typedef char NSIS_STRING[NSIS_MAX_STRLEN]; -// MAX_NAMED_USER_VARS defines the maximum of named user variables -// the complier also use this value to abort if exceded -// The real maximum is (0x0FFF - USER_VARS_COUNT) = 4068 -#define MAX_NAMED_USER_VARS (0x0FFF - USER_VARS_COUNT) - #endif//!APSTUDIO_INVOKED #endif // NSIS_CONFIG_H diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 79c2755b..a37f6d41 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -315,16 +315,22 @@ typedef struct #define SF_EXPAND 32 #define SF_PSELECTED 64 -typedef struct +typedef union { - int name_ptr; // '' for non-optional components - int install_types; // bits set for each of the different install_types, if any. - int flags; // SF_* - defined above - int code; - int code_size; - int size_kb; + struct + { + int name_ptr; // '' for non-optional components + int install_types; // bits set for each of the different install_types, if any. + int flags; // SF_* - defined above + int code; + int code_size; + int size_kb; + }; + int fields[1]; } section; +#define SECTION_OFFSET(field) (FIELD_OFFSET(section, field)/sizeof(int)) + typedef struct { int which; @@ -427,9 +433,14 @@ DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove); // $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value. // Added by ramon 3 jun 2003 -#define VAR_CODES_START 252 -#define SHELL_CODES_START 253 -#define LANG_CODES_START 254 +#define NS_SKIP_CODE 252 +#define NS_VAR_CODE 253 +#define NS_SHELL_CODE 254 +#define NS_LANG_CODE 255 +#define NS_CODES_START NS_SKIP_CODE + +#define CODE_SHORT(x) (WORD)((((WORD)x & 0x7F) | (((WORD)x & 0x3F80) << 1) | 0x8080)) +#define MAX_CODED 16383 #define NSIS_INSTDIR_INVALID 1 #define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2 diff --git a/Source/exehead/state.h b/Source/exehead/state.h index 3eb6a122..9d1321b4 100644 --- a/Source/exehead/state.h +++ b/Source/exehead/state.h @@ -1,4 +1,4 @@ -extern NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; +extern NSIS_STRING g_usrvars[1]; #define state_command_line g_usrvars[20] #define state_install_directory g_usrvars[21] diff --git a/Source/exehead/ui.h b/Source/exehead/ui.h index fb141d3a..28368f37 100644 --- a/Source/exehead/ui.h +++ b/Source/exehead/ui.h @@ -3,7 +3,7 @@ extern int *cur_langtable; -int NSISCALL ui_doinstall(void); +extern int NSISCALL ui_doinstall(void); void NSISCALL update_status_text(int strtab, const char *text2); extern int ui_st_updateflag; diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 9c2e6505..d5f95136 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -22,7 +22,7 @@ char g_log_file[1024]; // which result in extra memory for extra variables without code to do allocation :) // nsis then removes the "DISCARDABLE" style from section (for safe) #pragma bss_seg( VARS_SECTION_NAME ) -NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; +NSIS_STRING g_usrvars[1]; #pragma bss_seg() #define SECTION_VARS_RWD "/section:" ## VARS_SECTION_NAME ## ",rwd" #pragma comment(linker, SECTION_VARS_RWD) @@ -48,10 +48,12 @@ int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl) HANDLE NSISCALL myCreateProcess(char *cmd, char *dir) { DWORD d; - static PROCESS_INFORMATION ProcInfo; - STARTUPINFO StartUp = {sizeof(StartUp), }; + PROCESS_INFORMATION ProcInfo; + static STARTUPINFO StartUp; + StartUp.cb=sizeof(StartUp); d=GetFileAttributes(dir); - if (d == INVALID_FILE_ATTRIBUTES || !(d&FILE_ATTRIBUTE_DIRECTORY)) dir=0; + if (d == INVALID_FILE_ATTRIBUTES || !(d&FILE_ATTRIBUTE_DIRECTORY)) + dir=0; if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, dir, &StartUp, &ProcInfo)) return NULL; CloseHandle(ProcInfo.hThread); @@ -69,25 +71,21 @@ BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val) //return my_SetWindowText(GetDlgItem(dlg,idx),val); } -/*int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size) +int NSISCALL my_GetDialogItemText(UINT idx, char *val) { - return SendMessage(hWnd,WM_GETTEXT,size,(LPARAM)val); + extern HWND m_curwnd; + return GetDlgItemText(m_curwnd, idx, val, NSIS_MAX_STRLEN); } -int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size) -{ - return my_GetWindowText(GetDlgItem(dlg,idx),val,size); -}*/ - int NSISCALL my_MessageBox(const char *text, UINT type) { + int _type = type & 0x000FFFFF; // default for silent installers if (g_exec_flags.silent && type >> 20) return type >> 20; // no silent or no default, just show - if (!g_exec_flags.rtl) - return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF); - else - return MessageBox(g_hwnd, text, g_caption, (type & 0x000FFFFF) ^ (MB_RIGHT | MB_RTLREADING)); + if (g_exec_flags.rtl) + _type ^= MB_RIGHT | MB_RTLREADING; + return MessageBox(g_hwnd, text, g_caption, _type); } void * NSISCALL my_GlobalAlloc(DWORD dwBytes) { @@ -102,7 +100,7 @@ void NSISCALL doRMDir(char *buf, int flags) // 1 - recurse, 2 - rebootok if (flags&1) { SHFILEOPSTRUCT op; - op.hwnd=0; + op.hwnd=g_hwnd; op.wFunc=FO_DELETE; buf[mystrlen(buf)+1]=0; op.pFrom=buf; @@ -472,12 +470,23 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) } while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN) { - int nVarIdx = (unsigned char)*in++; - if (nVarIdx == 255) + unsigned char nVarIdx = (unsigned char)*in++; + int nData; + int fldrs[4]; + if (nVarIdx > NS_SKIP_CODE) + { + nData = ((in[1] & 0x7F) << 7) | (in[0] & 0x7F); + fldrs[0] = in[0]; // current user + fldrs[1] = in[0] | CSIDL_FLAG_CREATE; + fldrs[2] = in[1]; // all users + fldrs[3] = in[1] | CSIDL_FLAG_CREATE; + in += 2; + } + if (nVarIdx == NS_SKIP_CODE) { *out++ = *in++; } - else if (nVarIdx == SHELL_CODES_START) + else if (nVarIdx == NS_SHELL_CODE) { // NOTE 1: the code CSIDL_PRINTERS, is used for QUICKLAUNCH // NOTE 2: the code CSIDL_BITBUCKET is used for COMMONFILES @@ -485,19 +494,10 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) LPITEMIDLIST idl; char *append = 0; - int fldrs[4] = { - in[0], // current user - in[0] | CSIDL_FLAG_CREATE, - in[1], // all users - in[1] | CSIDL_FLAG_CREATE - }; - int x = 0; *out = 0; - in += 2; - if (fldrs[2] == CSIDL_PRINTERS) // QUICKLAUNCH { append = "\\Microsoft\\Internet Explorer\\Quick Launch"; @@ -550,27 +550,23 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) validate_filename(out); out += mystrlen(out); } - else if (nVarIdx == VAR_CODES_START) + else if (nVarIdx == NS_VAR_CODE) { - nVarIdx = (*(WORD*)in - 1) & 0x7FFF; - in += sizeof(WORD); - if (nVarIdx == 27) // HWNDPARENT + if (nData == 27) // HWNDPARENT myitoa(out, (unsigned int) g_hwnd); else - mystrcpy(out, g_usrvars[nVarIdx]); + mystrcpy(out, g_usrvars[nData]); // validate the directory name - if ((unsigned int)(nVarIdx - 21) < 6) { + if ((unsigned int)(nData - 21) < 6) { // validate paths for $INSTDIR, $OUTDIR, $EXEDIR, $LANGUAGE, $TEMP and $PLUGINSDIR // $LANGUAGE is just a number anyway... validate_filename(out); } out += mystrlen(out); } // == VAR_CODES_START - else if (nVarIdx == LANG_CODES_START) + else if (nVarIdx == NS_LANG_CODE) { - nVarIdx = *(short*)in; - in += sizeof(short); - GetNSISString(out, nVarIdx); + GetNSISString(out, -nData-1); out += mystrlen(out); } else // Normal char diff --git a/Source/exehead/util.h b/Source/exehead/util.h index df409ef8..1839b1c7 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -19,10 +19,11 @@ int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl); //BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); #define my_SetWindowText SetWindowText BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val); +//#define my_SetDialogItemText SetDlgItemText //int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size); #define my_GetWindowText GetWindowText -//int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size); -#define my_GetDialogItemText GetDlgItemText +int NSISCALL my_GetDialogItemText(UINT idx, char *val); +//#define my_GetDialogItemText GetDlgItemText #ifdef NSIS_CONFIG_LOG extern char log_text[NSIS_MAX_STRLEN*4]; diff --git a/Source/lang.cpp b/Source/lang.cpp index 21fbe2f9..84f7e126 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -286,6 +286,17 @@ int CEXEBuild::GenerateLangTables() { SCRIPT_MSG("Generating language tables... "); + if ( +#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT + ubuild_langstring_num > MAX_CODED || +#endif + build_langstring_num > MAX_CODED + ) + { + ERROR_MSG("\nError: too many LangStrings. Maximum allowed is %u.\n", MAX_CODED); + return PS_ERROR; + } + // If we have no tables (user didn't set any string and didn't load any NLF) create the default one if (!lang_tables.getlen()) { LANGID lang = NSIS_DEFAULT_LANG; @@ -334,7 +345,7 @@ int CEXEBuild::GenerateLangTables() { #undef ADD_FONT } catch (exception& err) { - ERROR_MSG("Error while applying font: %s\n", err.what()); + ERROR_MSG("\nError while applying font: %s\n", err.what()); return PS_ERROR; } } @@ -390,7 +401,7 @@ int CEXEBuild::GenerateLangTables() { #undef ADD_FONT } catch (exception& err) { - ERROR_MSG("Error while applying NLF font/RTL: %s\n", err.what()); + ERROR_MSG("\nError while applying NLF font/RTL: %s\n", err.what()); return PS_ERROR; } @@ -411,7 +422,9 @@ int CEXEBuild::GenerateLangTables() { build_langtables.add(&rtl, sizeof(int)); } - int *lst = (int *)((char *)build_langtables.get() + build_langtables.getlen()); + int *lst = NULL; + unsigned int oldlen = build_langtables.getlen(); + cnt = 0; tabsset = 1; @@ -426,6 +439,7 @@ int CEXEBuild::GenerateLangTables() { lang_strings = build_langstrings.sort_index(&l); for (j = 0; j < l; j++) { + lst = (int *)((char *)build_langtables.get() + oldlen); if (lang_strings[j].index >= 0) { if (cnt >= lastcnt || !lst[lang_strings[j].index]) { const char *str = lt[i].lang_strings->get(lang_strings[j].sn); @@ -460,6 +474,8 @@ int CEXEBuild::GenerateLangTables() { } } + lst = (int *)((char *)build_langtables.get() + oldlen); + // optimize langstrings and check for recursion TinyGrowBuf rec; for (j = 0; j < build_langstring_num; j++) { @@ -498,7 +514,9 @@ int CEXEBuild::GenerateLangTables() { ubuild_langtables.add(&rtl, sizeof(int)); } - int *lst = (int *)((char *)ubuild_langtables.get() + ubuild_langtables.getlen()); + int *lst = NULL; + unsigned int oldlen = ubuild_langtables.getlen(); + cnt = 0; tabsset = 1; @@ -513,6 +531,7 @@ int CEXEBuild::GenerateLangTables() { lang_strings = build_langstrings.sort_uindex(&l); for (j = 0; j < l; j++) { + lst = (int *)((char *)ubuild_langtables.get() + oldlen); if (lang_strings[j].uindex >= 0) { if (cnt >= lastcnt || !lst[lang_strings[j].uindex]) { const char *str = lt[i].lang_strings->get(lang_strings[j].sn); @@ -547,6 +566,8 @@ int CEXEBuild::GenerateLangTables() { } } + lst = (int *)((char *)ubuild_langtables.get() + oldlen); + // optimize langstrings and check for recursion TinyGrowBuf rec; for (j = 0; j < ubuild_langstring_num; j++) { diff --git a/Source/script.cpp b/Source/script.cpp index 87b72f73..0aaf9857 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -4985,7 +4985,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { SCRIPT_MSG("VAR \"%s\"\n",line.gettoken_str(1)); int res = DeclaredUserVar(line.gettoken_str(1)); - if ( res != PS_OK ) + if (res != PS_OK) return res; } return PS_OK;