Skip to content

Commit ec5b142

Browse files
authored
[IMM32][SDK] Implement ImmIMPGetIMEA/W (reactos#8011)
Implementing missing features... JIRA issue: CORE-19268 - Add dll/win32/imm32/imepro.c. - Move some utils.c code into imepro.c. - Implement ImmIMPGetIMEA and ImmIMPGetIMEW functions there. - Add prototypes into <imm32_undoc.h>. - Delete needless code.
1 parent 06034b2 commit ec5b142

File tree

5 files changed

+153
-196
lines changed

5 files changed

+153
-196
lines changed

dll/win32/imm32/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ list(APPEND SOURCE
1414
guideline.c
1515
ime.c
1616
imemenu.c
17+
imepro.c
1718
imm.c
1819
keymsg.c
1920
regword.c

dll/win32/imm32/imepro.c

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/*
2+
* PROJECT: ReactOS IMM32
3+
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4+
* PURPOSE: Implementing ImmIMP* functions
5+
* COPYRIGHT: Copyright 2020-2025 Katayama Hirofumi MZ <[email protected]>
6+
*/
7+
8+
#include "precomp.h"
9+
10+
WINE_DEFAULT_DEBUG_CHANNEL(imm);
11+
12+
/*
13+
* An IMEPROA/IMEPROW structure is an IME program information.
14+
* The ImmIMP* functions just treat these information.
15+
*/
16+
17+
static VOID
18+
Imm32ConvertImeProWideToAnsi(_In_ const IMEPROW *pProW, _Out_ PIMEPROA pProA)
19+
{
20+
pProA->hWnd = pProW->hWnd;
21+
pProA->InstDate = pProW->InstDate;
22+
pProA->wVersion = pProW->wVersion;
23+
24+
WideCharToMultiByte(CP_ACP, 0, pProW->szDescription, -1,
25+
(PSTR)pProA->szDescription, _countof(pProA->szDescription), NULL, NULL);
26+
pProA->szDescription[_countof(pProA->szDescription) - 1] = ANSI_NULL; /* Avoid buffer overrun */
27+
28+
WideCharToMultiByte(CP_ACP, 0, pProW->szName, -1,
29+
(PSTR)pProA->szName, _countof(pProA->szName), NULL, NULL);
30+
pProA->szName[_countof(pProA->szName) - 1] = ANSI_NULL; /* Avoid buffer overrun */
31+
32+
pProA->szOptions[0] = ANSI_NULL;
33+
}
34+
35+
static BOOL
36+
Imm32IMPGetIME(_In_ HKL hKL, _Out_ PIMEPROW pProW)
37+
{
38+
IMEINFOEX ImeInfoEx;
39+
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
40+
return FALSE;
41+
42+
pProW->hWnd = NULL;
43+
ZeroMemory(&pProW->InstDate, sizeof(pProW->InstDate));
44+
pProW->wVersion = ImeInfoEx.dwImeWinVersion;
45+
46+
StringCchCopyNW(pProW->szDescription, _countof(pProW->szDescription),
47+
ImeInfoEx.wszImeDescription, _countof(ImeInfoEx.wszImeDescription));
48+
StringCchCopyNW(pProW->szName, _countof(pProW->szName),
49+
ImeInfoEx.wszImeFile, _countof(ImeInfoEx.wszImeFile));
50+
pProW->szOptions[0] = UNICODE_NULL;
51+
52+
return TRUE;
53+
}
54+
55+
/***********************************************************************
56+
* ImmIMPGetIMEA(IMM32.@)
57+
*/
58+
BOOL WINAPI
59+
ImmIMPGetIMEA(_In_opt_ HWND hWnd, _Out_ LPIMEPROA pImePro)
60+
{
61+
UNREFERENCED_PARAMETER(hWnd);
62+
63+
TRACE("(%p, %p)\n", hWnd, pImePro);
64+
65+
if (!Imm32IsSystemJapaneseOrKorean())
66+
{
67+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
68+
return FALSE;
69+
}
70+
71+
IMEPROW ImeProW;
72+
HKL hKL = GetKeyboardLayout(0);
73+
if (!Imm32IMPGetIME(hKL, &ImeProW))
74+
return FALSE;
75+
76+
Imm32ConvertImeProWideToAnsi(&ImeProW, pImePro);
77+
return TRUE;
78+
}
79+
80+
/***********************************************************************
81+
* ImmIMPGetIMEW(IMM32.@)
82+
*/
83+
BOOL WINAPI
84+
ImmIMPGetIMEW(_In_opt_ HWND hWnd, _Out_ LPIMEPROW pImePro)
85+
{
86+
UNREFERENCED_PARAMETER(hWnd);
87+
88+
TRACE("(%p, %p)\n", hWnd, pImePro);
89+
90+
if (!Imm32IsSystemJapaneseOrKorean())
91+
{
92+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
93+
return FALSE;
94+
}
95+
96+
HKL hKL = GetKeyboardLayout(0);
97+
return Imm32IMPGetIME(hKL, pImePro);
98+
}
99+
100+
/***********************************************************************
101+
* ImmIMPQueryIMEA(IMM32.@)
102+
*/
103+
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
104+
{
105+
FIXME("(%p)\n", pImePro);
106+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
107+
return FALSE;
108+
}
109+
110+
/***********************************************************************
111+
* ImmIMPQueryIMEW(IMM32.@)
112+
*/
113+
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
114+
{
115+
FIXME("(%p)\n", pImePro);
116+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
117+
return FALSE;
118+
}
119+
120+
/***********************************************************************
121+
* ImmIMPSetIMEA(IMM32.@)
122+
*/
123+
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
124+
{
125+
FIXME("(%p, %p)\n", hWnd, pImePro);
126+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
127+
return FALSE;
128+
}
129+
130+
/***********************************************************************
131+
* ImmIMPSetIMEW(IMM32.@)
132+
*/
133+
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
134+
{
135+
FIXME("(%p, %p)\n", hWnd, pImePro);
136+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
137+
return FALSE;
138+
}

dll/win32/imm32/precomp.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
120120
PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL);
121121
LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect);
122122
BOOL APIENTRY Imm32ReleaseIME(HKL hKL);
123-
BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID);
123+
BOOL Imm32IsSystemJapaneseOrKorean(VOID);
124124
BOOL APIENTRY Imm32IsCrossThreadAccess(HIMC hIMC);
125125
BOOL APIENTRY Imm32IsCrossProcessAccess(HWND hWnd);
126-
BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC);
126+
BOOL Imm32IsImcAnsi(HIMC hIMC);
127127

