Don't maintain a client-side WND structure for the desktop window.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 24 Mar 2005 15:18:50 +0000 (15:18 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 24 Mar 2005 15:18:50 +0000 (15:18 +0000)
Made WIN_GetPtr return WND_DESKTOP in that case.

17 files changed:
dlls/ttydrv/wnd.c
dlls/user/menu.c
dlls/user/message.c
dlls/user/msg16.c
dlls/user/painting.c
dlls/user/scroll.c
dlls/x11drv/desktop.c
dlls/x11drv/winpos.c
include/win.h
windows/class.c
windows/dce.c
windows/defdlg.c
windows/dialog.c
windows/mdi.c
windows/nonclient.c
windows/win.c
windows/winpos.c

index c590d07389ae4b6201ad37b0c992439cc69ae269..420e0dca601f1b8e8ae3ef03483ae7be9de45a4c 100644 (file)
@@ -109,6 +109,7 @@ static BOOL set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
         ret = !wine_server_call( req );
     }
     SERVER_END_REQ;
+    if (win == WND_DESKTOP) return ret;
     if (ret)
     {
         win->rectWindow = *rectWindow;
index 2d6593eada6dc940e9ae82712c5ca2a72af29a4d..bca2faba31649cf587d66f5739db3825a4801f85 100644 (file)
@@ -319,7 +319,7 @@ static HMENU get_win_sys_menu( HWND hwnd )
 {
     HMENU ret = 0;
     WND *win = WIN_GetPtr( hwnd );
-    if (win && win != WND_OTHER_PROCESS)
+    if (win && win != WND_OTHER_PROCESS && win != WND_DESKTOP)
     {
         ret = win->hSysMenu;
         WIN_ReleasePtr( win );
@@ -3667,6 +3667,7 @@ HMENU WINAPI GetSystemMenu( HWND hWnd, BOOL bRevert )
     WND *wndPtr = WIN_GetPtr( hWnd );
     HMENU retvalue = 0;
 
+    if (wndPtr == WND_DESKTOP) return 0;
     if (wndPtr == WND_OTHER_PROCESS)
     {
         if (IsWindow( hWnd )) FIXME( "not supported on other process window %p\n", hWnd );
@@ -3724,7 +3725,7 @@ BOOL WINAPI SetSystemMenu( HWND hwnd, HMENU hMenu )
 {
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (wndPtr && wndPtr != WND_OTHER_PROCESS)
+    if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP)
     {
        if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
        wndPtr->hSysMenu = MENU_GetSysMenu( hwnd, hMenu );
index adb1469b4bd99e52fc113189ffbca1364d91ac06..aa5b4b30f5885c21de32723407c7a11fd9cb6a45 100644 (file)
@@ -2867,7 +2867,7 @@ LONG WINAPI DispatchMessageA( const MSG* msg )
         if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
     }
-    if (wndPtr == WND_OTHER_PROCESS)
+    if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
     {
         if (IsWindow( msg->hwnd )) SetLastError( ERROR_MESSAGE_SYNC_ONLY );
         else SetLastError( ERROR_INVALID_WINDOW_HANDLE );
@@ -2942,7 +2942,7 @@ LONG WINAPI DispatchMessageW( const MSG* msg )
         if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
     }
-    if (wndPtr == WND_OTHER_PROCESS)
+    if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
     {
         if (IsWindow( msg->hwnd )) SetLastError( ERROR_MESSAGE_SYNC_ONLY );
         else SetLastError( ERROR_INVALID_WINDOW_HANDLE );
index 3be36d2b0d1a2a306a63241ef53adab417c1cce3..115ad9d1a00636ca2d79d8f18d5f86466f9451b7 100644 (file)
@@ -363,11 +363,10 @@ LONG WINAPI DispatchMessage16( const MSG16* msg )
         if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
     }
-    if (wndPtr == WND_OTHER_PROCESS)
+    if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
     {
-        if (IsWindow( hwnd ))
-            ERR( "cannot dispatch msg to other process window %p\n", hwnd );
-        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+        if (IsWindow( hwnd )) SetLastError( ERROR_MESSAGE_SYNC_ONLY );
+        else SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
     }
     winproc = (WNDPROC16)wndPtr->winproc;
index 256ca20e29db14b459c07d558b2e8f9716baf8f9..62993f44c665f253f6566697b106165c32339c5d 100644 (file)
@@ -188,7 +188,7 @@ static HRGN send_ncpaint( HWND hwnd, HWND *child, UINT *flags )
         INT type;
         WND *win = WIN_GetPtr( hwnd );
 
-        if (!win || win == WND_OTHER_PROCESS)
+        if (!win || win == WND_OTHER_PROCESS || win == WND_DESKTOP)
         {
             DeleteObject( whole_rgn );
             return 0;
index d4b58e158f5928f6bb1b546602ffd6cb2b1026aa..4e7e552e55fabe0d0f6becac3ae4ac986b2ebf4c 100644 (file)
@@ -152,7 +152,7 @@ static SCROLLBAR_INFO *SCROLL_GetInternalInfo( HWND hwnd, INT nBar, BOOL alloc )
     SCROLLBAR_INFO *infoPtr = NULL;
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return NULL;
+    if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return NULL;
     switch(nBar)
     {
         case SB_HORZ: infoPtr = (SCROLLBAR_INFO *)wndPtr->pHScroll; break;
@@ -201,7 +201,7 @@ static BOOL SCROLL_GetScrollBarRect( HWND hwnd, INT nBar, RECT *lprect,
     BOOL vertical;
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE;
+    if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE;
 
     switch(nBar)
     {
@@ -1069,7 +1069,7 @@ void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt )
     if (scrollbar != SB_CTL)
     {
         WND *wndPtr = WIN_GetPtr( hwnd );
-        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return;
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return;
         xoffset = wndPtr->rectClient.left - wndPtr->rectWindow.left;
         yoffset = wndPtr->rectClient.top - wndPtr->rectWindow.top;
         WIN_ReleasePtr( wndPtr );
index 7a8049cffe8e788819ed7e324f096be25ec91cba..32e65374454ee748f593495f93a679055171b973 100644 (file)
@@ -66,18 +66,12 @@ static DWORD CALLBACK desktop_thread( LPVOID driver_data )
     Display *display;
     MSG msg;
     HWND hwnd;
-    WND *win;
     Atom atom = x11drv_atom(WM_DELETE_WINDOW);
 
     NtCurrentTeb()->driver_data = driver_data;
     display = thread_display();
     hwnd = GetDesktopWindow();
 
-    /* patch the desktop window queue to point to our queue */
-    win = WIN_GetPtr( hwnd );
-    win->tid = GetCurrentThreadId();
-    WIN_ReleasePtr( win );
-
     SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_winproc );
     wine_tsx11_lock();
     XSaveContext( display, root_window, winContext, (char *)hwnd );
index b43e18ef26c90ff448172a389b3da34d14ca7a38..cf09777df3cd31128e79ea59cc9046941d684180 100644 (file)
@@ -724,7 +724,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
         if (IsWindow( hwnd )) ERR( "cannot set rectangles of other process window %p\n", hwnd );
         return FALSE;
     }
-    old_style = win->dwStyle;
     SERVER_START_REQ( set_window_pos )
     {
         req->handle        = hwnd;
@@ -749,6 +748,8 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
     }
     SERVER_END_REQ;
 
+    if (win == WND_DESKTOP) return ret;
+
     if (ret)
     {
         Display *display = thread_display();
@@ -765,6 +766,7 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
 
         win->rectWindow   = *rectWindow;
         win->rectClient   = *rectClient;
+        old_style         = win->dwStyle;
         win->dwStyle      = new_style;
         data->window_rect = *rectWindow;
 
@@ -1090,6 +1092,7 @@ BOOL X11DRV_ShowWindow( HWND hwnd, INT cmd )
     RECT newPos = {0, 0, 0, 0};
     UINT swp = 0;
 
+    if (hwnd == GetDesktopWindow()) return FALSE;
 
     TRACE("hwnd=%p, cmd=%d, wasVisible %d\n", hwnd, cmd, wasVisible);
 
index f87c3d9186ad56a0c26246da8601b6264ed52e6b..b55b9f9f8765ed6c6ec37923d9c188865dd922f4 100644 (file)
@@ -106,6 +106,7 @@ inline static void WIN_ReleasePtr( WND *ptr )
 }
 
 #define WND_OTHER_PROCESS ((WND *)1)  /* returned by WIN_GetPtr on unknown window handles */
+#define WND_DESKTOP       ((WND *)2)  /* returned by WIN_GetPtr on the desktop window */
 
 extern LRESULT HOOK_CallHooks( INT id, INT code, WPARAM wparam, LPARAM lparam, BOOL unicode );
 
index 608f2ed292e431609748bd4b9a64fc8ab99655b8..40b5d303832136d623455b2b666dab6179b70787 100644 (file)
@@ -65,7 +65,6 @@ typedef struct tagCLASS
 } CLASS;
 
 static struct list class_list = LIST_INIT( class_list );
-static CLASS *desktop_class;
 
 #define CLASS_OTHER_PROCESS ((CLASS *)1)
 
@@ -78,8 +77,9 @@ static CLASS *get_class_ptr( HWND hwnd, BOOL write_access )
 
     if (ptr)
     {
-        if (ptr != WND_OTHER_PROCESS) return ptr->class;
-        if (write_access && IsWindow( hwnd )) /* check other processes */
+        if (ptr != WND_OTHER_PROCESS && ptr != WND_DESKTOP) return ptr->class;
+
+        if (write_access && (ptr == WND_DESKTOP || IsWindow( hwnd ))) /* check other processes */
         {
             /* modifying classes in other processes is not allowed */
             SetLastError( ERROR_ACCESS_DENIED );
@@ -476,7 +476,7 @@ void CLASS_RegisterBuiltinClasses(void)
     extern const struct builtin_class_descr SCROLL_builtin_class;
     extern const struct builtin_class_descr STATIC_builtin_class;
 
-    desktop_class = register_builtin( &DESKTOP_builtin_class );
+    register_builtin( &DESKTOP_builtin_class );
     register_builtin( &BUTTON_builtin_class );
     register_builtin( &COMBO_builtin_class );
     register_builtin( &COMBOLBOX_builtin_class );
@@ -499,8 +499,6 @@ void CLASS_RegisterBuiltinClasses(void)
  */
 void CLASS_AddWindow( CLASS *class, WND *win, WINDOWPROCTYPE type )
 {
-    if (!class) class = desktop_class;
-
     if (type == WIN_PROC_32W)
     {
         if (!(win->winproc = class->winprocW)) win->winproc = class->winprocA;
index ecccab06ec6928631276a87f8e1085b490cd4021..832d1e73ee437f966252dc9c3f4c2d9fd4218357 100644 (file)
@@ -349,7 +349,7 @@ HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
     else hwnd = WIN_GetFullHandle( hwnd );
 
     if (!(wndPtr = WIN_GetPtr( hwnd ))) return 0;
-    if (wndPtr == WND_OTHER_PROCESS)
+    if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
     {
         wndPtr = NULL;
         USER_Lock();
index 902f7776f85a3f6fe0e4e44ebf7b998ebc13492b..09356f02e527fdcc6ca5e1ba2c45e702f7e4d691 100644 (file)
@@ -359,7 +359,7 @@ DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create )
         dlgInfo->flags       = 0;
         dlgInfo->hDialogHeap = 0;
         wndPtr = WIN_GetPtr( hwnd );
-        if (wndPtr && wndPtr != WND_OTHER_PROCESS)
+        if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP)
         {
             wndPtr->flags |= WIN_ISDIALOG;
             WIN_ReleasePtr( wndPtr );
index 3027d9d3f4f7db791d31a4e6773d846592362fdd..c6e733a6d630807f1170cbf7cd72d433afd17d32 100644 (file)
@@ -997,7 +997,7 @@ static HWND DIALOG_FindMsgDestination( HWND hwndDlg )
        if (!hParent) break;
 
        pParent = WIN_GetPtr(hParent);
-       if (!pParent || pParent == WND_OTHER_PROCESS) break;
+       if (!pParent || pParent == WND_OTHER_PROCESS || pParent == WND_DESKTOP) break;
 
        if (!(pParent->flags & WIN_ISDIALOG))
        {
@@ -1086,6 +1086,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg )
     if (CallMsgFilterW( msg, MSGF_DIALOGBOX )) return TRUE;
 
     hwndDlg = WIN_GetFullHandle( hwndDlg );
+    if (hwndDlg == GetDesktopWindow()) return FALSE;
     if ((hwndDlg != msg->hwnd) && !IsChild( hwndDlg, msg->hwnd )) return FALSE;
 
     hwndDlg = DIALOG_FindMsgDestination(hwndDlg);
index 79365be241cd1ea3d0e07652b570f95f2a5d6a3f..f54222d45af9b75f556f376de2e7f5586f41d3d4 100644 (file)
@@ -191,7 +191,7 @@ static MDICLIENTINFO *get_client_info( HWND client )
     {
         if (win == WND_OTHER_PROCESS)
         {
-            ERR( "client %p belongs to other process\n", client );
+            if (IsWindow(client)) ERR( "client %p belongs to other process\n", client );
             return NULL;
         }
         if (win->cbWndExtra < sizeof(MDICLIENTINFO)) WARN( "%p is not an MDI client\n", client );
index dfc38189fe486e80d05dbb3e13c8ea86ec4876cf..c368d79b5981c68fc8a248d619e735d3a568dedd 100644 (file)
@@ -182,7 +182,7 @@ static HICON NC_IconForWindow( HWND hwnd )
     HICON hIcon = 0;
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (wndPtr && wndPtr != WND_OTHER_PROCESS)
+    if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP)
     {
         hIcon = wndPtr->hIconSmall;
         if (!hIcon) hIcon = wndPtr->hIcon;
@@ -441,7 +441,7 @@ static void NC_GetInsideRect( HWND hwnd, RECT *rect )
 {
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return;
+    if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return;
 
     rect->top    = rect->left = 0;
     rect->right  = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
@@ -642,7 +642,7 @@ LONG NC_HandleNCHitTest (HWND hwnd , POINT pt)
     LONG retvalue;
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return HTERROR;
+    if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return HTERROR;
 
     retvalue = NC_DoNCHitTest (wndPtr, pt);
     WIN_ReleasePtr( wndPtr );
@@ -933,18 +933,10 @@ static void  NC_DrawCaption( HDC  hdc, RECT *rect, HWND hwnd, DWORD  style,
 
 
 /******************************************************************************
- *
  *   NC_DoNCPaint
  *
- *   Paint the non-client area for windows.  The clip region is
- *   currently ignored.
- *
- *   Bugs
- *        grep -E -A10 -B5 \(95\)\|\(Bugs\)\|\(FIXME\) windows/nonclient.c \
- *           misc/tweak.c controls/menu.c  # :-)
- *
- *****************************************************************************/
-
+ *   Paint the non-client area for windows.
+ */
 static void  NC_DoNCPaint( HWND  hwnd, HRGN  clip, BOOL  suppress_menupaint )
 {
     HDC hdc;
@@ -1185,7 +1177,7 @@ void NC_GetSysPopupPos( HWND hwnd, RECT* rect )
     else
     {
         WND *wndPtr = WIN_GetPtr( hwnd );
-        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return;
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return;
 
         NC_GetInsideRect( hwnd, rect );
         OffsetRect( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top);
index f8a39f9292c3959ff11f861d204cfc4c76fd02aa..0405749080b2eba0412907015df628d63f9e6a01 100644 (file)
@@ -51,7 +51,7 @@ WINE_DECLARE_DEBUG_CHANNEL(msg);
 /**********************************************************************/
 
 /* Desktop window */
-static WND *pWndDesktop = NULL;
+static HWND hwndDesktop;
 
 static WORD wDragWidth = 4;
 static WORD wDragHeight= 3;
@@ -213,13 +213,14 @@ static HWND *list_window_parents( HWND hwnd )
     {
         if (!(win = WIN_GetPtr( current ))) goto empty;
         if (win == WND_OTHER_PROCESS) break;  /* need to do it the hard way */
-        list[pos] = win->parent;
-        WIN_ReleasePtr( win );
-        if (!(current = list[pos]))
+        if (win == WND_DESKTOP)
         {
             if (!pos) goto empty;
+            list[pos] = 0;
             return list;
         }
+        list[pos] = current = win->parent;
+        WIN_ReleasePtr( win );
         if (++pos == size - 1)
         {
             /* need to grow the list */
@@ -312,6 +313,11 @@ WND *WIN_GetPtr( HWND hwnd )
             return ptr;
         ptr = NULL;
     }
+    else if (index == USER_HANDLE_TO_INDEX(hwndDesktop))
+    {
+        if (!HIWORD(hwnd) || hwnd == GetDesktopWindow()) ptr = WND_DESKTOP;
+        else ptr = NULL;
+    }
     else ptr = WND_OTHER_PROCESS;
     USER_Unlock();
     return ptr;
@@ -328,7 +334,7 @@ HWND WIN_IsCurrentProcess( HWND hwnd )
     WND *ptr;
     HWND ret;
 
-    if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS) return 0;
+    if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0;
     ret = ptr->hwndSelf;
     WIN_ReleasePtr( ptr );
     return ret;
@@ -345,11 +351,9 @@ HWND WIN_IsCurrentThread( HWND hwnd )
     WND *ptr;
     HWND ret = 0;
 
-    if ((ptr = WIN_GetPtr( hwnd )) && ptr != WND_OTHER_PROCESS)
-    {
-        if (ptr->tid == GetCurrentThreadId()) ret = ptr->hwndSelf;
-        WIN_ReleasePtr( ptr );
-    }
+    if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0;
+    if (ptr->tid == GetCurrentThreadId()) ret = ptr->hwndSelf;
+    WIN_ReleasePtr( ptr );
     return ret;
 }
 
@@ -370,6 +374,8 @@ HWND WIN_Handle32( HWND16 hwnd16 )
 
     if (!(ptr = WIN_GetPtr( hwnd ))) return hwnd;
 
+    if (ptr == WND_DESKTOP) return GetDesktopWindow();
+
     if (ptr != WND_OTHER_PROCESS)
     {
         hwnd = ptr->hwndSelf;
@@ -411,7 +417,7 @@ void WIN_LinkWindow( HWND hwnd, HWND parent, HWND hwndInsertAfter )
 {
     WND *wndPtr = WIN_GetPtr( hwnd );
 
-    if (!wndPtr) return;
+    if (!wndPtr || wndPtr == WND_DESKTOP) return;
     if (wndPtr == WND_OTHER_PROCESS)
     {
         if (IsWindow(hwnd)) ERR(" cannot link other process window %p\n", hwnd );
@@ -444,7 +450,7 @@ HWND WIN_SetOwner( HWND hwnd, HWND owner )
     WND *win = WIN_GetPtr( hwnd );
     HWND ret = 0;
 
-    if (!win) return 0;
+    if (!win || win == WND_DESKTOP) return 0;
     if (win == WND_OTHER_PROCESS)
     {
         if (IsWindow(hwnd)) ERR( "cannot set owner %p on other process window %p\n", owner, hwnd );
@@ -477,7 +483,7 @@ ULONG WIN_SetStyle( HWND hwnd, ULONG set_bits, ULONG clear_bits )
     ULONG new_style, old_style = 0;
     WND *win = WIN_GetPtr( hwnd );
 
-    if (!win) return 0;
+    if (!win || win == WND_DESKTOP) return 0;
     if (win == WND_OTHER_PROCESS)
     {
         if (IsWindow(hwnd))
@@ -521,7 +527,16 @@ BOOL WIN_GetRectangles( HWND hwnd, RECT *rectWindow, RECT *rectClient )
     BOOL ret = TRUE;
 
     if (!win) return FALSE;
-    if (win == WND_OTHER_PROCESS)
+    if (win == WND_DESKTOP)
+    {
+        RECT rect;
+        rect.left = rect.top = 0;
+        rect.right  = GetSystemMetrics(SM_CXSCREEN);
+        rect.bottom = GetSystemMetrics(SM_CYSCREEN);
+        if (rectWindow) *rectWindow = rect;
+        if (rectClient) *rectClient = rect;
+    }
+    else if (win == WND_OTHER_PROCESS)
     {
         SERVER_START_REQ( get_window_rectangles )
         {
@@ -645,26 +660,27 @@ void WIN_DestroyThreadWindows( HWND hwnd )
  */
 BOOL WIN_CreateDesktopWindow(void)
 {
-    HWND hwndDesktop;
     CREATESTRUCTA cs;
 
     TRACE("Creating desktop window\n");
 
     if (!WINPOS_CreateInternalPosAtom()) return FALSE;
 
-    pWndDesktop = create_window_handle( 0, 0, LOWORD(DESKTOP_CLASS_ATOM), 0, WIN_PROC_32W );
-    if (!pWndDesktop) return FALSE;
-    hwndDesktop = pWndDesktop->hwndSelf;
+    SERVER_START_REQ( create_window )
+    {
+        req->parent   = 0;
+        req->owner    = 0;
+        req->atom     = LOWORD(DESKTOP_CLASS_ATOM);
+        req->instance = 0;
+        if (!wine_server_call_err( req )) hwndDesktop = reply->handle;
+    }
+    SERVER_END_REQ;
 
-    pWndDesktop->tid               = 0;  /* nobody owns the desktop */
-    pWndDesktop->parent            = 0;
-    pWndDesktop->owner             = 0;
-    pWndDesktop->text              = NULL;
-    pWndDesktop->pVScroll          = NULL;
-    pWndDesktop->pHScroll          = NULL;
-    pWndDesktop->helpContext       = 0;
-    pWndDesktop->flags             = 0;
-    pWndDesktop->hSysMenu          = 0;
+    if (!hwndDesktop)
+    {
+        ERR( "error %ld creating desktop window\n", GetLastError() );
+        return FALSE;
+    }
 
     cs.lpCreateParams = NULL;
     cs.hInstance      = 0;
@@ -674,30 +690,12 @@ BOOL WIN_CreateDesktopWindow(void)
     cs.y              = 0;
     cs.cx             = GetSystemMetrics( SM_CXSCREEN );
     cs.cy             = GetSystemMetrics( SM_CYSCREEN );
-    cs.style          = pWndDesktop->dwStyle;
-    cs.dwExStyle      = pWndDesktop->dwExStyle;
+    cs.style          = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+    cs.dwExStyle      = 0;
     cs.lpszName       = NULL;
     cs.lpszClass      = DESKTOP_CLASS_ATOM;
 
-    SERVER_START_REQ( set_window_info )
-    {
-        req->handle = hwndDesktop;
-        req->flags  = 0;  /* don't set anything, just retrieve */
-        req->extra_offset = -1;
-        wine_server_call( req );
-        pWndDesktop->dwStyle   = reply->old_style;
-        pWndDesktop->dwExStyle = reply->old_ex_style;
-        pWndDesktop->hInstance = (HINSTANCE)reply->old_instance;
-        pWndDesktop->userdata  = (ULONG_PTR)reply->old_user_data;
-        pWndDesktop->wIDmenu   = reply->old_id;
-    }
-    SERVER_END_REQ;
-    WIN_ReleasePtr( pWndDesktop );
-
-    if (!USER_Driver.pCreateWindow || !USER_Driver.pCreateWindow( hwndDesktop, &cs, FALSE ))
-        return FALSE;
-
-    return TRUE;
+    return USER_Driver.pCreateWindow( hwndDesktop, &cs, TRUE );
 }
 
 
@@ -946,7 +944,7 @@ static HWND WIN_CreateWindowEx( CREATESTRUCTA *cs, ATOM classAtom,
         UINT flags = 0;
 
         wndPtr = WIN_GetPtr(cs->hwndParent);
-        if (wndPtr && wndPtr != WND_OTHER_PROCESS)
+        if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP)
         {
             flags = wndPtr->flags;
             WIN_ReleasePtr(wndPtr);
@@ -1640,7 +1638,7 @@ HWND WINAPI FindWindowW( LPCWSTR className, LPCWSTR title )
  */
 HWND WINAPI GetDesktopWindow(void)
 {
-    if (pWndDesktop) return pWndDesktop->hwndSelf;
+    if (hwndDesktop) return hwndDesktop;
     ERR( "Wine init error: either you're trying to use an invalid native USER.EXE config, or some graphics/GUI libraries or DLLs didn't initialize properly. Aborting.\n" );
     ExitProcess(1);
     return 0;
@@ -1714,6 +1712,7 @@ BOOL WINAPI IsWindowUnicode( HWND hwnd )
     BOOL retvalue;
 
     if (!(wndPtr = WIN_GetPtr(hwnd)) || wndPtr == WND_OTHER_PROCESS) return FALSE;
+    if (wndPtr == WND_DESKTOP) return TRUE;
     retvalue = (WINPROC_GetProcType( wndPtr->winproc ) == WIN_PROC_32W);
     WIN_ReleasePtr( wndPtr );
     return retvalue;
@@ -1734,7 +1733,7 @@ WORD WINAPI GetWindowWord( HWND hwnd, INT offset )
             SetLastError( ERROR_INVALID_WINDOW_HANDLE );
             return 0;
         }
-        if (wndPtr == WND_OTHER_PROCESS)
+        if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
         {
             SERVER_START_REQ( set_window_info )
             {
@@ -1801,6 +1800,11 @@ WORD WINAPI SetWindowWord( HWND hwnd, INT offset, WORD newval )
     }
 
     wndPtr = WIN_GetPtr( hwnd );
+    if (wndPtr == WND_DESKTOP)
+    {
+        SetLastError( ERROR_ACCESS_DENIED );
+        return 0;
+    }
     if (wndPtr == WND_OTHER_PROCESS)
     {
         if (IsWindow(hwnd))
@@ -1865,7 +1869,7 @@ static LONG_PTR WIN_GetWindowLong( HWND hwnd, INT offset, WINDOWPROCTYPE type )
         return 0;
     }
 
-    if (wndPtr == WND_OTHER_PROCESS)
+    if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
     {
         if (offset == GWLP_WNDPROC)
         {
@@ -1976,7 +1980,19 @@ static LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, LONG_PTR newval,
         SetLastError( ERROR_INVALID_PARAMETER );
         return FALSE;
     }
-    if (!WIN_IsCurrentProcess( hwnd ))
+
+    if (!(wndPtr = WIN_GetPtr( hwnd )))
+    {
+        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+        return 0;
+    }
+    if (wndPtr == WND_DESKTOP)
+    {
+        /* can't change anything on the desktop window */
+        SetLastError( ERROR_ACCESS_DENIED );
+        return 0;
+    }
+    if (wndPtr == WND_OTHER_PROCESS)
     {
         if (offset == GWLP_WNDPROC)
         {
@@ -1986,15 +2002,6 @@ static LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, LONG_PTR newval,
         return SendMessageW( hwnd, WM_WINE_SETWINDOWLONG, offset, newval );
     }
 
-    wndPtr = WIN_GetPtr( hwnd );
-    if (wndPtr->hwndSelf == GetDesktopWindow())
-    {
-        /* can't change anything on the desktop window */
-        WIN_ReleasePtr( wndPtr );
-        SetLastError( ERROR_ACCESS_DENIED );
-        return 0;
-    }
-
     /* first some special cases */
     switch( offset )
     {
@@ -2289,7 +2296,8 @@ INT WINAPI InternalGetWindowText(HWND hwnd,LPWSTR lpString,INT nMaxCount )
 
     if (nMaxCount <= 0) return 0;
     if (!(win = WIN_GetPtr( hwnd ))) return 0;
-    if (win != WND_OTHER_PROCESS)
+    if (win == WND_DESKTOP) lpString[0] = 0;
+    else if (win != WND_OTHER_PROCESS)
     {
         if (win->text) lstrcpynW( lpString, win->text, nMaxCount );
         else lpString[0] = 0;
@@ -2385,6 +2393,7 @@ BOOL WINAPI IsWindow( HWND hwnd )
     BOOL ret;
 
     if (!(ptr = WIN_GetPtr( hwnd ))) return FALSE;
+    if (ptr == WND_DESKTOP) return TRUE;
 
     if (ptr != WND_OTHER_PROCESS)
     {
@@ -2417,7 +2426,7 @@ DWORD WINAPI GetWindowThreadProcessId( HWND hwnd, LPDWORD process )
         return 0;
     }
 
-    if (ptr != WND_OTHER_PROCESS)
+    if (ptr != WND_OTHER_PROCESS && ptr != WND_DESKTOP)
     {
         /* got a valid window */
         tid = ptr->tid;
@@ -2454,6 +2463,7 @@ HWND WINAPI GetParent( HWND hwnd )
         SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
     }
+    if (wndPtr == WND_DESKTOP) return 0;
     if (wndPtr == WND_OTHER_PROCESS)
     {
         LONG style = GetWindowLongW( hwnd, GWL_STYLE );
@@ -2497,6 +2507,7 @@ HWND WINAPI GetAncestor( HWND hwnd, UINT type )
             SetLastError( ERROR_INVALID_WINDOW_HANDLE );
             return 0;
         }
+        if (win == WND_DESKTOP) return 0;
         if (win != WND_OTHER_PROCESS)
         {
             ret = win->parent;
@@ -2584,7 +2595,7 @@ HWND WINAPI SetParent( HWND hwnd, HWND parent )
     was_visible = ShowWindow( hwnd, SW_HIDE );
 
     if (!IsWindow( parent )) return 0;
-    if (!(wndPtr = WIN_GetPtr(hwnd)) || wndPtr == WND_OTHER_PROCESS) return 0;
+    if (!(wndPtr = WIN_GetPtr(hwnd)) || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return 0;
 
     retvalue = wndPtr->parent;  /* old parent */
     if (parent != retvalue)
@@ -2703,6 +2714,7 @@ HWND WINAPI GetWindow( HWND hwnd, UINT rel )
             SetLastError( ERROR_INVALID_HANDLE );
             return 0;
         }
+        if (wndPtr == WND_DESKTOP) return 0;
         if (wndPtr != WND_OTHER_PROCESS)
         {
             retval = wndPtr->owner;
@@ -2972,7 +2984,7 @@ BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert )
         RedrawWindow( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_FRAME );
 
         wndPtr = WIN_GetPtr(hWnd);
-        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE;
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE;
         if (bInvert && !(wndPtr->flags & WIN_NCACTIVATED))
         {
             wndPtr->flags |= WIN_NCACTIVATED;
@@ -2989,7 +3001,7 @@ BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert )
         WPARAM wparam;
 
         wndPtr = WIN_GetPtr(hWnd);
-        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE;
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE;
         hWnd = wndPtr->hwndSelf;  /* make it a full handle */
 
         if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED);
@@ -3017,7 +3029,7 @@ DWORD WINAPI GetWindowContextHelpId( HWND hwnd )
 {
     DWORD retval;
     WND *wnd = WIN_GetPtr( hwnd );
-    if (!wnd) return 0;
+    if (!wnd || wnd == WND_DESKTOP) return 0;
     if (wnd == WND_OTHER_PROCESS)
     {
         if (IsWindow( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
@@ -3035,7 +3047,7 @@ DWORD WINAPI GetWindowContextHelpId( HWND hwnd )
 BOOL WINAPI SetWindowContextHelpId( HWND hwnd, DWORD id )
 {
     WND *wnd = WIN_GetPtr( hwnd );
-    if (!wnd) return FALSE;
+    if (!wnd || wnd == WND_DESKTOP) return FALSE;
     if (wnd == WND_OTHER_PROCESS)
     {
         if (IsWindow( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
index f479c303847514d0f4ae3d6f5f9f24c9fa3a0a1c..8541bd1725fa53845abce9e89d5da07b6638fd9e 100644 (file)
@@ -477,7 +477,7 @@ static void WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, POINT *offset )
     {
         HWND hwnd = hwndFrom;
 
-        while (hwnd && hwnd != GetDesktopWindow())
+        while (hwnd)
         {
             if (hwnd == hwndTo) return;
             if (!(wndPtr = WIN_GetPtr( hwnd )))
@@ -485,6 +485,7 @@ static void WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, POINT *offset )
                 ERR( "bad hwndFrom = %p\n", hwnd );
                 return;
             }
+            if (wndPtr == WND_DESKTOP) break;
             if (wndPtr == WND_OTHER_PROCESS) goto other_process;
             offset->x += wndPtr->rectClient.left;
             offset->y += wndPtr->rectClient.top;
@@ -498,13 +499,14 @@ static void WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, POINT *offset )
     {
         HWND hwnd = hwndTo;
 
-        while (hwnd && hwnd != GetDesktopWindow())
+        while (hwnd)
         {
             if (!(wndPtr = WIN_GetPtr( hwnd )))
             {
                 ERR( "bad hwndTo = %p\n", hwnd );
                 return;
             }
+            if (wndPtr == WND_DESKTOP) break;
             if (wndPtr == WND_OTHER_PROCESS) goto other_process;
             offset->x -= wndPtr->rectClient.left;
             offset->y -= wndPtr->rectClient.top;
@@ -893,7 +895,7 @@ BOOL WINAPI GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
     WND *pWnd = WIN_GetPtr( hwnd );
     LPINTERNALPOS lpPos;
 
-    if (!pWnd) return FALSE;
+    if (!pWnd || pWnd == WND_DESKTOP) return FALSE;
     if (pWnd == WND_OTHER_PROCESS)
     {
         if (IsWindow( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
@@ -932,7 +934,7 @@ static BOOL WINPOS_SetPlacement( HWND hwnd, const WINDOWPLACEMENT *wndpl, UINT f
     DWORD style;
     WND *pWnd = WIN_GetPtr( hwnd );
 
-    if (!pWnd || pWnd == WND_OTHER_PROCESS) return FALSE;
+    if (!pWnd || pWnd == WND_OTHER_PROCESS || pWnd == WND_DESKTOP) return FALSE;
     lpPos = WINPOS_InitInternalPos( pWnd );
 
     if( flags & PLACE_MIN )