[EXPLORER-NEW]
authorDavid Quintana <gigaherz@gmail.com>
Sat, 25 Oct 2014 15:44:11 +0000 (15:44 +0000)
committerDavid Quintana <gigaherz@gmail.com>
Sat, 25 Oct 2014 15:44:11 +0000 (15:44 +0000)
* Fix HMENU leak.

[BROWSEUI]
* Work around for WM_SETICON not properly returning the old HICON.

[SHELL32]
* Fix HICON leak.
* Nitpick.

[WIN32K]
* Do not refcount the menus improperly.

svn path=/branches/shell-experiments/; revision=64986

base/shell/explorer-new/traywnd.c
dll/win32/browseui/shellbrowser.cpp
dll/win32/shell32/newmenu.cpp
dll/win32/shell32/shlview.cpp
win32ss/user/ntuser/menu.c

index 3e04bf4..d05ae39 100644 (file)
@@ -1023,6 +1023,8 @@ ITrayWindowImpl_TrackCtxMenu(IN OUT ITrayWindowImpl *This,
                               cmdId,
                               pcmContext,
                               Context);
+
+        DestroyMenu(hPopup);
     }
 
     return cmdId;
index ea89e17..c12143e 100644 (file)
@@ -1078,15 +1078,18 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder,
         HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0);
         HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0);
 
-        HICON oldSmall = (HICON)SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
-        HICON oldLarge = (HICON)SendMessage(WM_SETICON, ICON_BIG,   reinterpret_cast<LPARAM>(icLarge));
+        /* Hack to make it possible to release the old icons */
+        /* Something seems to go wrong with WM_SETICON */
+        HICON oldSmall = (HICON)SendMessage(WM_GETICON, ICON_SMALL, 0);
+        HICON oldLarge = (HICON)SendMessage(WM_GETICON, ICON_BIG,   0);
+
+        SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
+        SendMessage(WM_SETICON, ICON_BIG,   reinterpret_cast<LPARAM>(icLarge));
 
         DestroyIcon(oldSmall);
         DestroyIcon(oldLarge);
     }
 
-    // TODO: Update the window icon
-
     FireCommandStateChangeAll();
     hResult = UpdateForwardBackState();
     return S_OK;
index 5b16681..db71220 100644 (file)
@@ -179,7 +179,10 @@ CNewMenu::SHELLNEW_ITEM *CNewMenu::LoadItem(LPCWSTR pwszExt)
     pNewItem->pwszExt = _wcsdup(pwszExt);
     pNewItem->pwszDesc = _wcsdup(fi.szTypeName);
     if (fi.hIcon)
+    {
         pNewItem->hBitmap = IconToBitmap(fi.hIcon);
+        DestroyIcon(fi.hIcon);
+    }
 
     return pNewItem;
 }
index b00e973..54018e7 100644 (file)
@@ -984,7 +984,7 @@ LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
         SHFree((LPITEMIDLIST)ntreg.pidl);
     }
 
-    m_hAccel = LoadAcceleratorsA(shell32_hInstance, MAKEINTRESOURCEA( IDA_SHELLVIEW));
+    m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
 
     return S_OK;
 }
index 9cd0917..bb93bfa 100644 (file)
@@ -1653,7 +1653,7 @@ PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
    {
       return NULL;
    }
-   SysMenu = IntGetMenuObject(hSysMenu);
+   SysMenu = UserGetMenuObject(hSysMenu);
    if (NULL == SysMenu)
    {
        UserDestroyMenu(hSysMenu);
@@ -1684,7 +1684,7 @@ PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
          UserDestroyMenu(hSysMenu);
          return NULL;
       }
-      Menu = IntGetMenuObject(hNewMenu);
+      Menu = UserGetMenuObject(hNewMenu);
       if (!Menu)
       {
          IntReleaseMenuObject(SysMenu);