diff --git a/7.4.724 b/7.4.724 new file mode 100644 index 0000000..db6ac7e --- /dev/null +++ b/7.4.724 @@ -0,0 +1,381 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.724 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.724 +Problem: Vim icon does not show in Windows context menu. (issue 249) +Solution: Load the icon in GvimExt. +Files: src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h + + +*** ../vim-7.4.723/src/GvimExt/gvimext.cpp 2013-05-06 04:06:04.000000000 +0200 +--- src/GvimExt/gvimext.cpp 2015-05-04 18:20:37.345326768 +0200 +*************** +*** 79,97 **** + strcpy(name, searchpath((char *)"gvim.bat")); + if (name[0] == 0) + strcpy(name, "gvim"); // finds gvim.bat or gvim.exe +- +- // avoid that Vim tries to expand wildcards in the file names +- strcat(name, " --literal"); + } + } + + static void +! getGvimNameW(wchar_t *nameW) + { + char *name; + + name = (char *)malloc(BUFSIZE); +! getGvimName(name, 0); + mbstowcs(nameW, name, BUFSIZE); + free(name); + } +--- 79,102 ---- + strcpy(name, searchpath((char *)"gvim.bat")); + if (name[0] == 0) + strcpy(name, "gvim"); // finds gvim.bat or gvim.exe + } + } + + static void +! getGvimInvocation(char *name, int runtime) +! { +! getGvimName(name, runtime); +! // avoid that Vim tries to expand wildcards in the file names +! strcat(name, " --literal"); +! } +! +! static void +! getGvimInvocationW(wchar_t *nameW) + { + char *name; + + name = (char *)malloc(BUFSIZE); +! getGvimInvocation(name, 0); + mbstowcs(nameW, name, BUFSIZE); + free(name); + } +*************** +*** 123,128 **** +--- 128,153 ---- + } + } + ++ HBITMAP IconToBitmap(HICON hIcon, HBRUSH hBackground, int width, int height) ++ { ++ HDC hDC = GetDC(NULL); ++ HDC hMemDC = CreateCompatibleDC(hDC); ++ HBITMAP hMemBmp = CreateCompatibleBitmap(hDC, width, height); ++ HBITMAP hResultBmp = NULL; ++ HGDIOBJ hOrgBMP = SelectObject(hMemDC, hMemBmp); ++ ++ DrawIconEx(hMemDC, 0, 0, hIcon, width, height, 0, hBackground, DI_NORMAL); ++ ++ hResultBmp = hMemBmp; ++ hMemBmp = NULL; ++ ++ SelectObject(hMemDC, hOrgBMP); ++ DeleteDC(hMemDC); ++ ReleaseDC(NULL, hDC); ++ DestroyIcon(hIcon); ++ return hResultBmp; ++ } ++ + // + // GETTEXT: translated messages and menu entries + // +*************** +*** 404,410 **** + { + *ppv = NULL; + +! // Any interface on this object is the object pointer + + if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { +--- 429,435 ---- + { + *ppv = NULL; + +! // any interface on this object is the object pointer + + if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { +*************** +*** 448,454 **** + // QueryInterface with IID_IShellExtInit--this is how shell extensions are + // initialized. + +! LPCSHELLEXT pShellExt = new CShellExt(); //Create the CShellExt object + + if (NULL == pShellExt) + return E_OUTOFMEMORY; +--- 473,479 ---- + // QueryInterface with IID_IShellExtInit--this is how shell extensions are + // initialized. + +! LPCSHELLEXT pShellExt = new CShellExt(); // create the CShellExt object + + if (NULL == pShellExt) + return E_OUTOFMEMORY; +*************** +*** 469,474 **** +--- 494,501 ---- + m_pDataObj = NULL; + + inc_cRefThisDLL(); ++ ++ LoadMenuIcon(); + } + + CShellExt::~CShellExt() +*************** +*** 477,482 **** +--- 504,512 ---- + m_pDataObj->Release(); + + dec_cRefThisDLL(); ++ ++ if (m_hVimIconBitmap) ++ DeleteObject(m_hVimIconBitmap); + } + + STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv) +*************** +*** 597,602 **** +--- 627,633 ---- + + HKEY keyhandle; + bool showExisting = true; ++ bool showIcons = true; + + // Check whether "Edit with existing Vim" entries are disabled. + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0, +*************** +*** 605,610 **** +--- 636,644 ---- + if (RegQueryValueEx(keyhandle, "DisableEditWithExisting", 0, NULL, + NULL, NULL) == ERROR_SUCCESS) + showExisting = false; ++ if (RegQueryValueEx(keyhandle, "DisableContextMenuIcons", 0, NULL, ++ NULL, NULL) == ERROR_SUCCESS) ++ showIcons = false; + RegCloseKey(keyhandle); + } + +*************** +*** 612,639 **** + if (showExisting) + EnumWindows(EnumWindowsProc, (LPARAM)this); + + if (cbFiles > 1) + { +! InsertMenu(hMenu, +! indexMenu++, +! MF_STRING|MF_BYPOSITION, +! idCmd++, +! _("Edit with &multiple Vims")); +! +! InsertMenu(hMenu, +! indexMenu++, +! MF_STRING|MF_BYPOSITION, +! idCmd++, +! _("Edit with single &Vim")); + + if (cbFiles <= 4) + { + // Can edit up to 4 files in diff mode +! InsertMenu(hMenu, +! indexMenu++, +! MF_STRING|MF_BYPOSITION, +! idCmd++, +! _("Diff with Vim")); + m_edit_existing_off = 3; + } + else +--- 646,678 ---- + if (showExisting) + EnumWindows(EnumWindowsProc, (LPARAM)this); + ++ MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; ++ mii.fMask = MIIM_STRING | MIIM_ID; ++ if (showIcons) ++ { ++ mii.fMask |= MIIM_BITMAP; ++ mii.hbmpItem = m_hVimIconBitmap; ++ } ++ + if (cbFiles > 1) + { +! mii.wID = idCmd++; +! mii.dwTypeData = _("Edit with &multiple Vims"); +! mii.cch = lstrlen(mii.dwTypeData); +! InsertMenuItem(hMenu, indexMenu++, TRUE, &mii); +! +! mii.wID = idCmd++; +! mii.dwTypeData = _("Edit with single &Vim"); +! mii.cch = lstrlen(mii.dwTypeData); +! InsertMenuItem(hMenu, indexMenu++, TRUE, &mii); + + if (cbFiles <= 4) + { + // Can edit up to 4 files in diff mode +! mii.wID = idCmd++; +! mii.dwTypeData = _("Diff with Vim"); +! mii.cch = lstrlen(mii.dwTypeData); +! InsertMenuItem(hMenu, indexMenu++, TRUE, &mii); + m_edit_existing_off = 3; + } + else +*************** +*** 642,652 **** + } + else + { +! InsertMenu(hMenu, +! indexMenu++, +! MF_STRING|MF_BYPOSITION, +! idCmd++, +! _("Edit with &Vim")); + m_edit_existing_off = 1; + } + +--- 681,690 ---- + } + else + { +! mii.wID = idCmd++; +! mii.dwTypeData = _("Edit with &Vim"); +! mii.cch = lstrlen(mii.dwTypeData); +! InsertMenuItem(hMenu, indexMenu++, TRUE, &mii); + m_edit_existing_off = 1; + } + +*************** +*** 672,682 **** + temp[BUFSIZE - 1] = '\0'; + strncat(temp, title, BUFSIZE - 1 - strlen(temp)); + temp[BUFSIZE - 1] = '\0'; +! InsertMenu(hMenu, +! indexMenu++, +! MF_STRING|MF_BYPOSITION, +! idCmd++, +! temp); + } + // InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0, NULL); + +--- 710,720 ---- + temp[BUFSIZE - 1] = '\0'; + strncat(temp, title, BUFSIZE - 1 - strlen(temp)); + temp[BUFSIZE - 1] = '\0'; +! +! mii.wID = idCmd++; +! mii.dwTypeData = temp; +! mii.cch = lstrlen(mii.dwTypeData); +! InsertMenuItem(hMenu, indexMenu++, TRUE, &mii); + } + // InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0, NULL); + +*************** +*** 813,818 **** +--- 851,872 ---- + return TRUE; // continue enumeration (otherwise this would be false) + } + ++ BOOL CShellExt::LoadMenuIcon() ++ { ++ char vimExeFile[BUFSIZE]; ++ getGvimName(vimExeFile, 1); ++ if (vimExeFile[0] == '\0') ++ return FALSE; ++ HICON hVimIcon; ++ if (ExtractIconEx(vimExeFile, 0, NULL, &hVimIcon, 1) == 0) ++ return FALSE; ++ m_hVimIconBitmap = IconToBitmap(hVimIcon, ++ GetSysColorBrush(COLOR_MENU), ++ GetSystemMetrics(SM_CXSMICON), ++ GetSystemMetrics(SM_CYSMICON)); ++ return TRUE; ++ } ++ + #ifdef WIN32 + // This symbol is not defined in older versions of the SDK or Visual C++. + +*************** +*** 893,899 **** + m_szFileUserClickedOn, + sizeof(m_szFileUserClickedOn)); + +! getGvimNameW(cmdStrW); + wcscat(cmdStrW, L" \""); + + if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) < BUFSIZE) +--- 947,953 ---- + m_szFileUserClickedOn, + sizeof(m_szFileUserClickedOn)); + +! getGvimInvocationW(cmdStrW); + wcscat(cmdStrW, L" \""); + + if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) < BUFSIZE) +*************** +*** 961,967 **** + + cmdlen = BUFSIZE; + cmdStrW = (wchar_t *) malloc(cmdlen * sizeof(wchar_t)); +! getGvimNameW(cmdStrW); + + if (useDiff) + wcscat(cmdStrW, L" -d"); +--- 1015,1021 ---- + + cmdlen = BUFSIZE; + cmdStrW = (wchar_t *) malloc(cmdlen * sizeof(wchar_t)); +! getGvimInvocationW(cmdStrW); + + if (useDiff) + wcscat(cmdStrW, L" -d"); +*** ../vim-7.4.723/src/GvimExt/gvimext.h 2010-05-26 21:39:23.000000000 +0200 +--- src/GvimExt/gvimext.h 2015-05-04 18:24:28.898738746 +0200 +*************** +*** 110,119 **** +--- 110,123 ---- + class CShellExt : public IContextMenu, + IShellExtInit + { ++ private: ++ BOOL LoadMenuIcon(); ++ + protected: + ULONG m_cRef; + LPDATAOBJECT m_pDataObj; + UINT m_edit_existing_off; ++ HBITMAP m_hVimIconBitmap; + + // For some reason, this callback must be static + static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam); +*** ../vim-7.4.723/src/version.c 2015-05-04 17:50:25.613605986 +0200 +--- src/version.c 2015-05-04 18:25:12.494251378 +0200 +*************** +*** 743,744 **** +--- 743,746 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 724, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +3. Every time someone asks you to do something, ask if they want fries + with that. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///