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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui