/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll
- * FILE: lib/user32/windows/window.c
+ * FILE: win32ss/user/user32/windows/window.c
* PURPOSE: Window management
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* UPDATE HISTORY:
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(user32);
-LRESULT DefWndNCPaint(HWND hWnd, HRGN hRgn, BOOL Active);
void MDI_CalcDefaultChildPos( HWND hwndClient, INT total, LPPOINT lpPos, INT delta, UINT *id );
+extern LPCWSTR FASTCALL ClassNameToVersion(const void *lpszClass, LPCWSTR lpszMenuName, LPCWSTR *plpLibFileName, HANDLE *pContext, BOOL bAnsi);
/* FUNCTIONS *****************************************************************/
return HandleToUlong(hWnd);
}
-VOID
FORCEINLINE
+VOID
RtlInitLargeString(
OUT PLARGE_STRING plstr,
LPCVOID psz,
{
LARGE_STRING WindowName;
LARGE_STRING lstrClassName, *plstrClassName;
+ LARGE_STRING lstrClassVersion, *plstrClassVersion;
UNICODE_STRING ClassName;
+ UNICODE_STRING ClassVersion;
WNDCLASSEXA wceA;
WNDCLASSEXW wceW;
HMODULE hLibModule = NULL;
DWORD save_error;
BOOL Unicode, ClassFound = FALSE;
HWND Handle = NULL;
+ LPCWSTR lpszClsVersion;
+ HANDLE pCtx;
+ LPCWSTR lpLibFileName;
#if 0
DbgPrint("[window] User32CreateWindowEx style %d, exstyle %d, parent %d\n", dwStyle, dwExStyle, hWndParent);
return (HWND)0;
}
}
-
+
/* Copy it to a LARGE_STRING */
lstrClassName.Buffer = ClassName.Buffer;
lstrClassName.Length = ClassName.Length;
NTSTATUS Status;
PSTR AnsiBuffer = WindowName.Buffer;
ULONG AnsiLength = WindowName.Length;
-
+
WindowName.Length = 0;
WindowName.MaximumLength = AnsiLength * sizeof(WCHAR);
WindowName.Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
if (!Unicode) dwExStyle |= WS_EX_SETANSICREATOR;
+ lpszClsVersion = ClassNameToVersion(lpClassName, NULL, &lpLibFileName, &pCtx, !Unicode);
+ if (!lpszClsVersion)
+ {
+ plstrClassVersion = plstrClassName;
+ }
+ else
+ {
+ RtlInitUnicodeString(&ClassVersion, lpszClsVersion);
+ lstrClassVersion.Buffer = ClassVersion.Buffer;
+ lstrClassVersion.Length = ClassVersion.Length;
+ lstrClassVersion.MaximumLength = ClassVersion.MaximumLength;
+ plstrClassVersion = &lstrClassVersion;
+ }
+
for(;;)
{
Handle = NtUserCreateWindowEx(dwExStyle,
plstrClassName,
- NULL,
+ plstrClassVersion,
&WindowName,
dwStyle,
x,
dwFlags,
NULL);
if (Handle) break;
+ if (!lpLibFileName) break;
if (!ClassFound)
{
save_error = GetLastError();
if ( save_error == ERROR_CANNOT_FIND_WND_CLASS )
{
- ClassFound = VersionRegisterClass(ClassName.Buffer, NULL, NULL, &hLibModule);
+ ClassFound = VersionRegisterClass(ClassName.Buffer, lpLibFileName, pCtx, &hLibModule);
if (ClassFound) continue;
}
}
{
RtlFreeUnicodeString(&ClassName);
}
-
+
RtlFreeLargeString(&WindowName);
}
/*
* @implemented
*/
-HWND WINAPI
+HWND
+WINAPI
+DECLSPEC_HOTPATCH
CreateWindowExA(DWORD dwExStyle,
LPCSTR lpClassName,
LPCSTR lpWindowName,
if (!RegisterDefaultClasses)
{
- ERR("CreateWindowExA RegisterSystemControls\n");
+ TRACE("CreateWindowExA RegisterSystemControls\n");
RegisterSystemControls();
}
/*
* @implemented
*/
-HWND WINAPI
+HWND
+WINAPI
+DECLSPEC_HOTPATCH
CreateWindowExW(DWORD dwExStyle,
LPCWSTR lpClassName,
LPCWSTR lpWindowName,
WARN("WS_EX_MDICHILD, but parent %p is not MDIClient\n", hWndParent);
return NULL;
}
-
+
/* lpParams of WM_[NC]CREATE is different for MDI children.
* MDICREATESTRUCT members have the originally passed values.
*/
if (!dwCount)
{
if (!dwThreadId)
- return FALSE;
+ return FALSE;
else
return TRUE;
}
/* FIXME I'm only getting NULLs from Thread Enumeration, and it's
* probably because I'm not doing it right in NtUserBuildHwndList.
* Once that's fixed, we shouldn't have to check for a NULL HWND
- * here
+ * here
* This is now fixed in revision 50205. (jt)
*/
if (!pHwnd[i]) /* don't enumerate a NULL HWND */
{
HWND Ret = NULL;
PWND Ancestor, Wnd;
-
+
Wnd = ValidateHwnd(hwnd);
if (!Wnd)
return NULL;
lpRect->bottom = GetSystemMetrics(SM_CYMINIMIZED);
return TRUE;
}
- if ( hWnd != GetDesktopWindow()) // Wnd->fnid != FNID_DESKTOP )
+ if ( hWnd != GetDesktopWindow()) // Wnd->fnid != FNID_DESKTOP )
{
/* lpRect->left = lpRect->top = 0;
lpRect->right = Wnd->rcClient.right - Wnd->rcClient.left;
/* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
lpRect->right = GetSystemMetrics(SM_CXSCREEN);
lpRect->bottom = GetSystemMetrics(SM_CYSCREEN);
-*/ }
+*/ }
return TRUE;
}
if (Wnd->spwndPrev != NULL)
FoundWnd = DesktopPtrToUser(Wnd->spwndPrev);
break;
-
+
case GW_CHILD:
if (Wnd->spwndChild != NULL)
FoundWnd = DesktopPtrToUser(Wnd->spwndChild);
/*
* @implemented
*/
-BOOL WINAPI
+BOOL
+WINAPI
+DECLSPEC_HOTPATCH
GetWindowInfo(HWND hWnd,
PWINDOWINFO pwi)
{
if (!pWnd) return Ret;
ti = pWnd->head.pti;
-
+
if (ti)
{
if (ti == GetW32ThreadInfo())
/*
* @implemented
*/
-BOOL WINAPI
+BOOL
+WINAPI
+DECLSPEC_HOTPATCH
SetWindowTextA(HWND hWnd,
LPCSTR lpString)
{
/*
* @implemented
*/
-BOOL WINAPI
+BOOL
+WINAPI
+DECLSPEC_HOTPATCH
SetWindowTextW(HWND hWnd,
LPCWSTR lpString)
{
BLENDFUNCTION *pbl,
DWORD dwFlags)
{
- if ( dwFlags & ULW_EX_NORESIZE)
- dwFlags = ~(ULW_EX_NORESIZE|ULW_OPAQUE|ULW_ALPHA|ULW_COLORKEY);
+ if (dwFlags & ULW_EX_NORESIZE) /* only valid for UpdateLayeredWindowIndirect */
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
return NtUserUpdateLayeredWindow( hwnd,
hdcDst,
pptDst,