user32: Handle IME messages more gracefully.

This commit is contained in:
Kusanagi Kouichi 2008-04-18 08:39:31 +09:00 committed by Alexandre Julliard
parent 99892d6bae
commit d79dff4e30
1 changed files with 29 additions and 43 deletions

View File

@ -1030,38 +1030,22 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
break; break;
case WM_IME_STARTCOMPOSITION: case WM_IME_STARTCOMPOSITION:
/*
* FIXME in IME: This message is not always sent like it should be
*/
if (es->selection_start != es->selection_end)
{
static const WCHAR empty_stringW[] = {0};
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
}
es->composition_start = es->selection_end; es->composition_start = es->selection_end;
es->composition_len = 0; es->composition_len = 0;
break; break;
case WM_IME_COMPOSITION: case WM_IME_COMPOSITION:
{ EDIT_ImeComposition(hwnd, lParam, es);
int caret_pos = es->selection_end;
if (es->composition_len == 0)
{
if (es->selection_start != es->selection_end)
{
static const WCHAR empty_stringW[] = {0};
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
}
es->composition_start = es->selection_end;
}
EDIT_ImeComposition(hwnd,lParam,es);
EDIT_SetCaretPos(es, caret_pos, es->flags & EF_AFTER_WRAP);
break; break;
}
case WM_IME_ENDCOMPOSITION: case WM_IME_ENDCOMPOSITION:
es->composition_len= 0; if (es->composition_len > 0)
{
static const WCHAR empty_stringW[] = {0};
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
es->selection_end = es->selection_start;
es->composition_len= 0;
}
break; break;
case WM_IME_COMPOSITIONFULL: case WM_IME_COMPOSITIONFULL:
@ -5402,22 +5386,17 @@ static void EDIT_UpdateText(EDITSTATE *es, const RECT *rc, BOOL bErase)
* The Following code is to handle inline editing from IMEs * The Following code is to handle inline editing from IMEs
*/ */
static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es) static void EDIT_GetCompositionStr(HIMC hIMC, LPARAM CompFlag, EDITSTATE *es)
{ {
LONG buflen; LONG buflen;
LPWSTR lpCompStr = NULL; LPWSTR lpCompStr = NULL;
HIMC hIMC;
LPSTR lpCompStrAttr = NULL; LPSTR lpCompStrAttr = NULL;
DWORD dwBufLenAttr; DWORD dwBufLenAttr;
if (!(hIMC = ImmGetContext(hwnd)))
return;
buflen = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0); buflen = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
if (buflen < 0) if (buflen < 0)
{ {
ImmReleaseContext(hwnd, hIMC);
return; return;
} }
@ -5425,7 +5404,6 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
if (!lpCompStr) if (!lpCompStr)
{ {
ERR("Unable to allocate IME CompositionString\n"); ERR("Unable to allocate IME CompositionString\n");
ImmReleaseContext(hwnd,hIMC);
return; return;
} }
@ -5448,7 +5426,6 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
{ {
ERR("Unable to allocate IME Attribute String\n"); ERR("Unable to allocate IME Attribute String\n");
HeapFree(GetProcessHeap(),0,lpCompStr); HeapFree(GetProcessHeap(),0,lpCompStr);
ImmReleaseContext(hwnd,hIMC);
return; return;
} }
ImmGetCompositionStringW(hIMC,GCS_COMPATTR, lpCompStrAttr, ImmGetCompositionStringW(hIMC,GCS_COMPATTR, lpCompStrAttr,
@ -5479,22 +5456,16 @@ static void EDIT_GetCompositionStr(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
HeapFree(GetProcessHeap(),0,lpCompStrAttr); HeapFree(GetProcessHeap(),0,lpCompStrAttr);
HeapFree(GetProcessHeap(),0,lpCompStr); HeapFree(GetProcessHeap(),0,lpCompStr);
ImmReleaseContext(hwnd,hIMC);
} }
static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es) static void EDIT_GetResultStr(HIMC hIMC, EDITSTATE *es)
{ {
LONG buflen; LONG buflen;
LPWSTR lpResultStr; LPWSTR lpResultStr;
HIMC hIMC;
if ( !(hIMC = ImmGetContext(hwnd)))
return;
buflen = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0); buflen = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
if (buflen <= 0) if (buflen <= 0)
{ {
ImmReleaseContext(hwnd, hIMC);
return; return;
} }
@ -5502,7 +5473,6 @@ static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es)
if (!lpResultStr) if (!lpResultStr)
{ {
ERR("Unable to alloc buffer for IME string\n"); ERR("Unable to alloc buffer for IME string\n");
ImmReleaseContext(hwnd, hIMC);
return; return;
} }
@ -5520,13 +5490,29 @@ static void EDIT_GetResultStr(HWND hwnd, EDITSTATE *es)
es->composition_len = 0; es->composition_len = 0;
HeapFree(GetProcessHeap(),0,lpResultStr); HeapFree(GetProcessHeap(),0,lpResultStr);
ImmReleaseContext(hwnd, hIMC);
} }
static void EDIT_ImeComposition(HWND hwnd, LPARAM CompFlag, EDITSTATE *es) static void EDIT_ImeComposition(HWND hwnd, LPARAM CompFlag, EDITSTATE *es)
{ {
HIMC hIMC;
int cursor;
if (es->composition_len == 0 && es->selection_start != es->selection_end)
{
static const WCHAR empty_stringW[] = {0};
EDIT_EM_ReplaceSel(es, TRUE, empty_stringW, TRUE, TRUE);
es->composition_start = es->selection_end;
}
hIMC = ImmGetContext(hwnd);
if (!hIMC)
return;
if (CompFlag & GCS_RESULTSTR) if (CompFlag & GCS_RESULTSTR)
EDIT_GetResultStr(hwnd,es); EDIT_GetResultStr(hIMC, es);
if (CompFlag & GCS_COMPSTR) if (CompFlag & GCS_COMPSTR)
EDIT_GetCompositionStr(hwnd, CompFlag, es); EDIT_GetCompositionStr(hIMC, CompFlag, es);
cursor = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, 0, 0);
ImmReleaseContext(hwnd, hIMC);
EDIT_SetCaretPos(es, es->selection_start + cursor, es->flags & EF_AFTER_WRAP);
} }