Author: gadamopoulos
Date: Mon May 31 19:58:05 2010
New Revision: 47500
URL:
http://svn.reactos.org/svn/reactos?rev=47500&view=rev
Log:
[win32k]
- Rename co_IntCreateWindowEx to co_UserCreateWindowEx and refactor it to make it
readable
- Also fix the sequence of messages in co_UserCreateWindowEx
Modified:
trunk/reactos/subsystems/win32/win32k/include/class.h
trunk/reactos/subsystems/win32/win32k/include/window.h
trunk/reactos/subsystems/win32/win32k/include/winpos.h
trunk/reactos/subsystems/win32/win32k/ntuser/class.c
trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c
trunk/reactos/subsystems/win32/win32k/ntuser/window.c
trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
Modified: trunk/reactos/subsystems/win32/win32k/include/class.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/class.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/class.h [iso-8859-1] Mon May 31 19:58:05
2010
@@ -78,6 +78,9 @@
OUT PCLS **Link OPTIONAL);
PCLS
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance);
+
+PCLS
FASTCALL
IntCreateClass(IN CONST WNDCLASSEXW* lpwcx,
IN PUNICODE_STRING ClassName,
Modified: trunk/reactos/subsystems/win32/win32k/include/window.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] Mon May 31
19:58:05 2010
@@ -155,7 +155,7 @@
VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG);
-PWND APIENTRY
co_IntCreateWindowEx(DWORD,PUNICODE_STRING,PLARGE_STRING,DWORD,LONG,LONG,LONG,LONG,HWND,HMENU,HINSTANCE,LPVOID,DWORD,BOOL);
+PWND FASTCALL co_UserCreateWindowEx(CREATESTRUCTW*, PUNICODE_STRING, PLARGE_STRING);
WNDPROC FASTCALL IntGetWindowProc(PWND,BOOL);
/* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/include/winpos.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/winpos.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/winpos.h [iso-8859-1] Mon May 31
19:58:05 2010
@@ -25,6 +25,8 @@
INT cy, UINT flags);
BOOLEAN FASTCALL
co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd);
+void FASTCALL
+co_WinPosSendSizeMove(PWINDOW_OBJECT Window);
USHORT FASTCALL
co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT
*WinPoint,
PWINDOW_OBJECT* Window);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/class.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] Mon May 31 19:58:05
2010
@@ -1207,6 +1207,57 @@
return Atom;
}
+PCLS
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance)
+{
+ PCLS *ClassLink, Class = NULL;
+ RTL_ATOM ClassAtom;
+ PTHREADINFO pti;
+
+ pti = PsGetCurrentThreadWin32Thread();
+
+ if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED ))
+ {
+ UserRegisterSystemClasses();
+ }
+
+ /* Check the class. */
+
+ DPRINT("Class %wZ\n", ClassName);
+
+ ClassAtom = IntGetClassAtom(ClassName,
+ hInstance,
+ pti->ppi,
+ &Class,
+ &ClassLink);
+
+ if (ClassAtom == (RTL_ATOM)0)
+ {
+ if (IS_ATOM(ClassName->Buffer))
+ {
+ DPRINT1("Class 0x%p not found\n", (DWORD_PTR) ClassName->Buffer);
+ }
+ else
+ {
+ DPRINT1("Class \"%wZ\" not found\n", ClassName);
+ }
+
+ SetLastWin32Error(ERROR_CANNOT_FIND_WND_CLASS);
+ return NULL;
+ }
+ DPRINT("ClassAtom %x\n", ClassAtom);
+ Class = IntReferenceClass(Class,
+ ClassLink,
+ pti->rpdesk);
+ if (Class == NULL)
+ {
+ DPRINT1("Failed to reference window class!\n");
+ return NULL;
+ }
+
+ return Class;
+}
+
RTL_ATOM
UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx,
IN PUNICODE_STRING ClassName,
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Mon May 31
19:58:05 2010
@@ -885,6 +885,7 @@
UNICODE_STRING ClassName, MenuName;
LARGE_STRING WindowName;
PWND pWnd = NULL;
+ CREATESTRUCTW Cs;
DECLARE_RETURN(HDESK);
DPRINT("Enter NtUserCreateDesktop: %wZ\n", lpszDesktopName);
@@ -1079,20 +1080,14 @@
RtlZeroMemory(&MenuName, sizeof(MenuName));
RtlZeroMemory(&WindowName, sizeof(WindowName));
- pWnd = co_IntCreateWindowEx( 0,
- &ClassName,
- &WindowName,
- (WS_POPUP|WS_CLIPCHILDREN),
- 0,
- 0,
- 100,
- 100,
- NULL,
- NULL,
- hModClient,
- NULL,
- 0,
- TRUE);
+ RtlZeroMemory(&Cs, sizeof(Cs));
+ Cs.cx = Cs.cy = 100;
+ Cs.style = WS_POPUP|WS_CLIPCHILDREN;
+ Cs.hInstance = hModClient;
+ Cs.lpszName = (LPCWSTR) &WindowName;
+ Cs.lpszClass = (LPCWSTR) &ClassName;
+
+ pWnd = co_UserCreateWindowEx(&Cs, &ClassName, &WindowName);
if (!pWnd)
{
DPRINT1("Failed to create Message window handle\n");
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Mon May 31 19:58:05
2010
@@ -1603,244 +1603,125 @@
return Ret;
}
-
-/*
- * calculates the default position of a window
- */
-BOOL FASTCALL
-IntCalcDefPosSize(PWINDOW_OBJECT Parent, RECTL *rc, BOOL IncPos)
-{
- SIZE Sz;
- PMONITOR pMonitor;
- POINT Pos = {0, 0};
-
- pMonitor = IntGetPrimaryMonitor();
-
- if(Parent != NULL)
- {
- RECTL_bIntersectRect(rc, rc, &pMonitor->rcMonitor);
-
- if(IncPos)
- {
- Pos.x = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CXSIZE) +
UserGetSystemMetrics(SM_CXFRAME));
- Pos.y = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CYSIZE) +
UserGetSystemMetrics(SM_CYFRAME));
- if (Pos.x > ((rc->right - rc->left) / 4) ||
- Pos.y > ((rc->bottom - rc->top) / 4))
- {
- /* reset counter and position */
- Pos.x = 0;
- Pos.y = 0;
- pMonitor->cWndStack = 0;
- }
- pMonitor->cWndStack++;
- }
- Pos.x += rc->left;
- Pos.y += rc->top;
+void FASTCALL
+IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD*
dwShowMode)
+{
+#define IS_DEFAULT(x) ((x) == CW_USEDEFAULT || (x) == (SHORT)0x8000)
+
+ /* default positioning for overlapped windows */
+ if(!(Cs->style & (WS_POPUP | WS_CHILD)))
+ {
+ RECTL rc, WorkArea;
+ PRTL_USER_PROCESS_PARAMETERS ProcessParams;
+
+ UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0);
+
+ rc = WorkArea;
+ ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters;
+
+ if (IS_DEFAULT(Cs->x))
+ {
+ if (!IS_DEFAULT(Cs->y)) *dwShowMode = Cs->y;
+
+ if(ProcessParams->WindowFlags & STARTF_USEPOSITION)
+ {
+ Cs->x = ProcessParams->StartingX;
+ Cs->y = ProcessParams->StartingY;
+ }
+ else
+ {
+ Cs->x = WorkArea.left;
+ Cs->y = WorkArea.top;
+ }
+ }
+
+ if (IS_DEFAULT(Cs->cx))
+ {
+ if (ProcessParams->WindowFlags & STARTF_USEPOSITION)
+ {
+ Cs->cx = ProcessParams->CountX;
+ Cs->cy = ProcessParams->CountY;
+ }
+ else
+ {
+ Cs->cx = (WorkArea.right - WorkArea.left) * 3 / 4 - Cs->x;
+ Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y;
+ }
+ }
+ /* neither x nor cx are default. Check the y values .
+ * In the trace we see Outlook and Outlook Express using
+ * cy set to CW_USEDEFAULT when opening the address book.
+ */
+ else if (IS_DEFAULT(Cs->cy))
+ {
+ DPRINT("Strange use of CW_USEDEFAULT in nHeight\n");
+ Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y;
+ }
}
else
{
- Pos.x = rc->left;
- Pos.y = rc->top;
- }
-
- Sz.cx = EngMulDiv(rc->right - rc->left, 3, 4);
- Sz.cy = EngMulDiv(rc->bottom - rc->top, 3, 4);
-
- rc->left = Pos.x;
- rc->top = Pos.y;
- rc->right = rc->left + Sz.cx;
- rc->bottom = rc->top + Sz.cy;
- return TRUE;
-}
-
-
-/*
- * @implemented
- */
-PWND APIENTRY
-co_IntCreateWindowEx(DWORD dwExStyle,
- PUNICODE_STRING ClassName,
- PLARGE_STRING WindowName,
- DWORD dwStyle,
- LONG x,
- LONG y,
- LONG nWidth,
- LONG nHeight,
- HWND hWndParent,
- HMENU hMenu,
- HINSTANCE hInstance,
- LPVOID lpParam,
- DWORD dwShowMode,
- BOOL bUnicodeWindow)
-{
- PWINSTATION_OBJECT WinSta;
+ /* if CW_USEDEFAULT is set for non-overlapped windows, both values are set to zero
*/
+ if(IS_DEFAULT(Cs->x))
+ {
+ Cs->x = 0;
+ Cs->y = 0;
+ }
+ if(IS_DEFAULT(Cs->cx))
+ {
+ Cs->cx = 0;
+ Cs->cy = 0;
+ }
+ }
+
+#undef IS_DEFAULT
+}
+
+/* Allocates and initializes a window*/
+PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
+ PLARGE_STRING WindowName,
+ PCLS Class,
+ PWINDOW_OBJECT ParentWindow,
+ PWINDOW_OBJECT OwnerWindow)
+{
PWND Wnd = NULL;
- PCLS *ClassLink, Class = NULL;
- RTL_ATOM ClassAtom;
- PWINDOW_OBJECT Window = NULL;
- PWINDOW_OBJECT ParentWindow = NULL, OwnerWindow;
- HWND ParentWindowHandle = NULL;
- HWND OwnerWindowHandle;
+ PWINDOW_OBJECT Window;
+ HWND hWnd;
+ PTHREADINFO pti = NULL;
PMENU_OBJECT SystemMenu;
- HWND hWnd;
- POINT Pos;
- SIZE Size;
- PTHREADINFO ti = NULL;
-#if 0
-
- POINT MaxSize, MaxPos, MinTrack, MaxTrack;
-#else
-
- POINT MaxPos;
-#endif
- CREATESTRUCTW Cs;
- CBT_CREATEWNDW CbtCreate;
- LRESULT Result;
BOOL MenuChanged;
- DECLARE_RETURN(PWND);
- BOOL HasOwner;
- USER_REFERENCE_ENTRY ParentRef, Ref;
- PTHREADINFO pti;
+ BOOL bUnicodeWindow;
pti = PsGetCurrentThreadWin32Thread();
- if (pti->rpdesk)
- {
- ParentWindowHandle = pti->rpdesk->DesktopWindow;
- }
-
-
- if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED ))
- {
- UserRegisterSystemClasses();
- }
-
- OwnerWindowHandle = NULL;
-
- DPRINT("co_IntCreateWindowEx %wZ\n", ClassName);
-
- if (hWndParent == HWND_MESSAGE)
- {
- /*
- * native ole32.OleInitialize uses HWND_MESSAGE to create the
- * message window (style: WS_POPUP|WS_DISABLED)
- */
- ParentWindowHandle = IntGetMessageWindow();
- DPRINT("Parent is HWND_MESSAGE 0x%x\n", ParentWindowHandle);
- }
- else if (hWndParent)
- {
- if ((dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD)
- { //temp hack
- PWINDOW_OBJECT Par = UserGetWindowObject(hWndParent), Root;
- if (Par && (Root = UserGetAncestor(Par, GA_ROOT)))
- OwnerWindowHandle = Root->hSelf;
- }
- else
- ParentWindowHandle = hWndParent;
- }
- else if ((dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD)
- {
- SetLastWin32Error(ERROR_TLW_WITH_WSCHILD);
- RETURN( (PWND)0); /* WS_CHILD needs a parent, but WS_POPUP doesn't */
- }
-
- if (ParentWindowHandle)
- {
- ParentWindow = UserGetWindowObject(ParentWindowHandle);
-
- if (ParentWindow) UserRefObjectCo(ParentWindow, &ParentRef);
- }
+ /* Automatically add WS_EX_WINDOWEDGE */
+ if ((Cs->dwExStyle & WS_EX_DLGMODALFRAME) ||
+ ((!(Cs->dwExStyle & WS_EX_STATICEDGE)) &&
+ (Cs->style & (WS_DLGFRAME | WS_THICKFRAME))))
+ Cs->dwExStyle |= WS_EX_WINDOWEDGE;
else
- {
- ParentWindow = NULL;
- }
-
- /* FIXME: parent must belong to the current process */
-
- /* Check the window station. */
- ti = GetW32ThreadInfo();
- if (ti == NULL || pti->rpdesk == NULL)
- {
- DPRINT1("Thread is not attached to a desktop! Cannot create window!\n");
- RETURN( (PWND)0);
- }
-
- /* Check the class. */
-
- DPRINT("Class %wZ\n", ClassName);
-
- ClassAtom = IntGetClassAtom(ClassName,
- hInstance,
- ti->ppi,
- &Class,
- &ClassLink);
-
- if (ClassAtom == (RTL_ATOM)0)
- {
- if (IS_ATOM(ClassName->Buffer))
- {
- DPRINT1("Class 0x%p not found\n", (DWORD_PTR) ClassName->Buffer);
- }
- else
- {
- DPRINT1("Class \"%wZ\" not found\n", ClassName);
- }
-
- SetLastWin32Error(ERROR_CANNOT_FIND_WND_CLASS);
- RETURN((PWND)0);
- }
- DPRINT("ClassAtom %x\n", ClassAtom);
- Class = IntReferenceClass(Class,
- ClassLink,
- pti->rpdesk);
- if (Class == NULL)
- {
- DPRINT1("Failed to reference window class!\n");
- RETURN(NULL);
- }
-
- WinSta = pti->rpdesk->rpwinstaParent;
-
- //FIXME: Reference thread/desktop instead
- ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0);
-
- /* Create the window object. */
+ Cs->dwExStyle &= ~WS_EX_WINDOWEDGE;
+
+ /* Is it a unicode window? */
+ bUnicodeWindow =!(Cs->dwExStyle & WS_EX_SETANSICREATOR);
+ Cs->dwExStyle &= ~WS_EX_SETANSICREATOR;
+
+ /* Allocate the new window */
Window = (PWINDOW_OBJECT) UserCreateObject( gHandleTable,
pti->rpdesk,
(PHANDLE)&hWnd,
otWindow,
sizeof(WINDOW_OBJECT));
- if (Window)
- {
- Window->Wnd = DesktopHeapAlloc(pti->rpdesk,
- sizeof(WND) + Class->cbwndExtra);
- if (!Window->Wnd)
- goto AllocErr;
- RtlZeroMemory(Window->Wnd,
- sizeof(WND) + Class->cbwndExtra);
- Window->Wnd->head.h = hWnd;
- Wnd = Window->Wnd;
- Wnd->fnid = 0;
-
- Wnd->head.pti = ti;
- Wnd->head.rpdesk = pti->rpdesk;
- Wnd->hWndLastActive = hWnd;
- Wnd->state2 |= WNDS2_WIN40COMPAT;
- }
+
+ Wnd = DesktopHeapAlloc(pti->rpdesk, sizeof(WND) + Class->cbwndExtra);
+
+ if(!Window || !Wnd)
+ {
+ goto AllocError;
+ }
+
+ RtlZeroMemory(Wnd, sizeof(WND) + Class->cbwndExtra);
DPRINT("Created object with handle %X\n", hWnd);
- if (!Window)
- {
-AllocErr:
- ObDereferenceObject(WinSta);
- SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
- RETURN( (PWND)0);
- }
-
- UserRefObjectCo(Window, &Ref);
-
- ObDereferenceObject(WinSta);
if (NULL == pti->rpdesk->DesktopWindow)
{
@@ -1852,38 +1733,43 @@
/*
* Fill out the structure describing it.
*/
- Window->pti = ti;
+ Window->Wnd = Wnd;
+ Window->pti = pti;
+ Window->hSelf = hWnd;
+ Window->spwndParent = ParentWindow;
+ Window->hOwner = OwnerWindow ? OwnerWindow->hSelf : NULL;
+
+ Wnd->head.h = hWnd;
+ Wnd->head.pti = pti;
+ Wnd->head.rpdesk = pti->rpdesk;
+ Wnd->fnid = 0;
+ Wnd->hWndLastActive = hWnd;
+ Wnd->state2 |= WNDS2_WIN40COMPAT;
Wnd->pcls = Class;
- Class = NULL;
-
- Window->SystemMenu = (HMENU)0;
- Wnd->IDMenu = 0;
- Wnd->hModule = hInstance;
- Window->hSelf = hWnd;
+ Wnd->hModule = Cs->hInstance;
+ Wnd->style = Cs->style & ~WS_VISIBLE;
+ Wnd->ExStyle = Cs->dwExStyle;
+ Wnd->rcWindow.left = Cs->x;
+ Wnd->rcWindow.top = Cs->y;
+ Wnd->rcWindow.right = Cs->x + Cs->cx;
+ Wnd->rcWindow.bottom = Cs->y + Cs->cy;
+ Wnd->cbwndExtra = Wnd->pcls->cbwndExtra;
+ Wnd->spwndOwner = OwnerWindow ? OwnerWindow->Wnd : NULL;
+ Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL;
+
+ if (Wnd->style & WS_CHILD && ParentWindow)
+ {
+ RECTL_vOffsetRect(&(Wnd->rcWindow), ParentWindow->Wnd->rcClient.left,
+ ParentWindow->Wnd->rcClient.top);
+ }
+ Wnd->rcClient = Wnd->rcWindow;
IntReferenceMessageQueue(Window->pti->MessageQueue);
- Window->spwndParent = ParentWindow;
- Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL;
- if (Wnd->spwndParent != NULL && hWndParent != 0)
+ if (Wnd->spwndParent != NULL && Cs->hwndParent != 0)
{
Wnd->HideFocus = Wnd->spwndParent->HideFocus;
Wnd->HideAccel = Wnd->spwndParent->HideAccel;
}
-
- if((OwnerWindow = UserGetWindowObject(OwnerWindowHandle)))
- {
- Window->hOwner = OwnerWindowHandle;
- Wnd->spwndOwner = OwnerWindow->Wnd;
- HasOwner = TRUE;
- }
- else
- {
- Window->hOwner = NULL;
- Wnd->spwndOwner = NULL;
- HasOwner = FALSE;
- }
-
- Wnd->dwUserData = 0;
if (Wnd->pcls->CSF_flags & CSF_SERVERSIDEPROC)
Wnd->state |= WNDS_SERVERSIDEWINDOWPROC;
@@ -1929,15 +1815,15 @@
WndProc, unless the following overriding conditions occur:
*/
if ( !bUnicodeWindow &&
- ( ClassAtom == gpsi->atomSysClass[ICLS_BUTTON] ||
- ClassAtom == gpsi->atomSysClass[ICLS_COMBOBOX] ||
- ClassAtom == gpsi->atomSysClass[ICLS_COMBOLBOX] ||
- ClassAtom == gpsi->atomSysClass[ICLS_DIALOG] ||
- ClassAtom == gpsi->atomSysClass[ICLS_EDIT] ||
- ClassAtom == gpsi->atomSysClass[ICLS_IME] ||
- ClassAtom == gpsi->atomSysClass[ICLS_LISTBOX] ||
- ClassAtom == gpsi->atomSysClass[ICLS_MDICLIENT] ||
- ClassAtom == gpsi->atomSysClass[ICLS_STATIC] ) )
+ ( Class->atomClassName == gpsi->atomSysClass[ICLS_BUTTON] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_COMBOBOX] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_COMBOLBOX] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_DIALOG] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_EDIT] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_IME] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_LISTBOX] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_MDICLIENT] ||
+ Class->atomClassName == gpsi->atomSysClass[ICLS_STATIC] ) )
{ // Override Class and set the window Ansi WndProc.
Wnd->state |= WNDS_ANSIWINDOWPROC;
Wnd->Unicode = FALSE;
@@ -1949,74 +1835,61 @@
}
}
- Window->spwndChild = NULL;
- Window->spwndPrev = NULL;
- Window->spwndNext = NULL;
-
- Wnd->spwndNext = NULL;
- Wnd->spwndPrev = NULL;
- Wnd->spwndChild = NULL;
-
- Wnd->cbwndExtra = Wnd->pcls->cbwndExtra;
+ /* BugBoy Comments: if the window being created is a edit control, ATOM 0xCxxx,
+ then my testing shows that windows (2k and XP) creates a CallProc for it
immediately
+ Dont understand why it does this. */
+ if (Class->atomClassName == gpsi->atomSysClass[ICLS_EDIT])
+ {
+ PCALLPROCDATA CallProc;
+ //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow,
Wnd->ti->ppi);
+ CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode ,
Wnd->head.pti->ppi);
+
+ if (!CallProc)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ DPRINT1("Warning: Unable to create CallProc for edit control. Control may
not operate correctly! hwnd %x\n",hWnd);
+ }
+ else
+ {
+ UserAddCallProcToClass(Wnd->pcls, CallProc);
+ }
+ }
InitializeListHead(&Wnd->PropListHead);
- if ( NULL != WindowName->Buffer && WindowName->Length > 0 )
+ if ( WindowName->Buffer != NULL && WindowName->Length > 0 )
{
Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->head.rpdesk,
- WindowName->Length +
sizeof(UNICODE_NULL));
+ WindowName->Length +
sizeof(UNICODE_NULL));
if (Wnd->strName.Buffer == NULL)
{
- SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
- RETURN( (PWND)0);
- }
-
+ goto AllocError;
+ }
+
+ RtlCopyMemory(Wnd->strName.Buffer, WindowName->Buffer,
WindowName->Length);
Wnd->strName.Buffer[WindowName->Length / sizeof(WCHAR)] = L'\0';
- _SEH2_TRY
- {
- RtlCopyMemory(Wnd->strName.Buffer,
- WindowName->Buffer,
- WindowName->Length);
- Wnd->strName.Length = WindowName->Length;
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- WindowName->Length = 0;
- Wnd->strName.Buffer[0] = L'\0';
- }
- _SEH2_END;
- }
-
- /*
- * This has been tested for WS_CHILD | WS_VISIBLE. It has not been
- * tested for WS_POPUP
- */
- if ((dwExStyle & WS_EX_DLGMODALFRAME) ||
- ((!(dwExStyle & WS_EX_STATICEDGE)) &&
- (dwStyle & (WS_DLGFRAME | WS_THICKFRAME))))
- dwExStyle |= WS_EX_WINDOWEDGE;
- else
- dwExStyle &= ~WS_EX_WINDOWEDGE;
-
- dwExStyle &= ~WS_EX_SETANSICREATOR;
-
- Wnd->style = dwStyle & ~WS_VISIBLE;
+ Wnd->strName.Length = WindowName->Length;
+ }
/* Correct the window style. */
if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
{
Wnd->style |= WS_CLIPSIBLINGS;
- DPRINT("3: Style is now %lx\n", dwStyle);
if (!(Wnd->style & WS_POPUP))
{
Wnd->style |= WS_CAPTION;
Window->state |= WINDOWOBJECT_NEED_SIZE;
- DPRINT("4: Style is now %lx\n", dwStyle);
- }
- }
+ }
+ }
+
+ if ((Wnd->ExStyle & WS_EX_DLGMODALFRAME) ||
+ (Wnd->style & (WS_DLGFRAME | WS_THICKFRAME)))
+ Wnd->ExStyle |= WS_EX_WINDOWEDGE;
+ else
+ Wnd->ExStyle &= ~WS_EX_WINDOWEDGE;
/* create system menu */
- if((dwStyle & WS_SYSMENU) )//&& (dwStyle & WS_CAPTION) == WS_CAPTION)
+ if((Cs->style & WS_SYSMENU) )//&& (dwStyle & WS_CAPTION) ==
WS_CAPTION)
{
SystemMenu = IntGetSystemMenu(Window, TRUE, TRUE);
if(SystemMenu)
@@ -2027,13 +1900,15 @@
}
/* Set the window menu */
- if ((dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD)
- {
- if (hMenu)
- IntSetMenu(Window, hMenu, &MenuChanged);
+ if ((Cs->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
+ {
+ if (Cs->hMenu)
+ IntSetMenu(Window, Cs->hMenu, &MenuChanged);
else if (Wnd->pcls->lpszMenuName) // Take it from the parent.
{
UNICODE_STRING MenuName;
+ HMENU hMenu;
+
if (IS_INTRESOURCE(Wnd->pcls->lpszMenuName))
{
MenuName.Length = 0;
@@ -2049,7 +1924,7 @@
}
}
else // Not a child
- Wnd->IDMenu = (UINT) hMenu;
+ Wnd->IDMenu = (UINT) Cs->hMenu;
/* Insert the window into the thread's window list. */
InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry);
@@ -2064,163 +1939,138 @@
DceAllocDCE(Window, DCE_WINDOW_DC);
}
- Pos.x = x;
- Pos.y = y;
- Size.cx = nWidth;
- Size.cy = nHeight;
-
- Wnd->ExStyle = dwExStyle;
-
- /* call hook */
- Cs.lpCreateParams = lpParam;
- Cs.hInstance = hInstance;
- Cs.hMenu = hMenu;
- Cs.hwndParent = hWndParent; //Pass the original Parent handle!
- Cs.cx = Size.cx;
- Cs.cy = Size.cy;
- Cs.x = Pos.x;
- Cs.y = Pos.y;
- Cs.style = Wnd->style;
-// Cs.lpszName = (LPCWSTR) WindowName->Buffer;
-// Cs.lpszClass = (LPCWSTR) ClassName->Buffer;
- Cs.lpszName = (LPCWSTR) WindowName;
- Cs.lpszClass = (LPCWSTR) ClassName;
- Cs.dwExStyle = dwExStyle;
- CbtCreate.lpcs = &Cs;
+ return Window;
+
+AllocError:
+
+ if(Window)
+ UserDereferenceObject(Window);
+
+ if(Wnd)
+ DesktopHeapFree(Wnd->head.rpdesk, Wnd);
+
+ SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
+ return NULL;
+}
+
+/*
+ * @implemented
+ */
+PWND FASTCALL
+co_UserCreateWindowEx(CREATESTRUCTW* Cs,
+ PUNICODE_STRING ClassName,
+ PLARGE_STRING WindowName)
+{
+ PWINDOW_OBJECT Window = NULL, ParentWindow = NULL, OwnerWindow;
+ HWND hWnd, hWndParent, hWndOwner;
+ DWORD dwStyle;
+ PWINSTATION_OBJECT WinSta;
+ PWND Wnd = NULL;
+ PCLS Class = NULL;
+ SIZE Size;
+ POINT MaxPos;
+ CBT_CREATEWNDW CbtCreate;
+ LRESULT Result;
+ USER_REFERENCE_ENTRY ParentRef, Ref;
+ PTHREADINFO pti;
+ DWORD dwShowMode = SW_SHOW;
+ DECLARE_RETURN(PWND);
+
+ /* Get the current window station and reference it */
+ pti = GetW32ThreadInfo();
+ if (pti == NULL || pti->rpdesk == NULL)
+ {
+ DPRINT1("Thread is not attached to a desktop! Cannot create window!\n");
+ return NULL; //There is nothing to cleanup
+ }
+ WinSta = pti->rpdesk->rpwinstaParent;
+ ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0);
+
+ /* Get the class and reference it*/
+ Class = IntGetAndReferenceClass(ClassName, Cs->hInstance);
+ if(!Class)
+ {
+ DPRINT1("Failed to find class %wZ\n", ClassName);
+ RETURN(NULL);
+ }
+
+ /* Now find the parent and the owner window */
+ hWndParent = IntGetDesktopWindow();
+ hWndOwner = NULL;
+
+ if (Cs->hwndParent == HWND_MESSAGE)
+ {
+ Cs->hwndParent = hWndParent = IntGetMessageWindow();
+ }
+ else if (Cs->hwndParent)
+ {
+ if ((Cs->style & (WS_CHILD|WS_POPUP)) != WS_CHILD)
+ hWndOwner = Cs->hwndParent;
+ else
+ hWndParent = Cs->hwndParent;
+ }
+ else if ((Cs->style & (WS_CHILD|WS_POPUP)) == WS_CHILD)
+ {
+ DPRINT1("Cannot create a child window without a parrent!\n");
+ SetLastWin32Error(ERROR_TLW_WITH_WSCHILD);
+ RETURN(NULL); /* WS_CHILD needs a parent, but WS_POPUP doesn't */
+ }
+
+ ParentWindow = hWndParent ? UserGetWindowObject(hWndParent): NULL;
+ OwnerWindow = hWndOwner ? UserGetWindowObject(hWndOwner): NULL;
+
+ /* FIXME: is this correct?*/
+ if(OwnerWindow)
+ OwnerWindow = UserGetAncestor(OwnerWindow, GA_ROOT);
+
+ /* Fix the position and the size of the window */
+ if (ParentWindow)
+ {
+ UserRefObjectCo(ParentWindow, &ParentRef);
+ IntFixWindowCoordinates(Cs, ParentWindow, &dwShowMode);
+ }
+
+ /* Allocate and initialize the new window */
+ Window = IntCreateWindow(Cs,
+ WindowName,
+ Class,
+ ParentWindow,
+ OwnerWindow);
+ if(!Window)
+ {
+ DPRINT1("IntCreateWindow failed!\n");
+ RETURN(0);
+ }
+
+ Wnd = Window->Wnd;
+ hWnd = Window->hSelf;
+
+ UserRefObjectCo(Window, &Ref);
+ ObDereferenceObject(WinSta);
+
+ /* Call the WH_CBT hook */
+ dwStyle = Cs->style;
+ Cs->style = Wnd->style; /* HCBT_CREATEWND needs the real window style */
+ CbtCreate.lpcs = Cs;
CbtCreate.hwndInsertAfter = HWND_TOP;
if (ISITHOOKED(WH_CBT))
{
if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM)
&CbtCreate))
{
- /* FIXME - Delete window object and remove it from the thread windows list */
- /* FIXME - delete allocated DCE */
- DPRINT1("CBT-hook returned !0\n");
+ DPRINT1("HCBT_CREATEWND hook failed!\n");
RETURN( (PWND) NULL);
}
}
- x = Cs.x;
- y = Cs.y;
- nWidth = Cs.cx;
- nHeight = Cs.cy;
-
- Cs.style = dwStyle;
-// FIXME: Need to set the Z order in the window link list if the hook callback changed
it!
-// hwndInsertAfter = CbtCreate.hwndInsertAfter;
-
- /* default positioning for overlapped windows */
- if(!(Wnd->style & (WS_POPUP | WS_CHILD)))
- {
- RECTL rc, WorkArea;
- PRTL_USER_PROCESS_PARAMETERS ProcessParams;
- BOOL CalculatedDefPosSize = FALSE;
-
- UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0);
-
- rc = WorkArea;
- ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters;
-
- if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16)
- {
- CalculatedDefPosSize = IntCalcDefPosSize(ParentWindow, &rc, TRUE);
-
- if(ProcessParams->WindowFlags & STARTF_USEPOSITION)
- {
- ProcessParams->WindowFlags &= ~STARTF_USEPOSITION;
- Pos.x = WorkArea.left + ProcessParams->StartingX;
- Pos.y = WorkArea.top + ProcessParams->StartingY;
- }
- else
- {
- Pos.x = rc.left;
- Pos.y = rc.top;
- }
-
-/*
- According to wine, the ShowMode is set to y if x == CW_USEDEFAULT(16) and
- y is something else. and Quote!
- */
-
-/* Never believe Microsoft's documentation... CreateWindowEx doc says
- * that if an overlapped window is created with WS_VISIBLE style bit
- * set and the x parameter is set to CW_USEDEFAULT, the system ignores
- * the y parameter. However, disassembling NT implementation (WIN32K.SYS)
- * reveals that
- *
- * 1) not only it checks for CW_USEDEFAULT but also for CW_USEDEFAULT16
- * 2) it does not ignore the y parameter as the docs claim; instead, it
- * uses it as second parameter to ShowWindow() unless y is either
- * CW_USEDEFAULT or CW_USEDEFAULT16.
- *
- * The fact that we didn't do 2) caused bogus windows pop up when wine
- * was running apps that were using this obscure feature. Example -
- * calc.exe that comes with Win98 (only Win98, it's different from
- * the one that comes with Win95 and NT)
- */
- if(y != CW_USEDEFAULT && y != CW_USEDEFAULT16)
- {
- dwShowMode = y;
- }
- }
- if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16)
- {
- if(!CalculatedDefPosSize)
- {
- IntCalcDefPosSize(ParentWindow, &rc, FALSE);
- }
- if(ProcessParams->WindowFlags & STARTF_USESIZE)
- {
- ProcessParams->WindowFlags &= ~STARTF_USESIZE;
- Size.cx = ProcessParams->CountX;
- Size.cy = ProcessParams->CountY;
- }
- else
- {
- Size.cx = rc.right - rc.left;
- Size.cy = rc.bottom - rc.top;
- }
-
- /* move the window if necessary */
- if(Pos.x > rc.left)
- Pos.x = max(rc.left, 0);
- if(Pos.y > rc.top)
- Pos.y = max(rc.top, 0);
- }
- }
- else
- {
- /* if CW_USEDEFAULT(16) is set for non-overlapped windows, both values are set to
zero) */
- if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16)
- {
- Pos.x = 0;
- Pos.y = 0;
- }
- if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16)
- {
- Size.cx = 0;
- Size.cy = 0;
- }
- }
-
- /* Initialize the window dimensions. */
- Wnd->rcWindow.left = Pos.x;
- Wnd->rcWindow.top = Pos.y;
- Wnd->rcWindow.right = Pos.x + Size.cx;
- Wnd->rcWindow.bottom = Pos.y + Size.cy;
- if (0 != (Wnd->style & WS_CHILD) && ParentWindow)
- {
- RECTL_vOffsetRect(&(Wnd->rcWindow), ParentWindow->Wnd->rcClient.left,
- ParentWindow->Wnd->rcClient.top);
- }
- Wnd->rcClient = Wnd->rcWindow;
-
- /*
- * Get the size and position of the window.
- */
+ Cs->style = dwStyle; /* NCCREATE and WM_NCCALCSIZE need the original values*/
+
+ /* Send the WM_GETMINMAXINFO message*/
+ Size.cx = Cs->cx;
+ Size.cy = Cs->cy;
+
if ((dwStyle & WS_THICKFRAME) || !(dwStyle & (WS_POPUP | WS_CHILD)))
{
POINT MaxSize, MaxPos, MinTrack, MaxTrack;
- /* WinPosGetMinMaxInfo sends the WM_GETMINMAXINFO message */
co_WinPosGetMinMaxInfo(Window, &MaxSize, &MaxPos, &MinTrack,
&MaxTrack);
if (Size.cx > MaxTrack.x) Size.cx = MaxTrack.x;
if (Size.cy > MaxTrack.y) Size.cy = MaxTrack.y;
@@ -2228,47 +2078,20 @@
if (Size.cy < MinTrack.y) Size.cy = MinTrack.y;
}
- Wnd->rcWindow.left = Pos.x;
- Wnd->rcWindow.top = Pos.y;
- Wnd->rcWindow.right = Pos.x + Size.cx;
- Wnd->rcWindow.bottom = Pos.y + Size.cy;
+ Wnd->rcWindow.left = Cs->x;
+ Wnd->rcWindow.top = Cs->y;
+ Wnd->rcWindow.right = Cs->x + Size.cx;
+ Wnd->rcWindow.bottom = Cs->y + Size.cy;
if (0 != (Wnd->style & WS_CHILD) && ParentWindow)
{
- RECTL_vOffsetRect(&(Wnd->rcWindow), ParentWindow->Wnd->rcClient.left,
- ParentWindow->Wnd->rcClient.top);
+ RECTL_vOffsetRect(&Wnd->rcWindow,
+ ParentWindow->Wnd->rcClient.left,
+ ParentWindow->Wnd->rcClient.top);
}
Wnd->rcClient = Wnd->rcWindow;
- /* FIXME: Initialize the window menu. */
-
- /* Send a NCCREATE message. */
- DPRINT("[win32k.window] IntCreateWindowEx style %d, exstyle %d, parent
%d\n", Cs.style, Cs.dwExStyle, Cs.hwndParent);
- DPRINT("IntCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, Size.cx, Size.cy);
- DPRINT("IntCreateWindowEx(): About to send NCCREATE message.\n");
- Result = co_IntSendMessage(Window->hSelf, WM_NCCREATE, 0, (LPARAM) &Cs);
- if (!Result)
- {
- /* FIXME: Cleanup. */
- DPRINT1("IntCreateWindowEx(): NCCREATE message failed. No cleanup
performed!\n");
- RETURN((PWND)0);
- }
-
- /* Calculate the non-client size. */
- MaxPos.x = Window->Wnd->rcWindow.left;
- MaxPos.y = Window->Wnd->rcWindow.top;
-
-
- DPRINT("IntCreateWindowEx(): About to get non-client size.\n");
- /* WinPosGetNonClientSize SENDS THE WM_NCCALCSIZE message */
- Result = co_WinPosGetNonClientSize(Window,
- &Window->Wnd->rcWindow,
- &Window->Wnd->rcClient);
-
- RECTL_vOffsetRect(&Window->Wnd->rcWindow,
- MaxPos.x - Window->Wnd->rcWindow.left,
- MaxPos.y - Window->Wnd->rcWindow.top);
-
-
+
+ /* Link the window*/
if (NULL != ParentWindow)
{
/* link the window into the parent's child list */
@@ -2291,7 +2114,7 @@
{
/* link window as top sibling (but after topmost siblings) */
PWINDOW_OBJECT InsertAfter, Sibling;
- if (!(dwExStyle & WS_EX_TOPMOST))
+ if (!(Cs->dwExStyle & WS_EX_TOPMOST))
{
InsertAfter = NULL;
Sibling = ParentWindow->spwndChild;
@@ -2309,19 +2132,35 @@
IntLinkWindow(Window, ParentWindow, InsertAfter /* prev sibling */);
}
}
+
+ /* Send the NCCREATE message */
+ Result = co_IntSendMessage(Window->hSelf, WM_NCCREATE, 0, (LPARAM) Cs);
+ if (!Result)
+ {
+ DPRINT1("co_UserCreateWindowEx(): NCCREATE message failed\n");
+ RETURN((PWND)0);
+ }
+
+ /* Send the WM_NCCALCSIZE message */
+ MaxPos.x = Window->Wnd->rcWindow.left;
+ MaxPos.y = Window->Wnd->rcWindow.top;
+
+ Result = co_WinPosGetNonClientSize(Window, &Wnd->rcWindow,
&Wnd->rcClient);
+
+ RECTL_vOffsetRect(&Wnd->rcWindow, MaxPos.x - Wnd->rcWindow.left,
+ MaxPos.y - Wnd->rcWindow.top);
+
/* Send the WM_CREATE message. */
- DPRINT("IntCreateWindowEx(): about to send CREATE message.\n");
- Result = co_IntSendMessage(Window->hSelf, WM_CREATE, 0, (LPARAM) &Cs);
-
+ Result = co_IntSendMessage(Window->hSelf, WM_CREATE, 0, (LPARAM) Cs);
if (Result == (LRESULT)-1)
{
- /* FIXME: Cleanup. */
- DPRINT1("IntCreateWindowEx(): send CREATE message failed. No cleanup
performed!\n");
+ DPRINT1("co_UserCreateWindowEx(): WM_CREATE message failed\n");
IntUnlinkWindow(Window);
RETURN((PWND)0);
}
+ /* Send the EVENT_OBJECT_CREATE event*/
IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0);
/* By setting the flag below it can be examined to determine if the window
@@ -2329,43 +2168,10 @@
from here the function has to succeed. */
Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED;
- /* Send move and size messages. */
+ /* Send the WM_SIZE and WM_MOVE messages. */
if (!(Window->state & WINDOWOBJECT_NEED_SIZE))
{
- LONG lParam;
-
- DPRINT("IntCreateWindow(): About to send WM_SIZE\n");
-
- if ((Window->Wnd->rcClient.right - Window->Wnd->rcClient.left) < 0
||
- (Window->Wnd->rcClient.bottom - Window->Wnd->rcClient.top) <
0)
- {
- DPRINT("Sending bogus WM_SIZE\n");
- }
-
- lParam = MAKE_LONG(Window->Wnd->rcClient.right -
- Window->Wnd->rcClient.left,
- Window->Wnd->rcClient.bottom -
- Window->Wnd->rcClient.top);
- co_IntSendMessage(Window->hSelf, WM_SIZE, SIZE_RESTORED,
- lParam);
-
- DPRINT("IntCreateWindow(): About to send WM_MOVE\n");
-
- if (0 != (Wnd->style & WS_CHILD) && ParentWindow)
- {
- lParam = MAKE_LONG(Wnd->rcClient.left -
ParentWindow->Wnd->rcClient.left,
- Wnd->rcClient.top -
ParentWindow->Wnd->rcClient.top);
- }
- else
- {
- lParam = MAKE_LONG(Wnd->rcClient.left,
- Wnd->rcClient.top);
- }
-
- co_IntSendMessage(Window->hSelf, WM_MOVE, 0, lParam);
-
- /* Call WNDOBJ change procs */
- IntEngWindowChanged(Window, WOC_RGN_CLIENT);
+ co_WinPosSendSizeMove(Window);
}
/* Show or maybe minimize or maximize the window. */
@@ -2374,8 +2180,7 @@
RECTL NewPos;
UINT16 SwFlag;
- SwFlag = (Wnd->style & WS_MINIMIZE) ? SW_MINIMIZE :
- SW_MAXIMIZE;
+ SwFlag = (Wnd->style & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE;
co_WinPosMinMaximize(Window, SwFlag, &NewPos);
@@ -2383,31 +2188,24 @@
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED :
SWP_NOZORDER | SWP_FRAMECHANGED;
- DPRINT("IntCreateWindow(): About to minimize/maximize\n");
- DPRINT("%d,%d %dx%d\n", NewPos.left, NewPos.top, NewPos.right,
NewPos.bottom);
co_WinPosSetWindowPos(Window, 0, NewPos.left, NewPos.top,
NewPos.right, NewPos.bottom, SwFlag);
}
- /* Notify the parent window of a new child. */
+ /* Send the WM_PARENTNOTIFY message */
if ((Wnd->style & WS_CHILD) &&
(!(Wnd->ExStyle & WS_EX_NOPARENTNOTIFY)) && ParentWindow)
{
- DPRINT("IntCreateWindow(): About to notify parent\n");
co_IntSendMessage(ParentWindow->hSelf,
WM_PARENTNOTIFY,
MAKEWPARAM(WM_CREATE, Wnd->IDMenu),
(LPARAM)Window->hSelf);
}
- if ((!hWndParent) && (!HasOwner))
- {
- DPRINT("Sending CREATED notify\n");
+ /* Notify the shell that a new window was created */
+ if ((!hWndParent) && (!hWndOwner))
+ {
co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)hWnd);
- }
- else
- {
- DPRINT("Not sending CREATED notify, %x %d\n", ParentWindow, HasOwner);
}
/* Initialize and show the window's scrollbars */
@@ -2420,14 +2218,14 @@
co_UserShowScrollBar(Window, SB_HORZ, TRUE);
}
- if (dwStyle & WS_VISIBLE)
+ /* Show the new window */
+ if (Cs->style & WS_VISIBLE)
{
if (Wnd->style & WS_MAXIMIZE)
dwShowMode = SW_SHOW;
else if (Wnd->style & WS_MINIMIZE)
dwShowMode = SW_SHOWMINIMIZED;
- DPRINT("IntCreateWindow(): About to show window\n");
co_WinPosShowWindow(Window, dwShowMode);
if (Wnd->ExStyle & WS_EX_MDICHILD)
@@ -2438,49 +2236,26 @@
}
}
- /* BugBoy Comments: if the window being created is a edit control, ATOM 0xCxxx,
- then my testing shows that windows (2k and XP) creates a CallProc for it
immediately
- Dont understand why it does this. */
- if (ClassAtom == gpsi->atomSysClass[ICLS_EDIT])
- {
- PCALLPROCDATA CallProc;
- //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow,
Wnd->ti->ppi);
- CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode ,
Wnd->head.pti->ppi);
-
- if (!CallProc)
- {
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- DPRINT1("Warning: Unable to create CallProc for edit control. Control may
not operate correctly! hwnd %x\n",hWnd);
- }
- else
- {
- UserAddCallProcToClass(Wnd->pcls, CallProc);
- }
- }
-
- DPRINT("IntCreateWindow(): = %X\n", hWnd);
- DPRINT("WindowObject->SystemMenu = 0x%x\n", Window->SystemMenu);
+ DPRINT("co_UserCreateWindowEx(): Created window %X\n", hWnd);
RETURN( Wnd);
CLEANUP:
- if (!_ret_ && Window && Window->Wnd && ti)
- co_UserDestroyWindow(Window);
-// UserFreeWindowInfo(ti, Window);
+ if (!_ret_)
+ {
+ /* If the window was created, the class will be dereferenced by
co_UserDestroyWindow */
+ if (Window)
+ co_UserDestroyWindow(Window);
+ else
+ IntDereferenceClass(Class, pti->pDeskInfo, pti->ppi);
+ }
+
if (Window)
{
UserDerefObjectCo(Window);
UserDereferenceObject(Window);
}
if (ParentWindow) UserDerefObjectCo(ParentWindow);
- if (!_ret_ && ti != NULL)
- {
- if (Class != NULL)
- {
- IntDereferenceClass(Class,
- ti->pDeskInfo,
- ti->ppi);
- }
- }
+
END_CLEANUP;
}
@@ -2564,11 +2339,9 @@
LARGE_STRING lstrWindowName;
LARGE_STRING lstrClassName;
UNICODE_STRING ustrClassName;
+ CREATESTRUCTW Cs;
HWND hwnd = NULL;
PWND pwnd;
-
- DPRINT("Enter NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth,
nHeight);
- UserEnterExclusive();
lstrWindowName.Buffer = NULL;
lstrClassName.Buffer = NULL;
@@ -2580,8 +2353,9 @@
Status = ProbeAndCaptureLargeString(&lstrWindowName, plstrWindowName);
if (!NT_SUCCESS(Status))
{
+ DPRINT1("NtUserCreateWindowEx: failed to capture
plstrWindowName\n");
SetLastNtError(Status);
- goto leave;
+ return NULL;
}
plstrWindowName = &lstrWindowName;
}
@@ -2600,6 +2374,7 @@
Status = ProbeAndCaptureLargeString(&lstrClassName, plstrClassName);
if (!NT_SUCCESS(Status))
{
+ DPRINT1("NtUserCreateWindowEx: failed to capture
plstrClassName\n");
/* Set last error, cleanup and return */
SetLastNtError(Status);
goto cleanup;
@@ -2611,23 +2386,35 @@
ustrClassName.MaximumLength = lstrClassName.MaximumLength;
}
+ /* Fill the CREATESTRUCTW */
+ /* we will keep here the original parameters */
+ Cs.style = dwStyle;
+ Cs.lpCreateParams = lpParam;
+ Cs.hInstance = hInstance;
+ Cs.hMenu = hMenu;
+ Cs.hwndParent = hWndParent;
+ Cs.cx = nWidth;
+ Cs.cy = nHeight;
+ Cs.x = x;
+ Cs.y = y;
+// Cs.lpszName = (LPCWSTR) WindowName->Buffer;
+// Cs.lpszClass = (LPCWSTR) ClassName->Buffer;
+ Cs.lpszName = (LPCWSTR) plstrWindowName;
+ Cs.lpszClass = (LPCWSTR) &ustrClassName;
+ Cs.dwExStyle = dwExStyle;
+
+ UserEnterExclusive();
+
/* Call the internal function */
- pwnd = co_IntCreateWindowEx(dwExStyle,
- &ustrClassName,
- plstrWindowName,
- dwStyle,
- x,
- y,
- nWidth,
- nHeight,
- hWndParent,
- hMenu,
- hInstance,
- lpParam,
- SW_SHOW,
- !(dwExStyle & WS_EX_SETANSICREATOR));
-
+ pwnd = co_UserCreateWindowEx(&Cs, &ustrClassName, plstrWindowName);
+
+ if(!pwnd)
+ {
+ DPRINT1("co_UserCreateWindowEx failed!\n");
+ }
hwnd = pwnd ? UserHMGetHandle(pwnd) : NULL;
+
+ UserLeave();
cleanup:
if (lstrWindowName.Buffer)
@@ -2638,10 +2425,6 @@
{
ExFreePoolWithTag(lstrClassName.Buffer, TAG_STRING);
}
-
-leave:
- DPRINT("Leave NtUserCreateWindowEx, hwnd=%i\n", hwnd);
- UserLeave();
return hwnd;
}
@@ -2957,10 +2740,10 @@
(Child->Wnd->strName.Length < 0xFFFF &&
!RtlCompareUnicodeString(WindowName, &CurrentWindowName, TRUE)))
{
- Ret = Child->hSelf;
- break;
- }
+ Ret = Child->hSelf;
+ break;
}
+ }
}
ExFreePool(List);
}
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] Mon May 31 19:58:05
2010
@@ -1463,6 +1463,33 @@
return Result;
}
+void FASTCALL
+co_WinPosSendSizeMove(PWINDOW_OBJECT Window)
+{
+ WPARAM wParam = SIZE_RESTORED;
+ PWND Wnd = Window->Wnd;
+
+ Window->state &= ~WINDOWOBJECT_NEED_SIZE;
+ if (Wnd->style & WS_MAXIMIZE)
+ {
+ wParam = SIZE_MAXIMIZED;
+ }
+ else if (Wnd->style & WS_MINIMIZE)
+ {
+ wParam = SIZE_MINIMIZED;
+ }
+
+ co_IntSendMessageNoWait(Window->hSelf, WM_SIZE, wParam,
+ MAKELONG(Wnd->rcClient.right -
+ Wnd->rcClient.left,
+ Wnd->rcClient.bottom -
+ Wnd->rcClient.top));
+ co_IntSendMessageNoWait(Window->hSelf, WM_MOVE, 0,
+ MAKELONG(Wnd->rcClient.left,
+ Wnd->rcClient.top));
+ IntEngWindowChanged(Window, WOC_RGN_CLIENT);
+}
+
BOOLEAN FASTCALL
co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd)
{
@@ -1621,28 +1648,7 @@
if ((Window->state & WINDOWOBJECT_NEED_SIZE) &&
!(Window->state & WINDOWSTATUS_DESTROYING))
{
- WPARAM wParam = SIZE_RESTORED;
-
- Window->state &= ~WINDOWOBJECT_NEED_SIZE;
- if (Wnd->style & WS_MAXIMIZE)
- {
- wParam = SIZE_MAXIMIZED;
- }
- else if (Wnd->style & WS_MINIMIZE)
- {
- wParam = SIZE_MINIMIZED;
- }
-
- co_IntSendMessageNoWait(Window->hSelf, WM_SIZE, wParam,
- MAKELONG(Wnd->rcClient.right -
- Wnd->rcClient.left,
- Wnd->rcClient.bottom -
- Wnd->rcClient.top));
- co_IntSendMessageNoWait(Window->hSelf, WM_MOVE, 0,
- MAKELONG(Wnd->rcClient.left,
- Wnd->rcClient.top));
- IntEngWindowChanged(Window, WOC_RGN_CLIENT);
-
+ co_WinPosSendSizeMove(Window);
}
/* Activate the window if activation is not requested and the window is not minimized
*/