* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include <precomp.h>
+#include "precomp.h"
WINE_DEFAULT_DEBUG_CHANNEL(desktop);
#define SHDESK_TAG 0x4b534544
-static const WCHAR szProgmanClassName[] = {'P','r','o','g','m','a','n'};
-static const WCHAR szProgmanWindowName[] = {
- 'P','r','o','g','r','a','m',' ','M','a','n','a','g','e','r'
-};
+static const WCHAR szProgmanClassName [] = L"Progman";
+static const WCHAR szProgmanWindowName [] = L"Program Manager";
class CDesktopBrowser :
- public CComObjectRootEx<CComMultiThreadModelNoCS>,
- public IShellBrowser,
- public ICommDlgBrowser,
- public IServiceProvider
+ public CComObjectRootEx<CComMultiThreadModelNoCS>,
+ public IShellBrowser,
+ public ICommDlgBrowser,
+ public IServiceProvider
{
public:
DWORD Tag;
HWND hWnd;
HWND hWndShellView;
HWND hWndDesktopListView;
- CComPtr<IShellDesktopTray> ShellDesk;
- CComPtr<IShellView> DesktopView;
- IShellBrowser *DefaultShellBrowser;
+ CComPtr<IShellDesktopTray> ShellDesk;
+ CComPtr<IShellView> DesktopView;
+ CComPtr<IShellBrowser> DefaultShellBrowser;
LPITEMIDLIST pidlDesktopDirectory;
LPITEMIDLIST pidlDesktop;
public:
- CDesktopBrowser();
- ~CDesktopBrowser();
- HRESULT Initialize(HWND hWndx, IShellDesktopTray *ShellDeskx);
- HWND FindDesktopListView ();
- BOOL CreateDeskWnd();
- HWND DesktopGetWindowControl(IN UINT id);
- static LRESULT CALLBACK ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam);
- static BOOL MessageLoop();
-
- // *** IOleWindow methods ***
- virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
- virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
-
- // *** IShellBrowser methods ***
+ CDesktopBrowser();
+ ~CDesktopBrowser();
+ HRESULT Initialize(HWND hWndx, IShellDesktopTray *ShellDeskx);
+ HWND FindDesktopListView ();
+ BOOL CreateDeskWnd();
+ HWND DesktopGetWindowControl(IN UINT id);
+ static LRESULT CALLBACK ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam);
+ static BOOL MessageLoop();
+
+ // *** IOleWindow methods ***
+ virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
+ virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
+
+ // *** IShellBrowser methods ***
virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared);
virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(struct IShellView *ppshv);
virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
- // *** ICommDlgBrowser methods ***
- virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand (struct IShellView *ppshv);
- virtual HRESULT STDMETHODCALLTYPE OnStateChange (struct IShellView *ppshv, ULONG uChange);
- virtual HRESULT STDMETHODCALLTYPE IncludeObject (struct IShellView *ppshv, LPCITEMIDLIST pidl);
+ // *** ICommDlgBrowser methods ***
+ virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand (struct IShellView *ppshv);
+ virtual HRESULT STDMETHODCALLTYPE OnStateChange (struct IShellView *ppshv, ULONG uChange);
+ virtual HRESULT STDMETHODCALLTYPE IncludeObject (struct IShellView *ppshv, LPCITEMIDLIST pidl);
- // *** IServiceProvider methods ***
- virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
+ // *** IServiceProvider methods ***
+ virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
BEGIN_COM_MAP(CDesktopBrowser)
- COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
- COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser)
- COM_INTERFACE_ENTRY_IID(IID_ICommDlgBrowser, ICommDlgBrowser)
- COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
+ COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+ COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser)
+ COM_INTERFACE_ENTRY_IID(IID_ICommDlgBrowser, ICommDlgBrowser)
+ COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
END_COM_MAP()
};
CDesktopBrowser::CDesktopBrowser()
{
- Tag = SHDESK_TAG;
- hWnd = NULL;
- hWndShellView = NULL;
- hWndDesktopListView = NULL;
- DefaultShellBrowser = NULL;
- pidlDesktopDirectory = NULL;
- pidlDesktop = NULL;
+ Tag = SHDESK_TAG;
+ hWnd = NULL;
+ hWndShellView = NULL;
+ hWndDesktopListView = NULL;
+ DefaultShellBrowser = NULL;
+ pidlDesktopDirectory = NULL;
+ pidlDesktop = NULL;
}
CDesktopBrowser::~CDesktopBrowser()
HRESULT CDesktopBrowser::Initialize(HWND hWndx, IShellDesktopTray *ShellDeskx)
{
- CComPtr<IShellFolder> psfDesktopFolder;
- CSFV csfv;
- HRESULT hRet;
+ CComPtr<IShellFolder> psfDesktopFolder;
+ CSFV csfv;
+ HRESULT hRet;
hWnd = hWndx;
ShellDesk = ShellDeskx;
hRet = SHCreateShellFolderViewEx(&csfv, &DesktopView);
- return hRet;
+ return hRet;
}
static CDesktopBrowser *SHDESK_Create(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
- IShellDesktopTray *ShellDesk;
- CComObject<CDesktopBrowser> *pThis;
- HRESULT hRet;
+ CComPtr<IShellDesktopTray> ShellDesk;
+ CComObject<CDesktopBrowser> *pThis;
+ HRESULT hRet;
ShellDesk = (IShellDesktopTray *)lpCreateStruct->lpCreateParams;
if (ShellDesk == NULL)
return NULL;
}
- pThis = new CComObject<CDesktopBrowser>;
- if (pThis == NULL)
- return NULL;
- pThis->AddRef();
+ pThis = new CComObject<CDesktopBrowser>;
+ if (pThis == NULL)
+ return NULL;
+ pThis->AddRef();
- hRet = pThis->Initialize(hWnd, ShellDesk);
- if (FAILED(hRet))
- {
- pThis->Release();
- return NULL;
- }
+ hRet = pThis->Initialize(hWnd, ShellDesk);
+ if (FAILED(hRet))
+ {
+ pThis->Release();
+ return NULL;
+ }
- return pThis;
+ return pThis;
}
HWND CDesktopBrowser::FindDesktopListView ()
HRESULT STDMETHODCALLTYPE CDesktopBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags)
{
- return E_NOTIMPL;
+ /*
+ * We should use IShellWindows interface here in order to attempt to
+ * find an open shell window that shows the requested pidl and activate it
+ */
+
+ return SHOpenNewFrame((LPITEMIDLIST)pidl, NULL, 0, 0);
}
HRESULT STDMETHODCALLTYPE CDesktopBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
HRESULT STDMETHODCALLTYPE CDesktopBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
{
- HWND hWnd;
+ HWND hWnd;
if (pret == NULL)
return E_POINTER;
HRESULT STDMETHODCALLTYPE CDesktopBrowser::QueryActiveShellView(IShellView **ppshv)
{
*ppshv = DesktopView;
- if (DesktopView != NULL)
- DesktopView->AddRef();
+ if (DesktopView != NULL)
+ DesktopView->AddRef();
return S_OK;
}
if (uMsg != WM_NCCREATE)
{
- pThis = (CDesktopBrowser*)GetWindowLongPtrW(hwnd,
- 0);
+ pThis = reinterpret_cast<CDesktopBrowser *>(GetWindowLongPtrW(hwnd, 0));
if (pThis == NULL)
goto DefMsgHandler;
}
rcDesktop.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
/* FIXME: Update work area */
+ DBG_UNREFERENCED_LOCAL_VARIABLE(rcDesktop);
}
break;
case WM_SYSCOLORCHANGE:
+ case WM_SETTINGCHANGE:
{
- InvalidateRect(pThis->hWnd,
- NULL,
- TRUE);
-
- if (pThis->hWndShellView != NULL)
+ if (uMsg == WM_SYSCOLORCHANGE || wParam == SPI_SETDESKWALLPAPER || wParam == 0)
{
- /* Forward the message */
- SendMessageW(pThis->hWndShellView,
- WM_SYSCOLORCHANGE,
- wParam,
- lParam);
+ if (pThis->hWndShellView != NULL)
+ {
+ /* Forward the message */
+ SendMessageW(pThis->hWndShellView,
+ uMsg,
+ wParam,
+ lParam);
+ }
}
break;
}
break;
}
+ case WM_EXPLORER_OPEN_NEW_WINDOW:
+ DbgPrint("Proxy Desktop message 1035 received.\n");
+ SHOnCWMCommandLine((HANDLE)lParam);
+ break;
+
default:
DefMsgHandler:
Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam);
WNDCLASSW wcProgman;
wcProgman.style = CS_DBLCLKS;
- wcProgman.lpfnWndProc = CDesktopBrowser::ProgmanWindowProc;
+ wcProgman.lpfnWndProc = CDesktopBrowser::ProgmanWindowProc;
wcProgman.cbClsExtra = 0;
wcProgman.cbWndExtra = sizeof(CDesktopBrowser *);
wcProgman.hInstance = shell32_hInstance;
/*************************************************************************
- * SHCreateDesktop [SHELL32.200]
+ * SHCreateDesktop [SHELL32.200]
*
*/
HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk)
rcDesk.bottom = GetSystemMetrics(SM_CYSCREEN);
}
- hWndDesk = CreateWindowExW(0, szProgmanClassName, szProgmanWindowName,
+ hWndDesk = CreateWindowExW(WS_EX_TOOLWINDOW, szProgmanClassName, szProgmanWindowName,
WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
rcDesk.left, rcDesk.top, rcDesk.right, rcDesk.bottom,
NULL, NULL, shell32_hInstance, (LPVOID)ShellDesk);
}
/*************************************************************************
- * SHCreateDesktop [SHELL32.201]
+ * SHCreateDesktop [SHELL32.201]
*
*/
BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop)
{
- CDesktopBrowser *Desk = (CDesktopBrowser *)hDesktop;
+ CDesktopBrowser *Desk = static_cast<CDesktopBrowser *>(hDesktop);
if (Desk == NULL || Desk->Tag != SHDESK_TAG)
{