Reactos

[IMM32][SDK] Support ImmIMPQueryIMEA/W and ImmIMPSetIMEA/W (#8033)

Implementing missing features...
These functions are given for IME
program handling.
JIRA issue: CORE-19268
- Implement ImmIMPQueryIMEA
and ImmIMPQueryIMEW functions.
- Implement ImmIMPSetIMEA and
ImmIMPSetIMEW functions.
- Add prototypes to <imm32_undoc.h>.

authored by

Katayama Hirofumi MZ and committed by
GitHub
17577d25 3df71d67

+227 -19
+8
sdk/include/reactos/imm32_undoc.h
··· 233 233 234 234 BOOL WINAPI ImmIMPGetIMEA(_In_opt_ HWND hWnd, _Out_ LPIMEPROA pImePro); 235 235 BOOL WINAPI ImmIMPGetIMEW(_In_opt_ HWND hWnd, _Out_ LPIMEPROW pImePro); 236 + BOOL WINAPI ImmIMPQueryIMEA(_Inout_ LPIMEPROA pImePro); 237 + BOOL WINAPI ImmIMPQueryIMEW(_Inout_ LPIMEPROW pImePro); 238 + BOOL WINAPI ImmIMPSetIMEA(_In_opt_ HWND hWnd, _Inout_ LPIMEPROA pImePro); 239 + BOOL WINAPI ImmIMPSetIMEW(_In_opt_ HWND hWnd, _Inout_ LPIMEPROW pImePro); 236 240 237 241 HRESULT WINAPI CtfAImmActivate(_Out_opt_ HINSTANCE *phinstCtfIme); 238 242 HRESULT WINAPI CtfAImmDeactivate(_In_ BOOL bDestroy); ··· 260 264 261 265 #ifdef UNICODE 262 266 #define ImmIMPGetIME ImmIMPGetIMEW 267 + #define ImmIMPQueryIME ImmIMPQueryIMEW 268 + #define ImmIMPSetIME ImmIMPSetIMEW 263 269 #else 264 270 #define ImmIMPGetIME ImmIMPGetIMEA 271 + #define ImmIMPQueryIME ImmIMPQueryIMEA 272 + #define ImmIMPSetIME ImmIMPSetIMEA 265 273 #endif 266 274 267 275 #ifdef __cplusplus
+219 -19
win32ss/user/imm32/imepro.c
··· 15 15 */ 16 16 17 17 static VOID 18 - Imm32ConvertImeProWideToAnsi(_In_ const IMEPROW *pProW, _Out_ PIMEPROA pProA) 18 + Imm32ConvertImeProWideToAnsi( 19 + _In_ const IMEPROW *pProW, 20 + _Out_ PIMEPROA pProA) 19 21 { 22 + ASSERT(pProW); 23 + ASSERT(pProA); 24 + 20 25 pProA->hWnd = pProW->hWnd; 21 26 pProA->InstDate = pProW->InstDate; 22 27 pProA->wVersion = pProW->wVersion; ··· 33 38 } 34 39 35 40 static BOOL 36 - Imm32IMPGetIME(_In_ HKL hKL, _Out_ PIMEPROW pProW) 41 + Imm32IMPGetIME( 42 + _In_ HKL hKL, 43 + _Out_ PIMEPROW pProW) 37 44 { 45 + ASSERT(pProW); 46 + 38 47 IMEINFOEX ImeInfoEx; 39 48 if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL)) 40 49 return FALSE; ··· 56 65 * ImmIMPGetIMEA(IMM32.@) 57 66 */ 58 67 BOOL WINAPI 59 - ImmIMPGetIMEA(_In_opt_ HWND hWnd, _Out_ LPIMEPROA pImePro) 68 + ImmIMPGetIMEA( 69 + _In_opt_ HWND hWnd, 70 + _Out_ LPIMEPROA pImePro) 60 71 { 61 72 UNREFERENCED_PARAMETER(hWnd); 62 73 63 74 TRACE("(%p, %p)\n", hWnd, pImePro); 75 + 76 + ASSERT(pImePro); 64 77 65 78 if (!Imm32IsSystemJapaneseOrKorean()) 66 79 { ··· 81 94 * ImmIMPGetIMEW(IMM32.@) 82 95 */ 83 96 BOOL WINAPI 84 - ImmIMPGetIMEW(_In_opt_ HWND hWnd, _Out_ LPIMEPROW pImePro) 97 + ImmIMPGetIMEW( 98 + _In_opt_ HWND hWnd, 99 + _Out_ LPIMEPROW pImePro) 85 100 { 86 101 UNREFERENCED_PARAMETER(hWnd); 87 102 88 103 TRACE("(%p, %p)\n", hWnd, pImePro); 89 104 105 + ASSERT(pImePro); 106 + 90 107 if (!Imm32IsSystemJapaneseOrKorean()) 91 108 { 92 109 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); ··· 100 117 /*********************************************************************** 101 118 * ImmIMPQueryIMEA(IMM32.@) 102 119 */ 103 - BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro) 120 + BOOL WINAPI 121 + ImmIMPQueryIMEA(_Inout_ LPIMEPROA pImePro) 104 122 { 105 - FIXME("(%p)\n", pImePro); 106 - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 107 - return FALSE; 123 + TRACE("(%p)\n", pImePro); 124 + 125 + ASSERT(pImePro); 126 + 127 + if (!Imm32IsSystemJapaneseOrKorean()) 128 + { 129 + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 130 + return FALSE; 131 + } 132 + 133 + IMEPROW ProW; 134 + if (pImePro->szName[0]) 135 + { 136 + /* pImePro->szName is BYTE[], so we need type cast */ 137 + if (!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (PSTR)pImePro->szName, -1, 138 + ProW.szName, _countof(ProW.szName))) 139 + { 140 + ERR("szName: %s\n", debugstr_a((PSTR)pImePro->szName)); 141 + return FALSE; 142 + } 143 + ProW.szName[_countof(ProW.szName) - 1] = UNICODE_NULL; /* Avoid buffer overrun */ 144 + } 145 + else 146 + { 147 + ProW.szName[0] = UNICODE_NULL; 148 + } 149 + 150 + if (!ImmIMPQueryIMEW(&ProW)) 151 + return FALSE; 152 + 153 + Imm32ConvertImeProWideToAnsi(&ProW, pImePro); 154 + return TRUE; 108 155 } 109 156 110 157 /*********************************************************************** 111 158 * ImmIMPQueryIMEW(IMM32.@) 112 159 */ 113 - BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro) 160 + BOOL WINAPI 161 + ImmIMPQueryIMEW(_Inout_ LPIMEPROW pImePro) 114 162 { 115 - FIXME("(%p)\n", pImePro); 116 - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 117 - return FALSE; 163 + TRACE("(%p)\n", pImePro); 164 + 165 + ASSERT(pImePro); 166 + 167 + if (!Imm32IsSystemJapaneseOrKorean()) 168 + { 169 + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 170 + return FALSE; 171 + } 172 + 173 + INT nLayouts = GetKeyboardLayoutList(0, NULL); 174 + if (nLayouts <= 0) 175 + { 176 + ERR("nLayouts: %d\n", nLayouts); 177 + return FALSE; 178 + } 179 + 180 + HKL *phKLs = ImmLocalAlloc(0, nLayouts * sizeof(HKL)); 181 + if (!phKLs) 182 + { 183 + ERR("Out of memory\n"); 184 + return FALSE; 185 + } 186 + 187 + if (GetKeyboardLayoutList(nLayouts, phKLs) != nLayouts) 188 + { 189 + ERR("KL count mismatch\n"); 190 + ImmLocalFree(phKLs); 191 + return FALSE; 192 + } 193 + 194 + BOOL result = FALSE; 195 + if (pImePro->szName[0]) 196 + { 197 + IMEINFOEX ImeInfoEx; 198 + if (ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExImeFileName, pImePro->szName)) 199 + { 200 + for (INT iKL = 0; iKL < nLayouts; ++iKL) 201 + { 202 + if (phKLs[iKL] == ImeInfoEx.hkl) 203 + { 204 + result = Imm32IMPGetIME(phKLs[iKL], pImePro); 205 + break; 206 + } 207 + } 208 + } 209 + } 210 + else 211 + { 212 + for (INT iKL = 0; iKL < nLayouts; ++iKL) 213 + { 214 + result = Imm32IMPGetIME(phKLs[iKL], pImePro); 215 + if (result) 216 + break; 217 + } 218 + } 219 + 220 + ImmLocalFree(phKLs); 221 + return result; 118 222 } 119 223 120 224 /*********************************************************************** 121 225 * ImmIMPSetIMEA(IMM32.@) 122 226 */ 123 - BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro) 227 + BOOL WINAPI 228 + ImmIMPSetIMEA( 229 + _In_opt_ HWND hWnd, 230 + _Inout_ LPIMEPROA pImePro) 124 231 { 125 - FIXME("(%p, %p)\n", hWnd, pImePro); 126 - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 127 - return FALSE; 232 + TRACE("(%p, %p)\n", hWnd, pImePro); 233 + 234 + ASSERT(pImePro); 235 + 236 + IMEPROW ProW; 237 + if (!Imm32IsSystemJapaneseOrKorean()) 238 + { 239 + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 240 + return FALSE; 241 + } 242 + 243 + if (pImePro->szName[0]) 244 + { 245 + /* pImePro->szName is BYTE[], so we need type cast */ 246 + if (!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (PSTR)pImePro->szName, -1, 247 + ProW.szName, _countof(ProW.szName))) 248 + { 249 + ERR("szName: %s\n", debugstr_a((PSTR)pImePro->szName)); 250 + return FALSE; 251 + } 252 + ProW.szName[_countof(ProW.szName) - 1] = UNICODE_NULL; /* Avoid buffer overrun */ 253 + } 254 + else 255 + { 256 + ProW.szName[0] = UNICODE_NULL; 257 + } 258 + 259 + return ImmIMPSetIMEW(hWnd, &ProW); 128 260 } 129 261 130 262 /*********************************************************************** 131 263 * ImmIMPSetIMEW(IMM32.@) 132 264 */ 133 - BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro) 265 + BOOL WINAPI 266 + ImmIMPSetIMEW( 267 + _In_opt_ HWND hWnd, 268 + _Inout_ LPIMEPROW pImePro) 134 269 { 135 - FIXME("(%p, %p)\n", hWnd, pImePro); 136 - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 270 + UNREFERENCED_PARAMETER(hWnd); 271 + 272 + TRACE("(%p, %p)\n", hWnd, pImePro); 273 + 274 + ASSERT(pImePro); 275 + 276 + if (!Imm32IsSystemJapaneseOrKorean()) 277 + { 278 + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 279 + return FALSE; 280 + } 281 + 282 + HKL hTargetKL = NULL; 283 + if (pImePro->szName[0]) 284 + { 285 + IMEINFOEX ImeInfoEx; 286 + if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExImeFileName, pImePro->szName)) 287 + return FALSE; 288 + 289 + hTargetKL = ImeInfoEx.hkl; 290 + } 291 + else 292 + { 293 + INT nLayouts = GetKeyboardLayoutList(0, NULL); 294 + if (nLayouts <= 0) 295 + { 296 + ERR("nLayouts: %d\n", nLayouts); 297 + return FALSE; 298 + } 299 + 300 + HKL *phKLs = ImmLocalAlloc(0, nLayouts * sizeof(HKL)); 301 + if (!phKLs) 302 + { 303 + ERR("Out of memory\n"); 304 + return FALSE; 305 + } 306 + 307 + if (GetKeyboardLayoutList(nLayouts, phKLs) == nLayouts) 308 + { 309 + for (INT iKL = 0; iKL < nLayouts; ++iKL) 310 + { 311 + if (!ImmIsIME(phKLs[iKL])) 312 + { 313 + hTargetKL = phKLs[iKL]; 314 + break; 315 + } 316 + } 317 + } 318 + else 319 + { 320 + ERR("KL count mismatch\n"); 321 + } 322 + 323 + ImmLocalFree(phKLs); 324 + } 325 + 326 + if (hTargetKL && GetKeyboardLayout(0) != hTargetKL) 327 + { 328 + HWND hwndFocus = GetFocus(); 329 + if (hwndFocus) 330 + { 331 + PostMessageW(hwndFocus, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_SYSCHARSET, 332 + (LPARAM)hTargetKL); 333 + return TRUE; 334 + } 335 + } 336 + 137 337 return FALSE; 138 338 }