Author: dgorbachev Date: Tue Dec 8 22:57:27 2009 New Revision: 44474
URL: http://svn.reactos.org/svn/reactos?rev=44474&view=rev Log: Cleanup in desktopbg.c, inspired by BeastL (slyhome|AT|ipnet|DOT|ua), bug #4985.
Modified: trunk/reactos/subsystems/win32/csrss/win32csr/desktopbg.c
Modified: trunk/reactos/subsystems/win32/csrss/win32csr/desktopbg.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win3... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/win32csr/desktopbg.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/win32csr/desktopbg.c [iso-8859-1] Tue Dec 8 22:57:27 2009 @@ -8,6 +8,7 @@ */
#define NDEBUG + #include "w32csr.h" #include <debug.h>
@@ -18,283 +19,302 @@
typedef struct tagDTBG_THREAD_DATA { - HDESK Desktop; - HANDLE Event; - NTSTATUS Status; + HDESK Desktop; + HANDLE Event; + NTSTATUS Status; } DTBG_THREAD_DATA, *PDTBG_THREAD_DATA;
typedef struct tagPRIVATE_NOTIFY_DESKTOP { - NMHDR hdr; - union - { + NMHDR hdr; struct /* PM_SHOW_DESKTOP */ { - int Width; - int Height; + int Width; + int Height; } ShowDesktop; - }; } PRIVATE_NOTIFY_DESKTOP, *PPRIVATE_NOTIFY_DESKTOP;
static BOOL BgInitialized = FALSE; static HWND VisibleDesktopWindow = NULL;
-static LRESULT CALLBACK -DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT PS; - HDC hDC; - - switch(Msg) - { - case WM_ERASEBKGND: - PaintDesktop((HDC)wParam); +static +LRESULT +CALLBACK +DtbgWindowProc(HWND Wnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + PAINTSTRUCT PS; + + switch (Msg) + { + case WM_ERASEBKGND: + PaintDesktop((HDC)wParam); + return 1; + + case WM_PAINT: + if (BeginPaint(Wnd, &PS)) + EndPaint(Wnd, &PS); + return 0; + + case WM_SETCURSOR: + return (LRESULT)SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); + + case WM_NCCREATE: + return (LRESULT)TRUE; + + case WM_CREATE: + case WM_CLOSE: + return 0; + + case WM_NOTIFY: + { + PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam; + + /* Use WM_NOTIFY for private messages since + * it can't be sent between processes! + */ + switch (nmh->hdr.code) + { + case PM_SHOW_DESKTOP: + { + LRESULT Result; + + Result = !SetWindowPos(Wnd, NULL, 0, 0, + nmh->ShowDesktop.Width, + nmh->ShowDesktop.Height, + SWP_NOACTIVATE | SWP_NOZORDER | + SWP_SHOWWINDOW); + + UpdateWindow(Wnd); + VisibleDesktopWindow = Wnd; + return Result; + } + + case PM_HIDE_DESKTOP: + { + LRESULT Result; + + Result = !SetWindowPos(Wnd, NULL, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOZORDER | + SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); + + UpdateWindow(Wnd); + VisibleDesktopWindow = NULL; + return Result; + } + + default: + DPRINT("Unknown notification code 0x%x sent to the desktop window!\n", + nmh->hdr.code); + return 0; + } + } + + default: + return DefWindowProcW(Wnd, Msg, wParam, lParam); + } + + return 0; +} + +static +BOOL +FASTCALL +DtbgInit(VOID) +{ + WNDCLASSEXW Class; + ATOM ClassAtom; + + /* + * Create the desktop window class + */ + Class.cbSize = sizeof(WNDCLASSEXW); + Class.style = CS_GLOBALCLASS; + Class.lpfnWndProc = DtbgWindowProc; + Class.cbClsExtra = 0; + Class.cbWndExtra = 0; + Class.hInstance = (HINSTANCE)GetModuleHandleW(NULL); + Class.hIcon = NULL; + Class.hCursor = NULL; + Class.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND); + Class.lpszMenuName = NULL; + Class.lpszClassName = (LPCWSTR)DESKTOP_WINDOW_ATOM; + ClassAtom = RegisterClassExW(&Class); + + if (ClassAtom == INVALID_ATOM) + { + DPRINT1("Unable to register desktop background class (error %d)\n", + GetLastError()); + + return FALSE; + } + + VisibleDesktopWindow = NULL; + + return TRUE; +} + +static +DWORD +WINAPI +DtbgDesktopThread(PVOID Data) +{ + HWND BackgroundWnd; + MSG msg; + PDTBG_THREAD_DATA ThreadData = (PDTBG_THREAD_DATA)Data; + + if (!SetThreadDesktop(ThreadData->Desktop)) + { + DPRINT1("Failed to set thread desktop\n"); + ThreadData->Status = STATUS_UNSUCCESSFUL; + SetEvent(ThreadData->Event); return 1; - - case WM_PAINT: - { - if((hDC = BeginPaint(Wnd, &PS))) - EndPaint(Wnd, &PS); - return 0; - } - - case WM_SETCURSOR: - return (LRESULT) SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); - - case WM_NCCREATE: - return (LRESULT) TRUE; - - case WM_CREATE: - return 0; - - case WM_CLOSE: - return 0; - - case WM_NOTIFY: - { - PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam; - - /* Use WM_NOTIFY for private messages since it can't be sent between - processes! */ - switch(nmh->hdr.code) - { - case PM_SHOW_DESKTOP: - { - LRESULT Result; - - Result = ! SetWindowPos(Wnd, - NULL, 0, 0, - nmh->ShowDesktop.Width, - nmh->ShowDesktop.Height, - SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW); - UpdateWindow(Wnd); - VisibleDesktopWindow = Wnd; - return Result; - } - - case PM_HIDE_DESKTOP: - { - LRESULT Result; - - Result = ! SetWindowPos(Wnd, - NULL, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | - SWP_HIDEWINDOW); - UpdateWindow(Wnd); - VisibleDesktopWindow = NULL; - return Result; - } - - default: - DPRINT("Unknown notification code 0x%x sent to the desktop window!\n", nmh->hdr.code); - return 0; - } - } - - default: - return DefWindowProcW(Wnd, Msg, wParam, lParam); - } - - return 0; -} - -static BOOL FASTCALL -DtbgInit() -{ - WNDCLASSEXW Class; - ATOM ClassAtom; - - /* - * Create the desktop window class - */ - Class.cbSize = sizeof(WNDCLASSEXW); - Class.style = CS_GLOBALCLASS; - Class.lpfnWndProc = DtbgWindowProc; - Class.cbClsExtra = 0; - Class.cbWndExtra = 0; - Class.hInstance = (HINSTANCE) GetModuleHandleW(NULL); - Class.hIcon = NULL; - Class.hCursor = NULL; - Class.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND); - Class.lpszMenuName = NULL; - Class.lpszClassName = (LPCWSTR) DESKTOP_WINDOW_ATOM; - ClassAtom = RegisterClassExW(&Class); - if ((ATOM) 0 == ClassAtom) - { - DPRINT1("Unable to register desktop background class (error %d)\n", - GetLastError()); - return FALSE; - } - VisibleDesktopWindow = NULL; - - return TRUE; -} - -static DWORD WINAPI -DtbgDesktopThread(PVOID Data) -{ - HWND BackgroundWnd; - MSG msg; - PDTBG_THREAD_DATA ThreadData = (PDTBG_THREAD_DATA) Data; - - if (! SetThreadDesktop(ThreadData->Desktop)) - { - DPRINT1("Failed to set thread desktop\n"); - ThreadData->Status = STATUS_UNSUCCESSFUL; - SetEvent(ThreadData->Event); - return 1; - } - BackgroundWnd = CreateWindowW((LPCWSTR) DESKTOP_WINDOW_ATOM, - L"", - WS_POPUP | WS_CLIPCHILDREN, + } + + BackgroundWnd = CreateWindowW((LPCWSTR)DESKTOP_WINDOW_ATOM, + L"", + WS_POPUP | WS_CLIPCHILDREN, + 0, 0, 0, 0, + NULL, NULL, + (HINSTANCE)GetModuleHandleW(NULL), + NULL); + + if (NULL == BackgroundWnd) + { + DPRINT1("Failed to create desktop background window\n"); + ThreadData->Status = STATUS_UNSUCCESSFUL; + SetEvent(ThreadData->Event); + return 1; + } + + ThreadData->Status = STATUS_SUCCESS; + SetEvent(ThreadData->Event); + + while (GetMessageW(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + + return 1; +} + +CSR_API(CsrCreateDesktop) +{ + DTBG_THREAD_DATA ThreadData; + HANDLE ThreadHandle; + + DPRINT("CsrCreateDesktop\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + if (!BgInitialized) + { + BgInitialized = TRUE; + + if (!DtbgInit()) + return STATUS_UNSUCCESSFUL; + } + + /* + * The desktop handle we got from win32k is in + * the scope of CSRSS so we can just use it. + */ + ThreadData.Desktop = Request->Data.CreateDesktopRequest.DesktopHandle; + + ThreadData.Event = CreateEventW(NULL, FALSE, FALSE, NULL); + + if (NULL == ThreadData.Event) + { + DPRINT1("Failed to create event (error %d)\n", GetLastError()); + return STATUS_UNSUCCESSFUL; + } + + ThreadHandle = CreateThread(NULL, 0, + DtbgDesktopThread, + (PVOID)&ThreadData, 0, - 0, - 0, - NULL, - NULL, - (HINSTANCE) GetModuleHandleW(NULL), NULL); - if (NULL == BackgroundWnd) - { - DPRINT1("Failed to create desktop background window\n"); - ThreadData->Status = STATUS_UNSUCCESSFUL; - SetEvent(ThreadData->Event); - return 1; - } - - ThreadData->Status = STATUS_SUCCESS; - SetEvent(ThreadData->Event); - - while (GetMessageW(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } - - return 1; -} - -CSR_API(CsrCreateDesktop) -{ - DTBG_THREAD_DATA ThreadData; - HANDLE ThreadHandle; - - DPRINT("CsrCreateDesktop\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - if (! BgInitialized) - { - BgInitialized = TRUE; - if (! DtbgInit()) - { - return STATUS_UNSUCCESSFUL; - } - } - - /* - * the desktop handle we got from win32k is in the scope of CSRSS so we can just use it - */ - ThreadData.Desktop = Request->Data.CreateDesktopRequest.DesktopHandle; - - ThreadData.Event = CreateEventW(NULL, FALSE, FALSE, NULL); - if (NULL == ThreadData.Event) - { - DPRINT1("Failed to create event (error %d)\n", GetLastError()); - return STATUS_UNSUCCESSFUL; - } - ThreadHandle = CreateThread(NULL, - 0, - DtbgDesktopThread, - (PVOID) &ThreadData, - 0, - NULL); - if (NULL == ThreadHandle) - { - CloseHandle(ThreadData.Event); - DPRINT1("Failed to create desktop window thread.\n"); - return STATUS_UNSUCCESSFUL; - } - CloseHandle(ThreadHandle); - - WaitForSingleObject(ThreadData.Event, INFINITE); - CloseHandle(ThreadData.Event); - - return ThreadData.Status; + + if (NULL == ThreadHandle) + { + CloseHandle(ThreadData.Event); + DPRINT1("Failed to create desktop window thread.\n"); + return STATUS_UNSUCCESSFUL; + } + + CloseHandle(ThreadHandle); + + WaitForSingleObject(ThreadData.Event, INFINITE); + CloseHandle(ThreadData.Event); + + return ThreadData.Status; }
CSR_API(CsrShowDesktop) { - PRIVATE_NOTIFY_DESKTOP nmh; - DPRINT("CsrShowDesktop\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; - nmh.hdr.idFrom = 0; - nmh.hdr.code = PM_SHOW_DESKTOP; - - nmh.ShowDesktop.Width = (int)Request->Data.ShowDesktopRequest.Width; - nmh.ShowDesktop.Height = (int)Request->Data.ShowDesktopRequest.Height; - - return SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, - WM_NOTIFY, - (WPARAM)nmh.hdr.hwndFrom, - (LPARAM)&nmh) - ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS; + PRIVATE_NOTIFY_DESKTOP nmh; + DPRINT("CsrShowDesktop\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; + nmh.hdr.idFrom = 0; + nmh.hdr.code = PM_SHOW_DESKTOP; + + nmh.ShowDesktop.Width = (int)Request->Data.ShowDesktopRequest.Width; + nmh.ShowDesktop.Height = (int)Request->Data.ShowDesktopRequest.Height; + + if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, + WM_NOTIFY, + (WPARAM)nmh.hdr.hwndFrom, + (LPARAM)&nmh)) + { + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; }
CSR_API(CsrHideDesktop) { - PRIVATE_NOTIFY_DESKTOP nmh; - DPRINT("CsrHideDesktop\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; - nmh.hdr.idFrom = 0; - nmh.hdr.code = PM_HIDE_DESKTOP; - - return SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, - WM_NOTIFY, - (WPARAM)nmh.hdr.hwndFrom, - (LPARAM)&nmh) - ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS; -} - -BOOL FASTCALL + PRIVATE_NOTIFY_DESKTOP nmh; + DPRINT("CsrHideDesktop\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; + nmh.hdr.idFrom = 0; + nmh.hdr.code = PM_HIDE_DESKTOP; + + if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, + WM_NOTIFY, + (WPARAM)nmh.hdr.hwndFrom, + (LPARAM)&nmh)) + { + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + +BOOL +FASTCALL DtbgIsDesktopVisible(VOID) { - if (NULL != VisibleDesktopWindow && ! IsWindowVisible(VisibleDesktopWindow)) - { - VisibleDesktopWindow = NULL; - } - - return NULL != VisibleDesktopWindow; + if (VisibleDesktopWindow != NULL && + !IsWindowVisible(VisibleDesktopWindow)) + { + VisibleDesktopWindow = NULL; + } + + return VisibleDesktopWindow != NULL; }
/* EOF */