[RSHELL]
[reactos.git] / dll / win32 / shell32 / desktop.cpp
index 9bdfcea..b27168b 100644 (file)
@@ -18,7 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include "precomp.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(desktop);
 
@@ -26,16 +26,14 @@ BOOL WINAPI SetShellWindowEx(HWND, HWND);
 
 #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;
@@ -43,26 +41,26 @@ private:
     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);
@@ -77,31 +75,31 @@ public:
     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()
@@ -130,9 +128,9 @@ 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;
@@ -154,14 +152,14 @@ HRESULT CDesktopBrowser::Initialize(HWND hWndx, IShellDesktopTray *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)
@@ -170,19 +168,19 @@ static CDesktopBrowser *SHDESK_Create(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
         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 ()
@@ -261,7 +259,12 @@ HRESULT STDMETHODCALLTYPE CDesktopBrowser::TranslateAcceleratorSB(LPMSG lpmsg, W
 
 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)
@@ -302,7 +305,7 @@ HRESULT STDMETHODCALLTYPE CDesktopBrowser::GetControlWindow(UINT id, HWND *lphwn
 
 HRESULT STDMETHODCALLTYPE CDesktopBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
 {
-    HWND                                               hWnd;
+    HWND                        hWnd;
 
     if (pret == NULL)
         return E_POINTER;
@@ -323,8 +326,8 @@ HRESULT STDMETHODCALLTYPE CDesktopBrowser::SendControlMsg(UINT id, UINT uMsg, WP
 HRESULT STDMETHODCALLTYPE CDesktopBrowser::QueryActiveShellView(IShellView **ppshv)
 {
     *ppshv = DesktopView;
-       if (DesktopView != NULL)
-               DesktopView->AddRef();
+    if (DesktopView != NULL)
+        DesktopView->AddRef();
 
     return S_OK;
 }
@@ -384,8 +387,7 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
 
     if (uMsg != WM_NCCREATE)
     {
-        pThis = (CDesktopBrowser*)GetWindowLongPtrW(hwnd,
-                                          0);
+        pThis = reinterpret_cast<CDesktopBrowser *>(GetWindowLongPtrW(hwnd, 0));
         if (pThis == NULL)
             goto DefMsgHandler;
     }
@@ -418,22 +420,23 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
                     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;
             }
@@ -470,6 +473,11 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
                 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);
@@ -486,7 +494,7 @@ RegisterProgmanWindowClass(VOID)
     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;
@@ -501,7 +509,7 @@ RegisterProgmanWindowClass(VOID)
 
 
 /*************************************************************************
- * SHCreateDesktop                     [SHELL32.200]
+ * SHCreateDesktop            [SHELL32.200]
  *
  */
 HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk)
@@ -533,7 +541,7 @@ 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);
@@ -544,12 +552,12 @@ HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *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)
     {