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

svn path=/trunk/; revision=36933
This commit is contained in:
Dmitry Chapyshev 2008-10-25 07:37:48 +00:00
parent 8a90945651
commit 1e2dcd06e8
3 changed files with 318 additions and 107 deletions

View file

@ -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;
}
/*

View file

@ -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;
}

View file

@ -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
*/