- 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
This commit is contained in:
kichik 2004-01-04 17:05:03 +00:00
parent e1c4b80991
commit fcd2c16685
15 changed files with 266 additions and 188 deletions

View file

@ -112,6 +112,7 @@ static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LP
while ( !TryEnterCS() ) Sleep(0); while ( !TryEnterCS() ) Sleep(0);
if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL) if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL)
{ {
SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_SETSTATE, FALSE, 0);
g_cancelled = 1; g_cancelled = 1;
} }
else else
@ -308,10 +309,7 @@ __declspec(dllexport) void download (HWND parent,
// enable the cancel button // enable the cancel button
wasen=EnableWindow(GetDlgItem(parent,IDCANCEL),TRUE); wasen=EnableWindow(GetDlgItem(parent,IDCANCEL),TRUE);
SendMessage(parent, DM_SETDEFID, IDCANCEL, 0); SendMessage(parent, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(parent, IDCANCEL), TRUE);
// remove the BS_DEFPUSHBUTTON style from IDOK
SendMessage(GetDlgItem(parent, IDOK), BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
SetFocus(GetDlgItem(parent,IDCANCEL));
} }
{ {
WSADATA wsaData; WSADATA wsaData;
@ -387,10 +385,16 @@ __declspec(dllexport) void download (HWND parent,
if (hwndB) ShowWindow(hwndB,SW_SHOWNA); if (hwndB) ShowWindow(hwndB,SW_SHOWNA);
if (hwndL) ShowWindow(hwndL,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); SetWindowPos(
childwnd,0,0,0,
if (wasen) EnableWindow(GetDlgItem(parent,IDCANCEL),FALSE); 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 ) if ( !error )
error = "cancel"; error = "cancel";

View file

@ -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 // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog
SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0);
ShowWindow(hwndDlg, SW_SHOWNA); 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; break;
case WM_COMMAND: case WM_COMMAND:

Binary file not shown.

Binary file not shown.

View file

@ -419,6 +419,8 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
m_UserVarNames.add("HWNDPARENT",-1); // 27 m_UserVarNames.add("HWNDPARENT",-1); // 27
m_UserVarNames.add("_CLICK",-1); // 28 m_UserVarNames.add("_CLICK",-1); // 28
m_iBaseVarsNum = m_UserVarNames.getnum();
m_ShellConstants.add("WINDIR",CSIDL_WINDOWS,CSIDL_WINDOWS); m_ShellConstants.add("WINDIR",CSIDL_WINDOWS,CSIDL_WINDOWS);
m_ShellConstants.add("SYSDIR",CSIDL_SYSTEM,CSIDL_SYSTEM); m_ShellConstants.add("SYSDIR",CSIDL_SYSTEM,CSIDL_SYSTEM);
m_ShellConstants.add("PROGRAMFILES",CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILES); m_ShellConstants.add("PROGRAMFILES",CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILES);
@ -498,8 +500,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A
while (l--) while (l--)
{ {
int i = (unsigned char)*p++; int i = (unsigned char)*p++;
if (i >= VAR_CODES_START) { if (i >= NS_CODES_START) {
*out++ = (char)255; *out++ = (char)NS_SKIP_CODE;
} }
*out++=i; *out++=i;
} }
@ -511,8 +513,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A
p=np; p=np;
// Test for characters extending into the variable codes // Test for characters extending into the variable codes
if (i >= VAR_CODES_START) { if (i >= NS_CODES_START) {
*out++ = (char)255; *out++ = (char)NS_SKIP_CODE;
} }
else if (i == '$') 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 // which is also memory wasting
// So the line below must be commented !?? // So the line below must be commented !??
//m_UserVarNames.inc_reference(idxUserVar); //m_UserVarNames.inc_reference(idxUserVar);
*out++ = (unsigned int) VAR_CODES_START; // Named user variable; *out++ = (unsigned int) NS_VAR_CODE; // Named user variable;
*(WORD*)out = (WORD) ((idxUserVar + 1) | 0x8000); *(WORD*)out = CODE_SHORT(idxUserVar);
out += sizeof(WORD); out += sizeof(WORD);
p += pUserVarName-p; p += pUserVarName-p;
bProceced = true; 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_current = m_ShellConstants.get_value1(idxConst);
int CSIDL_Value_all = m_ShellConstants.get_value2(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_current;
*out++=(char)CSIDL_Value_all; *out++=(char)CSIDL_Value_all;
p = pShellConstName; p = pShellConstName;
@ -585,8 +587,8 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A
idx = DefineLangString(cp); idx = DefineLangString(cp);
if (idx < 0) if (idx < 0)
{ {
*out++ = (unsigned int)LANG_CODES_START; // Next word is lang-string Identifier *out++ = (unsigned int)NS_LANG_CODE; // Next word is lang-string Identifier
*(WORD*)out= (WORD) idx; *(WORD*)out= CODE_SHORT(-idx-1);
out += sizeof(WORD); out += sizeof(WORD);
p += strlen(cp) + 2; p += strlen(cp) + 2;
bProceced = true; bProceced = true;
@ -2231,7 +2233,8 @@ int CEXEBuild::write_output(void)
init_res_editor(); init_res_editor();
VerifyDeclaredUserVarRefs(&m_UserVarNames); VerifyDeclaredUserVarRefs(&m_UserVarNames);
int MaxUserVars = m_UserVarNames.getnum(); 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); ERROR_MSG("Internal compiler error #12346: invalid exehead cannot find section \"%s\"!\n", VARS_SECTION_NAME);
return PS_ERROR; return PS_ERROR;
@ -3218,9 +3221,9 @@ int CEXEBuild::DeclaredUserVar(const char *szVarName)
} }
m_UserVarNames.add(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_ERROR;
} }
return PS_OK; return PS_OK;
@ -3252,9 +3255,9 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token)
void CEXEBuild::VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList) 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)); warning("Variable \"%s\" not referenced, wasting memory!", pVarsStringList->idx2name(i));
} }

