diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index 03831a3ba8f..ccea5178f6f 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -533,17 +533,17 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt ) RECT rect, rcClient; POINT ptClient; - TRACE("hwnd=%p pt=%d,%d\n", wndPtr->hwndSelf, pt.x, pt.y ); + TRACE("hwnd=%p pt=%d,%d\n", wndPtr->obj.handle, pt.x, pt.y ); - GetWindowRect(wndPtr->hwndSelf, &rect ); + GetWindowRect(wndPtr->obj.handle, &rect ); if (!PtInRect( &rect, pt )) return HTNOWHERE; if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION; /* Check client area */ ptClient = pt; - ScreenToClient( wndPtr->hwndSelf, &ptClient ); - GetClientRect( wndPtr->hwndSelf, &rcClient ); + ScreenToClient( wndPtr->obj.handle, &ptClient ); + GetClientRect( wndPtr->obj.handle, &rcClient ); if (PtInRect( &rcClient, ptClient )) return HTCLIENT; /* Check borders */ @@ -606,7 +606,7 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt ) /* Check system menu */ if ((wndPtr->dwStyle & WS_SYSMENU) && !(wndPtr->dwExStyle & WS_EX_TOOLWINDOW)) { - if (NC_IconForWindow(wndPtr->hwndSelf)) + if (NC_IconForWindow(wndPtr->obj.handle)) rect.left += GetSystemMetrics(SM_CYCAPTION) - 1; } if (pt.x < rect.left) return HTSYSMENU; diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 28ea84119b5..be40018e464 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -250,12 +250,12 @@ static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name, index = USER_HANDLE_TO_INDEX(handle); assert( index < NB_USER_HANDLES ); user_handles[index] = win; - win->hwndSelf = handle; + win->obj.handle = handle; + win->obj.type = USER_WINDOW; win->parent = full_parent; win->owner = full_owner; win->class = class; win->winproc = get_class_winproc( class ); - win->dwMagic = WND_MAGIC; win->cbWndExtra = extra_bytes; if (WINPROC_IsUnicode( win->winproc, unicode )) win->flags |= WIN_ISUNICODE; return win; @@ -267,31 +267,23 @@ static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name, * * Free a window handle. */ -static WND *free_window_handle( HWND hwnd ) +static void free_window_handle( HWND hwnd ) { - WND *ptr; + struct user_object *ptr; WORD index = USER_HANDLE_TO_INDEX(hwnd); - if (index >= NB_USER_HANDLES) return NULL; - USER_Lock(); - if ((ptr = user_handles[index])) + if ((ptr = get_user_handle_ptr( hwnd, USER_WINDOW )) && ptr != OBJ_OTHER_PROCESS) { SERVER_START_REQ( destroy_window ) { req->handle = wine_server_user_handle( hwnd ); - if (!wine_server_call_err( req )) - { - user_handles[index] = NULL; - ptr->dwMagic = 0; - } - else - ptr = NULL; + if (!wine_server_call_err( req )) user_handles[index] = NULL; + else ptr = NULL; } SERVER_END_REQ; + release_user_handle_ptr( ptr ); + HeapFree( GetProcessHeap(), 0, ptr ); } - USER_Unlock(); - HeapFree( GetProcessHeap(), 0, ptr ); - return ptr; } @@ -494,22 +486,12 @@ BOOL is_desktop_window( HWND hwnd ) */ WND *WIN_GetPtr( HWND hwnd ) { - WND * ptr; - WORD index = USER_HANDLE_TO_INDEX(hwnd); + WND *ptr; - if (index >= NB_USER_HANDLES) return NULL; - - USER_Lock(); - if ((ptr = user_handles[index])) + if ((ptr = get_user_handle_ptr( hwnd, USER_WINDOW )) == WND_OTHER_PROCESS) { - if (ptr->dwMagic == WND_MAGIC && - (hwnd == ptr->hwndSelf || !HIWORD(hwnd) || HIWORD(hwnd) == 0xffff)) - return ptr; - ptr = NULL; + if (is_desktop_window( hwnd )) ptr = WND_DESKTOP; } - else if (is_desktop_window( hwnd )) ptr = WND_DESKTOP; - else ptr = WND_OTHER_PROCESS; - USER_Unlock(); return ptr; } @@ -525,7 +507,7 @@ HWND WIN_IsCurrentProcess( HWND hwnd ) HWND ret; if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0; - ret = ptr->hwndSelf; + ret = ptr->obj.handle; WIN_ReleasePtr( ptr ); return ret; } @@ -542,7 +524,7 @@ HWND WIN_IsCurrentThread( HWND hwnd ) HWND ret = 0; if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0; - if (ptr->tid == GetCurrentThreadId()) ret = ptr->hwndSelf; + if (ptr->tid == GetCurrentThreadId()) ret = ptr->obj.handle; WIN_ReleasePtr( ptr ); return ret; } @@ -572,7 +554,7 @@ HWND WIN_Handle32( HWND16 hwnd16 ) if (ptr != WND_OTHER_PROCESS) { - hwnd = ptr->hwndSelf; + hwnd = ptr->obj.handle; WIN_ReleasePtr( ptr ); } else /* may belong to another process */ @@ -832,7 +814,6 @@ static void destroy_thread_window( HWND hwnd ) sys_menu = wndPtr->hSysMenu; free_dce( wndPtr->dce, hwnd ); user_handles[index] = NULL; - wndPtr->dwMagic = 0; } USER_Unlock(); @@ -1219,7 +1200,7 @@ static HWND WIN_CreateWindowEx( CREATESTRUCTA *cs, LPCWSTR className, UINT flags if (!(wndPtr = create_window_handle( parent, owner, className, cs->hInstance, unicode ))) return 0; - hwnd = wndPtr->hwndSelf; + hwnd = wndPtr->obj.handle; /* Fill the window structure */ @@ -3305,7 +3286,7 @@ BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert ) wndPtr = WIN_GetPtr(hWnd); if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE; - hWnd = wndPtr->hwndSelf; /* make it a full handle */ + hWnd = wndPtr->obj.handle; /* make it a full handle */ if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED); else wparam = (hWnd == GetForegroundWindow()); diff --git a/dlls/user32/win.h b/dlls/user32/win.h index 5cd879ab5fb..743c67e1fa6 100644 --- a/dlls/user32/win.h +++ b/dlls/user32/win.h @@ -28,20 +28,19 @@ #include #include -#define WND_MAGIC 0x444e4957 /* 'WIND' */ +#include "user_private.h" struct tagCLASS; struct tagDIALOGINFO; typedef struct tagWND { - HWND hwndSelf; /* Handle of this window */ + struct user_object obj; /* object header */ HWND parent; /* Window parent */ HWND owner; /* Window owner */ struct tagCLASS *class; /* Window class */ struct dce *dce; /* DCE pointer */ WNDPROC winproc; /* Window procedure */ - DWORD dwMagic; /* Magic number (must be WND_MAGIC) */ DWORD tid; /* Owner thread id */ HINSTANCE hInstance; /* Window hInstance (from CreateWindow) */ RECT rectClient; /* Client area rel. to parent client area */ diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index 72532dee8f9..c62fdaa7460 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -1790,7 +1790,7 @@ static BOOL fixup_flags( WINDOWPOS *winpos ) SetLastError( ERROR_INVALID_WINDOW_HANDLE ); return FALSE; } - winpos->hwnd = wndPtr->hwndSelf; /* make it a full handle */ + winpos->hwnd = wndPtr->obj.handle; /* make it a full handle */ /* Finally make sure that all coordinates are valid */ if (winpos->x < -32768) winpos->x = -32768;