https://git.reactos.org/?p=reactos.git;a=commitdiff;h=66c8ded4548bd1d886431…
commit 66c8ded4548bd1d886431152bc8a7e5cacc411d1
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sun Apr 9 15:19:19 2023 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Sun Apr 9 15:19:19 2023 +0900
[COMCTL32][USER32] EDIT: CompForm and CandForm (#5226)
The changes of this PR are on EDIT controls.
- Delete composition_len and composition_start members.
- Add EDIT_ImmSetCompositionWindow helper function.
- At EDIT_SetCaretPos, set the position of the composition window.
- We don't use internal composition string. Rely on the composition window.
- Improve WM_IME_STARTCOMPOSITION, WM_IME_COMPOSITION and WM_IME_ENDCOMPOSITION
message handling.
CORE-11700
---
dll/win32/comctl32/edit.c | 71 +++++++++++++++++++++++++++++++--
win32ss/user/user32/controls/edit.c | 79 ++++++++++++++++++++++++++++++++++---
2 files changed, 141 insertions(+), 9 deletions(-)
diff --git a/dll/win32/comctl32/edit.c b/dll/win32/comctl32/edit.c
index 2e7322077fa..b37bf8cffb5 100644
--- a/dll/win32/comctl32/edit.c
+++ b/dll/win32/comctl32/edit.c
@@ -150,8 +150,10 @@ typedef struct
/*
* IME Data
*/
+#ifndef __REACTOS__ /* Rely on the composition window */
UINT composition_len; /* length of composition, 0 == no composition */
int composition_start; /* the character position for the composition */
+#endif
/*
* Uniscribe Data
*/
@@ -1711,6 +1713,33 @@ static LRESULT EDIT_EM_Scroll(EDITSTATE *es, INT action)
}
+#ifdef __REACTOS__
+static void EDIT_ImmSetCompositionWindow(EDITSTATE *es, POINT pt)
+{
+ COMPOSITIONFORM CompForm;
+ HIMC hIMC = ImmGetContext(es->hwndSelf);
+ if (!hIMC)
+ {
+ ERR("!hIMC\n");
+ return;
+ }
+
+ CompForm.ptCurrentPos = pt;
+ if (es->style & ES_MULTILINE)
+ {
+ CompForm.dwStyle = CFS_RECT;
+ CompForm.rcArea = es->format_rect;
+ }
+ else
+ {
+ CompForm.dwStyle = CFS_POINT;
+ SetRectEmpty(&CompForm.rcArea);
+ }
+
+ ImmSetCompositionWindow(hIMC, &CompForm);
+ ImmReleaseContext(es->hwndSelf, hIMC);
+}
+#endif
/*********************************************************************
*
* EDIT_SetCaretPos
@@ -1720,8 +1749,19 @@ static void EDIT_SetCaretPos(EDITSTATE *es, INT pos,
BOOL after_wrap)
{
LRESULT res = EDIT_EM_PosFromChar(es, pos, after_wrap);
+#ifdef __REACTOS__
+ HKL hKL = GetKeyboardLayout(0);
+ POINT pt = { (short)LOWORD(res), (short)HIWORD(res) };
+ SetCaretPos(pt.x, pt.y);
+
+ if (!ImmIsIME(hKL))
+ return;
+
+ EDIT_ImmSetCompositionWindow(es, pt);
+#else
TRACE("%d - %dx%d\n", pos, (short)LOWORD(res), (short)HIWORD(res));
SetCaretPos((short)LOWORD(res), (short)HIWORD(res));
+#endif
}
@@ -2076,7 +2116,11 @@ static INT EDIT_PaintText(EDITSTATE *es, HDC dc, INT x, INT y, INT
line, INT col
BkColor = GetBkColor(dc);
TextColor = GetTextColor(dc);
if (rev) {
+#ifdef __REACTOS__
+ if (TRUE)
+#else
if (es->composition_len == 0)
+#endif
{
SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT));
@@ -2101,7 +2145,11 @@ static INT EDIT_PaintText(EDITSTATE *es, HDC dc, INT x, INT y, INT
line, INT col
ret = size.cx;
}
if (rev) {
+#ifdef __REACTOS__
+ if (TRUE)
+#else
if (es->composition_len == 0)
+#endif
{
SetBkColor(dc, BkColor);
SetTextColor(dc, TextColor);
@@ -4256,6 +4304,7 @@ static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag,
EDITSTATE *es)
}
}
+#ifndef __REACTOS__ /* We don't use internal composition string. Rely on the
composition window */
/* check for change in composition start */
if (es->selection_end < es->composition_start)
es->composition_start = es->selection_end;
@@ -4273,6 +4322,7 @@ static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag,
EDITSTATE *es)
es->selection_start = es->composition_start;
es->selection_end = es->selection_start + es->composition_len;
+#endif
heap_free(lpCompStrAttr);
heap_free(lpCompStr);
@@ -4298,6 +4348,7 @@ static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpResultStr, buflen);
+#ifndef __REACTOS__
/* check for change in composition start */
if (es->selection_end < es->composition_start)
es->composition_start = es->selection_end;
@@ -4307,6 +4358,7 @@ static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
EDIT_EM_ReplaceSel(es, TRUE, lpResultStr, buflen / sizeof(WCHAR), TRUE, TRUE);
es->composition_start = es->selection_end;
es->composition_len = 0;
+#endif
heap_free(lpResultStr);
}
@@ -4316,11 +4368,16 @@ static void EDIT_ImeComposition(HWND hwnd, LPARAM CompFlag,
EDITSTATE *es)
HIMC hIMC;
int cursor;
+#ifdef __REACTOS__
+ if (es->selection_start != es->selection_end)
+ EDIT_EM_ReplaceSel(es, TRUE, NULL, 0, TRUE, TRUE);
+#else
if (es->composition_len == 0 && es->selection_start !=
es->selection_end)
{
EDIT_EM_ReplaceSel(es, TRUE, NULL, 0, TRUE, TRUE);
es->composition_start = es->selection_end;
}
+#endif
hIMC = ImmGetContext(hwnd);
if (!hIMC)
@@ -5015,26 +5072,34 @@ static LRESULT CALLBACK EDIT_WindowProc(HWND hwnd, UINT msg,
WPARAM wParam, LPAR
break;
case WM_IME_STARTCOMPOSITION:
- es->composition_start = es->selection_end;
- es->composition_len = 0;
#ifdef __REACTOS__
if (FALSE) /* FIXME: Condition */
return TRUE;
- result = DefWindowProcW(hwnd, WM_IME_STARTCOMPOSITION, wParam, lParam);
+ result = DefWindowProcW(hwnd, msg, wParam, lParam);
+#else
+ es->composition_start = es->selection_end;
+ es->composition_len = 0;
#endif
break;
case WM_IME_COMPOSITION:
EDIT_ImeComposition(hwnd, lParam, es);
+#ifdef __REACTOS__
+ result = DefWindowProcW(hwnd, msg, wParam, lParam);
+#endif
break;
case WM_IME_ENDCOMPOSITION:
+#ifdef __REACTOS__
+ result = DefWindowProcW(hwnd, msg, wParam, lParam);
+#else
if (es->composition_len > 0)
{
EDIT_EM_ReplaceSel(es, TRUE, NULL, 0, TRUE, TRUE);
es->selection_end = es->selection_start;
es->composition_len= 0;
}
+#endif
break;
case WM_IME_COMPOSITIONFULL:
diff --git a/win32ss/user/user32/controls/edit.c b/win32ss/user/user32/controls/edit.c
index c9e4faaed53..9a38353eb59 100644
--- a/win32ss/user/user32/controls/edit.c
+++ b/win32ss/user/user32/controls/edit.c
@@ -47,14 +47,16 @@
#include <usp10.h>
#ifdef __REACTOS__
#include <immdev.h>
-#define ImmGetContext IMM_FN(ImmGetContext)
#define ImmGetCompositionStringW IMM_FN(ImmGetCompositionStringW)
-#define ImmReleaseContext IMM_FN(ImmReleaseContext)
+#define ImmGetCompositionWindow IMM_FN(ImmGetCompositionWindow)
+#define ImmGetContext IMM_FN(ImmGetContext)
+#define ImmIsIME IMM_FN(ImmIsIME)
#define ImmLockIMC IMM_FN(ImmLockIMC)
-#define ImmUnlockIMC IMM_FN(ImmUnlockIMC)
#define ImmNotifyIME IMM_FN(ImmNotifyIME)
-#define ImmIsIME IMM_FN(ImmIsIME)
+#define ImmReleaseContext IMM_FN(ImmReleaseContext)
#define ImmSetCompositionFontW IMM_FN(ImmSetCompositionFontW)
+#define ImmSetCompositionWindow IMM_FN(ImmSetCompositionWindow)
+#define ImmUnlockIMC IMM_FN(ImmUnlockIMC)
#endif
WINE_DEFAULT_DEBUG_CHANNEL(edit);
@@ -154,8 +156,10 @@ typedef struct
/*
* IME Data
*/
+#ifndef __REACTOS__ /* Rely on the composition window */
UINT composition_len; /* length of composition, 0 == no composition */
int composition_start; /* the character position for the composition */
+#endif
/*
* Uniscribe Data
*/
@@ -1864,6 +1868,33 @@ static LRESULT EDIT_EM_Scroll(EDITSTATE *es, INT action)
}
+#ifdef __REACTOS__
+static void EDIT_ImmSetCompositionWindow(EDITSTATE *es, POINT pt)
+{
+ COMPOSITIONFORM CompForm;
+ HIMC hIMC = ImmGetContext(es->hwndSelf);
+ if (!hIMC)
+ {
+ ERR("!hIMC\n");
+ return;
+ }
+
+ CompForm.ptCurrentPos = pt;
+ if (es->style & ES_MULTILINE)
+ {
+ CompForm.dwStyle = CFS_RECT;
+ CompForm.rcArea = es->format_rect;
+ }
+ else
+ {
+ CompForm.dwStyle = CFS_POINT;
+ SetRectEmpty(&CompForm.rcArea);
+ }
+
+ ImmSetCompositionWindow(hIMC, &CompForm);
+ ImmReleaseContext(es->hwndSelf, hIMC);
+}
+#endif
/*********************************************************************
*
* EDIT_SetCaretPos
@@ -1873,8 +1904,19 @@ static void EDIT_SetCaretPos(EDITSTATE *es, INT pos,
BOOL after_wrap)
{
LRESULT res = EDIT_EM_PosFromChar(es, pos, after_wrap);
+#ifdef __REACTOS__
+ HKL hKL = GetKeyboardLayout(0);
+ POINT pt = { (short)LOWORD(res), (short)HIWORD(res) };
+ SetCaretPos(pt.x, pt.y);
+
+ if (!ImmIsIME(hKL))
+ return;
+
+ EDIT_ImmSetCompositionWindow(es, pt);
+#else
TRACE("%d - %dx%d\n", pos, (short)LOWORD(res), (short)HIWORD(res));
SetCaretPos((short)LOWORD(res), (short)HIWORD(res));
+#endif
}
@@ -2229,7 +2271,11 @@ static INT EDIT_PaintText(EDITSTATE *es, HDC dc, INT x, INT y, INT
line, INT col
BkColor = GetBkColor(dc);
TextColor = GetTextColor(dc);
if (rev) {
+#ifdef __REACTOS__
+ if (TRUE)
+#else
if (es->composition_len == 0)
+#endif
{
SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT));
@@ -2254,7 +2300,11 @@ static INT EDIT_PaintText(EDITSTATE *es, HDC dc, INT x, INT y, INT
line, INT col
ret = size.cx;
}
if (rev) {
+#ifdef __REACTOS__
+ if (TRUE)
+#else
if (es->composition_len == 0)
+#endif
{
SetBkColor(dc, BkColor);
SetTextColor(dc, TextColor);
@@ -4478,6 +4528,7 @@ static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag,
EDITSTATE *es)
}
}
+#ifndef __REACTOS__ /* We don't use internal composition string. Rely on the
composition window */
/* check for change in composition start */
if (es->selection_end < es->composition_start)
es->composition_start = es->selection_end;
@@ -4495,6 +4546,7 @@ static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag,
EDITSTATE *es)
es->selection_start = es->composition_start;
es->selection_end = es->selection_start + es->composition_len;
+#endif
HeapFree(GetProcessHeap(),0,lpCompStrAttr);
HeapFree(GetProcessHeap(),0,lpCompStr);
@@ -4521,6 +4573,7 @@ static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpResultStr, buflen);
lpResultStr[buflen/sizeof(WCHAR)] = 0;
+#ifndef __REACTOS__
/* check for change in composition start */
if (es->selection_end < es->composition_start)
es->composition_start = es->selection_end;
@@ -4530,6 +4583,7 @@ static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
EDIT_EM_ReplaceSel(es, TRUE, lpResultStr, TRUE, TRUE);
es->composition_start = es->selection_end;
es->composition_len = 0;
+#endif
HeapFree(GetProcessHeap(),0,lpResultStr);
}
@@ -4539,11 +4593,16 @@ static void EDIT_ImeComposition(HWND hwnd, LPARAM CompFlag,
EDITSTATE *es)
HIMC hIMC;
int cursor;
+#ifdef __REACTOS__
+ if (es->selection_start != es->selection_end)
+ EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
+#else
if (es->composition_len == 0 && es->selection_start !=
es->selection_end)
{
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
es->composition_start = es->selection_end;
}
+#endif
hIMC = ImmGetContext(hwnd);
if (!hIMC)
@@ -5333,26 +5392,34 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, WPARAM
wParam, LPARAM lP
break;
case WM_IME_STARTCOMPOSITION:
- es->composition_start = es->selection_end;
- es->composition_len = 0;
#ifdef __REACTOS__
if (FALSE) /* FIXME: Condition */
return TRUE;
result = DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
+#else
+ es->composition_start = es->selection_end;
+ es->composition_len = 0;
#endif
break;
case WM_IME_COMPOSITION:
EDIT_ImeComposition(hwnd, lParam, es);
+#ifdef __REACTOS__
+ result = DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
+#endif
break;
case WM_IME_ENDCOMPOSITION:
+#ifdef __REACTOS__
+ result = DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
+#else
if (es->composition_len > 0)
{
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
es->selection_end = es->selection_start;
es->composition_len= 0;
}
+#endif
break;
case WM_IME_COMPOSITIONFULL: