| Index: views/ime/input_method_win.cc
|
| diff --git a/views/ime/input_method_win.cc b/views/ime/input_method_win.cc
|
| index 4ab1a187378d389ba70bf8dc6d3131b107afa847..38278daa2d23489a14b91169c4566bcd683340e6 100644
|
| --- a/views/ime/input_method_win.cc
|
| +++ b/views/ime/input_method_win.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "views/ime/input_method_win.h"
|
|
|
| +#include <algorithm>
|
| +
|
| #include "base/basictypes.h"
|
| #include "base/logging.h"
|
| #include "base/string_util.h"
|
| @@ -115,6 +117,9 @@ LRESULT InputMethodWin::OnImeMessages(
|
| case WM_IME_ENDCOMPOSITION:
|
| result = OnImeEndComposition(message, w_param, l_param, handled);
|
| break;
|
| + case WM_IME_REQUEST:
|
| + result = OnImeRequest(message, w_param, l_param, handled);
|
| + break;
|
| case WM_CHAR:
|
| case WM_SYSCHAR:
|
| result = OnChar(message, w_param, l_param, handled);
|
| @@ -219,6 +224,126 @@ LRESULT InputMethodWin::OnImeEndComposition(
|
| return 0;
|
| }
|
|
|
| +LRESULT InputMethodWin::OnReconvertString(RECONVERTSTRING *reconv) {
|
| + TextInputClient* client = GetTextInputClient();
|
| + if (!client)
|
| + return 0;
|
| +
|
| + // If there is a composition string already, we don't allow reconversion.
|
| + if (client->HasCompositionText())
|
| + return 0;
|
| +
|
| + ui::Range selection_range;
|
| + if (!client->GetSelectionRange(&selection_range) ||
|
| + selection_range.is_empty()) {
|
| + return 0;
|
| + }
|
| +
|
| + size_t len = selection_range.length();
|
| + size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
|
| +
|
| + if (!reconv)
|
| + return need_size;
|
| +
|
| + if (reconv->dwSize < need_size)
|
| + return 0;
|
| +
|
| + string16 text;
|
| + ui::Range actual_range;
|
| + if (!GetTextInputClient()->GetTextFromRange(
|
| + selection_range, &text, &actual_range))
|
| + return 0;
|
| +
|
| + reconv->dwVersion = 0;
|
| + reconv->dwStrLen = len;
|
| + reconv->dwStrOffset = sizeof(RECONVERTSTRING);
|
| + reconv->dwCompStrLen = len;
|
| + reconv->dwCompStrOffset = 0;
|
| + reconv->dwTargetStrLen = len;
|
| + reconv->dwTargetStrOffset = 0;
|
| + memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING),
|
| + text.c_str(), len * sizeof(WCHAR));
|
| +
|
| + return need_size;
|
| +}
|
| +
|
| +LRESULT InputMethodWin::OnDocumentFeed(RECONVERTSTRING *reconv) {
|
| + TextInputClient* client = GetTextInputClient();
|
| + if (!client)
|
| + return 0;
|
| +
|
| + ui::Range text_range;
|
| + if (!client->GetTextRange(&text_range) || text_range.is_empty())
|
| + return 0;
|
| +
|
| + ui::Range target_range;
|
| + do {
|
| + if (client->HasCompositionText() &&
|
| + client->GetCompositionTextRange(&target_range) &&
|
| + !target_range.is_empty()) {
|
| + break;
|
| + }
|
| + if (client->GetSelectionRange(&target_range))
|
| + break;
|
| + return 0;
|
| + } while (0);
|
| +
|
| + if (!text_range.Contains(target_range))
|
| + return 0;
|
| +
|
| + size_t len = text_range.length();
|
| + size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
|
| +
|
| + if (!reconv)
|
| + return need_size;
|
| +
|
| + if (reconv->dwSize < need_size)
|
| + return 0;
|
| +
|
| + string16 text;
|
| + ui::Range actual_range;
|
| + if (!GetTextInputClient()->GetTextFromRange(
|
| + text_range, &text, &actual_range)) {
|
| + return 0;
|
| + }
|
| +
|
| + DCHECK(text_range == actual_range);
|
| +
|
| + reconv->dwVersion = 0;
|
| + reconv->dwStrLen = len;
|
| + reconv->dwStrOffset = sizeof(RECONVERTSTRING);
|
| + reconv->dwCompStrLen =
|
| + client->HasCompositionText() ? reconv->dwTargetStrOffset : 0;
|
| + reconv->dwCompStrOffset =
|
| + (target_range.GetMin() - text_range.start()) * sizeof(WCHAR);
|
| + reconv->dwTargetStrLen = target_range.length();
|
| + reconv->dwTargetStrOffset = reconv->dwCompStrOffset;
|
| +
|
| + memcpy((char*)reconv + sizeof(RECONVERTSTRING),
|
| + text.c_str(), len * sizeof(WCHAR));
|
| +
|
| + return need_size;
|
| +}
|
| +
|
| +LRESULT InputMethodWin::OnImeRequest(
|
| + UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
|
| + *handled = FALSE;
|
| +
|
| + if (IsTextInputTypeNone())
|
| + return 0;
|
| +
|
| + switch (wparam) {
|
| + case IMR_RECONVERTSTRING:
|
| + *handled = TRUE;
|
| + return OnReconvertString(reinterpret_cast<RECONVERTSTRING*>(lparam));
|
| + case IMR_DOCUMENTFEED:
|
| + *handled = TRUE;
|
| + return OnDocumentFeed(reinterpret_cast<RECONVERTSTRING*>(lparam));
|
| + default:
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| LRESULT InputMethodWin::OnChar(
|
| UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
|
| *handled = TRUE;
|
|
|