ReactOS 0.4.16-dev-1453-g06343fa
imemenu.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS IMM32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Implementing IME menus
5 * COPYRIGHT: Copyright 1998 Patrik Stridvall
6 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
7 * Copyright 2017 James Tabor <james.tabor@reactos.org>
8 * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
9 * Copyright 2020-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
10 */
11
12#include "precomp.h"
13
15
16#define IMEMENUINFO_BUFFER_SIZE 0x20000
17#define IMEMENUINFO_MAGIC 0xBABEF00D /* ReactOS-specific */
18
19/* ReactOS-specific */
20typedef struct tagIMEMENUINFO
21{
23 DWORD cbCapacity; /* IMEMENUINFO_BUFFER_SIZE */
24 DWORD dwMagic; /* IMEMENUINFO_MAGIC */
25 DWORD dwFlags; /* ImmGetImeMenuItems.dwFlags */
26 DWORD dwType; /* ImmGetImeMenuItems.dwType */
32
33typedef struct tagBITMAPINFOMAX
34{
38
39/* ReactOS-specific */
41{
46
47#define PTR_FROM_OFFSET(head, offset) (PVOID)((PBYTE)(head) + (SIZE_T)(offset))
48
49/* Convert ANSI IME menu to Wide */
50static BOOL
52 _In_ const IMEMENUITEMINFOA *pItemA,
53 _Out_ PIMEMENUITEMINFOW pItemW,
54 _In_ UINT uCodePage,
55 _In_ BOOL bBitmap)
56{
57 INT ret;
58 pItemW->cbSize = pItemA->cbSize;
59 pItemW->fType = pItemA->fType;
60 pItemW->fState = pItemA->fState;
61 pItemW->wID = pItemA->wID;
62 if (bBitmap)
63 {
64 pItemW->hbmpChecked = pItemA->hbmpChecked;
65 pItemW->hbmpUnchecked = pItemA->hbmpUnchecked;
66 pItemW->hbmpItem = pItemA->hbmpItem;
67 }
68 pItemW->dwItemData = pItemA->dwItemData;
69 ret = MultiByteToWideChar(uCodePage, 0, pItemA->szString, -1,
70 pItemW->szString, _countof(pItemW->szString));
71 pItemW->szString[_countof(pItemW->szString) - 1] = UNICODE_NULL; // Avoid buffer overrun
72 return !!ret;
73}
74
75/* Convert Wide IME menu to ANSI */
76static BOOL
78 _In_ const IMEMENUITEMINFOW *pItemW,
79 _Out_ PIMEMENUITEMINFOA pItemA,
80 _In_ UINT uCodePage)
81{
82 INT ret;
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;
91 ret = WideCharToMultiByte(uCodePage, 0, pItemW->szString, -1,
92 pItemA->szString, _countof(pItemA->szString), NULL, NULL);
93 pItemA->szString[_countof(pItemA->szString) - 1] = ANSI_NULL; // Avoid buffer overrun
94 return !!ret;
95}
96
97static DWORD
99 _In_ const IMEMENUINFO *pView,
101{
102 const BYTE *pb = (const BYTE *)pView;
103 pb += pView->dwBitmapsOffset;
104 const IMEMENUBITMAPHEADER *pBitmap = (const IMEMENUBITMAPHEADER *)pb;
105 while (pBitmap->cbSize)
106 {
107 if (pBitmap->hbm == hbm)
108 return (PBYTE)pBitmap - (PBYTE)pView; /* Byte offset from pView */
109 pBitmap = PTR_FROM_OFFSET(pBitmap, pBitmap->cbSize);
110 }
111 return 0;
112}
113
114static VOID
116{
117 PBYTE pb = (PBYTE)pView;
118 pb += pView->dwBitmapsOffset;
120 while (pBitmap->cbSize)
121 {
122 if (pBitmap->hbm)
123 {
124 DeleteObject(pBitmap->hbm);
125 pBitmap->hbm = NULL;
126 }
127 pBitmap = PTR_FROM_OFFSET(pBitmap, pBitmap->cbSize);
128 }
129}
130
131static DWORD
133 _In_ HDC hDC,
134 _Inout_ PIMEMENUINFO pView,
136{
137 if (hbm == NULL)
138 return 0;
139
141 if (dwOffset)
142 return dwOffset; /* Already serialized */
143
144 /* Get DIB info */
145 BITMAPINFOMAX bmi;
146 ZeroMemory(&bmi, sizeof(bmi));
147 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
148 if (!GetDIBits(hDC, hbm, 0, 0, NULL, (PBITMAPINFO)&bmi, DIB_RGB_COLORS))
149 {
150 ERR("!GetDIBits\n");
151 return 0;
152 }
153
154 /* Calculate the possible color table size */
155 DWORD colorTableSize = 0;
156 if (bmi.bmiHeader.biBitCount <= 8)
157 colorTableSize = (1 << bmi.bmiHeader.biBitCount) * sizeof(RGBQUAD);
158 else if (bmi.bmiHeader.biBitCount == 16 || bmi.bmiHeader.biBitCount == 32)
159 colorTableSize = 3 * sizeof(DWORD);
160
161 /* Calculate the data sizes and validate them */
162 DWORD cbBitmapHeader = sizeof(IMEMENUBITMAPHEADER);
163 DWORD dibHeaderSize = sizeof(BITMAPINFOHEADER) + colorTableSize;
164 DWORD cbData = cbBitmapHeader + dibHeaderSize + bmi.bmiHeader.biSizeImage;
165 if (pView->cbSize + cbData + sizeof(DWORD) > pView->cbCapacity)
166 {
167 ERR("Too large IME menu (0x%X, 0x%X)\n", pView->cbSize, cbData);
168 return 0;
169 }
170
171 /* Create a bitmap for getting bits */
173 if (!hbmTmp)
174 {
175 ERR("Out of memory\n");
176 return 0;
177 }
178
179 /* Store the IMEMENUBITMAPHEADER */
180 PBYTE pb = (PBYTE)pView + pView->cbSize;
182 pBitmap->cbSize = cbData;
183 pBitmap->dwBitsOffset = cbBitmapHeader + dibHeaderSize;
184 pBitmap->hbm = hbm;
185 pb += cbBitmapHeader;
186
187 /* Store the BITMAPINFO */
189 CopyMemory(pbmi, &bmi, dibHeaderSize);
190 pb += dibHeaderSize;
191
192 /* Get the bits */
193 HGDIOBJ hbmOld = SelectObject(hDC, hbmTmp);
195 SelectObject(hDC, hbmOld);
196
197 DeleteObject(hbmTmp);
198
199 if (!ret)
200 {
201 ERR("!GetDIBits\n");
202 pBitmap->cbSize = 0;
203 return 0;
204 }
205
206 pView->cbSize += cbData;
207 return (PBYTE)pBitmap - (PBYTE)pView; /* Byte offset from pView */
208}
209
210static HBITMAP
212{
213 const BYTE *pb = (const BYTE *)pBitmap;
214 const BITMAPINFO *pbmi = (const BITMAPINFO *)(pb + sizeof(*pBitmap));
215
216 HDC hDC = GetDC(NULL);
218 &pbmi->bmiHeader,
219 CBM_INIT,
220 pb + pBitmap->dwBitsOffset,
221 pbmi,
223 if (!hbm)
224 ERR("!hbm\n");
226 return hbm;
227}
228
229/*
230 * We transport the IME menu items by using a flat memory block via
231 * a file mapping object beyond boundary of process.
232 */
233static DWORD
235 _Inout_ PIMEMENUINFO pView,
236 _In_ HIMC hIMC,
237 _Inout_opt_ PIMEMENUITEMINFOW lpImeParentMenu,
238 _In_ BOOL bCountOnly)
239{
240 /* Sanity check */
241 if (pView->dwMagic != IMEMENUINFO_MAGIC || pView->cbSize > pView->cbCapacity)
242 {
243 ERR("Invalid pView\n");
244 return 0;
245 }
246
247 /* Get the count of menu items */
248 DWORD dwFlags = pView->dwFlags;
249 DWORD dwType = pView->dwType;
250 DWORD dwItemCount = ImmGetImeMenuItemsW(hIMC, dwFlags, dwType, lpImeParentMenu, NULL, 0);
251 pView->dwItemCount = dwItemCount;
252 if (bCountOnly)
253 return dwItemCount;
254
255 if (!dwItemCount)
256 return 0;
257
258 /* Start of serialization */
259 PBYTE pb = (PBYTE)pView;
260 pb += sizeof(*pView);
261
262 /* Store the parent menu data */
263 if (lpImeParentMenu)
264 {
265 pView->dwParentOffset = pb - (PBYTE)pView;
266 pView->cbSize += sizeof(*lpImeParentMenu);
267 CopyMemory(pb, lpImeParentMenu, sizeof(*lpImeParentMenu));
268 pb += sizeof(*lpImeParentMenu);
269 }
270
271 /* The byte size of items */
272 SIZE_T cbItems = dwItemCount * sizeof(IMEMENUITEMINFOW);
273
274 /* Update the offset info */
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)
279 {
280 ERR("Too large IME menu (0x%X, 0x%X)\n", pView->dwItemsOffset, pView->dwBitmapsOffset);
281 return 0;
282 }
283
284 /* Actually get the items */
285 PIMEMENUITEMINFOW pItems = (PIMEMENUITEMINFOW)pb;
286 dwItemCount = ImmGetImeMenuItemsW(hIMC, dwFlags, dwType, lpImeParentMenu, pItems, cbItems);
287 pView->dwItemCount = dwItemCount;
288 pView->cbSize += cbItems;
289
290 /* Serialize the bitmaps */
293 for (DWORD iItem = 0; iItem < dwItemCount; ++iItem)
294 {
295 PIMEMENUITEMINFOW pItem = &pItems[iItem];
296
297 dwOffset = Imm32SerializeImeMenuBitmap(hDC, pView, pItem->hbmpChecked);
298 if (dwOffset)
299 pItem->hbmpChecked = UlongToHandle(dwOffset);
300
301 dwOffset = Imm32SerializeImeMenuBitmap(hDC, pView, pItem->hbmpUnchecked);
302 if (dwOffset)
303 pItem->hbmpUnchecked = UlongToHandle(dwOffset);
304
305 dwOffset = Imm32SerializeImeMenuBitmap(hDC, pView, pItem->hbmpItem);
306 if (dwOffset)
307 pItem->hbmpItem = UlongToHandle(dwOffset);
308 }
309 DeleteDC(hDC);
310
311 TRACE("pView->cbSize: 0x%X\n", pView->cbSize);
312
313 /* Clean up */
315
316 return dwItemCount;
317}
318
319static DWORD
321 _Inout_ PIMEMENUINFO pView,
322 _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOW lpImeMenuItems,
324{
325 /* Sanity check */
326 if (pView->dwMagic != IMEMENUINFO_MAGIC || pView->cbSize > pView->cbCapacity)
327 {
328 ERR("Invalid pView\n");
329 return 0;
330 }
331
332 DWORD dwItemCount = pView->dwItemCount;
333 if (lpImeMenuItems == NULL)
334 return dwItemCount; /* Count only */
335
336 /* Limit the item count for dwSize */
337 if (dwItemCount > dwSize / sizeof(IMEMENUITEMINFOW))
338 dwItemCount = dwSize / sizeof(IMEMENUITEMINFOW);
339
340 /* Get the items pointer */
341 PIMEMENUITEMINFOW pItems = PTR_FROM_OFFSET(pView, pView->dwItemsOffset);
342
343 /* Copy the items and de-serialize the bitmaps */
344 PIMEMENUBITMAPHEADER pBitmap;
345 for (DWORD iItem = 0; iItem < dwItemCount; ++iItem)
346 {
347 PIMEMENUITEMINFOW pItem = &pItems[iItem];
348 if (pItem->hbmpChecked)
349 {
350 pBitmap = PTR_FROM_OFFSET(pView, pItem->hbmpChecked);
351 pItem->hbmpChecked = Imm32DeserializeImeMenuBitmap(pBitmap);
352 }
353 if (pItem->hbmpUnchecked)
354 {
355 pBitmap = PTR_FROM_OFFSET(pView, pItem->hbmpUnchecked);
356 pItem->hbmpUnchecked = Imm32DeserializeImeMenuBitmap(pBitmap);
357 }
358 if (pItem->hbmpItem)
359 {
360 pBitmap = PTR_FROM_OFFSET(pView, pItem->hbmpItem);
361 pItem->hbmpItem = Imm32DeserializeImeMenuBitmap(pBitmap);
362 }
363 lpImeMenuItems[iItem] = *pItem;
364 }
365
366 return dwItemCount;
367}
368
369/***********************************************************************
370 * ImmPutImeMenuItemsIntoMappedFile (IMM32.@)
371 *
372 * Called from user32.dll to transport the IME menu items by using a
373 * file mapping object. This function is provided for WM_IME_SYSTEM:IMS_GETIMEMENU
374 * handling.
375 */
378{
379 /* Open the existing file mapping */
380 HANDLE hMapping = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"ImmMenuInfo");
381 if (!hMapping)
382 {
383 ERR("!hMapping\n");
384 return 0;
385 }
386
387 /* Map the view */
388 PIMEMENUINFO pView = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
389 if (!pView)
390 {
391 ERR("!pView\n");
392 CloseHandle(hMapping);
393 return 0;
394 }
395
396 /* Get parent menu info */
397 PVOID lpImeParentMenu = NULL;
398 if (pView->dwParentOffset)
399 lpImeParentMenu = PTR_FROM_OFFSET(pView, pView->dwParentOffset);
400
401 /* Serialize the IME menu */
402 DWORD dwItemCount = Imm32SerializeImeMenu(pView, hIMC, lpImeParentMenu, !pView->dwItemCount);
403
404 /* Clean up */
405 UnmapViewOfFile(pView);
406 CloseHandle(hMapping);
407
408 return dwItemCount;
409}
410
411static DWORD
413 _In_ HIMC hIMC,
415 _In_ DWORD dwType,
416 _Inout_opt_ PVOID lpImeParentMenu,
417 _Out_writes_bytes_opt_(dwSize) PVOID lpImeMenuItems,
419{
420 /* Get IME window */
422 if (!hwndIme || !IsWindow(hwndIme))
423 {
424 ERR("!hwndIme\n");
425 return 0;
426 }
427
428 /* Lock */
430
431 /* Create a file mapping */
433 0, IMEMENUINFO_BUFFER_SIZE, L"ImmMenuInfo");
434 if (!hMapping)
435 {
436 ERR("!pView\n");
438 return 0;
439 }
440
441 /* Map the view */
442 PIMEMENUINFO pView = MapViewOfFile(hMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
443 if (!pView)
444 {
445 ERR("!pView\n");
446 CloseHandle(hMapping);
448 return 0;
449 }
450
451 /* Initialize view header */
453 pView->cbSize = sizeof(*pView);
455 pView->dwMagic = IMEMENUINFO_MAGIC;
456 pView->dwFlags = dwFlags;
457 pView->dwType = dwType;
458 pView->dwItemCount = lpImeMenuItems ? (dwSize / sizeof(IMEMENUITEMINFOW)) : 0;
459
460 /* Send WM_IME_SYSTEM.IMS_GETIMEMENU message. It will call ImmPutImeMenuItemsIntoMappedFile */
461 DWORD ret = 0;
462 if (SendMessageW(hwndIme, WM_IME_SYSTEM, IMS_GETIMEMENU, (LPARAM)hIMC))
463 {
464 /* De-serialize the IME menu */
465 ret = Imm32DeserializeImeMenu(pView, lpImeMenuItems, dwSize);
466 }
467
468 /* Clean up */
469 UnmapViewOfFile(pView); /* Unmap */
470 CloseHandle(hMapping); /* Close the file mapping */
471 RtlLeaveCriticalSection(&gcsImeDpi); /* Unlock */
472 return ret;
473}
474
475/* Absorbs the differences between ANSI and Wide */
476static DWORD
478 _In_ HIMC hIMC,
480 _In_ DWORD dwType,
481 _Inout_opt_ PVOID lpImeParentMenu,
482 _Out_writes_bytes_opt_(dwSize) PVOID lpImeMenuItems,
484 _In_ BOOL bTargetIsAnsi)
485{
486 DWORD ret = 0, iItem;
487
488 if (!hIMC)
489 {
490 ERR("!hIMC\n");
491 return 0;
492 }
493
494 /* Get input process ID */
496 if (!dwProcessId)
497 {
498 ERR("!dwProcessId\n");
499 return 0;
500 }
501
502 if (dwProcessId != GetCurrentProcessId()) /* Cross process? */
503 {
504 if (bTargetIsAnsi)
505 {
506 ERR("ImmGetImeMenuItemsA cannot cross process boundary\n");
507 return 0;
508 }
509
510 /* Transport the IME menu items, using file mapping */
511 return Imm32GetImeMenuItemWInterProcess(hIMC, dwFlags, dwType, lpImeParentMenu,
512 lpImeMenuItems, dwSize);
513 }
514
515 PINPUTCONTEXT pIC = ImmLockIMC(hIMC);
516 if (!pIC)
517 {
518 ERR("!pIC\n");
519 return 0;
520 }
521
522 /* Get input thread ID */
524 if (!dwThreadId)
525 {
526 ERR("!dwThreadId\n");
527 ImmUnlockIMC(hIMC);
528 return 0;
529 }
530
531 /* Get IME interface */
533 PIMEDPI pImeDpi = ImmLockImeDpi(hKL);
534 if (!pImeDpi)
535 {
536 ERR("!pImeDpi\n");
537 ImmUnlockIMC(hIMC);
538 return 0;
539 }
540
541 /* ImeGetImeMenuItems is optional */
542 if (!pImeDpi->ImeGetImeMenuItems)
543 {
544 WARN("ImeGetImeMenuItems is not available (optional).\n");
545 ImmUnlockImeDpi(pImeDpi);
546 ImmUnlockIMC(hIMC);
547 return 0;
548 }
549
550 /* Is the IME ANSI? */
551 BOOL bImcIsAnsi = Imm32IsImcAnsi(hIMC);
552
553 IMEMENUITEMINFOA ParentA, *pItemA;
554 IMEMENUITEMINFOW ParentW, *pItemW;
555 PVOID pNewItems = NULL, pNewParent = NULL;
556
557 /* Are text types (ANSI/Wide) different between IME and target? */
558 if (bImcIsAnsi != bTargetIsAnsi)
559 {
560 DWORD cbTotal;
561 if (bTargetIsAnsi)
562 {
563 /* Convert the parent */
564 if (lpImeParentMenu)
565 {
566 Imm32ImeMenuAnsiToWide(lpImeParentMenu, &ParentW, pImeDpi->uCodePage, TRUE);
567 pNewParent = &ParentW;
568 }
569
570 /* Allocate buffer for new items */
571 if (lpImeMenuItems)
572 {
573 cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOA)) * sizeof(IMEMENUITEMINFOW));
574 pNewItems = ImmLocalAlloc(0, cbTotal);
575 if (!pNewItems)
576 {
577 ERR("!pNewItems\n");
578 goto Quit;
579 }
580 }
581 }
582 else
583 {
584 /* Convert the parent */
585 if (lpImeParentMenu)
586 {
587 Imm32ImeMenuWideToAnsi(lpImeParentMenu, &ParentA, pImeDpi->uCodePage);
588 pNewParent = &ParentA;
589 }
590
591 /* Allocate buffer for new items */
592 if (lpImeMenuItems)
593 {
594 cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOW)) * sizeof(IMEMENUITEMINFOA));
595 pNewItems = ImmLocalAlloc(0, cbTotal);
596 if (!pNewItems)
597 {
598 ERR("!pNewItems\n");
599 goto Quit;
600 }
601 }
602 }
603 }
604 else
605 {
606 /* Get the items directly */
607 pNewItems = lpImeMenuItems;
608 pNewParent = lpImeParentMenu;
609 }
610
611 /* Get IME menu items from the IME */
612 ret = pImeDpi->ImeGetImeMenuItems(hIMC, dwFlags, dwType, pNewParent, pNewItems, dwSize);
613 if (!ret)
614 {
615 ERR("ImeGetImeMenuItems failed\n");
616 goto Quit;
617 }
618
619 if (!lpImeMenuItems)
620 goto Quit;
621
622 if (bImcIsAnsi != bTargetIsAnsi) /* Are text types different? */
623 {
624 if (bTargetIsAnsi)
625 {
626 /* Convert the parent */
627 if (pNewParent)
628 Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, pImeDpi->uCodePage);
629
630 /* Convert the items */
631 pItemW = pNewItems;
632 pItemA = lpImeMenuItems;
633 for (iItem = 0; iItem < ret; ++iItem, ++pItemW, ++pItemA)
634 {
635 Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage);
636 }
637 }
638 else
639 {
640 /* Convert the parent */
641 if (pNewParent)
642 Imm32ImeMenuAnsiToWide(pNewParent, lpImeParentMenu, pImeDpi->uCodePage, TRUE);
643
644 /* Convert the items */
645 pItemA = pNewItems;
646 pItemW = lpImeMenuItems;
647 for (iItem = 0; iItem < dwSize; ++iItem, ++pItemA, ++pItemW)
648 {
649 Imm32ImeMenuAnsiToWide(pItemA, pItemW, pImeDpi->uCodePage, TRUE);
650 }
651 }
652 }
653
654Quit:
655 if (pNewItems != lpImeMenuItems)
656 ImmLocalFree(pNewItems);
657 ImmUnlockImeDpi(pImeDpi);
658 ImmUnlockIMC(hIMC);
659 return ret;
660}
661
662/***********************************************************************
663 * ImmGetImeMenuItemsA (IMM32.@)
664 */
667 _In_ HIMC hIMC,
669 _In_ DWORD dwType,
670 _Inout_opt_ PIMEMENUITEMINFOA lpImeParentMenu,
671 _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOA lpImeMenu,
673{
674 TRACE("(%p, 0x%lX, 0x%lX, %p, %p, 0x%lX)\n",
675 hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize);
676 return ImmGetImeMenuItemsAW(hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize, TRUE);
677}
678
679/***********************************************************************
680 * ImmGetImeMenuItemsW (IMM32.@)
681 */
684 _In_ HIMC hIMC,
686 _In_ DWORD dwType,
687 _Inout_opt_ PIMEMENUITEMINFOW lpImeParentMenu,
688 _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOW lpImeMenu,
690{
691 TRACE("(%p, 0x%lX, 0x%lX, %p, %p, 0x%lX)\n",
692 hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize);
693 return ImmGetImeMenuItemsAW(hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize, FALSE);
694}
static HDC hDC
Definition: 3dtext.c:33
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define UlongToHandle(ul)
Definition: basetsd.h:97
DWORD HIMC
Definition: dimm.idl:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define UnmapViewOfFile
Definition: compat.h:746
HANDLE HWND
Definition: compat.h:19
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define FILE_MAP_READ
Definition: compat.h:776
#define WideCharToMultiByte
Definition: compat.h:111
#define MapViewOfFile
Definition: compat.h:745
#define MultiByteToWideChar
Definition: compat.h:110
ULONG RGBQUAD
Definition: precomp.h:59
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
DWORD dwThreadId
Definition: fdebug.c:31
HANDLE NTAPI OpenFileMappingW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: filemap.c:297
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:16
#define IMS_GETIMEMENU
Definition: imm32_undoc.h:49
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:561
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1079
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1089
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
Definition: ime.c:1878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62
UINT_PTR HKL
Definition: msctf.idl:125
unsigned int UINT
Definition: ndis.h:50
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define ANSI_NULL
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
_In_ DWORD _In_ DWORD dwOffset
Definition: ntgdi.h:2033
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2780
BYTE * PBYTE
Definition: pedump.c:66
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
DWORD biSizeImage
Definition: amvideo.idl:36
UINT uCodePage
Definition: imm32_undoc.h:95
BITMAPINFOHEADER bmiHeader
Definition: imemenu.c:35
RGBQUAD bmiColors[256]
Definition: imemenu.c:36
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
DWORD cbSize
Definition: imemenu.c:22
DWORD dwItemsOffset
Definition: imemenu.c:29
DWORD dwItemCount
Definition: imemenu.c:27
DWORD dwBitmapsOffset
Definition: imemenu.c:30
DWORD dwMagic
Definition: imemenu.c:24
DWORD dwFlags
Definition: imemenu.c:25
DWORD cbCapacity
Definition: imemenu.c:23
DWORD dwParentOffset
Definition: imemenu.c:28
DWORD dwType
Definition: imemenu.c:26
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
@ QIC_DEFAULTWINDOWIME
Definition: undocuser.h:405
@ QIC_INPUTTHREADID
Definition: undocuser.h:404
@ QIC_INPUTPROCESSID
Definition: undocuser.h:403
#define PTR_FROM_OFFSET(head, offset)
Definition: imemenu.c:47
static HBITMAP Imm32DeserializeImeMenuBitmap(_Inout_ const IMEMENUBITMAPHEADER *pBitmap)
Definition: imemenu.c:211
struct tagIMEMENUBITMAPHEADER IMEMENUBITMAPHEADER
struct tagIMEMENUINFO IMEMENUINFO
static DWORD Imm32SerializeImeMenu(_Inout_ PIMEMENUINFO pView, _In_ HIMC hIMC, _Inout_opt_ PIMEMENUITEMINFOW lpImeParentMenu, _In_ BOOL bCountOnly)
Definition: imemenu.c:234
struct tagBITMAPINFOMAX BITMAPINFOMAX
DWORD WINAPI ImmGetImeMenuItemsW(_In_ HIMC hIMC, _In_ DWORD dwFlags, _In_ DWORD dwType, _Inout_opt_ PIMEMENUITEMINFOW lpImeParentMenu, _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOW lpImeMenu, _In_ DWORD dwSize)
Definition: imemenu.c:683
static DWORD Imm32GetImeMenuItemWInterProcess(_In_ HIMC hIMC, _In_ DWORD dwFlags, _In_ DWORD dwType, _Inout_opt_ PVOID lpImeParentMenu, _Out_writes_bytes_opt_(dwSize) PVOID lpImeMenuItems, _In_ DWORD dwSize)
Definition: imemenu.c:412
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(_In_ HIMC hIMC)
Definition: imemenu.c:377
static DWORD ImmGetImeMenuItemsAW(_In_ HIMC hIMC, _In_ DWORD dwFlags, _In_ DWORD dwType, _Inout_opt_ PVOID lpImeParentMenu, _Out_writes_bytes_opt_(dwSize) PVOID lpImeMenuItems, _In_ DWORD dwSize, _In_ BOOL bTargetIsAnsi)
Definition: imemenu.c:477
static DWORD Imm32SerializeImeMenuBitmap(_In_ HDC hDC, _Inout_ PIMEMENUINFO pView, _In_ HBITMAP hbm)
Definition: imemenu.c:132
struct tagIMEMENUINFO * PIMEMENUINFO
struct tagIMEMENUBITMAPHEADER * PIMEMENUBITMAPHEADER
#define IMEMENUINFO_MAGIC
Definition: imemenu.c:17
static VOID Imm32DeleteImeMenuBitmaps(_Inout_ PIMEMENUINFO pView)
Definition: imemenu.c:115
struct tagBITMAPINFOMAX * PBITMAPINFOMAX
static DWORD Imm32DeserializeImeMenu(_Inout_ PIMEMENUINFO pView, _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOW lpImeMenuItems, _In_ DWORD dwSize)
Definition: imemenu.c:320
#define IMEMENUINFO_BUFFER_SIZE
Definition: imemenu.c:16
DWORD WINAPI ImmGetImeMenuItemsA(_In_ HIMC hIMC, _In_ DWORD dwFlags, _In_ DWORD dwType, _Inout_opt_ PIMEMENUITEMINFOA lpImeParentMenu, _Out_writes_bytes_opt_(dwSize) PIMEMENUITEMINFOA lpImeMenu, _In_ DWORD dwSize)
Definition: imemenu.c:666
static BOOL Imm32ImeMenuWideToAnsi(_In_ const IMEMENUITEMINFOW *pItemW, _Out_ PIMEMENUITEMINFOA pItemA, _In_ UINT uCodePage)
Definition: imemenu.c:77
static DWORD Imm32FindImeMenuBitmap(_In_ const IMEMENUINFO *pView, _In_ HBITMAP hbm)
Definition: imemenu.c:98
static BOOL Imm32ImeMenuAnsiToWide(_In_ const IMEMENUITEMINFOA *pItemA, _Out_ PIMEMENUITEMINFOW pItemW, _In_ UINT uCodePage, _In_ BOOL bBitmap)
Definition: imemenu.c:51
#define ImmLocalFree(lpData)
Definition: precomp.h:105
BOOL Imm32IsImcAnsi(HIMC hIMC)
Definition: utils.c:85
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
#define ZeroMemory
Definition: winbase.h:1753
#define FILE_MAP_WRITE
Definition: winbase.h:162
#define FILE_MAP_ALL_ACCESS
Definition: winbase.h:164
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define CopyMemory
Definition: winbase.h:1751
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
#define WINAPI
Definition: msvc.h:6
#define DIB_RGB_COLORS
Definition: wingdi.h:367
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)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
#define CBM_INIT
Definition: wingdi.h:365
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)
unsigned char BYTE
Definition: xxhash.c:193