[ros-diffs] [weiden] 35176: Very basic (and incomplete) implementation of SHCreateDesktop and SHDesktopMessageLoop to implement the Progman window class for the shell. This patch has not been submitted to WINE.

weiden at svn.reactos.org weiden at svn.reactos.org
Fri Aug 8 03:38:18 CEST 2008


Author: weiden
Date: Thu Aug  7 20:38:18 2008
New Revision: 35176

URL: http://svn.reactos.org/svn/reactos?rev=35176&view=rev
Log:
Very basic (and incomplete) implementation of SHCreateDesktop and SHDesktopMessageLoop to implement the Progman window class for the shell. This patch has not been submitted to WINE.

Added:
    trunk/reactos/dll/win32/shell32/desktop.c   (with props)
Modified:
    trunk/reactos/dll/win32/shell32/shell32.rbuild
    trunk/reactos/dll/win32/shell32/shell32.spec
    trunk/reactos/dll/win32/shell32/undocshell.h

Added: trunk/reactos/dll/win32/shell32/desktop.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/desktop.c?rev=35176&view=auto
==============================================================================
--- trunk/reactos/dll/win32/shell32/desktop.c (added)
+++ trunk/reactos/dll/win32/shell32/desktop.c [iso-8859-1] Thu Aug  7 20:38:18 2008
@@ -1,0 +1,782 @@
+/*
+ * Shell Desktop
+ *
+ * Copyright 2008 Thomas Bluemel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winnls.h"
+#include "winuser.h"
+#include "shellapi.h"
+#include "shlobj.h"
+#include "undocshell.h"
+#include "shell32_main.h"
+
+#include "wine/debug.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 IShellBrowserVtbl SHDESK_Vtbl;
+static const ICommDlgBrowserVtbl SHDESK_ICommDlgBrowser_Vtbl;
+static const IServiceProviderVtbl SHDESK_IServiceProvider_Vtbl;
+
+typedef struct _SHDESK
+{
+    DWORD Tag;
+    const IShellBrowserVtbl *lpVtbl;
+    const ICommDlgBrowserVtbl *lpVtblCommDlgBrowser;
+    const IServiceProviderVtbl *lpVtblServiceProvider;
+    LONG Ref;
+    HWND hWnd;
+    HWND hWndShellView;
+    HWND hWndDesktopListView;
+    IShellDesktop *ShellDesk;
+    IShellView *DesktopView;
+    IShellBrowser *DefaultShellBrowser;
+    LPITEMIDLIST pidlDesktopDirectory;
+    LPITEMIDLIST pidlDesktop;
+} SHDESK, *PSHDESK;
+
+static IUnknown *
+IUnknown_from_impl(SHDESK *This)
+{
+    return (IUnknown *)&This->lpVtbl;
+}
+
+static IShellBrowser *
+IShellBrowser_from_impl(SHDESK *This)
+{
+    return (IShellBrowser *)&This->lpVtbl;
+}
+
+static IOleWindow *
+IOleWindow_from_impl(SHDESK *This)
+{
+    return (IOleWindow *)&This->lpVtbl;
+}
+
+static ICommDlgBrowser *
+ICommDlgBrowser_from_impl(SHDESK *This)
+{
+    return (ICommDlgBrowser *)&This->lpVtblCommDlgBrowser;
+}
+
+static IServiceProvider *
+IServiceProvider_from_impl(SHDESK *This)
+{
+    return (IServiceProvider *)&This->lpVtblServiceProvider;
+}
+
+static SHDESK *
+impl_from_IShellBrowser(IShellBrowser *iface)
+{
+    return (SHDESK *)((ULONG_PTR)iface - FIELD_OFFSET(SHDESK, lpVtbl));
+}
+
+static SHDESK *
+impl_from_ICommDlgBrowser(ICommDlgBrowser *iface)
+{
+    return (SHDESK *)((ULONG_PTR)iface - FIELD_OFFSET(SHDESK, lpVtblCommDlgBrowser));
+}
+
+static SHDESK *
+impl_from_IServiceProvider(IServiceProvider *iface)
+{
+    return (SHDESK *)((ULONG_PTR)iface - FIELD_OFFSET(SHDESK, lpVtblServiceProvider));
+}
+
+static void
+SHDESK_Free(SHDESK *This)
+{
+    if (This->ShellDesk != NULL)
+        IShellDesktop_Release(This->ShellDesk);
+
+    if (This->DesktopView != NULL)
+    {
+        if (This->hWndShellView != NULL)
+            IShellView_DestroyViewWindow(This->DesktopView);
+
+        IShellView_Release(This->DesktopView);
+        This->DesktopView = NULL;
+        This->hWndShellView = NULL;
+        This->hWndDesktopListView = NULL;
+    }
+
+    if (This->pidlDesktopDirectory != NULL)
+    {
+        ILFree(This->pidlDesktopDirectory);
+        This->pidlDesktopDirectory = NULL;
+    }
+
+    if (This->pidlDesktop != NULL)
+    {
+        ILFree(This->pidlDesktop);
+        This->pidlDesktop = NULL;
+    }
+
+    ZeroMemory(This, sizeof(SHDESK));
+    LocalFree((HLOCAL)This);
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_Release(IShellBrowser *iface)
+{
+    SHDESK *This = impl_from_IShellBrowser(iface);
+    ULONG Ret;
+
+    Ret = InterlockedDecrement(&This->Ref);
+    if (Ret == 0)
+        SHDESK_Free(This);
+
+    return Ret;
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_AddRef(IShellBrowser *iface)
+{
+    SHDESK *This = impl_from_IShellBrowser(iface);
+
+    return InterlockedIncrement(&This->Ref);
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_QueryInterface(IShellBrowser *iface, REFIID riid, LPVOID *ppvObj)
+{
+    SHDESK *This;
+
+    if (ppvObj == NULL)
+        return E_POINTER;
+
+    This = impl_from_IShellBrowser(iface);
+
+    if (IsEqualIID(riid, &IID_IUnknown))
+    {
+        *ppvObj = IUnknown_from_impl(This);
+    }
+    else if (This->DefaultShellBrowser != NULL)
+    {
+        return IShellBrowser_QueryInterface(This->DefaultShellBrowser, riid, ppvObj);
+    }
+    else if (IsEqualIID(riid, &IID_IOleWindow))
+    {
+        *ppvObj = IOleWindow_from_impl(This);
+    }
+    else if (IsEqualIID(riid, &IID_IShellBrowser))
+    {
+        *ppvObj = IShellBrowser_from_impl(This);
+    }
+    else if (IsEqualIID(riid, &IID_ICommDlgBrowser))
+    {
+        *ppvObj = ICommDlgBrowser_from_impl(This);
+    }
+    else if (IsEqualIID(riid, &IID_IServiceProvider))
+    {
+        *ppvObj = IServiceProvider_from_impl(This);
+    }
+    else
+    {
+        *ppvObj = NULL;
+        return E_NOINTERFACE;
+    }
+
+    SHDESK_AddRef(iface);
+    return S_OK;
+}
+
+static PSHDESK
+SHDESK_Create(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
+{
+    IShellFolder *psfDesktopFolder;
+    IShellDesktop *ShellDesk;
+    CSFV csfv;
+    SHDESK *This;
+    HRESULT hRet;
+
+    ShellDesk = (IShellDesktop *)lpCreateStruct->lpCreateParams;
+    if (ShellDesk == NULL)
+    {
+        WARN("No IShellDesk interface provided!");
+        return NULL;
+    }
+
+    This = (PSHDESK)LocalAlloc(LMEM_FIXED, sizeof(SHDESK));
+    if (This == NULL)
+        return NULL;
+
+    ZeroMemory(This, sizeof(SHDESK));
+    This->Tag = SHDESK_TAG;
+    This->lpVtbl = &SHDESK_Vtbl;
+    This->lpVtblCommDlgBrowser = &SHDESK_ICommDlgBrowser_Vtbl;
+    This->lpVtblServiceProvider = &SHDESK_IServiceProvider_Vtbl;
+    This->Ref = 1;
+    This->hWnd = hWnd;
+    This->ShellDesk = ShellDesk;
+    IShellDesktop_AddRef(ShellDesk);
+
+    This->pidlDesktopDirectory = SHCloneSpecialIDList(This->hWnd, CSIDL_DESKTOPDIRECTORY, FALSE);
+    hRet = SHGetSpecialFolderLocation(This->hWnd, CSIDL_DESKTOP, &This->pidlDesktop);
+    if (!SUCCEEDED(hRet))
+        goto Fail;
+
+    hRet = SHGetDesktopFolder(&psfDesktopFolder);
+    if (!SUCCEEDED(hRet))
+        goto Fail;
+
+    ZeroMemory(&csfv, sizeof(csfv));
+    csfv.cbSize = sizeof(csfv);
+    csfv.pshf = psfDesktopFolder;
+    csfv.psvOuter = NULL;
+
+    hRet = SHCreateShellFolderViewEx(&csfv, &This->DesktopView);
+    IShellFolder_Release(psfDesktopFolder);
+
+    if (!SUCCEEDED(hRet))
+    {
+Fail:
+        SHDESK_Release(IShellBrowser_from_impl(This));
+        return NULL;
+    }
+
+    return This;
+}
+
+static BOOL
+SHDESK_CreateDeskWnd(SHDESK *This)
+{
+    IShellBrowser *ShellBrowser;
+    FOLDERSETTINGS fs;
+    RECT rcClient;
+    HRESULT hRet;
+
+    if (!GetClientRect(This->hWnd,
+                       &rcClient))
+    {
+        return FALSE;
+    }
+
+    ShellBrowser = IShellBrowser_from_impl(This);
+
+    fs.ViewMode = FVM_ICON;
+    fs.fFlags = FWF_DESKTOP | FWF_NOCLIENTEDGE  | FWF_NOSCROLL | FWF_TRANSPARENT;
+    hRet = IShellView_CreateViewWindow(This->DesktopView, NULL, &fs, ShellBrowser, &rcClient, &This->hWndShellView);
+    if (!SUCCEEDED(hRet))
+        return FALSE;
+
+    return TRUE;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_GetWindow(IShellBrowser *iface, HWND *phwnd)
+{
+    SHDESK *This = impl_from_IShellBrowser(iface);
+
+    if (This->hWnd != NULL)
+    {
+        *phwnd = This->hWnd;
+        return S_OK;
+    }
+
+    *phwnd = NULL;
+    return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_ContextSensitiveHelp(IShellBrowser *iface, BOOL fEnterMode)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_InsertMenusSB(IShellBrowser *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_SetMenuSB(IShellBrowser *iface, HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_RemoveMenusSB(IShellBrowser *iface, HMENU hmenuShared)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_SetStatusTextSB(IShellBrowser *iface, LPCOLESTR lpszStatusText)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_EnableModelessSB(IShellBrowser *iface, BOOL fEnable)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_TranslateAcceleratorSB(IShellBrowser *iface, LPMSG lpmsg, WORD wID)
+{
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_BrowseObject(IShellBrowser *iface, LPCITEMIDLIST pidl, UINT wFlags)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_GetViewStateStream(IShellBrowser *iface, DWORD grfMode, IStream **ppStrm)
+{
+    return E_NOTIMPL;
+}
+
+static HWND
+DesktopGetWindowControl(IN SHDESK *This,
+                        IN UINT id)
+{
+    switch (id)
+    {
+        case FCW_TOOLBAR:
+        case FCW_STATUS:
+        case FCW_TREE:
+        case FCW_PROGRESS:
+            return NULL;
+
+        default:
+            return NULL;
+    }
+
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_GetControlWindow(IShellBrowser *iface, UINT id, HWND *lphwnd)
+{
+    SHDESK *This = impl_from_IShellBrowser(iface);
+    HWND hWnd;
+
+    hWnd = DesktopGetWindowControl(This,
+                                   id);
+    if (hWnd != NULL)
+    {
+        *lphwnd = hWnd;
+        return S_OK;
+    }
+
+    *lphwnd = NULL;
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_SendControlMsg(IShellBrowser *iface, UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
+{
+    SHDESK *This = impl_from_IShellBrowser(iface);
+    HWND hWnd;
+
+    if (pret == NULL)
+        return E_POINTER;
+
+    hWnd = DesktopGetWindowControl(This,
+                                   id);
+    if (hWnd != NULL)
+    {
+        *pret = SendMessage(hWnd,
+                            uMsg,
+                            wParam,
+                            lParam);
+        return S_OK;
+    }
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_QueryActiveShellView(IShellBrowser *iface, IShellView **ppshv)
+{
+    IShellView *ActiveView;
+    SHDESK *This = impl_from_IShellBrowser(iface);
+
+    ActiveView = This->DesktopView;
+    SHDESK_AddRef(iface);
+    *ppshv = ActiveView;
+
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_OnViewWindowActive(IShellBrowser *iface, IShellView *ppshv)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_SetToolbarItems(IShellBrowser *iface, LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_QueryInterface(ICommDlgBrowser *iface, REFIID riid, LPVOID *ppvObj)
+{
+    SHDESK *This = impl_from_ICommDlgBrowser(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_QueryInterface(ShellBrowser, riid, ppvObj);
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_Release(ICommDlgBrowser *iface)
+{
+    SHDESK *This = impl_from_ICommDlgBrowser(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_Release(ShellBrowser);
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_AddRef(ICommDlgBrowser *iface)
+{
+    SHDESK *This = impl_from_ICommDlgBrowser(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_AddRef(ShellBrowser);
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_OnDefaultCommand(ICommDlgBrowser *iface, IShellView *ppshv)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_OnStateChange(ICommDlgBrowser *iface, IShellView *ppshv, ULONG uChange)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_ICommDlgBrowser_IncludeObject(ICommDlgBrowser *iface, IShellView *ppshv, LPCITEMIDLIST pidl)
+{
+    return S_OK;
+}
+
+static const ICommDlgBrowserVtbl SHDESK_ICommDlgBrowser_Vtbl =
+{
+    /* IUnknown */
+    SHDESK_ICommDlgBrowser_QueryInterface,
+    SHDESK_ICommDlgBrowser_AddRef,
+    SHDESK_ICommDlgBrowser_Release,
+    /* ICommDlgBrowser */
+    SHDESK_ICommDlgBrowser_OnDefaultCommand,
+    SHDESK_ICommDlgBrowser_OnStateChange,
+    SHDESK_ICommDlgBrowser_IncludeObject
+};
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_IServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, LPVOID *ppvObj)
+{
+    SHDESK *This = impl_from_IServiceProvider(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_QueryInterface(ShellBrowser, riid, ppvObj);
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_IServiceProvider_Release(IServiceProvider *iface)
+{
+    SHDESK *This = impl_from_IServiceProvider(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_Release(ShellBrowser);
+}
+
+static ULONG STDMETHODCALLTYPE
+SHDESK_IServiceProvider_AddRef(IServiceProvider *iface)
+{
+    SHDESK *This = impl_from_IServiceProvider(iface);
+    IShellBrowser *ShellBrowser = IShellBrowser_from_impl(This);
+
+    return SHDESK_AddRef(ShellBrowser);
+}
+
+static HRESULT STDMETHODCALLTYPE
+SHDESK_IServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, PVOID *ppv)
+{
+    /* FIXME - handle guidService */
+    return SHDESK_IServiceProvider_QueryInterface(iface, riid, ppv);
+}
+
+static const IServiceProviderVtbl SHDESK_IServiceProvider_Vtbl =
+{
+    /* IUnknown */
+    SHDESK_IServiceProvider_QueryInterface,
+    SHDESK_IServiceProvider_AddRef,
+    SHDESK_IServiceProvider_Release,
+    /* IServiceProvider */
+    SHDESK_IServiceProvider_QueryService
+};
+
+static BOOL
+SHDESK_MessageLoop(SHDESK *This)
+{
+    MSG Msg;
+    BOOL bRet;
+
+    while ((bRet = GetMessage(&Msg, NULL, 0, 0)) != 0)
+    {
+        if (bRet != -1)
+        {
+            TranslateMessage(&Msg);
+            DispatchMessage(&Msg);
+        }
+    }
+
+    return TRUE;
+}
+
+static LRESULT CALLBACK
+ProgmanWindowProc(IN HWND hwnd,
+                  IN UINT uMsg,
+                  IN WPARAM wParam,
+                  IN LPARAM lParam)
+{
+    SHDESK *This = NULL;
+    LRESULT Ret = FALSE;
+
+    if (uMsg != WM_NCCREATE)
+    {
+        This = (SHDESK*)GetWindowLongPtrW(hwnd,
+                                          0);
+        if (This == NULL)
+            goto DefMsgHandler;
+    }
+
+    if (This != NULL || uMsg == WM_NCCREATE)
+    {
+        switch (uMsg)
+        {
+            case WM_ERASEBKGND:
+                PaintDesktop((HDC)wParam);
+                break;
+
+            case WM_GETISHELLBROWSER:
+                Ret = (LRESULT)IShellBrowser_from_impl(This);
+                break;
+
+            case WM_SIZE:
+                if (wParam == SIZE_MINIMIZED)
+                {
+                    /* Hey, we're the desktop!!! */
+                    ShowWindow(hwnd,
+                               SW_RESTORE);
+                }
+                else
+                {
+                    RECT rcDesktop;
+
+                    rcDesktop.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
+                    rcDesktop.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
+                    rcDesktop.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+                    rcDesktop.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
+
+                    /* FIXME: Update work area */
+                }
+                break;
+
+            case WM_SYSCOLORCHANGE:
+            {
+                InvalidateRect(This->hWnd,
+                               NULL,
+                               TRUE);
+
+                if (This->hWndShellView != NULL)
+                {
+                    /* Forward the message */
+                    SendMessageW(This->hWndShellView,
+                                 WM_SYSCOLORCHANGE,
+                                 wParam,
+                                 lParam);
+                }
+                break;
+            }
+
+            case WM_CREATE:
+            {
+                IShellDesktop_RegisterDesktopWindow(This->ShellDesk,
+                                                    This->hWnd);
+
+                if (!SHDESK_CreateDeskWnd(This))
+                    WARN("Could not create the desktop view control!\n");
+                break;
+            }
+
+            case WM_NCCREATE:
+            {
+                LPCREATESTRUCT CreateStruct = (LPCREATESTRUCT)lParam;
+                This = SHDESK_Create(hwnd, CreateStruct);
+                if (This == NULL)
+                {
+                    WARN("Failed to create desktop structure\n");
+                    break;
+                }
+
+                SetWindowLongPtrW(hwnd,
+                                  0,
+                                  (LONG_PTR)This);
+                Ret = TRUE;
+                break;
+            }
+
+            case WM_NCDESTROY:
+            {
+                SHDESK_Free(This);
+                break;
+            }
+
+            default:
+DefMsgHandler:
+                Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam);
+                break;
+        }
+    }
+
+    return Ret;
+}
+
+static BOOL
+RegisterProgmanWindowClass(VOID)
+{
+    WNDCLASSW wcProgman;
+
+    wcProgman.style = CS_DBLCLKS;
+    wcProgman.lpfnWndProc = ProgmanWindowProc;
+    wcProgman.cbClsExtra = 0;
+    wcProgman.cbWndExtra = sizeof(PSHDESK);
+    wcProgman.hInstance = shell32_hInstance;
+    wcProgman.hIcon = NULL;
+    wcProgman.hCursor = LoadCursor(NULL,
+                                   IDC_ARROW);
+    wcProgman.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
+    wcProgman.lpszMenuName = NULL;
+    wcProgman.lpszClassName = szProgmanClassName;
+
+    return RegisterClassW(&wcProgman) != 0;
+}
+
+
+/*************************************************************************
+ * SHCreateDesktop			[SHELL32.200]
+ *
+ */
+HANDLE WINAPI SHCreateDesktop(IShellDesktop *ShellDesk)
+{
+    HWND hWndDesk;
+    RECT rcDesk;
+
+    if (ShellDesk == NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return NULL;
+    }
+
+    if (RegisterProgmanWindowClass() == 0)
+    {
+        WARN("Failed to register the Progman window class!\n");
+        return NULL;
+    }
+
+    rcDesk.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
+    rcDesk.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
+    rcDesk.right = rcDesk.left + GetSystemMetrics(SM_CXVIRTUALSCREEN);
+    rcDesk.bottom = rcDesk.top + GetSystemMetrics(SM_CYVIRTUALSCREEN);
+
+    if (IsRectEmpty(&rcDesk))
+    {
+        rcDesk.left = rcDesk.top = 0;
+        rcDesk.right = GetSystemMetrics(SM_CXSCREEN);
+        rcDesk.bottom = GetSystemMetrics(SM_CYSCREEN);
+    }
+
+    hWndDesk = CreateWindowExW(0, szProgmanClassName, szProgmanWindowName,
+        WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+        rcDesk.left, rcDesk.top, rcDesk.right, rcDesk.bottom,
+        NULL, NULL, shell32_hInstance, (LPVOID)ShellDesk);
+    if (hWndDesk != NULL)
+        return (HANDLE)GetWindowLongPtr(hWndDesk, 0);
+
+    return NULL;
+}
+
+/*************************************************************************
+ * SHCreateDesktop			[SHELL32.201]
+ *
+ */
+BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop)
+{
+    PSHDESK Desk = (PSHDESK)hDesktop;
+
+    if (Desk == NULL || Desk->Tag != SHDESK_TAG)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    return SHDESK_MessageLoop(Desk);
+}
+
+static const IShellBrowserVtbl SHDESK_Vtbl =
+{
+    /* IUnknown */
+    SHDESK_QueryInterface,
+    SHDESK_AddRef,
+    SHDESK_Release,
+    /* IOleWindow */
+    SHDESK_GetWindow,
+    SHDESK_ContextSensitiveHelp,
+    /* IShellBrowser */
+    SHDESK_InsertMenusSB,
+    SHDESK_SetMenuSB,
+    SHDESK_RemoveMenusSB,
+    SHDESK_SetStatusTextSB,
+    SHDESK_EnableModelessSB,
+    SHDESK_TranslateAcceleratorSB,
+    SHDESK_BrowseObject,
+    SHDESK_GetViewStateStream,
+    SHDESK_GetControlWindow,
+    SHDESK_SendControlMsg,
+    SHDESK_QueryActiveShellView,
+    SHDESK_OnViewWindowActive,
+    SHDESK_SetToolbarItems
+};

