Commit in reactos/subsys/csrss/win32csr on MAIN
desktopbg.c+93-451.8 -> 1.9
use WM_NOTIFY messages to communicate with the desktop window thread as they can't be sent from processes other than csrss

reactos/subsys/csrss/win32csr
desktopbg.c 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- desktopbg.c	8 May 2004 19:35:32 -0000	1.8
+++ desktopbg.c	17 Aug 2004 14:57:52 -0000	1.9
@@ -1,4 +1,4 @@
-/* $Id: desktopbg.c,v 1.8 2004/05/08 19:35:32 weiden Exp $
+/* $Id: desktopbg.c,v 1.9 2004/08/17 14:57:52 weiden Exp $
  *
  * reactos/subsys/csrss/win32csr/desktopbg.c
  *
@@ -43,63 +43,97 @@
   NTSTATUS Status;
 } DTBG_THREAD_DATA, *PDTBG_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 Initialized = FALSE;
 static HWND VisibleDesktopWindow = NULL;
 
 static LRESULT CALLBACK
 DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
 {
-  LRESULT Result;
-
   switch(Msg)
     {
       case WM_ERASEBKGND:
-        {
-          PaintDesktop((HDC)wParam);
-          Result = 1;
-        }
-        break;
+        return 1;
+
       case WM_PAINT:
+      {
+        PAINTSTRUCT PS;
+        RECT rc;
+        HDC hDC;
+        
+        if(GetUpdateRect(Wnd, &rc, FALSE) &&
+           (hDC = BeginPaint(Wnd, &PS)))
         {
-          PAINTSTRUCT PS;
-          BeginPaint(Wnd, &PS);
-          /* No need to paint, already done in WM_ERASEBKGND. */
+          PaintDesktop(hDC);
           EndPaint(Wnd, &PS);
-          Result = 0;
         }
-        break;
+        return 0;
+      }
+
       case WM_SETCURSOR:
-	Result = (LRESULT) SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
-        break;
+	return (LRESULT) SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
+
       case WM_NCCREATE:
-        Result = (LRESULT) TRUE;
-        break;
+        return (LRESULT) TRUE;
+
       case WM_CREATE:
-        Result = 0;
-        break;
-      case PM_SHOW_DESKTOP:
-        Result = ! SetWindowPos(Wnd,
-                                NULL, 0, 0,
-                                (int)(short) LOWORD(lParam),
-                                (int)(short) HIWORD(lParam),
-                                SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOREDRAW);
-        UpdateWindow(Wnd);
-        VisibleDesktopWindow = Wnd;
-        break;
-      case PM_HIDE_DESKTOP:
-        Result = ! SetWindowPos(Wnd,
-                                NULL, 0, 0, 0, 0,
-                                SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE |
-                                SWP_HIDEWINDOW);
-        UpdateWindow(Wnd);
-        VisibleDesktopWindow = NULL;
-        break;
-      default:
-        Result = 0;
-        break;
+        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 | SWP_NOREDRAW);
+            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->code);
+            return 0;
+        }
+      }
     }
 
-  return Result;
+  return 0;
 }
 
 static BOOL FASTCALL
@@ -253,16 +287,23 @@
 
 CSR_API(CsrShowDesktop)
 {
+  PRIVATE_NOTIFY_DESKTOP nmh;
   DPRINT("CsrShowDesktop\n");
 
   Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
   Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
 
+  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;
+
   Reply->Status = SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
-                               PM_SHOW_DESKTOP,
-                               0,
-                               MAKELONG(Request->Data.ShowDesktopRequest.Width,
-                                        Request->Data.ShowDesktopRequest.Height))
+                               WM_NOTIFY,
+                               (WPARAM)nmh.hdr.hwndFrom,
+                               (LPARAM)&nmh)
                   ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
 
   return Reply->Status;
@@ -270,13 +311,20 @@
 
 CSR_API(CsrHideDesktop)
 {
+  PRIVATE_NOTIFY_DESKTOP nmh;
   DPRINT("CsrHideDesktop\n");
 
   Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
   Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
 
+  nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow;
+  nmh.hdr.idFrom = 0;
+  nmh.hdr.code = PM_HIDE_DESKTOP;
+
   Reply->Status = SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow,
-                               PM_HIDE_DESKTOP, 0, 0)
+                               WM_NOTIFY,
+                               (WPARAM)nmh.hdr.hwndFrom,
+                               (LPARAM)&nmh)
                   ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
 
   return Reply->Status;
CVSspam 0.2.8