Store the internal window placement directly inside the WINDOW structure

svn path=/trunk/; revision=30610
This commit is contained in:
Thomas Bluemel 2007-11-21 05:35:33 +00:00
parent bfc8890eee
commit 2bc07496f3
7 changed files with 82 additions and 103 deletions

View file

@ -1854,7 +1854,13 @@ DWORD
STDCALL
GetWindowContextHelpId(HWND hwnd)
{
return NtUserGetWindowContextHelpId(hwnd);
PWINDOW Wnd = ValidateHwnd(hwnd);
if (Wnd != NULL)
{
return Wnd->ContextHelpId;
}
return 0;
}
/*

View file

@ -140,10 +140,20 @@ typedef struct _WINDOW
PWINDOWCLASS Class;
/* Window name. */
UNICODE_STRING WindowName;
/* Context help id */
DWORD ContextHelpId;
struct
{
RECT NormalRect;
POINT IconPos;
POINT MaxPos;
} InternalPos;
UINT Unicode : 1;
/* Indicates whether the window is derived from a system class */
UINT IsSystem : 1;
UINT InternalPosInitialized : 1;
} WINDOW, *PWINDOW;
typedef struct _W32PROCESSINFO

View file

@ -13,17 +13,6 @@ typedef struct _WINDOW_OBJECT *PWINDOW_OBJECT;
#include <include/prop.h>
#include <include/scroll.h>
VOID FASTCALL
WinPosSetupInternalPos(VOID);
typedef struct _INTERNALPOS
{
RECT NormalRect;
POINT IconPos;
POINT MaxPos;
} INTERNALPOS, *PINTERNALPOS;
typedef struct _WINDOW_OBJECT
{
/* NOTE: Do *NOT* Move this pointer anywhere in this structure! This
@ -36,8 +25,6 @@ typedef struct _WINDOW_OBJECT
PW32THREADINFO ti;
/* Pointer to the desktop */
PDESKTOP Desktop;
/* Context help id */
DWORD ContextHelpId;
/* system menu handle. */
HMENU SystemMenu;
/* Entry in the thread's list of windows. */
@ -71,7 +58,6 @@ typedef struct _WINDOW_OBJECT
PWINDOW_SCROLLINFO Scroll;
PETHREAD OwnerThread;
HWND hWndLastPopup; /* handle to last active popup window (wine doesn't use pointer, for unk. reason)*/
PINTERNALPOS InternalPos;
ULONG Status;
/* counter for tiled child windows */
ULONG TiledCounter;

View file

@ -35,7 +35,7 @@ co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTes
PWINDOW_OBJECT* Window);
VOID FASTCALL co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window);
PINTERNALPOS FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject,
POINT *pt, PRECT RestoreRect);
VOID FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject,
POINT *pt, PRECT RestoreRect);
#endif /* _WIN32K_WINPOS_H */

View file

@ -301,7 +301,7 @@ NtUserCallOneParam(
RETURN( FALSE);
}
Result = Window->ContextHelpId;
Result = Window->Wnd->ContextHelpId;
RETURN( Result);
}
@ -605,7 +605,7 @@ NtUserCallTwoParam(
RETURN( (DWORD)FALSE);
}
Window->ContextHelpId = Param2;
Window->Wnd->ContextHelpId = Param2;
RETURN( (DWORD)TRUE);

View file

