mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
make window parent a pointer + fix usage
svn path=/trunk/; revision=17697
This commit is contained in:
parent
e51f10ab47
commit
a1c7e10fc8
6 changed files with 50 additions and 79 deletions
|
@ -72,9 +72,9 @@ typedef struct _WINDOW_OBJECT
|
|||
/* Entry in the list of thread windows. */
|
||||
LIST_ENTRY ThreadListEntry;
|
||||
/* Handle to the parent window. */
|
||||
HANDLE Parent;
|
||||
struct _WINDOW_OBJECT* Parent;
|
||||
/* Handle to the owner window. */
|
||||
HANDLE Owner;
|
||||
HWND hOwner;
|
||||
/* DC Entries (DCE) */
|
||||
PDCE Dce;
|
||||
/* Property list head.*/
|
||||
|
|
|
@ -129,7 +129,7 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner)
|
|||
|
||||
for(Child = Root->FirstChild; Child; Child = Child->NextSibling)
|
||||
{
|
||||
OwnerWnd = IntGetWindowObject(Child->Owner);
|
||||
OwnerWnd = IntGetWindowObject(Child->hOwner);
|
||||
if(!OwnerWnd)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -52,6 +52,8 @@ ObmpPerformRetentionChecks(PUSER_OBJECT_HEADER ObjectHeader)
|
|||
{
|
||||
DPRINT1("ObjectHeader 0x%X has invalid reference count (%d)\n",
|
||||
ObjectHeader, ObjectHeader->RefCount);
|
||||
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
if (ObjectHeader->HandleCount < 0)
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
VOID FASTCALL
|
||||
IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion)
|
||||
{
|
||||
PWINDOW_OBJECT ParentWindow = IntGetParentObject(Child), OldWindow;
|
||||
PWINDOW_OBJECT ParentWindow = Child->Parent;
|
||||
|
||||
while (ParentWindow)
|
||||
{
|
||||
|
@ -65,9 +65,8 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion)
|
|||
NtGdiOffsetRgn(ValidRegion, -OffsetX, -OffsetY);
|
||||
}
|
||||
}
|
||||
OldWindow = ParentWindow;
|
||||
ParentWindow = IntGetParentObject(ParentWindow);
|
||||
IntReleaseWindowObject(OldWindow);
|
||||
|
||||
ParentWindow = ParentWindow->Parent;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -147,13 +147,17 @@ IntGetParent(PWINDOW_OBJECT Wnd)
|
|||
|
||||
if (Wnd->Style & WS_POPUP)
|
||||
{
|
||||
hWnd = Wnd->Owner;
|
||||
hWnd = Wnd->hOwner;
|
||||
return IntGetWindowObject(hWnd);
|
||||
}
|
||||
else if (Wnd->Style & WS_CHILD)
|
||||
{
|
||||
hWnd = Wnd->Parent;
|
||||
return IntGetWindowObject(hWnd);
|
||||
PWINDOW_OBJECT par;
|
||||
|
||||
par = Wnd->Parent;
|
||||
if (par) IntReferenceWindowObject(par);
|
||||
return par;
|
||||
//return IntGetWindowObject(hWnd);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -164,7 +168,7 @@ IntGetOwner(PWINDOW_OBJECT Wnd)
|
|||
{
|
||||
HWND hWnd;
|
||||
|
||||
hWnd = Wnd->Owner;
|
||||
hWnd = Wnd->hOwner;
|
||||
|
||||
return IntGetWindowObject(hWnd);
|
||||
}
|
||||
|
@ -172,10 +176,11 @@ IntGetOwner(PWINDOW_OBJECT Wnd)
|
|||
PWINDOW_OBJECT FASTCALL
|
||||
IntGetParentObject(PWINDOW_OBJECT Wnd)
|
||||
{
|
||||
HWND hParent;
|
||||
|
||||
hParent = Wnd->Parent;
|
||||
return IntGetWindowObject(hParent);
|
||||
PWINDOW_OBJECT par;
|
||||
|
||||
par = Wnd->Parent;
|
||||
if (par) IntReferenceWindowObject(par);
|
||||
return par;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -759,9 +764,9 @@ IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu)
|
|||
BOOL FASTCALL
|
||||
IntIsChildWindow(HWND Parent, HWND Child)
|
||||
{
|
||||
PWINDOW_OBJECT BaseWindow, Window, Old;
|
||||
PWINDOW_OBJECT BaseWindow, Window;
|
||||
|
||||
if(!(BaseWindow = IntGetWindowObject(Child)))
|
||||
if(!(BaseWindow = UserGetWindowObjectNoRef(Child)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -771,24 +776,16 @@ IntIsChildWindow(HWND Parent, HWND Child)
|
|||
{
|
||||
if (Window->hSelf == Parent)
|
||||
{
|
||||
if(Window != BaseWindow)
|
||||
IntReleaseWindowObject(Window);
|
||||
IntReleaseWindowObject(BaseWindow);
|
||||
return(TRUE);
|
||||
}
|
||||
if(!(Window->Style & WS_CHILD))
|
||||
{
|
||||
if(Window != BaseWindow)
|
||||
IntReleaseWindowObject(Window);
|
||||
break;
|
||||
}
|
||||
Old = Window;
|
||||
Window = IntGetParentObject(Window);
|
||||
if(Old != BaseWindow)
|
||||
IntReleaseWindowObject(Old);
|
||||
|
||||
Window = Window->Parent;
|
||||
}
|
||||
|
||||
IntReleaseWindowObject(BaseWindow);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
@ -849,37 +846,34 @@ IntLinkWindow(
|
|||
{
|
||||
PWINDOW_OBJECT Parent;
|
||||
|
||||
Wnd->Parent = WndParent->hSelf;
|
||||
Wnd->Parent = WndParent;
|
||||
if ((Wnd->PrevSibling = WndPrevSibling))
|
||||
{
|
||||
/* link after WndPrevSibling */
|
||||
if ((Wnd->NextSibling = WndPrevSibling->NextSibling))
|
||||
Wnd->NextSibling->PrevSibling = Wnd;
|
||||
else if ((Parent = IntGetWindowObject(Wnd->Parent)))
|
||||
else if ((Parent = Wnd->Parent))
|
||||
{
|
||||
if(Parent->LastChild == WndPrevSibling)
|
||||
Parent->LastChild = Wnd;
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
Wnd->PrevSibling->NextSibling = Wnd;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* link at top */
|
||||
Parent = IntGetWindowObject(Wnd->Parent);
|
||||
Parent = Wnd->Parent;
|
||||
if ((Wnd->NextSibling = WndParent->FirstChild))
|
||||
Wnd->NextSibling->PrevSibling = Wnd;
|
||||
else if (Parent)
|
||||
{
|
||||
Parent->LastChild = Wnd;
|
||||
Parent->FirstChild = Wnd;
|
||||
IntReleaseWindowObject(Parent);
|
||||
return;
|
||||
}
|
||||
if(Parent)
|
||||
{
|
||||
Parent->FirstChild = Wnd;
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -895,7 +889,7 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
|
|||
if(!Wnd)
|
||||
return NULL;
|
||||
|
||||
WndOldOwner = IntGetWindowObject(Wnd->Owner);
|
||||
WndOldOwner = IntGetWindowObject(Wnd->hOwner);
|
||||
if (WndOldOwner)
|
||||
{
|
||||
ret = WndOldOwner->hSelf;
|
||||
|
@ -908,11 +902,11 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
|
|||
|
||||
if((WndNewOwner = IntGetWindowObject(hWndNewOwner)))
|
||||
{
|
||||
Wnd->Owner = hWndNewOwner;
|
||||
Wnd->hOwner = hWndNewOwner;
|
||||
IntReleaseWindowObject(WndNewOwner);
|
||||
}
|
||||
else
|
||||
Wnd->Owner = NULL;
|
||||
Wnd->hOwner = NULL;
|
||||
|
||||
IntReleaseWindowObject(Wnd);
|
||||
return ret;
|
||||
|
@ -1048,12 +1042,7 @@ IntSetSystemMenu(PWINDOW_OBJECT Window, PMENU_OBJECT Menu)
|
|||
VOID FASTCALL
|
||||
IntUnlinkWindow(PWINDOW_OBJECT Wnd)
|
||||
{
|
||||
PWINDOW_OBJECT WndParent;
|
||||
|
||||
if((WndParent = IntGetWindowObject(Wnd->Parent)))
|
||||
{
|
||||
|
||||
}
|
||||
PWINDOW_OBJECT WndParent = Wnd->Parent;
|
||||
|
||||
if (Wnd->NextSibling) Wnd->NextSibling->PrevSibling = Wnd->PrevSibling;
|
||||
else if (WndParent && WndParent->LastChild == Wnd) WndParent->LastChild = Wnd->PrevSibling;
|
||||
|
@ -1061,10 +1050,6 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd)
|
|||
if (Wnd->PrevSibling) Wnd->PrevSibling->NextSibling = Wnd->NextSibling;
|
||||
else if (WndParent && WndParent->FirstChild == Wnd) WndParent->FirstChild = Wnd->NextSibling;
|
||||
|
||||
if(WndParent)
|
||||
{
|
||||
IntReleaseWindowObject(WndParent);
|
||||
}
|
||||
Wnd->PrevSibling = Wnd->NextSibling = Wnd->Parent = NULL;
|
||||
}
|
||||
|
||||
|
@ -1081,7 +1066,7 @@ IntAnyPopup(VOID)
|
|||
|
||||
for(Child = Window->FirstChild; Child; Child = Child->NextSibling)
|
||||
{
|
||||
if(Child->Owner && Child->Style & WS_VISIBLE)
|
||||
if(Child->hOwner && Child->Style & WS_VISIBLE)
|
||||
{
|
||||
/*
|
||||
* The desktop has a popup window if one of them has
|
||||
|
@ -1548,14 +1533,14 @@ co_IntCreateWindowEx(DWORD dwExStyle,
|
|||
}
|
||||
Window->MessageQueue = PsGetWin32Thread()->MessageQueue;
|
||||
IntReferenceMessageQueue(Window->MessageQueue);
|
||||
Window->Parent = (ParentWindow ? ParentWindow->hSelf : NULL);
|
||||
Window->Parent = ParentWindow;
|
||||
if((OwnerWindow = IntGetWindowObject(OwnerWindowHandle)))
|
||||
{
|
||||
Window->Owner = OwnerWindowHandle;
|
||||
Window->hOwner = OwnerWindowHandle;
|
||||
IntReleaseWindowObject(OwnerWindow);
|
||||
HasOwner = TRUE;
|
||||
} else {
|
||||
Window->Owner = NULL;
|
||||
Window->hOwner = NULL;
|
||||
HasOwner = FALSE;
|
||||
}
|
||||
Window->UserData = 0;
|
||||
|
@ -2192,7 +2177,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
|
|||
Child = IntGetWindowObject(*ChildHandle);
|
||||
if (Child == NULL)
|
||||
continue;
|
||||
if (Child->Owner != Window->hSelf)
|
||||
if (Child->hOwner != Window->hSelf)
|
||||
{
|
||||
IntReleaseWindowObject(Child);
|
||||
continue;
|
||||
|
@ -2206,9 +2191,9 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (Child->Owner != NULL)
|
||||
if (Child->hOwner != NULL)
|
||||
{
|
||||
Child->Owner = NULL;
|
||||
Child->hOwner = NULL;
|
||||
}
|
||||
|
||||
IntReleaseWindowObject(Child);
|
||||
|
@ -3214,27 +3199,23 @@ UserGetWindow(HWND hWnd, UINT Relationship)
|
|||
PWINDOW_OBJECT Parent, Window;
|
||||
HWND hWndResult = NULL;
|
||||
|
||||
if (!(Window = IntGetWindowObject(hWnd))) return NULL;
|
||||
if (!(Window = UserGetWindowObjectNoRef(hWnd))) return NULL;
|
||||
|
||||
switch (Relationship)
|
||||
{
|
||||
case GW_HWNDFIRST:
|
||||
if((Parent = IntGetParentObject(Window)))
|
||||
if((Parent = Window->Parent))
|
||||
{
|
||||
if (Parent->FirstChild)
|
||||
hWndResult = Parent->FirstChild->hSelf;
|
||||
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
break;
|
||||
|
||||
case GW_HWNDLAST:
|
||||
if((Parent = IntGetParentObject(Window)))
|
||||
if((Parent = Window->Parent))
|
||||
{
|
||||
if (Parent->LastChild)
|
||||
hWndResult = Parent->LastChild->hSelf;
|
||||
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -3249,7 +3230,7 @@ UserGetWindow(HWND hWnd, UINT Relationship)
|
|||
break;
|
||||
|
||||
case GW_OWNER:
|
||||
if((Parent = IntGetWindowObject(Window->Owner)))
|
||||
if((Parent = IntGetWindowObject(Window->hOwner)))
|
||||
{
|
||||
hWndResult = Parent->hSelf;
|
||||
IntReleaseWindowObject(Parent);
|
||||
|
@ -3261,8 +3242,6 @@ UserGetWindow(HWND hWnd, UINT Relationship)
|
|||
break;
|
||||
}
|
||||
|
||||
IntReleaseWindowObject(Window);
|
||||
|
||||
return hWndResult;
|
||||
}
|
||||
|
||||
|
@ -3365,14 +3344,13 @@ UserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi)
|
|||
break;
|
||||
|
||||
case GWL_HWNDPARENT:
|
||||
Parent = IntGetWindowObject(Window->Parent);
|
||||
Parent = Window->Parent;
|
||||
if(Parent)
|
||||
{
|
||||
if (Parent && Parent->hSelf == IntGetDesktopWindow())
|
||||
Result = (LONG) UserGetWindow(Window->hSelf, GW_OWNER);
|
||||
else
|
||||
Result = (LONG) Parent->hSelf;
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -254,14 +254,13 @@ WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, PRECT RestoreRect)
|
|||
RECT WorkArea;
|
||||
PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; /* Or rather get it from the window? */
|
||||
|
||||
Parent = IntGetParentObject(Window);
|
||||
Parent = Window->Parent;
|
||||
if(Parent)
|
||||
{
|
||||
if(IntIsDesktopWindow(Parent))
|
||||
IntGetDesktopWorkArea(Desktop, &WorkArea);
|
||||
else
|
||||
WorkArea = Parent->ClientRect;
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
else
|
||||
IntGetDesktopWorkArea(Desktop, &WorkArea);
|
||||
|
@ -507,7 +506,7 @@ co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos,
|
|||
params.rgrc[0] = *WindowRect;
|
||||
params.rgrc[1] = Window->WindowRect;
|
||||
params.rgrc[2] = Window->ClientRect;
|
||||
Parent = IntGetParentObject(Window);
|
||||
Parent = Window->Parent;
|
||||
if (0 != (Window->Style & WS_CHILD) && Parent)
|
||||
{
|
||||
IntGdiOffsetRect(&(params.rgrc[0]), - Parent->ClientRect.left,
|
||||
|
@ -550,8 +549,6 @@ co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos,
|
|||
{
|
||||
WinPos->flags &= ~SWP_NOCLIENTSIZE;
|
||||
}
|
||||
if(Parent)
|
||||
IntReleaseWindowObject(Parent);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -593,14 +590,13 @@ co_WinPosDoWinPosChanging(PWINDOW_OBJECT Window,
|
|||
PWINDOW_OBJECT Parent;
|
||||
X = WinPos->x;
|
||||
Y = WinPos->y;
|
||||
Parent = IntGetParentObject(Window);
|
||||
Parent = Window->Parent;
|
||||
if ((0 != (Window->Style & WS_CHILD)) && Parent)
|
||||
{
|
||||
X += Parent->ClientRect.left;
|
||||
Y += Parent->ClientRect.top;
|
||||
}
|
||||
if(Parent)
|
||||
IntReleaseWindowObject(Parent);
|
||||
|
||||
WindowRect->left = X;
|
||||
WindowRect->top = Y;
|
||||
WindowRect->right += X - Window->WindowRect.left;
|
||||
|
@ -805,18 +801,14 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window)
|
|||
&& HWND_NOTOPMOST != WinPos->hwndInsertAfter
|
||||
&& HWND_BOTTOM != WinPos->hwndInsertAfter)
|
||||
{
|
||||
PWINDOW_OBJECT Parent = IntGetParentObject(Window);
|
||||
PWINDOW_OBJECT Parent = Window->Parent;
|
||||
if (UserGetAncestor(WinPos->hwndInsertAfter, GA_PARENT) !=
|
||||
(Parent ? Parent->hSelf : NULL))
|
||||
{
|
||||
if(Parent)
|
||||
IntReleaseWindowObject(Parent);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Parent)
|
||||
IntReleaseWindowObject(Parent);
|
||||
/*
|
||||
* We don't need to change the Z order of hwnd if it's already
|
||||
* inserted after hwndInsertAfter or when inserting hwnd after
|
||||
|
@ -1382,7 +1374,7 @@ co_WinPosShowWindow(HWND Wnd, INT Cmd)
|
|||
if (Wnd == IntGetThreadFocusWindow() ||
|
||||
IntIsChildWindow(Wnd, IntGetThreadFocusWindow()))
|
||||
{
|
||||
UserSetFocus(Window->Parent);
|
||||
UserSetFocus(Window->Parent->hSelf);
|
||||
}
|
||||
|
||||
if (!(Window->Parent))
|
||||
|
|
Loading…
Reference in a new issue