Author: dchapyshev
Date: Sat Oct 25 02:37:48 2008
New Revision: 36933
URL:
http://svn.reactos.org/svn/reactos?rev=36933&view=rev
Log:
DefWindowProcA/W:
- Fix WM_GETTEXTLENGHT message
- Add WM_IME_NOTIFY message
- Implement WM_IME_KEYDOWN, WM_IME_KEYUP, WM_IME_SETCONTEXT, WM_IME_CHAR,
WM_IME_STARTCOMPOSITION, WM_IME_COMPOSITION, WM_IME_ENDCOMPOSITION, WM_IME_SELECT,
WM_IME_NOTIFY
- Remove CascadeWindows and TileWindows from window.c (it is already declared in mdi.c)
- Implement TileChildWindows, CascadeChildWindows, GetInternalWindowPos, SetSysColorsTemp
- Add checking params for GetProcessDefaultLayout, SetProcessDefaultLayout,
GetMouseMovePointsEx, GetRawInputDeviceList
- LockSetForegroundWindow return TRUE
- GetRawInputBuffer, GetRawInputDeviceInfoA/W, DefRawInputProc, GetRawInputData,
GetRegisteredRawInputDevices return 0
Based on Wine implementation
Modified:
trunk/reactos/dll/win32/user32/misc/stubs.c
trunk/reactos/dll/win32/user32/windows/defwnd.c
trunk/reactos/dll/win32/user32/windows/window.c
Modified: trunk/reactos/dll/win32/user32/misc/stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/stub…
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/stubs.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -42,8 +42,22 @@
int nBufPoints,
DWORD resolution)
{
- UNIMPLEMENTED;
- return 0;
+ if((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return -1;
+ }
+
+ if(!lppt || !lpptBuf)
+ {
+ SetLastError(ERROR_NOACCESS);
+ return -1;
+ }
+
+ UNIMPLEMENTED;
+
+ SetLastError(ERROR_POINT_NOT_FOUND);
+ return -1;
}
@@ -137,8 +151,15 @@
LPPOINT ptIcon
)
{
- UNIMPLEMENTED;
- return FALSE;
+ WINDOWPLACEMENT wndpl;
+
+ if (GetWindowPlacement(hwnd, &wndpl))
+ {
+ if (rectWnd) *rectWnd = wndpl.rcNormalPosition;
+ if (ptIcon) *ptIcon = wndpl.ptMinPosition;
+ return wndpl.showCmd;
+ }
+ return 0;
}
/*
@@ -226,41 +247,91 @@
return NtUserCallOneParam((DWORD) hDC, ONEPARAM_ROUTINE_REALIZEPALETTE);
}
-/*
- * @unimplemented
- */
-HANDLE
+
+/*************************************************************************
+ * SetSysColorsTemp (USER32.@) (Wine 10/22/2008)
+ *
+ * UNDOCUMENTED !!
+ *
+ * Called by W98SE desk.cpl Control Panel Applet:
+ * handle = SetSysColorsTemp(ptr, ptr, nCount); ("set" call)
+ * result = SetSysColorsTemp(NULL, NULL, handle); ("restore" call)
+ *
+ * pPens is an array of COLORREF values, which seems to be used
+ * to indicate the color values to create new pens with.
+ *
+ * pBrushes is an array of solid brush handles (returned by a previous
+ * CreateSolidBrush), which seems to contain the brush handles to set
+ * for the system colors.
+ *
+ * n seems to be used for
+ * a) indicating the number of entries to operate on (length of pPens,
+ * pBrushes)
+ * b) passing the handle that points to the previously used color settings.
+ * I couldn't figure out in hell what kind of handle this is on
+ * Windows. I just use a heap handle instead. Shouldn't matter anyway.
+ *
+ * RETURNS
+ * heap handle of our own copy of the current syscolors in case of
+ * "set" call, i.e. pPens, pBrushes != NULL.
+ * TRUE (unconditionally !) in case of "restore" call,
+ * i.e. pPens, pBrushes == NULL.
+ * FALSE in case of either pPens != NULL and pBrushes == NULL
+ * or pPens == NULL and pBrushes != NULL.
+ *
+ * I'm not sure whether this implementation is 100% correct. [AM]
+ */
+
+static HPEN SysColorPens[COLOR_MENUBAR + 1];
+static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1];
+
+DWORD
WINAPI
-SetSysColorsTemp(
- const COLORREF *pPens,
- const HBRUSH *pBrushes,
- INT n
- )
-{
- UNIMPLEMENTED;
- return FALSE;
-}
-
-/*
- * @unimplemented
- */
-WORD
-STDCALL
-CascadeChildWindows ( HWND hWndParent, WORD wFlags )
-{
- UNIMPLEMENTED;
- return FALSE;
-}
-
-/*
- * @unimplemented
- */
-WORD
-STDCALL
-TileChildWindows ( HWND hWndParent, WORD wFlags )
-{
- UNIMPLEMENTED;
- return FALSE;
+SetSysColorsTemp(const COLORREF *pPens,
+ const HBRUSH *pBrushes,
+ DWORD n)
+{
+ DWORD i;
+
+ if (pPens && pBrushes) /* "set" call */
+ {
+ /* allocate our structure to remember old colors */
+ LPVOID pOldCol = HeapAlloc(GetProcessHeap(), 0,
sizeof(DWORD)+n*sizeof(HPEN)+n*sizeof(HBRUSH));
+ LPVOID p = pOldCol;
+ *(DWORD *)p = n; p = (char*)p + sizeof(DWORD);
+ memcpy(p, SysColorPens, n*sizeof(HPEN)); p = (char*)p + n*sizeof(HPEN);
+ memcpy(p, SysColorBrushes, n*sizeof(HBRUSH)); p = (char*)p + n*sizeof(HBRUSH);
+
+ for (i=0; i < n; i++)
+ {
+ SysColorPens[i] = CreatePen( PS_SOLID, 1, pPens[i] );
+ SysColorBrushes[i] = pBrushes[i];
+ }
+
+ return (DWORD) pOldCol; /* FIXME: pointer truncation */
+ }
+ if (!pPens && !pBrushes) /* "restore" call */
+ {
+ LPVOID pOldCol = (LPVOID)n; /* FIXME: not 64-bit safe */
+ LPVOID p = pOldCol;
+ DWORD nCount = *(DWORD *)p;
+ p = (char*)p + sizeof(DWORD);
+
+ for (i=0; i < nCount; i++)
+ {
+ DeleteObject(SysColorPens[i]);
+ SysColorPens[i] = *(HPEN *)p; p = (char*)p + sizeof(HPEN);
+ }
+ for (i=0; i < nCount; i++)
+ {
+ SysColorBrushes[i] = *(HBRUSH *)p; p = (char*)p + sizeof(HBRUSH);
+ }
+ /* get rid of storage structure */
+ HeapFree(GetProcessHeap(), 0, pOldCol);
+
+ return TRUE;
+ }
+ return FALSE;
}
/*
@@ -308,7 +379,7 @@
PUINT pcbSize)
{
UNIMPLEMENTED;
- return FALSE;
+ return 0;
}
/*
@@ -340,7 +411,7 @@
PUINT pcbSize)
{
UNIMPLEMENTED;
- return FALSE;
+ return 0;
}
/*
@@ -365,7 +436,7 @@
UINT cbSizeHeader)
{
UNIMPLEMENTED;
- return FALSE;
+ return 0;
}
/*
@@ -374,12 +445,12 @@
UINT
STDCALL
GetRawInputBuffer(
- PRAWINPUT pData,
- PUINT pcbSize,
- UINT cbSizeHeader)
-{
- UNIMPLEMENTED;
- return FALSE;
+ PRAWINPUT pData,
+ PUINT pcbSize,
+ UINT cbSizeHeader)
+{
+ UNIMPLEMENTED;
+ return 0;
}
/*
@@ -388,14 +459,14 @@
UINT
STDCALL
GetRawInputData(
- HRAWINPUT hRawInput,
- UINT uiCommand,
- LPVOID pData,
- PUINT pcbSize,
- UINT cbSizeHeader)
-{
- UNIMPLEMENTED;
- return FALSE;
+ HRAWINPUT hRawInput,
+ UINT uiCommand,
+ LPVOID pData,
+ PUINT pcbSize,
+ UINT cbSizeHeader)
+{
+ UNIMPLEMENTED;
+ return 0;
}
/*
@@ -408,8 +479,12 @@
PUINT puiNumDevices,
UINT cbSize)
{
- UNIMPLEMENTED;
- return FALSE;
+ if(pRawInputDeviceList)
+ memset(pRawInputDeviceList, 0, sizeof *pRawInputDeviceList);
+ *puiNumDevices = 0;
+
+ UNIMPLEMENTED;
+ return 0;
}
/*
@@ -423,7 +498,7 @@
UINT cbSize)
{
UNIMPLEMENTED;
- return FALSE;
+ return 0;
}
/*
Modified: trunk/reactos/dll/win32/user32/windows/defwnd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/d…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/defwnd.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/defwnd.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -1194,6 +1194,7 @@
if (hDC)
{
HICON hIcon;
+
if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE &&
(hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL)
{
@@ -1762,6 +1763,75 @@
}
+/*
+ * helpers for calling IMM32 (from Wine 10/22/2008)
+ *
+ * WM_IME_* messages are generated only by IMM32,
+ * so I assume imm32 is already LoadLibrary-ed.
+ */
+static HWND
+DefWndImmGetDefaultIMEWnd(HWND hwnd)
+{
+ HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+ HWND (WINAPI *pFunc)(HWND);
+ HWND hwndRet = 0;
+
+ if (!hInstIMM)
+ {
+ ERR("cannot get IMM32 handle\n");
+ return 0;
+ }
+
+ pFunc = (void*) GetProcAddress(hInstIMM, "ImmGetDefaultIMEWnd");
+ if (pFunc != NULL)
+ hwndRet = (*pFunc)(hwnd);
+
+ return hwndRet;
+}
+
+
+static BOOL
+DefWndImmIsUIMessageA(HWND hwndIME, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+ BOOL (WINAPI *pFunc)(HWND,UINT,WPARAM,LPARAM);
+ BOOL fRet = FALSE;
+
+ if (!hInstIMM)
+ {
+ ERR("cannot get IMM32 handle\n");
+ return FALSE;
+ }
+
+ pFunc = (void*) GetProcAddress(hInstIMM, "ImmIsUIMessageA");
+ if (pFunc != NULL)
+ fRet = (*pFunc)(hwndIME, msg, wParam, lParam);
+
+ return fRet;
+}
+
+
+static BOOL
+DefWndImmIsUIMessageW(HWND hwndIME, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+ BOOL (WINAPI *pFunc)(HWND,UINT,WPARAM,LPARAM);
+ BOOL fRet = FALSE;
+
+ if (!hInstIMM)
+ {
+ ERR("cannot get IMM32 handle\n");
+ return FALSE;
+ }
+
+ pFunc = (void*) GetProcAddress(hInstIMM, "ImmIsUIMessageW");
+ if (pFunc != NULL)
+ fRet = (*pFunc)(hwndIME, msg, wParam, lParam);
+
+ return fRet;
+}
+
+
LRESULT STDCALL
DefWindowProcA(HWND hWnd,
UINT Msg,
@@ -1784,13 +1854,13 @@
if(cs->lpszName)
{
- RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
- RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
- NtUserDefSetText(hWnd, &UnicodeString);
- RtlFreeUnicodeString(&UnicodeString);
+ RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
+ RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
+ NtUserDefSetText(hWnd, &UnicodeString);
+ RtlFreeUnicodeString(&UnicodeString);
}
else
- NtUserDefSetText(hWnd, NULL);
+ NtUserDefSetText(hWnd, NULL);
Result = 1;
break;
@@ -1810,9 +1880,11 @@
buf,
Wnd->WindowName.Length)))
{
- Result = (LRESULT)len;
+ Result = (LRESULT) len;
}
}
+ else Result = 0L;
+
break;
}
@@ -1859,13 +1931,13 @@
if(lParam)
{
- RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
- RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
- NtUserDefSetText(hWnd, &UnicodeString);
- RtlFreeUnicodeString(&UnicodeString);
+ RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
+ RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
+ NtUserDefSetText(hWnd, &UnicodeString);
+ RtlFreeUnicodeString(&UnicodeString);
}
else
- NtUserDefSetText(hWnd, NULL);
+ NtUserDefSetText(hWnd, NULL);
if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
{
@@ -1876,16 +1948,50 @@
break;
}
-/* FIXME: Implement these. */
+ case WM_IME_KEYDOWN:
+ {
+ Result = PostMessageA(hWnd, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+
+ case WM_IME_KEYUP:
+ {
+ Result = PostMessageA(hWnd, WM_KEYUP, wParam, lParam);
+ break;
+ }
+
case WM_IME_CHAR:
- case WM_IME_KEYDOWN:
- case WM_IME_KEYUP:
+ {
+ if (HIBYTE(wParam))
+ PostMessageA(hWnd, WM_CHAR, HIBYTE(wParam), lParam);
+ PostMessageA(hWnd, WM_CHAR, LOBYTE(wParam), lParam);
+ break;
+ }
+
case WM_IME_STARTCOMPOSITION:
case WM_IME_COMPOSITION:
case WM_IME_ENDCOMPOSITION:
case WM_IME_SELECT:
+ case WM_IME_NOTIFY:
+ {
+ HWND hwndIME;
+
+ hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+ if (hwndIME)
+ Result = SendMessageA(hwndIME, Msg, wParam, lParam);
+ break;
+ }
+
case WM_IME_SETCONTEXT:
- FIXME("FIXME: WM_IME_* conversion isn't implemented yet!");
+ {
+ HWND hwndIME;
+
+ hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+ if (hwndIME)
+ Result = DefWndImmIsUIMessageA(hwndIME, Msg, wParam, lParam);
+ break;
+ }
+
/* fall through */
default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
@@ -1916,9 +2022,9 @@
* may have child window IDs instead of window name */
if(cs->lpszName)
- RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
-
- NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL));
+ RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
+
+ NtUserDefSetText(hWnd, (cs->lpszName ? &UnicodeString : NULL));
Result = 1;
break;
}
@@ -1937,9 +2043,11 @@
buf,
Wnd->WindowName.Length)))
{
- Result = (LRESULT)len;
+ Result = (LRESULT) (Wnd->WindowName.Length / sizeof(WCHAR));
}
}
+ else Result = 0L;
+
break;
}
@@ -1978,7 +2086,7 @@
UNICODE_STRING UnicodeString;
if(lParam)
- RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);
+ RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);
NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL));
@@ -1992,16 +2100,44 @@
case WM_IME_CHAR:
{
- SendMessageW(hWnd, WM_CHAR, wParam, lParam);
+ PostMessageW(hWnd, WM_CHAR, wParam, lParam);
Result = 0;
break;
}
+ case WM_IME_KEYDOWN:
+ {
+ Result = PostMessageW(hWnd, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+
+ case WM_IME_KEYUP:
+ {
+ Result = PostMessageW(hWnd, WM_KEYUP, wParam, lParam);
+ break;
+ }
+
+ case WM_IME_STARTCOMPOSITION:
+ case WM_IME_COMPOSITION:
+ case WM_IME_ENDCOMPOSITION:
+ case WM_IME_SELECT:
+ case WM_IME_NOTIFY:
+ {
+ HWND hwndIME;
+
+ hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+ if (hwndIME)
+ Result = SendMessageW(hwndIME, Msg, wParam, lParam);
+ break;
+ }
+
case WM_IME_SETCONTEXT:
{
- /* FIXME */
- FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
- Result = 0;
+ HWND hwndIME;
+
+ hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+ if (hwndIME)
+ Result = DefWndImmIsUIMessageW(hwndIME, Msg, wParam, lParam);
break;
}
Modified: trunk/reactos/dll/win32/user32/windows/window.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/w…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -96,27 +96,23 @@
}
-/*
- * @unimplemented
- */
-/*
-WORD STDCALL
-CascadeWindows(HWND hwndParent,
- UINT wHow,
- CONST RECT *lpRect,
- UINT cKids,
- const HWND *lpKids)
-{
- UNIMPLEMENTED;
- return 0;
-}
-*/
-
VOID STDCALL
SwitchToThisWindow(HWND hwnd, BOOL fUnknown)
{
ShowWindow(hwnd, SW_SHOW);
}
+
+
+/*
+ * @implemented
+ */
+WORD
+STDCALL
+CascadeChildWindows ( HWND hWndParent, WORD wFlags )
+{
+ return CascadeWindows(hWndParent, wFlags, NULL, 0, NULL);
+}
+
/*
* @implemented
@@ -1003,8 +999,16 @@
BOOL STDCALL
GetProcessDefaultLayout(DWORD *pdwDefaultLayout)
{
+ if (!pdwDefaultLayout)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
UNIMPLEMENTED;
- return FALSE;
+
+ *pdwDefaultLayout = 0;
+ return TRUE;
}
@@ -1502,7 +1506,7 @@
LockSetForegroundWindow(UINT uLockCode)
{
UNIMPLEMENTED;
- return FALSE;
+ return TRUE;
}
@@ -1602,6 +1606,9 @@
BOOL STDCALL
SetProcessDefaultLayout(DWORD dwDefaultLayout)
{
+ if (dwDefaultLayout == 0)
+ return TRUE;
+
UNIMPLEMENTED;
return FALSE;
}
@@ -1739,23 +1746,6 @@
{
return NtUserShowWindowAsync(hWnd, nCmdShow);
}
-
-
-/*
- * @unimplemented
- */
-/*
-WORD STDCALL
-TileWindows(HWND hwndParent,
- UINT wHow,
- CONST RECT *lpRect,
- UINT cKids,
- const HWND *lpKids)
-{
- UNIMPLEMENTED;
- return 0;
-}
-*/
/*
@@ -2003,6 +1993,16 @@
/*
* @implemented
*/
+WORD
+STDCALL
+TileChildWindows(HWND hWndParent, WORD wFlags)
+{
+ return TileWindows(hWndParent, wFlags, NULL, 0, NULL);
+}
+
+/*
+ * @implemented
+ */
BOOL STDCALL
AnyPopup(VOID)
{