ReactOS 0.4.16-dev-1273-g5b94656
win3.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 IMM32 Win3.x compatibility
5 * COPYRIGHT: Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9
11
12#ifdef IMM_WIN3_SUPPORT /* 3.x support */
13
15Imm32JTransCompA(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS,
16 const TRANSMSG *pSrc, LPTRANSMSG pDest)
17{
18 FIXME("\n");
19 *pDest = *pSrc;
20 return 1;
21}
22
24Imm32JTransCompW(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS,
25 const TRANSMSG *pSrc, LPTRANSMSG pDest)
26{
27 FIXME("\n");
28 *pDest = *pSrc;
29 return 1;
30}
31
32typedef LRESULT (WINAPI *FN_SendMessage)(HWND, UINT, WPARAM, LPARAM);
33
35WINNLSTranslateMessageJ(DWORD dwCount, LPTRANSMSG pTrans, LPINPUTCONTEXTDX pIC,
36 LPCOMPOSITIONSTRING pCS, BOOL bAnsi)
37{
38 DWORD ret = 0;
39 HWND hWnd, hwndDefIME;
40 LPTRANSMSG pTempList, pEntry, pNext;
41 DWORD dwIndex, iCandForm, dwNumber, cbTempList;
42 HGLOBAL hGlobal;
43 CANDIDATEFORM CandForm;
44 FN_SendMessage pSendMessage;
45
46 hWnd = pIC->hWnd;
47 hwndDefIME = ImmGetDefaultIMEWnd(hWnd);
48 pSendMessage = (IsWindowUnicode(hWnd) ? SendMessageW : SendMessageA);
49
50 // clone the message list
51 cbTempList = (dwCount + 1) * sizeof(TRANSMSG);
52 pTempList = ImmLocalAlloc(HEAP_ZERO_MEMORY, cbTempList);
53 if (IS_NULL_UNEXPECTEDLY(pTempList))
54 return 0;
55 RtlCopyMemory(pTempList, pTrans, dwCount * sizeof(TRANSMSG));
56
57 if (pIC->dwUIFlags & 0x2)
58 {
59 // find WM_IME_ENDCOMPOSITION
60 pEntry = pTempList;
61 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex, ++pEntry)
62 {
63 if (pEntry->message == WM_IME_ENDCOMPOSITION)
64 break;
65 }
66
67 if (pEntry->message == WM_IME_ENDCOMPOSITION) // if found
68 {
69 // move WM_IME_ENDCOMPOSITION to the end of the list
70 for (pNext = pEntry + 1; pNext->message != 0; ++pEntry, ++pNext)
71 *pEntry = *pNext;
72
73 pEntry->message = WM_IME_ENDCOMPOSITION;
74 pEntry->wParam = 0;
75 pEntry->lParam = 0;
76 }
77 }
78
79 for (pEntry = pTempList; pEntry->message != 0; ++pEntry)
80 {
81 switch (pEntry->message)
82 {
83 case WM_IME_STARTCOMPOSITION:
84 if (!(pIC->dwUIFlags & 0x2))
85 {
86 // send IR_OPENCONVERT
87 if (pIC->cfCompForm.dwStyle != CFS_DEFAULT)
88 pSendMessage(hWnd, WM_IME_REPORT, IR_OPENCONVERT, 0);
89
90 goto DoDefault;
91 }
92 break;
93
94 case WM_IME_ENDCOMPOSITION:
95 if (pIC->dwUIFlags & 0x2)
96 {
97 // send IR_UNDETERMINE
98 hGlobal = GlobalAlloc(GHND | GMEM_SHARE, sizeof(UNDETERMINESTRUCT));
99 if (hGlobal)
100 {
101 pSendMessage(hWnd, WM_IME_REPORT, IR_UNDETERMINE, (LPARAM)hGlobal);
102 GlobalFree(hGlobal);
103 }
104 }
105 else
106 {
107 // send IR_CLOSECONVERT
108 if (pIC->cfCompForm.dwStyle != CFS_DEFAULT)
109 pSendMessage(hWnd, WM_IME_REPORT, IR_CLOSECONVERT, 0);
110
111 goto DoDefault;
112 }
113 break;
114
115 case WM_IME_COMPOSITION:
116 if (bAnsi)
117 dwNumber = Imm32JTransCompA(pIC, pCS, pEntry, pTrans);
118 else
119 dwNumber = Imm32JTransCompW(pIC, pCS, pEntry, pTrans);
120
121 ret += dwNumber;
122 pTrans += dwNumber;
123
124 // send IR_CHANGECONVERT
125 if (!(pIC->dwUIFlags & 0x2))
126 {
127 if (pIC->cfCompForm.dwStyle != CFS_DEFAULT)
128 pSendMessage(hWnd, WM_IME_REPORT, IR_CHANGECONVERT, 0);
129 }
130 break;
131
132 case WM_IME_NOTIFY:
133 if (pEntry->wParam == IMN_OPENCANDIDATE)
134 {
135 if (IsWindow(hWnd) && (pIC->dwUIFlags & 0x2))
136 {
137 // send IMC_SETCANDIDATEPOS
138 for (iCandForm = 0; iCandForm < MAX_CANDIDATEFORM; ++iCandForm)
139 {
140 if (!(pEntry->lParam & (1 << iCandForm)))
141 continue;
142
143 CandForm.dwIndex = iCandForm;
144 CandForm.dwStyle = CFS_EXCLUDE;
145 CandForm.ptCurrentPos = pIC->cfCompForm.ptCurrentPos;
146 CandForm.rcArea = pIC->cfCompForm.rcArea;
147 pSendMessage(hwndDefIME, WM_IME_CONTROL, IMC_SETCANDIDATEPOS,
148 (LPARAM)&CandForm);
149 }
150 }
151 }
152
153 if (!(pIC->dwUIFlags & 0x2))
154 goto DoDefault;
155
156 // send a WM_IME_NOTIFY notification to the default ime window
157 pSendMessage(hwndDefIME, pEntry->message, pEntry->wParam, pEntry->lParam);
158 break;
159
160DoDefault:
161 default:
162 // default processing
163 *pTrans++ = *pEntry;
164 ++ret;
165 break;
166 }
167 }
168
169 ImmLocalFree(pTempList);
170 return ret;
171}
172
173DWORD
174WINNLSTranslateMessageK(DWORD dwCount, LPTRANSMSG pEntries, LPINPUTCONTEXTDX pIC,
175 LPCOMPOSITIONSTRING pCS, BOOL bAnsi)
176{
177 FIXME("(0x%X, %p, %p, %p, %d)\n", dwCount, pEntries, pIC, pCS, bAnsi);
178 return dwCount;
179}
180
181DWORD
182WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi, WORD wLang)
183{
184 BOOL ret = FALSE;
187
188 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
189 if (IS_NULL_UNEXPECTEDLY(pIC))
190 return 0;
191
192 pCS = ImmLockIMCC(pIC->hCompStr);
193 if (IS_NULL_UNEXPECTEDLY(pCS))
194 {
195 ImmUnlockIMC(hIMC);
196 return 0;
197 }
198
199 if (wLang == LANG_JAPANESE)
200 ret = WINNLSTranslateMessageJ(dwCount, pEntries, pIC, pCS, bAnsi);
201 else if (wLang == LANG_KOREAN)
202 ret = WINNLSTranslateMessageK(dwCount, pEntries, pIC, pCS, bAnsi);
203
204 ImmUnlockIMCC(pIC->hCompStr);
205 ImmUnlockIMC(hIMC);
206 return ret;
207}
208
209#endif /* IMM_WIN3_SUPPORT */
210
211/***********************************************************************
212 * ImmSendIMEMessageExA(IMM32.@)
213 */
216 _In_ HWND hWnd,
218{
219 FIXME("(%p, %p)\n", hWnd, lParam);
220 return 0;
221}
222
223/***********************************************************************
224 * ImmSendIMEMessageExW(IMM32.@)
225 */
228 _In_ HWND hWnd,
230{
231 FIXME("(%p, %p)\n", hWnd, lParam);
232 return 0;
233}
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
LPARAM lParam
Definition: combotst.c:139
DWORD HIMC
Definition: dimm.idl:75
#define FALSE
Definition: types.h:117
HANDLE HWND
Definition: compat.h:19
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
#define IMC_SETCANDIDATEPOS
Definition: imm.h:149
#define CFS_DEFAULT
Definition: imm.h:323
#define IMN_OPENCANDIDATE
Definition: imm.h:376
#define CFS_EXCLUDE
Definition: imm.h:328
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
Definition: ime.c:440
#define IR_UNDETERMINE
Definition: immdev.h:179
#define WM_IME_REPORT
Definition: immdev.h:166
BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc)
Definition: utils.c:615
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1079
#define IR_CHANGECONVERT
Definition: immdev.h:173
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1089
#define IR_CLOSECONVERT
Definition: immdev.h:174
#define IR_OPENCONVERT
Definition: immdev.h:172
LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc)
Definition: utils.c:604
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
#define LRESULT
Definition: ole.h:14
#define LANG_JAPANESE
Definition: nls.h:76
#define LANG_KOREAN
Definition: nls.h:84
DWORD dwIndex
Definition: dimm.idl:79
DWORD dwStyle
Definition: dimm.idl:80
POINT ptCurrentPos
Definition: dimm.idl:81
RECT rcArea
Definition: dimm.idl:82
UINT message
Definition: imm32.c:66
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
int ret
#define ImmLocalFree(lpData)
Definition: precomp.h:105
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:66
#define MAX_CANDIDATEFORM
Definition: precomp.h:78
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
WORD WINAPI ImmSendIMEMessageExA(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3.c:215
WORD WINAPI ImmSendIMEMessageExW(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3.c:227
#define GHND
Definition: winbase.h:330
#define GMEM_SHARE
Definition: winbase.h:338
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_IME_NOTIFY
Definition: winuser.h:1849
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI IsWindowUnicode(_In_ HWND)
#define WM_IME_CONTROL
Definition: winuser.h:1850
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)