View file

@ -254,6 +254,7 @@ class CEXEBuild {
int GetUserVarIndex(LineParser &line, int token); int GetUserVarIndex(LineParser &line, int token);
// Added by ramon 3 jun 2003 // Added by ramon 3 jun 2003
UserVarsStringList m_UserVarNames; UserVarsStringList m_UserVarNames;
int m_iBaseVarsNum;
int DeclaredUserVar(const char *VarName); int DeclaredUserVar(const char *VarName);
void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList);

View file

@ -81,17 +81,39 @@ static DWORD WINAPI install_thread(LPVOID p);
HWND insthwnd, insthwnd2, insthwndbutton; 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) { static BOOL NSISCALL SetDlgItemTextFromLang_(HWND dlg, int id, int lid) {
return my_SetDialogItemText(dlg,id+1000,GetNSISStringTT(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 SetDlgItemTextFromLang(dlg,id,lid) SetDlgItemTextFromLang_(dlg,(id)-1000,lid)
#define SetUITextFromLang(it,la) SetDlgItemTextFromLang_(hwndDlg,(it)-1000,la) #define SetUITextFromLang(it,la) SetDlgItemTextFromLang_(hwndDlg,(it)-1000,la)
#define SetUITextNT(it,text) my_SetDialogItemText(hwndDlg,it,text) #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) #define GetUIItem(it) GetDlgItem(hwndDlg,it)
#ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT #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; header *header = g_header;
static WNDCLASS wc; // richedit subclassing and bgbg creation 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) 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); SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)1,lpData);
} }
if (uMsg==BFFM_SELCHANGED) 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 // But if quit called we must exit now
if (m_delta==1) if (ExecuteCodeSegment(this_page->leavefunc,NULL)) return !g_quit_flag; if (m_delta==1) if (ExecuteCodeSegment(this_page->leavefunc,NULL)) return !g_quit_flag;
#endif #endif
// if the last page was a custom page, wait for it to finish by itself. // if the last page was a custom page, wait for it to finish by itself.
// if it doesn't, it's a BAD plugin. // if it doesn't, it's a BAD plugin.
// plugins should react to WM_NOTIFY_OUTER_NEXT. // plugins should react to WM_NOTIFY_OUTER_NEXT.
if (!this_page->dlg_id) return 0; if (!this_page->dlg_id) return 0;
} }
SendMessage(m_curwnd, WM_NOTIFY_INIGO_MONTOYA, 0, 0); NotifyCurWnd(WM_NOTIFY_INIGO_MONTOYA);
nextPage: nextPage:
m_page+=m_delta; m_page+=m_delta;
@ -451,22 +473,32 @@ nextPage:
SetDlgItemTextFromLang(hwndDlg, IDOK, this_page->next); SetDlgItemTextFromLang(hwndDlg, IDOK, this_page->next);
SetDlgItemTextFromLang(hwndDlg, IDC_BACK, this_page->back); SetDlgItemTextFromLang(hwndDlg, IDC_BACK, this_page->back);
SetDlgItemTextFromLang(hwndDlg, IDCANCEL, this_page->cancel); SetDlgItemTextFromLang(hwndDlg, IDCANCEL, this_page->cancel);
hwndtmp = GetDlgItem(hwndDlg, IDC_BACK); hwndtmp = GetDlgItem(hwndDlg, IDC_BACK);
if (g_exec_flags.abort) if (g_exec_flags.abort)
{ {
pflags &= ~(PF_BACK_ENABLE | PF_NEXT_ENABLE); pflags &= ~(PF_BACK_ENABLE | PF_NEXT_ENABLE);
pflags |= PF_CANCEL_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 ShowWindow(hwndtmp, pflags & PF_BACK_SHOW);// SW_HIDE = 0, PF_BACK_SHOW = SW_SHOWNA = 8
EnableWindow(hwndtmp, pflags & PF_BACK_ENABLE); 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); 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); mystrcpy(g_tmp,g_caption);
GetNSISString(g_tmp+mystrlen(g_tmp),this_page->caption); GetNSISString(g_tmp+mystrlen(g_tmp),this_page->caption);
my_SetWindowText(hwndDlg,g_tmp); my_SetWindowText(hwndDlg,g_tmp);
@ -478,12 +510,15 @@ nextPage:
} }
#endif //NSIS_SUPPORT_CODECALLBACKS #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 { else {
if (g_exec_flags.abort) SetFocus(m_hwndCancel); if (!g_exec_flags.abort && g_exec_flags.autoclose)
else if (g_exec_flags.autoclose) goto nextPage; goto nextPage;
else SetFocus(m_hwndOK); // without focus button, the system Beeps every time user press one key // no need to go to skipPage because PWP_COMPLETED always follows PWP_INSTFILES
goto skipPage; return FALSE;
} }
// update g_this_page for the dialog proc // update g_this_page for the dialog proc
@ -509,15 +544,8 @@ nextPage:
ExecuteCodeSegment(this_page->showfunc,NULL); ExecuteCodeSegment(this_page->showfunc,NULL);
#endif //NSIS_SUPPORT_CODECALLBACKS #endif //NSIS_SUPPORT_CODECALLBACKS
ShowWindow(m_curwnd,SW_SHOWNA); 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) if (!ui_dlg_visible && m_curwnd)
{ {
ShowWindow(hwndDlg, SW_SHOW); ShowWindow(hwndDlg, SW_SHOWDEFAULT);
ui_dlg_visible = 1; ui_dlg_visible = 1;
} }
@ -559,8 +587,12 @@ skipPage:
{ {
int id = LOWORD(wParam); int id = LOWORD(wParam);
HWND hCtl = GetDlgItem(hwndDlg, id); HWND hCtl = GetDlgItem(hwndDlg, id);
if (hCtl && !IsWindowEnabled(hCtl)) if (hCtl)
return 0; {
SendMessage(hCtl, BM_SETSTATE, FALSE, 0);
if (!IsWindowEnabled(hCtl))
return 0;
}
if (id == IDOK) 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; page *m_this_page=g_this_page;
HWND hwLicense; HWND hwLicense;
static int ignoreWMCommand;
if (uMsg == WM_INITDIALOG) 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_LICENSEAGREE,this_page->parms[2]);
SetUITextFromLang(IDC_LICENSEDISAGREE,this_page->parms[3]); SetUITextFromLang(IDC_LICENSEDISAGREE,this_page->parms[3]);
SendMessage(GetUIItem(IDC_LICENSEAGREE+!selected),BM_SETCHECK,BST_CHECKED,0); CheckDlgButton(hwndDlg,IDC_LICENSEAGREE+!selected,BST_CHECKED);
EnableWindow(m_hwndOK,selected); EnableNext(selected);
hwLicense=GetUIItem(IDC_EDIT1); hwLicense=GetUIItem(IDC_EDIT1);
SetActiveCtl(hwndDlg, hwLicense);
SendMessage(hwLicense,EM_AUTOURLDETECT,TRUE,0); SendMessage(hwLicense,EM_AUTOURLDETECT,TRUE,0);
#define lbg g_header->license_bg #define lbg g_header->license_bg
SendMessage(hwLicense,EM_SETBKGNDCOLOR,0,lbg>=0?lbg:GetSysColor(-lbg)); 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; dwRead=0;
SendMessage(hwLicense,EM_EXLIMITTEXT,0,mystrlen(l)); SendMessage(hwLicense,EM_EXLIMITTEXT,0,mystrlen(l));
SendMessage(hwLicense,EM_STREAMIN,lt,(LPARAM)&es); SendMessage(hwLicense,EM_STREAMIN,lt,(LPARAM)&es);
//XGE 5th September 2002 - place the initial focus in the richedit control ignoreWMCommand = 0;
SetFocus(hwLicense);
return FALSE; 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) { if (m_this_page->flags & PF_LICENSE_FORCE_SELECTION) {
int is = SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED; int is = SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED;
m_this_page->flags &= ~PF_LICENSE_SELECTED; m_this_page->flags &= ~PF_LICENSE_SELECTED;
m_this_page->flags |= is; m_this_page->flags |= is;
EnableWindow( EnableNext(is);
m_hwndOK, SetNextDef();
is
);
} }
} }
if (uMsg == WM_NOTIFY) { if (uMsg == WM_NOTIFY) {
@ -712,6 +742,10 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
#undef enlink #undef enlink
#undef msgfilter #undef msgfilter
} }
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{
ignoreWMCommand++;
}
return HandleStaticBkColor(); return HandleStaticBkColor();
} }
#endif #endif
@ -750,7 +784,7 @@ static char * NSISCALL inttosizestr(int kb, char *str)
return str; return str;
} }
static int NSISCALL getreqsize() static int NSISCALL _sumsecsfield(int idx)
{ {
int x,total; int x,total;
section *sections = g_sections; section *sections = g_sections;
@ -759,19 +793,22 @@ static int NSISCALL getreqsize()
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
if (sections[x].flags & SF_SELECTED) if (sections[x].flags & SF_SELECTED)
#endif #endif
total += sections[x].size_kb; total += sections[x].fields[idx];
} }
return total; return total;
} }
#define sumsecsfield(x) _sumsecsfield(SECTION_OFFSET(x))
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
static int dontsetdefstyle;
page *thispage = g_this_page; page *thispage = g_this_page;
char *dir = g_usrvars[thispage->parms[4]]; char *dir = g_usrvars[thispage->parms[4]];
int browse_text = thispage->parms[3]; int browse_text = thispage->parms[3];
if (uMsg == WM_NOTIFY_INIGO_MONTOYA) if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{ {
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); GetUIText(IDC_DIR,dir);
validate_filename(dir); validate_filename(dir);
#ifdef NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_LOG
#ifndef NSIS_CONFIG_LOG_ODS #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); SetUITextNT(IDC_DIR,dir);
SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]);
SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]);
SetActiveCtl(hwndDlg, GetUIItem(IDC_DIR));
} }
if (uMsg == WM_COMMAND) if (uMsg == WM_COMMAND)
{ {
@ -805,11 +843,10 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
} }
if (id == IDC_BROWSE) if (id == IDC_BROWSE)
{ {
char name[MAX_PATH];
BROWSEINFO bi = {0,}; BROWSEINFO bi = {0,};
ITEMIDLIST *idlist; ITEMIDLIST *idlist;
bi.hwndOwner = hwndDlg; bi.hwndOwner = hwndDlg;
bi.pszDisplayName = name; bi.pszDisplayName = g_tmp;
bi.lpfn = BrowseCallbackProc; bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)dir; bi.lParam = (LPARAM)dir;
bi.lpszTitle = GetNSISStringTT(browse_text); bi.lpszTitle = GetNSISStringTT(browse_text);
@ -821,19 +858,20 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
if (idlist) if (idlist)
{ {
// Get and free idlist // Get and free idlist
my_PIDL2Path(name, idlist); my_PIDL2Path(g_tmp, idlist);
if (g_header->install_directory_auto_append) if (g_header->install_directory_auto_append)
{ {
const char *post_str=ps_tmpbuf; const char *post_str=ps_tmpbuf;
GetNSISStringTT(g_header->install_directory_auto_append); GetNSISStringTT(g_header->install_directory_auto_append);
// name gives just the folder name // name gives just the folder name
if (lstrcmpi(post_str,name)) if (lstrcmpi(post_str,g_tmp))
{ {
lstrcat(addtrailingslash(dir),post_str); lstrcat(addtrailingslash(dir),post_str);
} }
} }
dontsetdefstyle++;
SetUITextNT(IDC_DIR,dir); SetUITextNT(IDC_DIR,dir);
} }
} }
@ -846,7 +884,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
int total, available=-1; int total, available=-1;
DWORD spc,bps,fc,tc; DWORD spc,bps,fc,tc;
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); GetUIText(IDC_DIR,dir);
if (!is_valid_instpath(dir)) if (!is_valid_instpath(dir))
error = NSIS_INSTDIR_INVALID; error = NSIS_INSTDIR_INVALID;
@ -862,7 +900,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
available=(int)r; available=(int)r;
} }
total = getreqsize(); total = sumsecsfield(size_kb);
if ((unsigned int)available < (unsigned int)total) if ((unsigned int)available < (unsigned int)total)
error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; 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) if (thispage->flags & PF_DIR_NO_BTN_DISABLE)
error = 0; error = 0;
EnableWindow(m_hwndOK, !error); EnableNext(!error);
if (!error && !dontsetdefstyle)
SetNextDef();
dontsetdefstyle = 0;
} }
return HandleStaticBkColor(); return HandleStaticBkColor();
} }
@ -901,7 +942,7 @@ static int NSISCALL SetChildrenStates(HWND hwTree, HTREEITEM hItem, int iChecked
int iCheckedChildren = 0, iChildren = 0, *pFlags, iState = 1; int iCheckedChildren = 0, iChildren = 0, *pFlags, iState = 1;
HTREEITEM hItrItem; HTREEITEM hItrItem;
TVITEM tvItem; TVITEM tvItem;
hItrItem = TreeView_GetChild(hwTree, hItem); hItrItem = TreeView_GetChild(hwTree, hItem);
while (hItrItem) while (hItrItem)
{ {
@ -909,12 +950,12 @@ static int NSISCALL SetChildrenStates(HWND hwTree, HTREEITEM hItem, int iChecked
iChildren++; iChildren++;
hItrItem = TreeView_GetNextSibling(hwTree, hItrItem); hItrItem = TreeView_GetNextSibling(hwTree, hItrItem);
} }
tvItem.hItem = hItem; tvItem.hItem = hItem;
tvItem.mask = TVIF_PARAM | TVIF_STATE; tvItem.mask = TVIF_PARAM | TVIF_STATE;
tvItem.stateMask = TVIS_STATEIMAGEMASK; tvItem.stateMask = TVIS_STATEIMAGEMASK;
TreeView_GetItem(hwTree, &tvItem); TreeView_GetItem(hwTree, &tvItem);
pFlags = &(g_sections[tvItem.lParam].flags); pFlags = &(g_sections[tvItem.lParam].flags);
if (*pFlags & SF_RO) if (*pFlags & SF_RO)
@ -995,10 +1036,10 @@ HTREEITEM NSISCALL TreeHitTest(HWND tree)
ht.pt.x = GET_X_LPARAM(dwpos); ht.pt.x = GET_X_LPARAM(dwpos);
ht.pt.y = GET_Y_LPARAM(dwpos); ht.pt.y = GET_Y_LPARAM(dwpos);
MapWindowPoints(HWND_DESKTOP, tree, &ht.pt, 1); ScreenToClient(tree, &ht.pt);
TreeView_HitTest(tree, &ht); TreeView_HitTest(tree, &ht);
if (ht.flags & (TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM)) if (ht.flags & (TVHT_ONITEMSTATEICON|TVHT_ONITEMLABEL|TVHT_ONITEMRIGHT|TVHT_ONITEM))
return ht.hItem; return ht.hItem;
@ -1009,9 +1050,9 @@ static LONG oldTreeWndProc;
static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
static LPARAM last_item=-1; 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 defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT)
if (uMsg == WM_DESTROY) { if (uMsg == WM_DESTROY) {
@ -1020,9 +1061,9 @@ static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
if (uMsg == WM_MOUSEMOVE) { if (uMsg == WM_MOUSEMOVE) {
TVITEM tvItem; TVITEM tvItem;
if (GetWindowLong(hwnd, GWL_STYLE) & WS_VISIBLE) { if (IsWindowVisible(hwnd)) {
tvItem.hItem = TreeHitTest(hwnd); tvItem.hItem = TreeHitTest(hwnd);
lParam = -1; lParam = -1;
if (tvItem.hItem) if (tvItem.hItem)
@ -1030,7 +1071,7 @@ static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
tvItem.mask = TVIF_PARAM; tvItem.mask = TVIF_PARAM;
TreeView_GetItem(hwnd, &tvItem); TreeView_GetItem(hwnd, &tvItem);
lParam = tvItem.lParam; lParam = tvItem.lParam;
} }
uMsg = WM_NOTIFY_SELCHANGE; 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); HWND hwndTree1 = GetUIItem(IDC_TREE1);
extern HWND g_SectionHack; extern HWND g_SectionHack;
section *sections=g_sections; section *sections=g_sections;
int *install_types=g_header->install_types;
if (uMsg == WM_INITDIALOG) if (uMsg == WM_INITDIALOG)
{ {
int doLines=0; int doLines=0;
@ -1071,14 +1113,11 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
g_SectionHack=hwndDlg; g_SectionHack=hwndDlg;
if (hTreeItems) GlobalFree(hTreeItems);
hTreeItems=(HTREEITEM*)my_GlobalAlloc(sizeof(HTREEITEM)*num_sections); hTreeItems=(HTREEITEM*)my_GlobalAlloc(sizeof(HTREEITEM)*num_sections);
hBMcheck1=LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); hBMcheck1=LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
oldTreeWndProc=SetWindowLong(hwndTree1,GWL_WNDPROC,(DWORD)newTreeWndProc); oldTreeWndProc=SetWindowLong(hwndTree1,GWL_WNDPROC,(long)newTreeWndProc);
if (hImageList) ImageList_Destroy(hImageList);
hImageList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 6, 0); hImageList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 6, 0);
ImageList_AddMasked(hImageList,hBMcheck1,RGB(255,0,255)); 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++) for (i = 0; i < NSIS_MAX_INST_TYPES+1; i++)
{ {
if (g_header->install_types[i]) if (install_types[i])
{ {
int j; int j;
if (i != NSIS_MAX_INST_TYPES) noCombo = 0; 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); j=SendMessage(hwndCombo1,CB_ADDSTRING,0,(LPARAM)g_tmp);
SendMessage(hwndCombo1,CB_SETITEMDATA,j,i); SendMessage(hwndCombo1,CB_SETITEMDATA,j,i);
if (i == g_exec_flags.cur_insttype) 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_TEXT1,this_page->parms[1+noCombo]);
SetUITextFromLang(IDC_TEXT2,this_page->parms[2+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); 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; uMsg = g_exec_flags.insttype_changed ? WM_NOTIFY_INSTTYPE_CHANGE : WM_IN_UPDATEMSG;
} }
if (uMsg == WM_NOTIFY_SECTEXT) // update text 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 || if (uMsg == WM_NOTIFY_INSTTYPE_CHANGE ||
(uMsg == WM_COMMAND && LOWORD(wParam)==IDC_COMBO1 && HIWORD(wParam)==CBN_SELCHANGE)) (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) if (uMsg == WM_NOTIFY_INSTTYPE_CHANGE || t != CB_ERR)
{ {
int whichcfg=SendMessage(hwndCombo1,CB_GETITEMDATA,t,0); 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; else lParam = 1;
if (whichcfg == CB_ERR || !(g_header->install_types[whichcfg])) if (whichcfg == CB_ERR || !(install_types[whichcfg]))
whichcfg = NSIS_MAX_INST_TYPES; whichcfg = NSIS_MAX_INST_TYPES;
if (whichcfg != NSIS_MAX_INST_TYPES) // not custom 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 (hImageList) ImageList_Destroy(hImageList);
if (hTreeItems) GlobalFree(hTreeItems); if (hTreeItems) GlobalFree(hTreeItems);
hTreeItems=0; hImageList=NULL;
g_SectionHack=0; hTreeItems=NULL;
g_SectionHack=NULL;
} }
if (uMsg == WM_IN_UPDATEMSG) if (uMsg == WM_IN_UPDATEMSG)
{ {
@ -1362,7 +1407,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
section *t=sections; section *t=sections;
x=num_sections; x=num_sections;
if (!g_header->install_types[r]) continue; if (!install_types[r]) continue;
while (x--) while (x--)
{ {
@ -1387,8 +1432,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
} // end of typecheckshit } // end of typecheckshit
if (LANG_STR_TAB(LANG_SPACE_REQ)) { if (LANG_STR_TAB(LANG_SPACE_REQ)) {
char s[128]; SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(sumsecsfield(size_kb),GetNSISString(g_tmp,LANG_SPACE_REQ)));
SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(getreqsize(),GetNSISString(s,LANG_SPACE_REQ)));
} }
} }
@ -1448,14 +1493,18 @@ static DWORD WINAPI install_thread(LPVOID p)
} }
#endif #endif
while (m_inst_sec<num_sections && !g_exec_flags.abort) while (m_inst_sec<num_sections)
{ {
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
if (g_sections[m_inst_sec].flags&SF_SELECTED) if (g_sections[m_inst_sec].flags&SF_SELECTED)
#endif #endif
{ {
log_printf2("Section: \"%s\"",GetNSISStringTT(g_sections[m_inst_sec].name_ptr)); log_printf2("Section: \"%s\"",GetNSISStringTT(g_sections[m_inst_sec].name_ptr));
if (ExecuteCodeSegment(g_sections[m_inst_sec].code,progresswnd)) g_exec_flags.abort++; if (ExecuteCodeSegment(g_sections[m_inst_sec].code,progresswnd))
{
g_exec_flags.abort++;
break;
}
} }
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
else else
@ -1465,7 +1514,7 @@ static DWORD WINAPI install_thread(LPVOID p)
#endif #endif
m_inst_sec++; m_inst_sec++;
} }
if (m_curwnd) SendMessage(m_curwnd,WM_NOTIFY_INSTPROC_DONE,0,0); NotifyCurWnd(WM_NOTIFY_INSTPROC_DONE);
#if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT) #if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT)
OleUninitialize(); OleUninitialize();
@ -1487,21 +1536,15 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
RECT r; RECT r;
LVCOLUMN lvc = {LVCF_WIDTH, 0, -1, 0, 0, -1}; LVCOLUMN lvc = {LVCF_WIDTH, 0, -1, 0, 0, -1};
int lb_bg=g_header->lb_bg,lb_fg=g_header->lb_fg; int lb_bg=g_header->lb_bg,lb_fg=g_header->lb_fg;
int x=num_sections;
insthwndbutton=GetUIItem(IDC_SHOWDETAILS); insthwndbutton=GetUIItem(IDC_SHOWDETAILS);
insthwnd2=GetUIItem(IDC_INTROTEXT); insthwnd2=GetUIItem(IDC_INTROTEXT);
linsthwnd=insthwnd=GetUIItem(IDC_LIST1); linsthwnd=insthwnd=GetUIItem(IDC_LIST1);
progress_bar_len=0; progress_bar_len=sumsecsfield(code_size);
progress_bar_pos=0; progress_bar_pos=0;
log_printf3("New install of \"%s\" to \"%s\"",GetNSISStringTT(LANG_NAME),state_install_directory); 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); GetClientRect(linsthwnd, &r);
lvc.cx = r.right - GetSystemMetrics(SM_CXHSCROLL); 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(insthwndbutton,SW_HIDE);
ShowWindow(linsthwnd,SW_SHOWNA); ShowWindow(linsthwnd,SW_SHOWNA);
SetNextDef();
} }
if (uMsg == WM_NOTIFY_INSTPROC_DONE) 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 //>>>Ximon Eighteen aka Sunjammer 30th August 2002
//+++Popup "Copy Details To Clipboard" menu when RMB clicked in DetailView //+++Popup "Copy Details To Clipboard" menu when RMB clicked in DetailView
//+++Currently this has no language support for the popup menu tex //+++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); int count = ListView_GetItemCount(linsthwnd);
if (count > 0) if (count > 0)
{ {
DWORD pos = GetMessagePos();
HMENU menu = CreatePopupMenu(); HMENU menu = CreatePopupMenu();
POINT pt;
AppendMenu(menu,MF_STRING,1,GetNSISStringTT(LANG_COPYDETAILS)); 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( if (1==TrackPopupMenu(
menu, menu,
TPM_NONOTIFY|TPM_RETURNCMD, TPM_NONOTIFY|TPM_RETURNCMD,
GET_X_LPARAM(pos), pt.x,
GET_Y_LPARAM(pos), pt.y,
0,linsthwnd,0)) 0,linsthwnd,0))
{ {
char textBuf[1024];
int i,total = 1; // 1 for the null char int i,total = 1; // 1 for the null char
LVITEM item; LVITEM item;
HGLOBAL memory; HGLOBAL memory;
@ -1585,8 +1640,8 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
// 1st pass - determine clipboard memory required. // 1st pass - determine clipboard memory required.
item.iSubItem = 0; item.iSubItem = 0;
item.pszText = textBuf; item.pszText = g_tmp;
item.cchTextMax = 1023; item.cchTextMax = sizeof(g_tmp) - 1;
i = count; i = count;
while (i--) while (i--)
// Add 2 for the CR/LF combination that must follow every line. // Add 2 for the CR/LF combination that must follow every line.

View file

@ -391,27 +391,10 @@
#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
#endif #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" #define VARS_SECTION_NAME ".ndata"
typedef char NSIS_STRING[NSIS_MAX_STRLEN]; 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//!APSTUDIO_INVOKED
#endif // NSIS_CONFIG_H #endif // NSIS_CONFIG_H

View file

@ -315,16 +315,22 @@ typedef struct
#define SF_EXPAND 32 #define SF_EXPAND 32
#define SF_PSELECTED 64 #define SF_PSELECTED 64
typedef struct typedef union
{ {
int name_ptr; // '' for non-optional components struct
int install_types; // bits set for each of the different install_types, if any. {
int flags; // SF_* - defined above int name_ptr; // '' for non-optional components
int code; int install_types; // bits set for each of the different install_types, if any.
int code_size; int flags; // SF_* - defined above
int size_kb; int code;
int code_size;
int size_kb;
};
int fields[1];
} section; } section;
#define SECTION_OFFSET(field) (FIELD_OFFSET(section, field)/sizeof(int))
typedef struct typedef struct
{ {
int which; int which;
@ -427,9 +433,14 @@ DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove);
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value. // $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
// Added by ramon 3 jun 2003 // Added by ramon 3 jun 2003
#define VAR_CODES_START 252 #define NS_SKIP_CODE 252
#define SHELL_CODES_START 253 #define NS_VAR_CODE 253
#define LANG_CODES_START 254 #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_INVALID 1
#define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2 #define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2

View file

@ -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_command_line g_usrvars[20]
#define state_install_directory g_usrvars[21] #define state_install_directory g_usrvars[21]

View file

@ -3,7 +3,7 @@
extern int *cur_langtable; 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); void NSISCALL update_status_text(int strtab, const char *text2);
extern int ui_st_updateflag; extern int ui_st_updateflag;

View file

@ -22,7 +22,7 @@ char g_log_file[1024];
// which result in extra memory for extra variables without code to do allocation :) // which result in extra memory for extra variables without code to do allocation :)
// nsis then removes the "DISCARDABLE" style from section (for safe) // nsis then removes the "DISCARDABLE" style from section (for safe)
#pragma bss_seg( VARS_SECTION_NAME ) #pragma bss_seg( VARS_SECTION_NAME )
NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; NSIS_STRING g_usrvars[1];
#pragma bss_seg() #pragma bss_seg()
#define SECTION_VARS_RWD "/section:" ## VARS_SECTION_NAME ## ",rwd" #define SECTION_VARS_RWD "/section:" ## VARS_SECTION_NAME ## ",rwd"
#pragma comment(linker, SECTION_VARS_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) HANDLE NSISCALL myCreateProcess(char *cmd, char *dir)
{ {
DWORD d; DWORD d;
static PROCESS_INFORMATION ProcInfo; PROCESS_INFORMATION ProcInfo;
STARTUPINFO StartUp = {sizeof(StartUp), }; static STARTUPINFO StartUp;
StartUp.cb=sizeof(StartUp);
d=GetFileAttributes(dir); 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)) if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, dir, &StartUp, &ProcInfo))
return NULL; return NULL;
CloseHandle(ProcInfo.hThread); 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); //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 NSISCALL my_MessageBox(const char *text, UINT type) {
int _type = type & 0x000FFFFF;
// default for silent installers // default for silent installers
if (g_exec_flags.silent && type >> 20) if (g_exec_flags.silent && type >> 20)
return type >> 20; return type >> 20;
// no silent or no default, just show // no silent or no default, just show
if (!g_exec_flags.rtl) if (g_exec_flags.rtl)
return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF); _type ^= MB_RIGHT | MB_RTLREADING;
else return MessageBox(g_hwnd, text, g_caption, _type);
return MessageBox(g_hwnd, text, g_caption, (type & 0x000FFFFF) ^ (MB_RIGHT | MB_RTLREADING));
} }
void * NSISCALL my_GlobalAlloc(DWORD dwBytes) { void * NSISCALL my_GlobalAlloc(DWORD dwBytes) {
@ -102,7 +100,7 @@ void NSISCALL doRMDir(char *buf, int flags) // 1 - recurse, 2 - rebootok
if (flags&1) { if (flags&1) {
SHFILEOPSTRUCT op; SHFILEOPSTRUCT op;
op.hwnd=0; op.hwnd=g_hwnd;
op.wFunc=FO_DELETE; op.wFunc=FO_DELETE;
buf[mystrlen(buf)+1]=0; buf[mystrlen(buf)+1]=0;
op.pFrom=buf; op.pFrom=buf;
@ -472,12 +470,23 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
} }
while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN) while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN)
{ {
int nVarIdx = (unsigned char)*in++; unsigned char nVarIdx = (unsigned char)*in++;
if (nVarIdx == 255) 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++; *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 1: the code CSIDL_PRINTERS, is used for QUICKLAUNCH
// NOTE 2: the code CSIDL_BITBUCKET is used for COMMONFILES // NOTE 2: the code CSIDL_BITBUCKET is used for COMMONFILES
@ -485,19 +494,10 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
LPITEMIDLIST idl; LPITEMIDLIST idl;
char *append = 0; 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; int x = 0;
*out = 0; *out = 0;
in += 2;
if (fldrs[2] == CSIDL_PRINTERS) // QUICKLAUNCH if (fldrs[2] == CSIDL_PRINTERS) // QUICKLAUNCH
{ {
append = "\\Microsoft\\Internet Explorer\\Quick Launch"; append = "\\Microsoft\\Internet Explorer\\Quick Launch";
@ -550,27 +550,23 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
validate_filename(out); validate_filename(out);
out += mystrlen(out); out += mystrlen(out);
} }
else if (nVarIdx == VAR_CODES_START) else if (nVarIdx == NS_VAR_CODE)
{ {
nVarIdx = (*(WORD*)in - 1) & 0x7FFF; if (nData == 27) // HWNDPARENT
in += sizeof(WORD);
if (nVarIdx == 27) // HWNDPARENT
myitoa(out, (unsigned int) g_hwnd); myitoa(out, (unsigned int) g_hwnd);
else else
mystrcpy(out, g_usrvars[nVarIdx]); mystrcpy(out, g_usrvars[nData]);
// validate the directory name // 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 // validate paths for $INSTDIR, $OUTDIR, $EXEDIR, $LANGUAGE, $TEMP and $PLUGINSDIR
// $LANGUAGE is just a number anyway... // $LANGUAGE is just a number anyway...
validate_filename(out); validate_filename(out);
} }
out += mystrlen(out); out += mystrlen(out);
} // == VAR_CODES_START } // == VAR_CODES_START
else if (nVarIdx == LANG_CODES_START) else if (nVarIdx == NS_LANG_CODE)
{ {
nVarIdx = *(short*)in; GetNSISString(out, -nData-1);
in += sizeof(short);
GetNSISString(out, nVarIdx);
out += mystrlen(out); out += mystrlen(out);
} }
else // Normal char else // Normal char

View file

@ -19,10 +19,11 @@ int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl);
//BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); //BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val);
#define my_SetWindowText SetWindowText #define my_SetWindowText SetWindowText
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val); 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); //int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size);
#define my_GetWindowText GetWindowText #define my_GetWindowText GetWindowText
//int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size); int NSISCALL my_GetDialogItemText(UINT idx, char *val);
#define my_GetDialogItemText GetDlgItemText //#define my_GetDialogItemText GetDlgItemText
#ifdef NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_LOG
extern char log_text[NSIS_MAX_STRLEN*4]; extern char log_text[NSIS_MAX_STRLEN*4];

