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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_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, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_win.h" 5 #include "content/browser/renderer_host/render_widget_host_view_win.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/i18n/rtl.h" 10 #include "base/i18n/rtl.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 close_on_deactivate_(false), 278 close_on_deactivate_(false),
279 being_destroyed_(false), 279 being_destroyed_(false),
280 tooltip_hwnd_(NULL), 280 tooltip_hwnd_(NULL),
281 tooltip_showing_(false), 281 tooltip_showing_(false),
282 shutdown_factory_(this), 282 shutdown_factory_(this),
283 parent_hwnd_(NULL), 283 parent_hwnd_(NULL),
284 is_loading_(false), 284 is_loading_(false),
285 overlay_color_(0), 285 overlay_color_(0),
286 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 286 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
287 is_fullscreen_(false), 287 is_fullscreen_(false),
288 ignore_mouse_movement_(true) { 288 ignore_mouse_movement_(true),
289 composition_range_(ui::Range::InvalidRange()) {
289 render_widget_host_->SetView(this); 290 render_widget_host_->SetView(this);
290 registrar_.Add(this, 291 registrar_.Add(this,
291 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, 292 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
292 content::NotificationService::AllBrowserContextsAndSources()); 293 content::NotificationService::AllBrowserContextsAndSources());
293 } 294 }
294 295
295 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() { 296 RenderWidgetHostViewWin::~RenderWidgetHostViewWin() {
296 UnlockMouse(); 297 UnlockMouse();
297 ResetTooltip(); 298 ResetTooltip();
298 } 299 }
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD); 664 text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD);
664 // Only update caret position if the input method is enabled. 665 // Only update caret position if the input method is enabled.
665 if (is_enabled) 666 if (is_enabled)
666 ime_input_.UpdateCaretRect(m_hWnd, start_rect.Union(end_rect)); 667 ime_input_.UpdateCaretRect(m_hWnd, start_rect.Union(end_rect));
667 } 668 }
668 669
669 void RenderWidgetHostViewWin::ImeCancelComposition() { 670 void RenderWidgetHostViewWin::ImeCancelComposition() {
670 ime_input_.CancelIME(m_hWnd); 671 ime_input_.CancelIME(m_hWnd);
671 } 672 }
672 673
674 void RenderWidgetHostViewWin::ImeCompositionRangeChanged(
675 const ui::Range& range) {
676 composition_range_ = range;
677 }
678
673 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam) { 679 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam) {
674 if (!webkit::npapi::WebPluginDelegateImpl::IsPluginDelegateWindow(hwnd)) 680 if (!webkit::npapi::WebPluginDelegateImpl::IsPluginDelegateWindow(hwnd))
675 return TRUE; 681 return TRUE;
676 682
677 gfx::Rect* rect = reinterpret_cast<gfx::Rect*>(lparam); 683 gfx::Rect* rect = reinterpret_cast<gfx::Rect*>(lparam);
678 static UINT msg = RegisterWindowMessage(webkit::npapi::kPaintMessageName); 684 static UINT msg = RegisterWindowMessage(webkit::npapi::kPaintMessageName);
679 WPARAM wparam = rect->x() << 16 | rect->y(); 685 WPARAM wparam = rect->x() << 16 | rect->y();
680 lparam = rect->width() << 16 | rect->height(); 686 lparam = rect->width() << 16 | rect->height();
681 687
682 // SendMessage gets the message across much quicker than PostMessage, since it 688 // SendMessage gets the message across much quicker than PostMessage, since it
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
1270 // of the renderer process. 1276 // of the renderer process.
1271 render_widget_host_->ImeCancelComposition(); 1277 render_widget_host_->ImeCancelComposition();
1272 ime_input_.ResetComposition(m_hWnd); 1278 ime_input_.ResetComposition(m_hWnd);
1273 } 1279 }
1274 ime_input_.DestroyImeWindow(m_hWnd); 1280 ime_input_.DestroyImeWindow(m_hWnd);
1275 // Let WTL call ::DefWindowProc() and release its resources. 1281 // Let WTL call ::DefWindowProc() and release its resources.
1276 handled = FALSE; 1282 handled = FALSE;
1277 return 0; 1283 return 0;
1278 } 1284 }
1279 1285
1286 LRESULT RenderWidgetHostViewWin::OnImeRequest(
1287 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) {
1288 if (!render_widget_host_) {
1289 handled = FALSE;
1290 return 0;
1291 }
1292
1293 // Should not receive WM_IME_REQUEST message, if IME is disabled.
1294 if (text_input_type_ == ui::TEXT_INPUT_TYPE_NONE ||
1295 text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) {
1296 handled = FALSE;
1297 return 0;
1298 }
1299
1300 switch (wparam) {
1301 case IMR_RECONVERTSTRING:
1302 return OnReconvertString(reinterpret_cast<RECONVERTSTRING*>(lparam));
1303 case IMR_DOCUMENTFEED:
1304 return OnDocumentFeed(reinterpret_cast<RECONVERTSTRING*>(lparam));
1305 default:
1306 handled = FALSE;
1307 return 0;
1308 }
1309 }
1310
1280 LRESULT RenderWidgetHostViewWin::OnMouseEvent(UINT message, WPARAM wparam, 1311 LRESULT RenderWidgetHostViewWin::OnMouseEvent(UINT message, WPARAM wparam,
1281 LPARAM lparam, BOOL& handled) { 1312 LPARAM lparam, BOOL& handled) {
1282 handled = TRUE; 1313 handled = TRUE;
1283 1314
1284 if (message == WM_MOUSELEAVE) 1315 if (message == WM_MOUSELEAVE)
1285 ignore_mouse_movement_ = true; 1316 ignore_mouse_movement_ = true;
1286 1317
1287 if (mouse_locked_) { 1318 if (mouse_locked_) {
1288 HandleLockedMouseEvent(message, wparam, lparam); 1319 HandleLockedMouseEvent(message, wparam, lparam);
1289 MoveCursorToCenter(); 1320 MoveCursorToCenter();
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 if (message == WM_MOUSEMOVE) { 2049 if (message == WM_MOUSEMOVE) {
2019 CPoint center = GetClientCenter(); 2050 CPoint center = GetClientCenter();
2020 // Ignore WM_MOUSEMOVE messages generated by MoveCursorToCenter(). 2051 // Ignore WM_MOUSEMOVE messages generated by MoveCursorToCenter().
2021 if (LOWORD(lparam) == center.x && HIWORD(lparam) == center.y) 2052 if (LOWORD(lparam) == center.x && HIWORD(lparam) == center.y)
2022 return; 2053 return;
2023 } 2054 }
2024 2055
2025 ForwardMouseEventToRenderer(message, wparam, lparam); 2056 ForwardMouseEventToRenderer(message, wparam, lparam);
2026 } 2057 }
2027 2058
2059 LRESULT RenderWidgetHostViewWin::OnDocumentFeed(RECONVERTSTRING* reconv) {
2060 size_t target_offset;
2061 size_t target_length;
2062 bool has_composition;
2063 if (!composition_range_.is_empty()) {
2064 target_offset = composition_range_.GetMin();
2065 target_length = composition_range_.length();
2066 has_composition = true;
2067 } else if (!selection_range_.is_empty()) {
2068 target_offset = selection_range_.GetMin();
2069 target_length = selection_range_.length();
2070 has_composition = false;
2071 } else {
2072 return 0;
James Su 2011/10/28 18:16:04 This method should work even if there is no select
Peng 2011/10/28 19:13:06 Done.
2073 }
2074
2075 size_t len = selection_text_.length();
2076 size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
2077
2078 if (target_offset < selection_text_offset_ ||
2079 target_offset + target_length > selection_text_offset_ + len) {
2080 return 0;
2081 }
2082
2083 if (!reconv)
2084 return need_size;
2085
2086 if (reconv->dwSize < need_size)
2087 return 0;
2088
2089 reconv->dwVersion = 0;
2090 reconv->dwStrLen = len;
2091 reconv->dwStrOffset = sizeof(RECONVERTSTRING);
2092 reconv->dwCompStrLen = has_composition ? target_length: 0;
2093 reconv->dwCompStrOffset =
2094 (target_offset - selection_text_offset_) * sizeof(WCHAR);
2095 reconv->dwTargetStrLen = target_length;
2096 reconv->dwTargetStrOffset = reconv->dwCompStrOffset;
2097 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING),
2098 selection_text_.c_str(), len * sizeof(WCHAR));
James Su 2011/10/28 18:16:04 nit: alignment
Peng 2011/10/28 19:13:06 Done.
2099
2100 return reinterpret_cast<LRESULT>(reconv);
2101 }
2102
2103 LRESULT RenderWidgetHostViewWin::OnReconvertString(RECONVERTSTRING* reconv) {
2104 // If there is a composition string already, we don't allow reconversion.
2105 if (ime_input_.is_composing())
2106 return 0;
2107
2108 if (selection_range_.is_empty())
2109 return 0;
2110
2111 if (selection_text_.empty())
2112 return 0;
2113
2114 if (selection_range_.GetMin() < selection_text_offset_ ||
2115 selection_range_.GetMax() >
2116 selection_text_offset_ + selection_text_.length()) {
2117 return 0;
2118 }
2119
2120 size_t len = selection_range_.length();
2121 size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
2122
2123 if (!reconv)
2124 return need_size;
2125
2126 if (reconv->dwSize < need_size)
2127 return 0;
2128
2129 reconv->dwVersion = 0;
2130 reconv->dwStrLen = len;
2131 reconv->dwStrOffset = sizeof(RECONVERTSTRING);
2132 reconv->dwCompStrLen = len;
2133 reconv->dwCompStrOffset = 0;
2134 reconv->dwTargetStrLen = len;
2135 reconv->dwTargetStrOffset = 0;
2136
2137 size_t offset = selection_range_.GetMin() - selection_text_offset_;
2138 memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING),
2139 selection_text_.c_str() + offset, len * sizeof(WCHAR));
James Su 2011/10/28 18:16:04 nit: alignment
Peng 2011/10/28 19:13:06 Done.
2140
2141 return reinterpret_cast<LRESULT>(reconv);
2142 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698