diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index 82d5f034..d093c7cf 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -41,10 +41,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd g_sdata.script_alloced=false; g_sdata.defines = NULL; RestoreDefines(); + RestoreMRUList(); g_sdata.script=GetCommandLine(); if (*g_sdata.script=='"') { g_sdata.script++; while (*g_sdata.script && *g_sdata.script++!='"' ); } else while (*g_sdata.script!=' ' && *g_sdata.script) g_sdata.script++; while (*g_sdata.script==' ') g_sdata.script++; + PushMRUFile(g_sdata.script); if (!InitBranding()) { MessageBox(0,NSISERROR,"Error",MB_ICONEXCLAMATION|MB_OK); return 1; @@ -112,6 +114,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { case WM_DESTROY: { SaveDefines(); + SaveMRUList(); SaveWindowPos(g_sdata.hwnd); DestroyTooltips(); PostQuitMessage(0); @@ -143,6 +146,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { g_sdata.script_alloced = true; g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7); wsprintf(g_sdata.script,"\"%s\"",szTmp); + PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } @@ -246,6 +250,17 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { } return TRUE; } + case WM_MENUSELECT: + { + HMENU hMenu = (HMENU)lParam; + UINT id = (UINT)LOWORD(wParam); + UINT flags = (UINT)HIWORD(wParam); + if(hMenu == g_sdata.menu && id == 0 && (flags & MF_POPUP) == MF_POPUP) { + hMenu = GetSubMenu(hMenu, id); + BuildMRUMenu(hMenu); + } + return TRUE; + } case WM_COMMAND: { switch (LOWORD(wParam)) { @@ -317,12 +332,20 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { if (GetOpenFileName(&l)) { g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3); wsprintf(g_sdata.script,"\"%s\"",buf); + PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } + case IDM_MRU_FILE: + case IDM_MRU_FILE+1: + case IDM_MRU_FILE+2: + case IDM_MRU_FILE+3: + case IDM_MRU_FILE+4: + LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); + return TRUE; #ifdef COMPRESSOR_OPTION case IDM_COMPRESSOR: { diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index 9d356068..c1947779 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -46,6 +46,7 @@ #define REGLOC "MakeNSISWPlacement" #define REGDEFSUBKEY "Defines" #define REGDEFCOUNT "MakeNSISWDefinesCount" +#define REGMRUSUBKEY "MRU" #define EXENAME "makensis.exe" #define MAX_STRING 256 #define TIMEOUT 100 @@ -85,6 +86,8 @@ BOOL SetCompressor(WORD); #endif void RestoreDefines(); void SaveDefines(); +void RestoreMRUList(); +void SaveMRUList(); typedef struct NSISScriptData { bool script_alloced; diff --git a/Contrib/Makensisw/resource.h b/Contrib/Makensisw/resource.h index 56fd4e6b..54400cf2 100644 --- a/Contrib/Makensisw/resource.h +++ b/Contrib/Makensisw/resource.h @@ -9,9 +9,6 @@ #define IDS_FIND 5 #define IDS_RECOMPILE 6 #define IDS_DEFINES 7 -#ifdef COMPRESSOR_OPTION -#define IDS_COMPRESSOR 8 -#endif #define IDS_TEST 9 #define IDS_EDITSCRIPT 10 #define IDS_BROWSESCR 11 @@ -55,9 +52,6 @@ #define IDRIGHT 1019 #define IDLEFT 1020 #define IDC_DEFINES 1021 -#ifdef COMPRESSOR_OPTION -#define IDM_COMPRESSOR 40001 -#endif #define IDM_TEST 40002 #define IDM_EDITSCRIPT 40003 #define IDM_DOCS 40004 @@ -72,13 +66,14 @@ #define IDM_DEFAULT 40020 #define IDM_ZLIB 40021 #define IDM_GZIP 40022 +#define IDM_MRU_FILE 40023 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 124 -#define _APS_NEXT_COMMAND_VALUE 40023 +#define _APS_NEXT_COMMAND_VALUE 40029 #define _APS_NEXT_CONTROL_VALUE 1023 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Contrib/Makensisw/resource.rc b/Contrib/Makensisw/resource.rc index df6fc9a3..863525fa 100644 --- a/Contrib/Makensisw/resource.rc +++ b/Contrib/Makensisw/resource.rc @@ -70,6 +70,8 @@ BEGIN MENUITEM "&Load Script...\tCtrl+L", IDM_LOADSCRIPT MENUITEM SEPARATOR MENUITEM "E&xit\tAlt+X", IDM_EXIT + MENUITEM SEPARATOR + MENUITEM "", IDM_MRU_FILE END POPUP "&Edit" BEGIN diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index ff328e14..7fc2f502 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -28,6 +28,8 @@ NTOOLTIP g_tip; LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam); +char g_mru_files[MRU_SIZE][MAX_PATH] = { NULL, NULL, NULL, NULL, NULL }; + extern NSCRIPTDATA g_sdata; void SetTitle(HWND hwnd,char *substr) { @@ -406,4 +408,133 @@ char* BuildDefines() } return buf; -} \ No newline at end of file +} + +BOOL PopMRUFile(char* fname) +{ + int i; + + for(i=0; i= 0; i--) { + lstrcpy(g_mru_files[i+1], g_mru_files[i]); + } + lstrcpy(g_mru_files[0],buf); +} + +void BuildMRUMenu(HMENU hMenu) +{ + int i; + MENUITEMINFO mii; + + for(i = 0; i < MRU_SIZE; i++) { + DeleteMenu(hMenu, IDM_MRU_FILE+i, MF_BYCOMMAND); + } + + for(i = 0; i < MRU_SIZE; i++) { + if(g_mru_files[i][0]) { + my_memset(&mii, 0, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.wID = IDM_MRU_FILE+i; + mii.fType = MFT_STRING; + mii.dwTypeData = g_mru_files[i]; + mii.cch = sizeof(g_mru_files[i]); + mii.fState = MFS_ENABLED; + InsertMenuItem(hMenu, IDM_MRU_FILE+i, TRUE, &mii); + } + else { + break; + } + } +} + +void LoadMRUFile(int position) +{ + if (!g_sdata.thread && position >=0 && position < MRU_SIZE && g_mru_files[position][0]) { + g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(g_mru_files[position])+3); + wsprintf(g_sdata.script,"\"%s\"",g_mru_files[position]); + PushMRUFile(g_sdata.script); + ResetObjects(); + CompileNSISScript(); + } +} + +void RestoreMRUList() +{ + HKEY hKey; + HKEY hSubKey; + int n = 0; + int i; + if (RegOpenKeyEx(REGSEC,REGKEY,0,KEY_READ,&hKey) == ERROR_SUCCESS) { + if (RegCreateKey(hKey,REGMRUSUBKEY,&hSubKey) == ERROR_SUCCESS) { + char buf[8]; + DWORD l; + for(int i=0; i