View file

@ -286,6 +286,17 @@ int CEXEBuild::GenerateLangTables() {
SCRIPT_MSG("Generating language tables... "); 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 we have no tables (user didn't set any string and didn't load any NLF) create the default one
if (!lang_tables.getlen()) { if (!lang_tables.getlen()) {
LANGID lang = NSIS_DEFAULT_LANG; LANGID lang = NSIS_DEFAULT_LANG;
@ -334,7 +345,7 @@ int CEXEBuild::GenerateLangTables() {
#undef ADD_FONT #undef ADD_FONT
} }
catch (exception& err) { 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; return PS_ERROR;
} }
} }
@ -390,7 +401,7 @@ int CEXEBuild::GenerateLangTables() {
#undef ADD_FONT #undef ADD_FONT
} }
catch (exception& err) { 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; return PS_ERROR;
} }
@ -411,7 +422,9 @@ int CEXEBuild::GenerateLangTables() {
build_langtables.add(&rtl, sizeof(int)); 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; cnt = 0;
tabsset = 1; tabsset = 1;
@ -426,6 +439,7 @@ int CEXEBuild::GenerateLangTables() {
lang_strings = build_langstrings.sort_index(&l); lang_strings = build_langstrings.sort_index(&l);
for (j = 0; j < l; j++) { for (j = 0; j < l; j++) {
lst = (int *)((char *)build_langtables.get() + oldlen);
if (lang_strings[j].index >= 0) { if (lang_strings[j].index >= 0) {
if (cnt >= lastcnt || !lst[lang_strings[j].index]) { if (cnt >= lastcnt || !lst[lang_strings[j].index]) {
const char *str = lt[i].lang_strings->get(lang_strings[j].sn); 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 // optimize langstrings and check for recursion
TinyGrowBuf rec; TinyGrowBuf rec;
for (j = 0; j < build_langstring_num; j++) { for (j = 0; j < build_langstring_num; j++) {
@ -498,7 +514,9 @@ int CEXEBuild::GenerateLangTables() {
ubuild_langtables.add(&rtl, sizeof(int)); 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; cnt = 0;
tabsset = 1; tabsset = 1;
@ -513,6 +531,7 @@ int CEXEBuild::GenerateLangTables() {
lang_strings = build_langstrings.sort_uindex(&l); lang_strings = build_langstrings.sort_uindex(&l);
for (j = 0; j < l; j++) { for (j = 0; j < l; j++) {
lst = (int *)((char *)ubuild_langtables.get() + oldlen);
if (lang_strings[j].uindex >= 0) { if (lang_strings[j].uindex >= 0) {
if (cnt >= lastcnt || !lst[lang_strings[j].uindex]) { if (cnt >= lastcnt || !lst[lang_strings[j].uindex]) {
const char *str = lt[i].lang_strings->get(lang_strings[j].sn); 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 // optimize langstrings and check for recursion
TinyGrowBuf rec; TinyGrowBuf rec;
for (j = 0; j < ubuild_langstring_num; j++) { for (j = 0; j < ubuild_langstring_num; j++) {

View file

@ -4985,7 +4985,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
{ {
SCRIPT_MSG("VAR \"%s\"\n",line.gettoken_str(1)); SCRIPT_MSG("VAR \"%s\"\n",line.gettoken_str(1));
int res = DeclaredUserVar(line.gettoken_str(1)); int res = DeclaredUserVar(line.gettoken_str(1));
if ( res != PS_OK ) if (res != PS_OK)
return res; return res;
} }
return PS_OK; return PS_OK;