128128
#define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
129129

@@ -168,9 +168,6 @@ HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLang
168168
BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile);
169169
PTHREADINFO FASTCALL Imm32CurrentPti(VOID);
170170

171-
HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb);
172-
BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax);
173-
174171
HRESULT CtfImmTIMCreateInputContext(_In_ HIMC hIMC);
175172
HRESULT CtfImmTIMDestroyInputContext(_In_ HIMC hIMC);
176173
HRESULT CtfImmCoInitialize(VOID);

dll/win32/imm32/utils.c

Lines changed: 2 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ Imm32UIntToStr(DWORD dwValue, ULONG nBase, LPWSTR pszBuff, USHORT cchBuff)
6565
return S_OK;
6666
}
6767

68-
/* Win: CheckCountry */
69-
BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID)
68+
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
7069
{
7170
LCID lcid = GetSystemDefaultLCID();
7271
LANGID LangID = LANGIDFROMLCID(lcid);
@@ -79,141 +78,7 @@ BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID)
7978
return TRUE;
8079
}
8180

82-
typedef struct tagBITMAPCOREINFO256
83-
{
84-
BITMAPCOREHEADER bmciHeader;
85-
RGBTRIPLE bmciColors[256];
86-
} BITMAPCOREINFO256, *PBITMAPCOREINFO256;
87-
88-
HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
89-
{
90-
HBITMAP hbm = NULL;
91-
const BITMAPCOREINFO256 *pbmci;
92-
LPVOID pvBits;
93-
DWORD ib, cbBytes, cColors;
94-
BITMAP bm;
95-
96-
cbBytes = *(const DWORD *)pb;
97-
if (cbBytes == 0)
98-
return NULL;
99-
100-
pb += sizeof(DWORD);
101-
ib = sizeof(DWORD);
102-
103-
pbmci = (const BITMAPCOREINFO256 *)pb;
104-
hbm = CreateDIBSection(NULL, (LPBITMAPINFO)pbmci, DIB_RGB_COLORS, &pvBits, NULL, 0);
105-
if (!hbm || !GetObject(hbm, sizeof(BITMAP), &bm))
106-
{
107-
ERR("Invalid bitmap\n");
108-
return NULL;
109-
}
110-
111-
switch (pbmci->bmciHeader.bcBitCount)
112-
{
113-
case 1: cColors = 2; break;
114-
case 4: cColors = 16; break;
115-
case 8: cColors = 256; break;
116-
case 24: case 32:
117-
cColors = 0;
118-
break;
119-
default:
120-
ERR("Invalid bitmap\n");
121-
DeleteObject(hbm);
122-
return NULL;
123-
}
124-
125-
ib += sizeof(BITMAPCOREHEADER);
126-
pb += sizeof(BITMAPCOREHEADER);
127-
128-
ib += cColors * sizeof(RGBTRIPLE);
129-
pb += cColors * sizeof(RGBTRIPLE);
130-
131-
ib += bm.bmWidthBytes * bm.bmHeight;
132-
if (ib > cbBytes)
133-
{
134-
ERR("Invalid bitmap\n");
135-
DeleteObject(hbm);
136-
return NULL;
137-
}
138-
RtlCopyMemory(pvBits, pb, bm.bmWidthBytes * bm.bmHeight);
139-
140-
return hbm;
141-
}
142-
143-
BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
144-
{
145-
HDC hDC;
146-
BITMAP bm;
147-
DWORD cbBytes, cColors;
148-
BITMAPCOREINFO256 bmci;
149-
BOOL ret;
150-
LPBYTE pb = pbData;
151-
152-
*(LPDWORD)pb = 0;
153-
154-
if (!GetObject(hbm, sizeof(BITMAP), &bm))
155-
{
156-
ERR("Invalid bitmap\n");
157-
return FALSE;
158-
}
159-
160-
ZeroMemory(&bmci, sizeof(bmci));
161-
bmci.bmciHeader.bcSize = sizeof(BITMAPCOREHEADER);
162-
bmci.bmciHeader.bcWidth = bm.bmWidth;
163-
bmci.bmciHeader.bcHeight = bm.bmHeight;
164-
bmci.bmciHeader.bcPlanes = 1;
165-
bmci.bmciHeader.bcBitCount = bm.bmBitsPixel;
166-
167-
switch (bm.bmBitsPixel)
168-
{
169-
case 1: cColors = 2; break;
170-
case 4: cColors = 16; break;
171-
case 8: cColors = 256; break;
172-
case 24: case 32:
173-
cColors = 0;
174-
break;
175-
default:
176-
ERR("Invalid bitmap\n");
177-
return FALSE;
178-
}
179-
180-
cbBytes = sizeof(DWORD);
181-
cbBytes += sizeof(BITMAPCOREHEADER);
182-
cbBytes += cColors * sizeof(RGBTRIPLE);
183-
cbBytes += bm.bmWidthBytes * bm.bmHeight;
184-
if (cbBytes > cbDataMax)
185-
{
186-
ERR("Too small\n");
187-
return FALSE;
188-
}
189-
190-
hDC = CreateCompatibleDC(NULL);
191-
192-
ret = GetDIBits(hDC, hbm, 0, bm.bmHeight, NULL, (LPBITMAPINFO)&bmci, DIB_RGB_COLORS);
193-
194-
if (ret)
195-
{
196-
*(LPDWORD)pb = cbBytes;
197-
pb += sizeof(DWORD);
198-
199-
RtlCopyMemory(pb, &bmci.bmciHeader, sizeof(BITMAPCOREHEADER));
200-
pb += sizeof(BITMAPCOREHEADER);
201-
202-
RtlCopyMemory(pb, &bmci.bmciColors, cColors * sizeof(RGBTRIPLE));
203-
pb += cColors * sizeof(RGBTRIPLE);
204-
205-
ret = GetDIBits(hDC, hbm, 0, bm.bmHeight, pb, (LPBITMAPINFO)&bmci, DIB_RGB_COLORS);
206-
if (!ret)
207-
*(LPDWORD)pbData = 0;
208-
}
209-
210-
DeleteDC(hDC);
211-
212-
return ret;
213-
}
214-
215-
// Win: IsAnsiIMC
216-
BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC)
81+
BOOL Imm32IsImcAnsi(HIMC hIMC)
21782
{
21883
BOOL ret;
21984
PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
@@ -1228,57 +1093,3 @@ DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
12281093
ImmUnlockClientImc(pClientImc);
12291094
return ret;
12301095
}
1231-
1232-
/***********************************************************************
1233-
* ImmIMPGetIMEA(IMM32.@)
1234-
*/
1235-
BOOL WINAPI ImmIMPGetIMEA(HWND hWnd, LPIMEPROA pImePro)
1236-
{
1237-
FIXME("(%p, %p)\n", hWnd, pImePro);
1238-
return FALSE;
1239-
}
1240-
1241-
/***********************************************************************
1242-
* ImmIMPGetIMEW(IMM32.@)
1243-
*/
1244-
BOOL WINAPI ImmIMPGetIMEW(HWND hWnd, LPIMEPROW pImePro)
1245-
{
1246-
FIXME("(%p, %p)\n", hWnd, pImePro);
1247-
return FALSE;
1248-
}
1249-
1250-
/***********************************************************************
1251-
* ImmIMPQueryIMEA(IMM32.@)
1252-
*/
1253-
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
1254-
{
1255-
FIXME("(%p)\n", pImePro);
1256-
return FALSE;
1257-
}
1258-
1259-
/***********************************************************************
1260-
* ImmIMPQueryIMEW(IMM32.@)
1261-
*/
1262-
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
1263-
{
1264-
FIXME("(%p)\n", pImePro);
1265-
return FALSE;
1266-
}
1267-
1268-
/***********************************************************************
1269-
* ImmIMPSetIMEA(IMM32.@)
1270-
*/
1271-
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
1272-
{
1273-
FIXME("(%p, %p)\n", hWnd, pImePro);
1274-
return FALSE;
1275-
}
1276-
1277-
/***********************************************************************
1278-
* ImmIMPSetIMEW(IMM32.@)
1279-
*/
1280-
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
1281-
{
1282-
FIXME("(%p, %p)\n", hWnd, pImePro);
1283-
return FALSE;
1284-
}

0 commit comments

Comments
 (0)