Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(277)

Unified Diff: views/ime/input_method_win.cc

Issue 8294026: Support IMM32 reconversion on Windows (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix review issues Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698