Index: ui/base/ime/remote_input_method_win.cc |
diff --git a/ui/base/ime/remote_input_method_win.cc b/ui/base/ime/remote_input_method_win.cc |
deleted file mode 100644 |
index 27d242a384b3d7d9a5e9f087366d690903784e84..0000000000000000000000000000000000000000 |
--- a/ui/base/ime/remote_input_method_win.cc |
+++ /dev/null |
@@ -1,385 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/base/ime/remote_input_method_win.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include "base/command_line.h" |
-#include "base/macros.h" |
-#include "base/observer_list.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/win/scoped_handle.h" |
-#include "ui/base/ime/input_method.h" |
-#include "ui/base/ime/input_method_delegate.h" |
-#include "ui/base/ime/input_method_observer.h" |
-#include "ui/base/ime/remote_input_method_delegate_win.h" |
-#include "ui/base/ime/text_input_client.h" |
-#include "ui/base/ime/win/tsf_input_scope.h" |
-#include "ui/base/ui_base_switches.h" |
-#include "ui/events/event.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/gfx/geometry/rect.h" |
- |
-namespace ui { |
-namespace { |
- |
-const LANGID kFallbackLangID = |
- MAKELANGID(LANG_NEUTRAL, SUBLANG_UI_CUSTOM_DEFAULT); |
- |
-InputMethod* g_public_interface_ = NULL; |
-RemoteInputMethodPrivateWin* g_private_interface_ = NULL; |
- |
-void RegisterInstance(InputMethod* public_interface, |
- RemoteInputMethodPrivateWin* private_interface) { |
- CHECK(g_public_interface_ == NULL) |
- << "Only one instance is supported at the same time"; |
- CHECK(g_private_interface_ == NULL) |
- << "Only one instance is supported at the same time"; |
- g_public_interface_ = public_interface; |
- g_private_interface_ = private_interface; |
-} |
- |
-RemoteInputMethodPrivateWin* GetPrivate(InputMethod* public_interface) { |
- if (g_public_interface_ != public_interface) |
- return NULL; |
- return g_private_interface_; |
-} |
- |
-void UnregisterInstance(InputMethod* public_interface) { |
- RemoteInputMethodPrivateWin* private_interface = GetPrivate(public_interface); |
- if (g_public_interface_ == public_interface && |
- g_private_interface_ == private_interface) { |
- g_public_interface_ = NULL; |
- g_private_interface_ = NULL; |
- } |
-} |
- |
-std::string GetLocaleString(LCID Locale_id, LCTYPE locale_type) { |
- wchar_t buffer[16] = {}; |
- |
- //|chars_written| includes NUL terminator. |
- const int chars_written = |
- GetLocaleInfo(Locale_id, locale_type, buffer, arraysize(buffer)); |
- if (chars_written <= 1 || static_cast<int>(arraysize(buffer)) < chars_written) |
- return std::string(); |
- std::string result; |
- base::WideToUTF8(buffer, chars_written - 1, &result); |
- return result; |
-} |
- |
-std::vector<int32_t> GetInputScopesAsInt(TextInputType text_input_type, |
- TextInputMode text_input_mode) { |
- std::vector<int32_t> result; |
- // An empty vector represents |text_input_type| is TEXT_INPUT_TYPE_NONE. |
- if (text_input_type == TEXT_INPUT_TYPE_NONE) |
- return result; |
- |
- const std::vector<InputScope>& input_scopes = |
- tsf_inputscope::GetInputScopes(text_input_type, text_input_mode); |
- result.reserve(input_scopes.size()); |
- for (size_t i = 0; i < input_scopes.size(); ++i) |
- result.push_back(static_cast<int32_t>(input_scopes[i])); |
- return result; |
-} |
- |
-std::vector<gfx::Rect> GetCompositionCharacterBounds( |
- const TextInputClient* client) { |
- if (!client) |
- return std::vector<gfx::Rect>(); |
- |
- std::vector<gfx::Rect> bounds; |
- if (client->HasCompositionText()) { |
- gfx::Range range; |
- if (client->GetCompositionTextRange(&range)) { |
- for (uint32_t i = 0; i < range.length(); ++i) { |
- gfx::Rect rect; |
- if (!client->GetCompositionCharacterBounds(i, &rect)) |
- break; |
- bounds.push_back(rect); |
- } |
- } |
- } |
- |
- // Use the caret bounds as a fallback if no composition character bounds is |
- // available. One typical use case is PPAPI Flash, which does not support |
- // GetCompositionCharacterBounds at all. crbug.com/133472 |
- if (bounds.empty()) |
- bounds.push_back(client->GetCaretBounds()); |
- return bounds; |
-} |
- |
-class RemoteInputMethodWin : public InputMethod, |
- public RemoteInputMethodPrivateWin { |
- public: |
- explicit RemoteInputMethodWin(internal::InputMethodDelegate* delegate) |
- : delegate_(delegate), |
- remote_delegate_(NULL), |
- text_input_client_(NULL), |
- is_candidate_popup_open_(false), |
- is_ime_(false), |
- langid_(kFallbackLangID) { |
- RegisterInstance(this, this); |
- } |
- |
- ~RemoteInputMethodWin() override { |
- FOR_EACH_OBSERVER(InputMethodObserver, |
- observer_list_, |
- OnInputMethodDestroyed(this)); |
- UnregisterInstance(this); |
- } |
- |
- private: |
- // Overridden from InputMethod: |
- void SetDelegate(internal::InputMethodDelegate* delegate) override { |
- delegate_ = delegate; |
- } |
- |
- void OnFocus() override {} |
- |
- void OnBlur() override {} |
- |
- bool OnUntranslatedIMEMessage(const base::NativeEvent& event, |
- NativeEventResult* result) override { |
- return false; |
- } |
- |
- void SetFocusedTextInputClient(TextInputClient* client) override { |
- std::vector<int32_t> prev_input_scopes; |
- std::swap(input_scopes_, prev_input_scopes); |
- std::vector<gfx::Rect> prev_bounds; |
- std::swap(composition_character_bounds_, prev_bounds); |
- if (client) { |
- input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
- client->GetTextInputMode()); |
- composition_character_bounds_ = GetCompositionCharacterBounds(client); |
- } |
- |
- const bool text_input_client_changed = text_input_client_ != client; |
- text_input_client_ = client; |
- if (text_input_client_changed) { |
- FOR_EACH_OBSERVER(InputMethodObserver, |
- observer_list_, |
- OnTextInputStateChanged(client)); |
- } |
- |
- if (!remote_delegate_ || (prev_input_scopes == input_scopes_ && |
- prev_bounds == composition_character_bounds_)) |
- return; |
- remote_delegate_->OnTextInputClientUpdated(input_scopes_, |
- composition_character_bounds_); |
- } |
- |
- void DetachTextInputClient(TextInputClient* client) override { |
- if (text_input_client_ != client) |
- return; |
- SetFocusedTextInputClient(NULL); |
- } |
- |
- TextInputClient* GetTextInputClient() const override { |
- return text_input_client_; |
- } |
- |
- void DispatchKeyEvent(ui::KeyEvent* event) override { |
- if (event->HasNativeEvent()) { |
- const base::NativeEvent& native_key_event = event->native_event(); |
- if (native_key_event.message == WM_CHAR && text_input_client_) { |
- text_input_client_->InsertChar(*event); |
- event->StopPropagation(); |
- } |
- return; |
- } |
- |
- if (event->is_char()) { |
- if (text_input_client_) { |
- text_input_client_->InsertChar(*event); |
- } |
- event->StopPropagation(); |
- return; |
- } |
- if (delegate_) |
- ignore_result(delegate_->DispatchKeyEventPostIME(event)); |
- } |
- |
- void OnTextInputTypeChanged(const TextInputClient* client) override { |
- if (!text_input_client_ || text_input_client_ != client) |
- return; |
- std::vector<int32_t> prev_input_scopes; |
- std::swap(input_scopes_, prev_input_scopes); |
- input_scopes_ = GetInputScopesAsInt(client->GetTextInputType(), |
- client->GetTextInputMode()); |
- if (input_scopes_ != prev_input_scopes && remote_delegate_) { |
- remote_delegate_->OnTextInputClientUpdated( |
- input_scopes_, composition_character_bounds_); |
- } |
- } |
- |
- void OnCaretBoundsChanged(const TextInputClient* client) override { |
- if (!text_input_client_ || text_input_client_ != client) |
- return; |
- std::vector<gfx::Rect> prev_rects; |
- std::swap(composition_character_bounds_, prev_rects); |
- composition_character_bounds_ = GetCompositionCharacterBounds(client); |
- if (composition_character_bounds_ != prev_rects && remote_delegate_) { |
- remote_delegate_->OnTextInputClientUpdated( |
- input_scopes_, composition_character_bounds_); |
- } |
- } |
- |
- void CancelComposition(const TextInputClient* client) override { |
- if (CanSendRemoteNotification(client)) |
- remote_delegate_->CancelComposition(); |
- } |
- |
- void OnInputLocaleChanged() override {} |
- |
- std::string GetInputLocale() override { |
- const LCID locale_id = MAKELCID(langid_, SORT_DEFAULT); |
- std::string language = |
- GetLocaleString(locale_id, LOCALE_SISO639LANGNAME); |
- if (SUBLANGID(langid_) == SUBLANG_NEUTRAL || language.empty()) |
- return language; |
- const std::string& region = |
- GetLocaleString(locale_id, LOCALE_SISO3166CTRYNAME); |
- if (region.empty()) |
- return language; |
- return language.append(1, '-').append(region); |
- } |
- |
- TextInputType GetTextInputType() const override { |
- return text_input_client_ ? text_input_client_->GetTextInputType() |
- : TEXT_INPUT_TYPE_NONE; |
- } |
- |
- TextInputMode GetTextInputMode() const override { |
- return text_input_client_ ? text_input_client_->GetTextInputMode() |
- : TEXT_INPUT_MODE_DEFAULT; |
- } |
- |
- int GetTextInputFlags() const override { |
- return text_input_client_ ? text_input_client_->GetTextInputFlags() |
- : 0; |
- } |
- |
- bool CanComposeInline() const override { |
- return text_input_client_ ? text_input_client_->CanComposeInline() : true; |
- } |
- |
- bool IsCandidatePopupOpen() const override { |
- return is_candidate_popup_open_; |
- } |
- |
- void ShowImeIfNeeded() override {} |
- |
- void AddObserver(InputMethodObserver* observer) override { |
- observer_list_.AddObserver(observer); |
- } |
- |
- void RemoveObserver(InputMethodObserver* observer) override { |
- observer_list_.RemoveObserver(observer); |
- } |
- |
- // Overridden from RemoteInputMethodPrivateWin: |
- void SetRemoteDelegate( |
- internal::RemoteInputMethodDelegateWin* delegate) override { |
- remote_delegate_ = delegate; |
- |
- // Sync initial state. |
- if (remote_delegate_) { |
- remote_delegate_->OnTextInputClientUpdated( |
- input_scopes_, composition_character_bounds_); |
- } |
- } |
- |
- void OnCandidatePopupChanged(bool visible) override { |
- is_candidate_popup_open_ = visible; |
- } |
- |
- void OnInputSourceChanged(LANGID langid, bool /*is_ime*/) override { |
- // Note: Currently |is_ime| is not utilized yet. |
- const bool changed = (langid_ != langid); |
- langid_ = langid; |
- if (changed && GetTextInputClient()) |
- GetTextInputClient()->OnInputMethodChanged(); |
- } |
- |
- void OnCompositionChanged(const CompositionText& composition_text) override { |
- if (!text_input_client_) |
- return; |
- text_input_client_->SetCompositionText(composition_text); |
- } |
- |
- void OnTextCommitted(const base::string16& text) override { |
- if (!text_input_client_) |
- return; |
- if (text_input_client_->GetTextInputType() == TEXT_INPUT_TYPE_NONE) { |
- // According to the comment in text_input_client.h, |
- // TextInputClient::InsertText should never be called when the |
- // text input type is TEXT_INPUT_TYPE_NONE. |
- |
- for (size_t i = 0; i < text.size(); ++i) { |
- ui::KeyEvent char_event(text[i], static_cast<ui::KeyboardCode>(text[i]), |
- ui::EF_NONE); |
- text_input_client_->InsertChar(char_event); |
- } |
- return; |
- } |
- text_input_client_->InsertText(text); |
- } |
- |
- bool CanSendRemoteNotification( |
- const TextInputClient* text_input_client) const { |
- return text_input_client_ && |
- text_input_client_ == text_input_client && |
- remote_delegate_; |
- } |
- |
- base::ObserverList<InputMethodObserver> observer_list_; |
- |
- internal::InputMethodDelegate* delegate_; |
- internal::RemoteInputMethodDelegateWin* remote_delegate_; |
- |
- TextInputClient* text_input_client_; |
- std::vector<int32_t> input_scopes_; |
- std::vector<gfx::Rect> composition_character_bounds_; |
- bool is_candidate_popup_open_; |
- bool is_ime_; |
- LANGID langid_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RemoteInputMethodWin); |
-}; |
- |
-} // namespace |
- |
-bool IsRemoteInputMethodWinRequired(gfx::AcceleratedWidget widget) { |
- // If the remote input method is already registered then don't do it again. |
- if (ui::g_public_interface_ && ui::g_private_interface_) |
- return false; |
- |
- DWORD process_id = 0; |
- if (GetWindowThreadProcessId(widget, &process_id) == 0) |
- return false; |
- base::win::ScopedHandle process_handle(::OpenProcess( |
- PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_id)); |
- if (!process_handle.IsValid()) |
- return false; |
- return base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kViewerConnect); |
-} |
- |
-RemoteInputMethodPrivateWin::RemoteInputMethodPrivateWin() {} |
- |
-scoped_ptr<InputMethod> CreateRemoteInputMethodWin( |
- internal::InputMethodDelegate* delegate) { |
- return make_scoped_ptr(new RemoteInputMethodWin(delegate)); |
-} |
- |
-// static |
-RemoteInputMethodPrivateWin* RemoteInputMethodPrivateWin::Get( |
- InputMethod* input_method) { |
- return GetPrivate(input_method); |
-} |
- |
-} // namespace ui |