diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index d64d7c71..efd438cf 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -41,7 +41,6 @@ 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++; @@ -107,29 +106,10 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,NULL,ENM_SELCHANGE); DragAcceptFiles(g_sdata.hwnd,FALSE); g_sdata.menu = GetMenu(g_sdata.hwnd); - g_sdata.submenu = GetSubMenu(g_sdata.menu,1); - { - OSVERSIONINFO osvi; - my_memset(&osvi, 0, sizeof(osvi)); - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionEx(&osvi); - if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - // This is a hack because Win9x & WinNT/2000/XP behave differently for WM_MENUSELECT - MENUITEMINFO mii; - my_memset(&mii, 0, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID; - - GetMenuItemInfo(g_sdata.menu, FILE_MENU_INDEX, TRUE, &mii); - g_sdata.fileMenuId = mii.wID; - GetMenuItemInfo(g_sdata.menu, TOOLS_MENU_INDEX, TRUE, &mii); - g_sdata.toolsMenuId = mii.wID; - } - else { - g_sdata.fileMenuId = FILE_MENU_INDEX; - g_sdata.toolsMenuId = TOOLS_MENU_INDEX; - } - } + g_sdata.fileSubmenu = GetSubMenu(g_sdata.menu, FILE_MENU_INDEX); + g_sdata.editSubmenu = GetSubMenu(g_sdata.menu, EDIT_MENU_INDEX); + g_sdata.toolsSubmenu = GetSubMenu(g_sdata.menu, TOOLS_MENU_INDEX); + RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); #ifdef COMPRESSOR_OPTION @@ -174,8 +154,10 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { } case WM_CONTEXTMENU: { + // This does not work on Windows versions < Windows 2000 + // See http://support.microsoft.com:80/support/kb/articles/Q245/7/54.asp if ((HWND)wParam==GetDlgItem(g_sdata.hwnd,IDC_LOGWIN)) { - TrackPopupMenu(g_sdata.submenu,NULL,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),0,g_sdata.hwnd,0); + TrackPopupMenu(g_sdata.editSubmenu,NULL,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),0,g_sdata.hwnd,0); } return TRUE; } @@ -293,22 +275,6 @@ 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 && (flags & MF_POPUP) == MF_POPUP) { - if(id == g_sdata.fileMenuId) { // File menu - BuildMRUMenu(GetSubMenu(hMenu, id)); - } - else if (id == g_sdata.toolsMenuId) { // Tools menu - SetClearMRUListMenuitemState(GetSubMenu(hMenu, id)); - } - } - return TRUE; - } case WM_COMMAND: { switch (LOWORD(wParam)) { diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index ba8be21f..4278def2 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -53,7 +53,8 @@ #define MINWIDTH 350 #define MINHEIGHT 180 #define FILE_MENU_INDEX 0 -#define TOOLS_MENU_INDEX 2 +#define EDIT_MENU_INDEX 1 +#define TOOLS_MENU_INDEX 2 #define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001) @@ -106,9 +107,9 @@ typedef struct NSISScriptData { HINSTANCE hInstance; HWND hwnd; HMENU menu; - UINT fileMenuId; - UINT toolsMenuId; - HMENU submenu; + HMENU fileSubmenu; + HMENU editSubmenu; + HMENU toolsSubmenu; HANDLE thread; HWND focused_hwnd; CHARRANGE textrange; diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index d3481c93..e71a4efb 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -464,10 +464,12 @@ void PushMRUFile(char* fname) lstrcpy(g_mru_list[i+1], g_mru_list[i]); } lstrcpy(g_mru_list[0],full_file_name); + BuildMRUMenus(); } -void BuildMRUMenu(HMENU hMenu) +void BuildMRUMenus() { + HMENU hMenu = g_sdata.fileSubmenu; int i; MENUITEMINFO mii; char buf[MRU_DISPLAY_LENGTH+1]; @@ -526,6 +528,20 @@ void BuildMRUMenu(HMENU hMenu) break; } } + + hMenu = g_sdata.toolsSubmenu; + my_memset(&mii, 0, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STATE; + + if(g_mru_list[0][0]) { + mii.fState = MFS_ENABLED; + } + else { + mii.fState = MFS_GRAYED; + } + + SetMenuItemInfo(hMenu, IDM_CLEAR_MRU_LIST,FALSE,&mii); } void LoadMRUFile(int position) @@ -543,6 +559,7 @@ void LoadMRUFile(int position) } else { PopMRUFile(g_mru_list[position]); + BuildMRUMenus(); } ResetObjects(); CompileNSISScript(); @@ -574,6 +591,8 @@ void RestoreMRUList() for(i = n; i < MRU_LIST_SIZE; i++) { g_mru_list[i][0] = '\0'; } + + BuildMRUMenus(); } void SaveMRUList() @@ -600,21 +619,6 @@ void ClearMRUList() for(i=0; i