Propchange: trunk/reactos/dll/win32/shell32/desktop.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/shell32/shell32.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32.rbuild?rev=35176&r1=35175&r2=35176&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] Thu Aug  7 20:38:18 2008
@@ -35,6 +35,7 @@
 	<file>dataobject.c</file>
 	<file>dde.c</file>
 	<file>debughlp.c</file>
+	<file>desktop.c</file>
 	<file>dialogs.c</file>
 	<file>dragdrophelper.c</file>
 	<file>enumidlist.c</file>

Modified: trunk/reactos/dll/win32/shell32/shell32.spec
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32.spec?rev=35176&r1=35175&r2=35176&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shell32.spec [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shell32.spec [iso-8859-1] Thu Aug  7 20:38:18 2008
@@ -189,8 +189,8 @@
  197 stub -noname SHGlobalDefect
  198 stdcall -noname SHAbortInvokeCommand()
  199 stub SHGetFileIcon
- 200 stub SHLocalAlloc
- 201 stub SHLocalFree
+ 200 stdcall SHCreateDesktop(ptr)
+ 201 stdcall SHDesktopMessageLoop(ptr)
  202 stub SHLocalReAlloc
  203 stub AddCommasW
  204 stub ShortSizeFormatW

Modified: trunk/reactos/dll/win32/shell32/undocshell.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/undocshell.h?rev=35176&r1=35175&r2=35176&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/undocshell.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/undocshell.h [iso-8859-1] Thu Aug  7 20:38:18 2008
@@ -548,6 +548,37 @@
 DEFINE_GUID(CLSID_OpenWith, 0x09799AFB, 0xAD67, 0x11d1, 0xAB,0xCD,0x00,0xC0,0x4F,0xC3,0x09,0x36);
 DEFINE_GUID(CLSID_StartMenu, 0x4622AD11, 0xFF23, 0x11D0, 0x8D,0x34,0x00,0xA0,0xC9,0x0F,0x27,0x19);
 
+/* Shell Desktop functions */
+
+#undef INTERFACE
+#define INTERFACE IShellDesktop
+DECLARE_INTERFACE_(IShellDesktop,IUnknown)
+{
+    /*** IUnknown ***/
+    STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IShellDesktopTray ***/
+    STDMETHOD_(ULONG,GetState)(THIS) PURE;
+    STDMETHOD(GetTrayWindow)(THIS_ HWND*) PURE;
+    STDMETHOD(RegisterDesktopWindow)(THIS_ HWND) PURE;
+    STDMETHOD(Unknown)(THIS_ DWORD,DWORD) PURE;
+};
+#undef INTERFACE
+
+#define IShellDesktop_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
+#define IShellDesktop_AddRef(T) (T)->lpVtbl->AddRef(T)
+#define IShellDesktop_Release(T) (T)->lpVtbl->Release(T)
+#define IShellDesktop_GetState(T) (T)->lpVtbl->GetState(T)
+#define IShellDesktop_GetTrayWindow(T,a) (T)->lpVtbl->GetTrayWindow(T,a)
+#define IShellDesktop_RegisterDesktopWindow(T,a) (T)->lpVtbl->RegisterDesktopWindow(T,a)
+#define IShellDesktop_Unknown(T,a,b) (T)->lpVtbl->Unknown(T,a,b)
+
+#define WM_GETISHELLBROWSER (WM_USER+7)
+
+HANDLE WINAPI SHCreateDesktop(IShellDesktop*);
+BOOL WINAPI SHDesktopMessageLoop(HANDLE);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* defined(__cplusplus) */



More information about the Ros-diffs mailing list