@ -1618,7 +1618,7 @@ AllocErr:
Class = NULL;
Window->SystemMenu = (HMENU)0;
Window->ContextHelpId = 0;
Wnd->ContextHelpId = 0;
Wnd->IDMenu = 0;
Wnd->Instance = hInstance;
Window->hSelf = hWnd;
@ -3883,7 +3883,6 @@ NtUserGetWindowPlacement(HWND hWnd,
{
PWINDOW_OBJECT Window;
PWINDOW Wnd;
PINTERNALPOS InternalPos;
POINT Size;
WINDOWPLACEMENT Safepl;
NTSTATUS Status;
@ -3930,18 +3929,12 @@ NtUserGetWindowPlacement(HWND hWnd,
Size.x = Wnd->WindowRect.left;
Size.y = Wnd->WindowRect.top;
InternalPos = WinPosInitInternalPos(Window, &Size,
&Wnd->WindowRect);
if (InternalPos)
{
Safepl.rcNormalPosition = InternalPos->NormalRect;
Safepl.ptMinPosition = InternalPos->IconPos;
Safepl.ptMaxPosition = InternalPos->MaxPos;
}
else
{
RETURN( FALSE);
}
WinPosInitInternalPos(Window, &Size,
&Wnd->WindowRect);
Safepl.rcNormalPosition = Wnd->InternalPos.NormalRect;
Safepl.ptMinPosition = Wnd->InternalPos.IconPos;
Safepl.ptMaxPosition = Wnd->InternalPos.MaxPos;
Status = MmCopyToCaller(lpwndpl, &Safepl, sizeof(WINDOWPLACEMENT));
if(!NT_SUCCESS(Status))
@ -4334,11 +4327,10 @@ NtUserSetWindowPlacement(HWND hWnd,
/* FIXME - change window status */
co_WinPosShowWindow(Window, Safepl.showCmd);
if (Window->InternalPos == NULL)
Window->InternalPos = ExAllocatePoolWithTag(PagedPool, sizeof(INTERNALPOS), TAG_WININTLIST);
Window->InternalPos->NormalRect = Safepl.rcNormalPosition;
Window->InternalPos->IconPos = Safepl.ptMinPosition;
Window->InternalPos->MaxPos = Safepl.ptMaxPosition;
Wnd->InternalPosInitialized = TRUE;
Wnd->InternalPos.NormalRect = Safepl.rcNormalPosition;
Wnd->InternalPos.IconPos = Safepl.ptMinPosition;
Wnd->InternalPos.MaxPos = Safepl.ptMaxPosition;
UserDerefObjectCo(Window);
RETURN(TRUE);

View file

@ -267,14 +267,14 @@ WinPosFindIconPos(PWINDOW_OBJECT Window, POINT *Pos)
/* FIXME */
}
PINTERNALPOS FASTCALL
VOID FASTCALL
WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, PRECT RestoreRect)
{
PWINDOW_OBJECT Parent;
UINT XInc, YInc;
PWINDOW Wnd = Window->Wnd;
PWINDOW_OBJECT Parent;
UINT XInc, YInc;
PWINDOW Wnd = Window->Wnd;
if (Window->InternalPos == NULL)
if (!Wnd->InternalPosInitialized)
{
RECT WorkArea;
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; /* Or rather get it from the window? */
@ -290,51 +290,43 @@ WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, PRECT RestoreRect)
else
IntGetDesktopWorkArea(Desktop, &WorkArea);
Window->InternalPos = ExAllocatePoolWithTag(PagedPool, sizeof(INTERNALPOS), TAG_WININTLIST);
if(!Window->InternalPos)
{
DPRINT1("Failed to allocate INTERNALPOS structure for window 0x%x\n", Window->hSelf);
return NULL;
}
Window->InternalPos->NormalRect = Window->Wnd->WindowRect;
Wnd->InternalPos.NormalRect = Window->Wnd->WindowRect;
IntGetWindowBorderMeasures(Window, &XInc, &YInc);
Window->InternalPos->MaxPos.x = WorkArea.left - XInc;
Window->InternalPos->MaxPos.y = WorkArea.top - YInc;
Window->InternalPos->IconPos.x = WorkArea.left;
Window->InternalPos->IconPos.y = WorkArea.bottom - UserGetSystemMetrics(SM_CYMINIMIZED);
Wnd->InternalPos.MaxPos.x = WorkArea.left - XInc;
Wnd->InternalPos.MaxPos.y = WorkArea.top - YInc;
Wnd->InternalPos.IconPos.x = WorkArea.left;
Wnd->InternalPos.IconPos.y = WorkArea.bottom - UserGetSystemMetrics(SM_CYMINIMIZED);
Wnd->InternalPosInitialized = TRUE;
}
if (Wnd->Style & WS_MINIMIZE)
{
Window->InternalPos->IconPos = *pt;
Wnd->InternalPos.IconPos = *pt;
}
else if (Wnd->Style & WS_MAXIMIZE)
{
Window->InternalPos->MaxPos = *pt;
Wnd->InternalPos.MaxPos = *pt;
}
else if (RestoreRect != NULL)
{
Window->InternalPos->NormalRect = *RestoreRect;
Wnd->InternalPos.NormalRect = *RestoreRect;
}
return(Window->InternalPos);
}
UINT FASTCALL
co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos)
{
POINT Size;
PINTERNALPOS InternalPos;
UINT SwpFlags = 0;
PWINDOW Wnd;
ASSERT_REFS_CO(Window);
Wnd = Window->Wnd;
Size.x = Window->Wnd->WindowRect.left;
Size.y = Window->Wnd->WindowRect.top;
InternalPos = WinPosInitInternalPos(Window, &Size, &Window->Wnd->WindowRect);
Size.x = Wnd->WindowRect.left;
Size.y = Wnd->WindowRect.top;
WinPosInitInternalPos(Window, &Size, &Wnd->WindowRect);
if (InternalPos)
{
if (Wnd->Style & WS_MINIMIZE)
{
if (!co_IntSendMessage(Window->hSelf, WM_QUERYOPEN, 0, 0))
@ -359,8 +351,8 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos)
co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOERASE |
RDW_NOINTERNALPAINT);
Wnd->Style |= WS_MINIMIZE;
WinPosFindIconPos(Window, &InternalPos->IconPos);
IntGdiSetRect(NewPos, InternalPos->IconPos.x, InternalPos->IconPos.y,
WinPosFindIconPos(Window, &Wnd->InternalPos.IconPos);
IntGdiSetRect(NewPos, Wnd->InternalPos.IconPos.x, Wnd->InternalPos.IconPos.y,
UserGetSystemMetrics(SM_CXMINIMIZED),
UserGetSystemMetrics(SM_CYMINIMIZED));
SwpFlags |= SWP_NOCOPYBITS;
@ -369,16 +361,16 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos)
case SW_MAXIMIZE:
{
co_WinPosGetMinMaxInfo(Window, &Size, &InternalPos->MaxPos,
co_WinPosGetMinMaxInfo(Window, &Size, &Wnd->InternalPos.MaxPos,
NULL, NULL);
DPRINT("Maximize: %d,%d %dx%d\n",
InternalPos->MaxPos.x, InternalPos->MaxPos.y, Size.x, Size.y);
Wnd->InternalPos.MaxPos.x, Wnd->InternalPos.MaxPos.y, Size.x, Size.y);
if (Wnd->Style & WS_MINIMIZE)
{
Wnd->Style &= ~WS_MINIMIZE;
}
Wnd->Style |= WS_MAXIMIZE;
IntGdiSetRect(NewPos, InternalPos->MaxPos.x, InternalPos->MaxPos.y,
IntGdiSetRect(NewPos, Wnd->InternalPos.MaxPos.x, Wnd->InternalPos.MaxPos.y,
Size.x, Size.y);
break;
}
@ -391,15 +383,15 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos)
if (Window->Flags & WINDOWOBJECT_RESTOREMAX)
{
co_WinPosGetMinMaxInfo(Window, &Size,
&InternalPos->MaxPos, NULL, NULL);
&Wnd->InternalPos.MaxPos, NULL, NULL);
Wnd->Style |= WS_MAXIMIZE;
IntGdiSetRect(NewPos, InternalPos->MaxPos.x,
InternalPos->MaxPos.y, Size.x, Size.y);
IntGdiSetRect(NewPos, Wnd->InternalPos.MaxPos.x,
Wnd->InternalPos.MaxPos.y, Size.x, Size.y);
break;
}
else
{
*NewPos = InternalPos->NormalRect;
*NewPos = Wnd->InternalPos.NormalRect;
NewPos->right -= NewPos->left;
NewPos->bottom -= NewPos->top;
break;
@ -412,18 +404,14 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos)
return 0;
}
Wnd->Style &= ~WS_MAXIMIZE;
*NewPos = InternalPos->NormalRect;
*NewPos = Wnd->InternalPos.NormalRect;
NewPos->right -= NewPos->left;
NewPos->bottom -= NewPos->top;
break;
}
}
}
}
else
{
SwpFlags |= SWP_NOSIZE | SWP_NOMOVE;
}
return(SwpFlags);
}
@ -447,9 +435,9 @@ WinPosFillMinMaxInfoStruct(PWINDOW_OBJECT Window, MINMAXINFO *Info)
Info->ptMaxTrackSize.x = Info->ptMaxSize.x;
Info->ptMaxTrackSize.y = Info->ptMaxSize.y;
if (Window->InternalPos != NULL)
if (Window->Wnd->InternalPosInitialized)
{
Info->ptMaxPosition = Window->InternalPos->MaxPos;
Info->ptMaxPosition = Window->Wnd->InternalPos.MaxPos;
}
else
{
@ -1696,8 +1684,8 @@ NtUserGetMinMaxInfo(
BOOL SendMessage)
{
POINT Size;
PINTERNALPOS InternalPos;
PWINDOW_OBJECT Window = NULL;
PWINDOW Wnd;
MINMAXINFO SafeMinMax;
NTSTATUS Status;
DECLARE_RETURN(BOOL);
@ -1712,33 +1700,30 @@ NtUserGetMinMaxInfo(
}
UserRefObjectCo(Window, &Ref);
Wnd = Window->Wnd;
Size.x = Window->Wnd->WindowRect.left;
Size.y = Window->Wnd->WindowRect.top;
InternalPos = WinPosInitInternalPos(Window, &Size,
&Window->Wnd->WindowRect);
if(InternalPos)
{
if(SendMessage)
{
co_WinPosGetMinMaxInfo(Window, &SafeMinMax.ptMaxSize, &SafeMinMax.ptMaxPosition,
&SafeMinMax.ptMinTrackSize, &SafeMinMax.ptMaxTrackSize);
}
else
{
WinPosFillMinMaxInfoStruct(Window, &SafeMinMax);
}
Status = MmCopyToCaller(MinMaxInfo, &SafeMinMax, sizeof(MINMAXINFO));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( FALSE);
}
WinPosInitInternalPos(Window, &Size,
&Wnd->WindowRect);
RETURN( TRUE);
if(SendMessage)
{
co_WinPosGetMinMaxInfo(Window, &SafeMinMax.ptMaxSize, &SafeMinMax.ptMaxPosition,
&SafeMinMax.ptMinTrackSize, &SafeMinMax.ptMaxTrackSize);
}
else
{
WinPosFillMinMaxInfoStruct(Window, &SafeMinMax);
}
Status = MmCopyToCaller(MinMaxInfo, &SafeMinMax, sizeof(MINMAXINFO));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RETURN( FALSE);
}
RETURN( FALSE);
RETURN( TRUE);
CLEANUP:
if (Window) UserDerefObjectCo(Window);