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/stubs... ============================================================================== --- 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/de... ============================================================================== --- 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/wi... ============================================================================== --- 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) {