| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/base/win/ime_input.h" | 5 #include "ui/base/win/ime_input.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/string16.h" | 9 #include "base/string16.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 116 |
| 117 } // namespace | 117 } // namespace |
| 118 | 118 |
| 119 namespace ui { | 119 namespace ui { |
| 120 | 120 |
| 121 ImeInput::ImeInput() | 121 ImeInput::ImeInput() |
| 122 : ime_status_(false), | 122 : ime_status_(false), |
| 123 input_language_id_(LANG_USER_DEFAULT), | 123 input_language_id_(LANG_USER_DEFAULT), |
| 124 is_composing_(false), | 124 is_composing_(false), |
| 125 system_caret_(false), | 125 system_caret_(false), |
| 126 caret_rect_(-1, -1, 0, 0) { | 126 caret_rect_(-1, -1, 0, 0), |
| 127 use_composition_window_(false) { |
| 127 } | 128 } |
| 128 | 129 |
| 129 ImeInput::~ImeInput() { | 130 ImeInput::~ImeInput() { |
| 130 } | 131 } |
| 131 | 132 |
| 132 bool ImeInput::SetInputLanguage() { | 133 bool ImeInput::SetInputLanguage() { |
| 133 // Retrieve the current keyboard layout from Windows and determine whether | 134 // Retrieve the current keyboard layout from Windows and determine whether |
| 134 // or not the current input context has IMEs. | 135 // or not the current input context has IMEs. |
| 135 // Also save its input language for language-specific operations required | 136 // Also save its input language for language-specific operations required |
| 136 // while composing a text. | 137 // while composing a text. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 // Destroy the system caret if we have created for this IME input context. | 184 // Destroy the system caret if we have created for this IME input context. |
| 184 if (system_caret_) { | 185 if (system_caret_) { |
| 185 ::DestroyCaret(); | 186 ::DestroyCaret(); |
| 186 system_caret_ = false; | 187 system_caret_ = false; |
| 187 } | 188 } |
| 188 } | 189 } |
| 189 | 190 |
| 190 void ImeInput::MoveImeWindow(HWND window_handle, HIMC imm_context) { | 191 void ImeInput::MoveImeWindow(HWND window_handle, HIMC imm_context) { |
| 191 int x = caret_rect_.x(); | 192 int x = caret_rect_.x(); |
| 192 int y = caret_rect_.y(); | 193 int y = caret_rect_.y(); |
| 194 |
| 193 const int kCaretMargin = 1; | 195 const int kCaretMargin = 1; |
| 194 if (PRIMARYLANGID(input_language_id_) == LANG_CHINESE) { | 196 if (!use_composition_window_ && |
| 197 PRIMARYLANGID(input_language_id_) == LANG_CHINESE) { |
| 195 // As written in a comment in ImeInput::CreateImeWindow(), | 198 // As written in a comment in ImeInput::CreateImeWindow(), |
| 196 // Chinese IMEs ignore function calls to ::ImmSetCandidateWindow() | 199 // Chinese IMEs ignore function calls to ::ImmSetCandidateWindow() |
| 197 // when a user disables TSF (Text Service Framework) and CUAS (Cicero | 200 // when a user disables TSF (Text Service Framework) and CUAS (Cicero |
| 198 // Unaware Application Support). | 201 // Unaware Application Support). |
| 199 // On the other hand, when a user enables TSF and CUAS, Chinese IMEs | 202 // On the other hand, when a user enables TSF and CUAS, Chinese IMEs |
| 200 // ignore the position of the current system caret and uses the | 203 // ignore the position of the current system caret and uses the |
| 201 // parameters given to ::ImmSetCandidateWindow() with its 'dwStyle' | 204 // parameters given to ::ImmSetCandidateWindow() with its 'dwStyle' |
| 202 // parameter CFS_CANDIDATEPOS. | 205 // parameter CFS_CANDIDATEPOS. |
| 203 // Therefore, we do not only call ::ImmSetCandidateWindow() but also | 206 // Therefore, we do not only call ::ImmSetCandidateWindow() but also |
| 204 // set the positions of the temporary system caret if it exists. | 207 // set the positions of the temporary system caret if it exists. |
| 205 CANDIDATEFORM candidate_position = {0, CFS_CANDIDATEPOS, {x, y}, | 208 CANDIDATEFORM candidate_position = {0, CFS_CANDIDATEPOS, {x, y}, |
| 206 {0, 0, 0, 0}}; | 209 {0, 0, 0, 0}}; |
| 207 ::ImmSetCandidateWindow(imm_context, &candidate_position); | 210 ::ImmSetCandidateWindow(imm_context, &candidate_position); |
| 208 } | 211 } |
| 209 if (system_caret_) { | 212 if (system_caret_) { |
| 210 switch (PRIMARYLANGID(input_language_id_)) { | 213 switch (PRIMARYLANGID(input_language_id_)) { |
| 211 case LANG_JAPANESE: | 214 case LANG_JAPANESE: |
| 212 ::SetCaretPos(x, y + caret_rect_.height()); | 215 ::SetCaretPos(x, y + caret_rect_.height()); |
| 213 break; | 216 break; |
| 214 default: | 217 default: |
| 215 ::SetCaretPos(x, y); | 218 ::SetCaretPos(x, y); |
| 216 break; | 219 break; |
| 217 } | 220 } |
| 218 } | 221 } |
| 222 if (use_composition_window_) { |
| 223 // Moves the composition text window. |
| 224 COMPOSITIONFORM cf = {CFS_POINT, {x, y}}; |
| 225 ::ImmSetCompositionWindow(imm_context, &cf); |
| 226 // Don't need to set the position of candidate window. |
| 227 return; |
| 228 } |
| 229 |
| 219 if (PRIMARYLANGID(input_language_id_) == LANG_KOREAN) { | 230 if (PRIMARYLANGID(input_language_id_) == LANG_KOREAN) { |
| 220 // Chinese IMEs and Japanese IMEs require the upper-left corner of | 231 // Chinese IMEs and Japanese IMEs require the upper-left corner of |
| 221 // the caret to move the position of their candidate windows. | 232 // the caret to move the position of their candidate windows. |
| 222 // On the other hand, Korean IMEs require the lower-left corner of the | 233 // On the other hand, Korean IMEs require the lower-left corner of the |
| 223 // caret to move their candidate windows. | 234 // caret to move their candidate windows. |
| 224 y += kCaretMargin; | 235 y += kCaretMargin; |
| 225 } | 236 } |
| 226 // Japanese IMEs and Korean IMEs also use the rectangle given to | 237 // Japanese IMEs and Korean IMEs also use the rectangle given to |
| 227 // ::ImmSetCandidateWindow() with its 'dwStyle' parameter CFS_EXCLUDE | 238 // ::ImmSetCandidateWindow() with its 'dwStyle' parameter CFS_EXCLUDE |
| 228 // to move their candidate windows when a user disables TSF and CUAS. | 239 // to move their candidate windows when a user disables TSF and CUAS. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 caret_rect_ = caret_rect; | 450 caret_rect_ = caret_rect; |
| 440 // Move the IME windows. | 451 // Move the IME windows. |
| 441 HIMC imm_context = ::ImmGetContext(window_handle); | 452 HIMC imm_context = ::ImmGetContext(window_handle); |
| 442 if (imm_context) { | 453 if (imm_context) { |
| 443 MoveImeWindow(window_handle, imm_context); | 454 MoveImeWindow(window_handle, imm_context); |
| 444 ::ImmReleaseContext(window_handle, imm_context); | 455 ::ImmReleaseContext(window_handle, imm_context); |
| 445 } | 456 } |
| 446 } | 457 } |
| 447 } | 458 } |
| 448 | 459 |
| 460 void ImeInput::SetUseCompositionWindow(bool use_composition_window) { |
| 461 use_composition_window_ = use_composition_window; |
| 462 } |
| 463 |
| 449 std::string ImeInput::GetInputLanguageName() const { | 464 std::string ImeInput::GetInputLanguageName() const { |
| 450 const LCID locale_id = MAKELCID(input_language_id_, SORT_DEFAULT); | 465 const LCID locale_id = MAKELCID(input_language_id_, SORT_DEFAULT); |
| 451 // max size for LOCALE_SISO639LANGNAME and LOCALE_SISO3166CTRYNAME is 9. | 466 // max size for LOCALE_SISO639LANGNAME and LOCALE_SISO3166CTRYNAME is 9. |
| 452 wchar_t buffer[9]; | 467 wchar_t buffer[9]; |
| 453 | 468 |
| 454 // Get language id. | 469 // Get language id. |
| 455 int length = ::GetLocaleInfo(locale_id, LOCALE_SISO639LANGNAME, &buffer[0], | 470 int length = ::GetLocaleInfo(locale_id, LOCALE_SISO639LANGNAME, &buffer[0], |
| 456 arraysize(buffer)); | 471 arraysize(buffer)); |
| 457 if (length <= 1) | 472 if (length <= 1) |
| 458 return std::string(); | 473 return std::string(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 keystate[VK_RCONTROL] = 0; | 566 keystate[VK_RCONTROL] = 0; |
| 552 keystate[VK_LCONTROL] = 0; | 567 keystate[VK_LCONTROL] = 0; |
| 553 for (int i = 0; i <= VK_PACKET; ++i) { | 568 for (int i = 0; i <= VK_PACKET; ++i) { |
| 554 if (keystate[i] & kKeyDownMask) | 569 if (keystate[i] & kKeyDownMask) |
| 555 return false; | 570 return false; |
| 556 } | 571 } |
| 557 return true; | 572 return true; |
| 558 } | 573 } |
| 559 | 574 |
| 560 } // namespace ui | 575 } // namespace ui |
| OLD | NEW |