mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 17:35:07 +00:00
Cleanup in desktopbg.c, inspired by BeastL (slyhome|AT|ipnet|DOT|ua), bug #4985.
svn path=/trunk/; revision=44474
This commit is contained in:
parent
b1e100ebd8
commit
ae89fc3761
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
|
||||
#define NDEBUG
|
||||
|
||||
#include "w32csr.h"
|
||||
#include <debug.h>
|
||||
|
||||
|
@ -26,47 +27,44 @@ typedef struct tagDTBG_THREAD_DATA
|
|||
typedef struct tagPRIVATE_NOTIFY_DESKTOP
|
||||
{
|
||||
NMHDR hdr;
|
||||
union
|
||||
{
|
||||
struct /* PM_SHOW_DESKTOP */
|
||||
{
|
||||
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)
|
||||
static
|
||||
LRESULT
|
||||
CALLBACK
|
||||
DtbgWindowProc(HWND Wnd,
|
||||
UINT Msg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
PAINTSTRUCT PS;
|
||||
HDC hDC;
|
||||
|
||||
switch(Msg)
|
||||
switch (Msg)
|
||||
{
|
||||
case WM_ERASEBKGND:
|
||||
PaintDesktop((HDC)wParam);
|
||||
return 1;
|
||||
|
||||
case WM_PAINT:
|
||||
{
|
||||
if((hDC = BeginPaint(Wnd, &PS)))
|
||||
if (BeginPaint(Wnd, &PS))
|
||||
EndPaint(Wnd, &PS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
case WM_SETCURSOR:
|
||||
return (LRESULT) SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
|
||||
return (LRESULT)SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
|
||||
|
||||
case WM_NCCREATE:
|
||||
return (LRESULT) TRUE;
|
||||
return (LRESULT)TRUE;
|
||||
|
||||
case WM_CREATE:
|
||||
return 0;
|
||||
|
||||
case WM_CLOSE:
|
||||
return 0;
|
||||
|
||||
|
@ -74,19 +72,21 @@ DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
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)
|
||||
/* 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,
|
||||
Result = !SetWindowPos(Wnd, NULL, 0, 0,
|
||||
nmh->ShowDesktop.Width,
|
||||
nmh->ShowDesktop.Height,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW);
|
||||
SWP_NOACTIVATE | SWP_NOZORDER |
|
||||
SWP_SHOWWINDOW);
|
||||
|
||||
UpdateWindow(Wnd);
|
||||
VisibleDesktopWindow = Wnd;
|
||||
return Result;
|
||||
|
@ -96,17 +96,18 @@ DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
LRESULT Result;
|
||||
|
||||
Result = ! SetWindowPos(Wnd,
|
||||
NULL, 0, 0, 0, 0,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE |
|
||||
SWP_HIDEWINDOW);
|
||||
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);
|
||||
DPRINT("Unknown notification code 0x%x sent to the desktop window!\n",
|
||||
nmh->hdr.code);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -118,8 +119,10 @@ DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static BOOL FASTCALL
|
||||
DtbgInit()
|
||||
static
|
||||
BOOL
|
||||
FASTCALL
|
||||
DtbgInit(VOID)
|
||||
{
|
||||
WNDCLASSEXW Class;
|
||||
ATOM ClassAtom;
|
||||
|
@ -132,49 +135,52 @@ DtbgInit()
|
|||
Class.lpfnWndProc = DtbgWindowProc;
|
||||
Class.cbClsExtra = 0;
|
||||
Class.cbWndExtra = 0;
|
||||
Class.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
|
||||
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;
|
||||
Class.lpszClassName = (LPCWSTR)DESKTOP_WINDOW_ATOM;
|
||||
ClassAtom = RegisterClassExW(&Class);
|
||||
if ((ATOM) 0 == ClassAtom)
|
||||
|
||||
if (ClassAtom == INVALID_ATOM)
|
||||
{
|
||||
DPRINT1("Unable to register desktop background class (error %d)\n",
|
||||
GetLastError());
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VisibleDesktopWindow = NULL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static DWORD WINAPI
|
||||
static
|
||||
DWORD
|
||||
WINAPI
|
||||
DtbgDesktopThread(PVOID Data)
|
||||
{
|
||||
HWND BackgroundWnd;
|
||||
MSG msg;
|
||||
PDTBG_THREAD_DATA ThreadData = (PDTBG_THREAD_DATA) Data;
|
||||
PDTBG_THREAD_DATA ThreadData = (PDTBG_THREAD_DATA)Data;
|
||||
|
||||
if (! SetThreadDesktop(ThreadData->Desktop))
|
||||
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,
|
||||
|
||||
BackgroundWnd = CreateWindowW((LPCWSTR)DESKTOP_WINDOW_ATOM,
|
||||
L"",
|
||||
WS_POPUP | WS_CLIPCHILDREN,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
(HINSTANCE) GetModuleHandleW(NULL),
|
||||
0, 0, 0, 0,
|
||||
NULL, NULL,
|
||||
(HINSTANCE)GetModuleHandleW(NULL),
|
||||
NULL);
|
||||
|
||||
if (NULL == BackgroundWnd)
|
||||
{
|
||||
DPRINT1("Failed to create desktop background window\n");
|
||||
|
@ -205,38 +211,42 @@ CSR_API(CsrCreateDesktop)
|
|||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
||||
|
||||
if (! BgInitialized)
|
||||
if (!BgInitialized)
|
||||
{
|
||||
BgInitialized = TRUE;
|
||||
if (! DtbgInit())
|
||||
{
|
||||
|
||||
if (!DtbgInit())
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* the desktop handle we got from win32k is in the scope of CSRSS so we can just use it
|
||||
* 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,
|
||||
(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);
|
||||
|
@ -260,11 +270,15 @@ CSR_API(CsrShowDesktop)
|
|||
nmh.ShowDesktop.Width = (int)Request->Data.ShowDesktopRequest.Width;
|
||||
nmh.ShowDesktop.Height = (int)Request->Data.ShowDesktopRequest.Height;
|
||||
|
||||
return SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
|
||||
if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
|
||||
WM_NOTIFY,
|
||||
(WPARAM)nmh.hdr.hwndFrom,
|
||||
(LPARAM)&nmh)
|
||||
? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
|
||||
(LPARAM)&nmh))
|
||||
{
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
CSR_API(CsrHideDesktop)
|
||||
|
@ -279,22 +293,28 @@ CSR_API(CsrHideDesktop)
|
|||
nmh.hdr.idFrom = 0;
|
||||
nmh.hdr.code = PM_HIDE_DESKTOP;
|
||||
|
||||
return SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
|
||||
if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
|
||||
WM_NOTIFY,
|
||||
(WPARAM)nmh.hdr.hwndFrom,
|
||||
(LPARAM)&nmh)
|
||||
? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
|
||||
(LPARAM)&nmh))
|
||||
{
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
BOOL FASTCALL
|
||||
BOOL
|
||||
FASTCALL
|
||||
DtbgIsDesktopVisible(VOID)
|
||||
{
|
||||
if (NULL != VisibleDesktopWindow && ! IsWindowVisible(VisibleDesktopWindow))
|
||||
if (VisibleDesktopWindow != NULL &&
|
||||
!IsWindowVisible(VisibleDesktopWindow))
|
||||
{
|
||||
VisibleDesktopWindow = NULL;
|
||||
}
|
||||
|
||||
return NULL != VisibleDesktopWindow;
|
||||
return VisibleDesktopWindow != NULL;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue