diff --git a/reactos/dll/win32/user32/misc/stubs.c b/reactos/dll/win32/user32/misc/stubs.c index 03eaa0bce91..cd6815305c9 100644 --- a/reactos/dll/win32/user32/misc/stubs.c +++ b/reactos/dll/win32/user32/misc/stubs.c @@ -42,8 +42,22 @@ GetMouseMovePointsEx( 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 @@ GetInternalWindowPos( 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 @@ UserRealizePalette ( HDC hDC ) return NtUserCallOneParam((DWORD) hDC, ONEPARAM_ROUTINE_REALIZEPALETTE); } -/* - * @unimplemented + +/************************************************************************* + * 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] */ -HANDLE + +static HPEN SysColorPens[COLOR_MENUBAR + 1]; +static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1]; + +DWORD WINAPI -SetSysColorsTemp( - const COLORREF *pPens, - const HBRUSH *pBrushes, - INT n - ) +SetSysColorsTemp(const COLORREF *pPens, + const HBRUSH *pBrushes, + DWORD n) { - UNIMPLEMENTED; - return FALSE; -} + DWORD i; -/* - * @unimplemented - */ -WORD -STDCALL -CascadeChildWindows ( HWND hWndParent, WORD wFlags ) -{ - UNIMPLEMENTED; - return FALSE; -} + 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); -/* - * @unimplemented - */ -WORD -STDCALL -TileChildWindows ( HWND hWndParent, WORD wFlags ) -{ - UNIMPLEMENTED; - return FALSE; + 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 @@ GetRawInputDeviceInfoW( PUINT pcbSize) { UNIMPLEMENTED; - return FALSE; + return 0; } /* @@ -340,7 +411,7 @@ GetRawInputDeviceInfoA( PUINT pcbSize) { UNIMPLEMENTED; - return FALSE; + return 0; } /* @@ -365,7 +436,7 @@ DefRawInputProc( UINT cbSizeHeader) { UNIMPLEMENTED; - return FALSE; + return 0; } /* @@ -374,12 +445,12 @@ DefRawInputProc( UINT STDCALL GetRawInputBuffer( - PRAWINPUT pData, - PUINT pcbSize, - UINT cbSizeHeader) + PRAWINPUT pData, + PUINT pcbSize, + UINT cbSizeHeader) { UNIMPLEMENTED; - return FALSE; + return 0; } /* @@ -388,14 +459,14 @@ GetRawInputBuffer( UINT STDCALL GetRawInputData( - HRAWINPUT hRawInput, - UINT uiCommand, - LPVOID pData, - PUINT pcbSize, - UINT cbSizeHeader) + HRAWINPUT hRawInput, + UINT uiCommand, + LPVOID pData, + PUINT pcbSize, + UINT cbSizeHeader) { UNIMPLEMENTED; - return FALSE; + return 0; } /* @@ -408,8 +479,12 @@ GetRawInputDeviceList( PUINT puiNumDevices, UINT cbSize) { - UNIMPLEMENTED; - return FALSE; + if(pRawInputDeviceList) + memset(pRawInputDeviceList, 0, sizeof *pRawInputDeviceList); + *puiNumDevices = 0; + + UNIMPLEMENTED; + return 0; } /* @@ -423,7 +498,7 @@ GetRegisteredRawInputDevices( UINT cbSize) { UNIMPLEMENTED; - return FALSE; + return 0; } /* diff --git a/reactos/dll/win32/user32/windows/defwnd.c b/reactos/dll/win32/user32/windows/defwnd.c index c5e22e17f06..4ea067d6ee5 100644 --- a/reactos/dll/win32/user32/windows/defwnd.c +++ b/reactos/dll/win32/user32/windows/defwnd.c @@ -1194,6 +1194,7 @@ User32DefWindowProc(HWND hWnd, if (hDC) { HICON hIcon; + if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE && (hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL) { @@ -1762,6 +1763,75 @@ User32DefWindowProc(HWND hWnd, } +/* + * 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 @@ DefWindowProcA(HWND hWnd, 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 @@ DefWindowProcA(HWND hWnd, buf, Wnd->WindowName.Length))) { - Result = (LRESULT)len; + Result = (LRESULT) len; } } + else Result = 0L; + break; } @@ -1859,13 +1931,13 @@ DefWindowProcA(HWND hWnd, 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 @@ DefWindowProcA(HWND hWnd, break; } -/* FIXME: Implement these. */ - case WM_IME_CHAR: 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: + { + 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 @@ DefWindowProcW(HWND hWnd, * may have child window IDs instead of window name */ if(cs->lpszName) - RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName); + RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName); - NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL)); + NtUserDefSetText(hWnd, (cs->lpszName ? &UnicodeString : NULL)); Result = 1; break; } @@ -1937,9 +2043,11 @@ DefWindowProcW(HWND hWnd, buf, Wnd->WindowName.Length))) { - Result = (LRESULT)len; + Result = (LRESULT) (Wnd->WindowName.Length / sizeof(WCHAR)); } } + else Result = 0L; + break; } @@ -1978,7 +2086,7 @@ DefWindowProcW(HWND hWnd, UNICODE_STRING UnicodeString; if(lParam) - RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam); + RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam); NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL)); @@ -1992,16 +2100,44 @@ DefWindowProcW(HWND hWnd, 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; } diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c index 908d9b261cc..83f3d086791 100644 --- a/reactos/dll/win32/user32/windows/window.c +++ b/reactos/dll/win32/user32/windows/window.c @@ -96,28 +96,24 @@ BringWindowToTop(HWND hWnd) } -/* - * @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 @@ GetParent(HWND hWnd) BOOL STDCALL GetProcessDefaultLayout(DWORD *pdwDefaultLayout) { + if (!pdwDefaultLayout) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + UNIMPLEMENTED; - return FALSE; + + *pdwDefaultLayout = 0; + return TRUE; } @@ -1502,7 +1506,7 @@ BOOL STDCALL LockSetForegroundWindow(UINT uLockCode) { UNIMPLEMENTED; - return FALSE; + return TRUE; } @@ -1602,6 +1606,9 @@ SetParent(HWND hWndChild, BOOL STDCALL SetProcessDefaultLayout(DWORD dwDefaultLayout) { + if (dwDefaultLayout == 0) + return TRUE; + UNIMPLEMENTED; return FALSE; } @@ -1741,23 +1748,6 @@ ShowWindowAsync(HWND hWnd, } -/* - * @unimplemented - */ -/* -WORD STDCALL -TileWindows(HWND hwndParent, - UINT wHow, - CONST RECT *lpRect, - UINT cKids, - const HWND *lpKids) -{ - UNIMPLEMENTED; - return 0; -} -*/ - - /* * @unimplemented */ @@ -2000,6 +1990,16 @@ ScrollWindowEx(HWND hWnd, flags); } +/* + * @implemented + */ +WORD +STDCALL +TileChildWindows(HWND hWndParent, WORD wFlags) +{ + return TileWindows(hWndParent, wFlags, NULL, 0, NULL); +} + /* * @implemented */