16#define IMEMENUINFO_BUFFER_SIZE 0x20000
17#define IMEMENUINFO_MAGIC 0xBABEF00D
47#define PTR_FROM_OFFSET(head, offset) (PVOID)((PBYTE)(head) + (SIZE_T)(offset))
53 _Out_ PIMEMENUITEMINFOW pItemW,
58 pItemW->cbSize = pItemA->cbSize;
59 pItemW->fType = pItemA->fType;
60 pItemW->fState = pItemA->fState;
61 pItemW->wID = pItemA->wID;
64 pItemW->hbmpChecked = pItemA->hbmpChecked;
65 pItemW->hbmpUnchecked = pItemA->hbmpUnchecked;
66 pItemW->hbmpItem = pItemA->hbmpItem;
68 pItemW->dwItemData = pItemA->dwItemData;
70 pItemW->szString,
_countof(pItemW->szString));
79 _Out_ PIMEMENUITEMINFOA pItemA,
83 pItemA->cbSize = pItemW->cbSize;
84 pItemA->fType = pItemW->fType;
85 pItemA->fState = pItemW->fState;
86 pItemA->wID = pItemW->wID;
87 pItemA->hbmpChecked = pItemW->hbmpChecked;
88 pItemA->hbmpUnchecked = pItemW->hbmpUnchecked;
89 pItemA->dwItemData = pItemW->dwItemData;
90 pItemA->hbmpItem = pItemW->hbmpItem;
102 const BYTE *pb = (
const BYTE *)pView;
103 pb += pView->dwBitmapsOffset;
118 pb += pView->dwBitmapsOffset;
155 DWORD colorTableSize = 0;
159 colorTableSize = 3 *
sizeof(
DWORD);
165 if (pView->cbSize + cbData +
sizeof(
DWORD) > pView->cbCapacity)
167 ERR(
"Too large IME menu (0x%X, 0x%X)\n", pView->cbSize, cbData);
175 ERR(
"Out of memory\n");
183 pBitmap->dwBitsOffset = cbBitmapHeader + dibHeaderSize;
185 pb += cbBitmapHeader;
206 pView->cbSize += cbData;
213 const BYTE *pb = (
const BYTE *)pBitmap;
220 pb + pBitmap->dwBitsOffset,
243 ERR(
"Invalid pView\n");
249 DWORD dwType = pView->dwType;
251 pView->dwItemCount = dwItemCount;
260 pb +=
sizeof(*pView);
265 pView->dwParentOffset = pb - (
PBYTE)pView;
266 pView->cbSize +=
sizeof(*lpImeParentMenu);
267 CopyMemory(pb, lpImeParentMenu,
sizeof(*lpImeParentMenu));
268 pb +=
sizeof(*lpImeParentMenu);
275 pView->dwItemsOffset = pb - (
PBYTE)pView;
276 pView->dwBitmapsOffset = pView->dwItemsOffset + cbItems;
277 if (pView->dwItemsOffset +
sizeof(
DWORD) > pView->cbCapacity ||
278 pView->dwBitmapsOffset +
sizeof(
DWORD) > pView->cbCapacity)
280 ERR(
"Too large IME menu (0x%X, 0x%X)\n", pView->dwItemsOffset, pView->dwBitmapsOffset);
285 PIMEMENUITEMINFOW
pItems = (PIMEMENUITEMINFOW)pb;
287 pView->dwItemCount = dwItemCount;
288 pView->cbSize += cbItems;
293 for (
DWORD iItem = 0; iItem < dwItemCount; ++iItem)
295 PIMEMENUITEMINFOW pItem = &
pItems[iItem];
311 TRACE(
"pView->cbSize: 0x%X\n", pView->cbSize);
328 ERR(
"Invalid pView\n");
332 DWORD dwItemCount = pView->dwItemCount;
333 if (lpImeMenuItems ==
NULL)
345 for (
DWORD iItem = 0; iItem < dwItemCount; ++iItem)
347 PIMEMENUITEMINFOW pItem = &
pItems[iItem];
348 if (pItem->hbmpChecked)
353 if (pItem->hbmpUnchecked)
363 lpImeMenuItems[iItem] = *pItem;
453 pView->
cbSize =
sizeof(*pView);
498 ERR(
"!dwProcessId\n");
506 ERR(
"ImmGetImeMenuItemsA cannot cross process boundary\n");
526 ERR(
"!dwThreadId\n");
542 if (!pImeDpi->ImeGetImeMenuItems)
544 WARN(
"ImeGetImeMenuItems is not available (optional).\n");
558 if (bImcIsAnsi != bTargetIsAnsi)
567 pNewParent = &ParentW;
588 pNewParent = &ParentA;
607 pNewItems = lpImeMenuItems;
608 pNewParent = lpImeParentMenu;
612 ret = pImeDpi->ImeGetImeMenuItems(hIMC,
dwFlags, dwType, pNewParent, pNewItems,
dwSize);
615 ERR(
"ImeGetImeMenuItems failed\n");
622 if (bImcIsAnsi != bTargetIsAnsi)
632 pItemA = lpImeMenuItems;
633 for (iItem = 0; iItem <
ret; ++iItem, ++pItemW, ++pItemA)
646 pItemW = lpImeMenuItems;
647 for (iItem = 0; iItem <
dwSize; ++iItem, ++pItemA, ++pItemW)
655 if (pNewItems != lpImeMenuItems)
674 TRACE(
"(%p, 0x%lX, 0x%lX, %p, %p, 0x%lX)\n",
691 TRACE(
"(%p, 0x%lX, 0x%lX, %p, %p, 0x%lX)\n",
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UlongToHandle(ul)
#define INVALID_HANDLE_VALUE
#define CreateFileMappingW(a, b, c, d, e, f)
#define WideCharToMultiByte
#define MultiByteToWideChar
HANDLE NTAPI OpenFileMappingW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
RTL_CRITICAL_SECTION gcsImeDpi
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define _Out_writes_bytes_opt_(s)
_In_ DWORD _In_ DWORD dwOffset
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
BITMAPINFOHEADER bmiHeader
BITMAPINFOHEADER bmiHeader
#define ImmLocalFree(lpData)
BOOL Imm32IsImcAnsi(HIMC hIMC)
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
#define FILE_MAP_ALL_ACCESS
DWORD WINAPI GetCurrentProcessId(void)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
struct tagBITMAPINFO * PBITMAPINFO
BOOL WINAPI DeleteDC(_In_ HDC)
HBITMAP WINAPI CreateDIBitmap(_In_ HDC hdc, _In_opt_ const BITMAPINFOHEADER *pbmih, _In_ DWORD fdwInit, _In_opt_ const VOID *pvInit, _In_opt_ const BITMAPINFO *pbmi, _In_ UINT uUsage)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
BOOL WINAPI IsWindow(_In_opt_ HWND)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
HDC WINAPI GetDC(_In_opt_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)