#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
#define USE_CUSTOM_MENUBAND 1
+HMODULE g_hRShell = NULL;
#if 1
// TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
CComPtr<IShellFolder> psfCommonFavorites;
CComPtr<IAugmentedShellFolder> pasf;
- *ppsfFavorites = NULL;
+ if (ppsfFavorites)
+ *ppsfFavorites = NULL;
+
+ if (ppidl)
+ *ppidl = NULL;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlUserFavorites);
if (FAILED(hr))
+ {
+ WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n");
+
+ hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ TRACE("COMMON favorites obtained.\n");
+ *ppidl = pidlCommonFavorites;
+ hr = BindToDesktop(pidlCommonFavorites, ppsfFavorites);
return hr;
+ }
- if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites)))
+ hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites);
+ if (FAILED_UNEXPECTEDLY(hr))
{
+ WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n");
+ *ppidl = pidlCommonFavorites;
hr = BindToDesktop(pidlUserFavorites, ppsfFavorites);
- *ppidl = pidlUserFavorites;
return hr;
}
+ TRACE("Both COMMON and USER favorites folders obtained, merging them...\n");
+
hr = BindToDesktop(pidlUserFavorites, &psfUserFavorites);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfFavorites));
pasf.Release();
+ // TODO: obtain the folder's PIDL
+
ILFree(pidlCommonFavorites);
ILFree(pidlUserFavorites);
return hResult;
hResult = newMenu->SetShellFolder(favoritesFolder, favoritesPIDL, orderRegKey, SMSET_BOTTOM | SMINIT_CACHED | SMINV_ID);
- ILFree(favoritesPIDL);
- if (SUCCEEDED(hResult))
- fFavoritesMenu.Attach(newMenu.Detach());
+ if (favoritesPIDL)
+ ILFree(favoritesPIDL);
+
+ if (FAILED(hResult))
+ return hResult;
+
+ fFavoritesMenu = newMenu;
}
- if (fFavoritesMenu.p == NULL)
- return E_FAIL;
+
return fFavoritesMenu->QueryInterface(riid, ppvObject);
}
case SMC_GETSFOBJECT:
break;
case SMC_SFEXEC:
+ SHInvokeDefaultCommand(psmd->hwnd, psmd->psf, psmd->pidlItem);
break;
case SMC_SFSELECTITEM:
break;
case 49:
break;
case 0x10000000:
- break;
+ return S_OK;
}
return S_FALSE;
}
hResult = E_FAIL;
#if USE_CUSTOM_MENUBAND
- HMODULE hrs = GetModuleHandleW(L"rshell.dll");
+ if (!g_hRShell) g_hRShell = GetModuleHandleW(L"rshell.dll");
- if (!hrs) hrs = LoadLibraryW(L"rshell.dll");
+ if (!g_hRShell) g_hRShell = LoadLibraryW(L"rshell.dll");
- if (hrs)
+ if (g_hRShell)
{
- PMENUBAND_CONSTRUCTOR func = (PMENUBAND_CONSTRUCTOR) GetProcAddress(hrs, "CMenuBand_Constructor");
+ PMENUBAND_CONSTRUCTOR func = (PMENUBAND_CONSTRUCTOR) GetProcAddress(g_hRShell, "CMenuBand_Constructor");
if (func)
{
hResult = func(IID_PPV_ARG(IShellMenu, &menubar));
}
#endif
- menubar->AddRef();
-
if (FAILED_UNEXPECTEDLY(hResult))
{
hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER,
return S_OK;
}
-template<class T>
-void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
-{
- if (cptr.p != NULL)
- {
- int nrc = cptr->Release();
- if (nrc > 0)
- {
- DbgPrint("WARNING: Unexpected RefCount > 0 (%d)!\n", nrc);
- if (forceRelease)
- {
- while (nrc > 0)
- {
- nrc = cptr->Release();
- }
- }
- }
- cptr.Detach();
- }
-}
-
HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved)
{
HRESULT hResult;
prgCmds->cmdf = OLECMDF_SUPPORTED;
break;
case ITID_TOOLBARBANDSHOWN: // toolbar visibility
- prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ prgCmds->cmdf = OLECMDF_SUPPORTED;
+ if (fControlsBar)
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
case ITID_ADDRESSBANDSHOWN: // address bar visibility
- prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ prgCmds->cmdf = OLECMDF_SUPPORTED;
+ if (fNavigationBar)
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
case ITID_LINKSBANDSHOWN: // links bar visibility
prgCmds->cmdf = 0;
break;
case ITID_MENUBANDSHOWN: // Menubar band visibility
- prgCmds->cmdf = 0;
+ prgCmds->cmdf = OLECMDF_SUPPORTED;
+ if (fMenuBar)
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
case ITID_AUTOHIDEENABLED: // Auto hide enabled/disabled
prgCmds->cmdf = 0;
break;
case ITID_CUSTOMIZEENABLED: // customize enabled
- prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ prgCmds->cmdf = OLECMDF_SUPPORTED;
break;
case ITID_TOOLBARLOCKED: // lock toolbars
prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
{
HRESULT hResult;
+ TRACE("SetCommandTarget %p category %s param %d\n", theTarget, wine_dbgstr_guid(category), param14);
+
fCommandTarget.Release();
hResult = theTarget->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &fCommandTarget));
if (FAILED_UNEXPECTEDLY(hResult))
default:
break;
}
-
- MENUITEMINFO mii;
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_STATE;
- mii.fState = fLocked ? MFS_CHECKED : MFS_UNCHECKED;
- SetMenuItemInfo(contextMenu, IDM_TOOLBARS_LOCKTOOLBARS, FALSE, &mii);
+
+ // TODO: Implement show/hide toolbars
+ SHEnableMenuItem(contextMenu, IDM_TOOLBARS_STANDARDBUTTONS, FALSE);
+ SHEnableMenuItem(contextMenu, IDM_TOOLBARS_ADDRESSBAR, FALSE);
+ SHEnableMenuItem(contextMenu, IDM_TOOLBARS_LINKSBAR, FALSE);
+ SHEnableMenuItem(contextMenu, IDM_TOOLBARS_CUSTOMIZE, FALSE);
+
+ SHCheckMenuItem(contextMenu, IDM_TOOLBARS_STANDARDBUTTONS, fControlsBar != NULL);
+ SHCheckMenuItem(contextMenu, IDM_TOOLBARS_ADDRESSBAR, fNavigationBar != NULL);
+ SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LINKSBAR, FALSE);
+ SHCheckMenuItem(contextMenu, IDM_TOOLBARS_CUSTOMIZE, FALSE);
+ SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LOCKTOOLBARS, fLocked);
// TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
command = TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
HRESULT CreateInternetToolbar(REFIID riid, void **ppv)
{
- CInternetToolbar *theToolbar;
- HRESULT hResult;
-
- if (ppv == NULL)
- return E_POINTER;
- *ppv = NULL;
- ATLTRY (theToolbar = new CComObject<CInternetToolbar>);
- if (theToolbar == NULL)
- return E_OUTOFMEMORY;
- hResult = theToolbar->QueryInterface (riid, reinterpret_cast<void **>(ppv));
- if (FAILED_UNEXPECTEDLY(hResult))
- {
- delete theToolbar;
- return hResult;
- }
- return S_OK;
+ return ShellObjectCreator<CInternetToolbar>(riid, ppv);
}