| Index: ui/base/ime/win/tsf_bridge.cc
|
| diff --git a/ui/base/ime/win/tsf_bridge.cc b/ui/base/ime/win/tsf_bridge.cc
|
| index c60cc6c401a8c84454cc05f54f6ea5c18980b67b..8da694925f5b310252e7962c860b2a206166b0d5 100644
|
| --- a/ui/base/ime/win/tsf_bridge.cc
|
| +++ b/ui/base/ime/win/tsf_bridge.cc
|
| @@ -39,6 +39,7 @@ class TSFBridgeDelegate : public TSFBridge {
|
| // TsfBridge:
|
| virtual void Shutdown() OVERRIDE;
|
| virtual void OnTextInputTypeChanged(TextInputClient* client) OVERRIDE;
|
| + virtual void OnTextLayoutChanged() OVERRIDE;
|
| virtual bool CancelComposition() OVERRIDE;
|
| virtual void SetFocusedClient(HWND focused_window,
|
| TextInputClient* client) OVERRIDE;
|
| @@ -74,13 +75,6 @@ class TSFBridgeDelegate : public TSFBridge {
|
| // Returns true if already initialized.
|
| bool IsInitialized();
|
|
|
| - // Returns an instance of ITfDocumentMgr that is associated with the
|
| - // current TextInputType of |client_|.
|
| - base::win::ScopedComPtr<ITfDocumentMgr> GetAssociatedDocumentManager();
|
| -
|
| - // An ITfThreadMgr object to be used in focus and document management.
|
| - base::win::ScopedComPtr<ITfThreadMgr> thread_manager_;
|
| -
|
| // A triple of document manager, text store and binding cookie between
|
| // a context owned by the document manager and the text store. This is a
|
| // minimum working set of an editable document in TSF.
|
| @@ -95,10 +89,17 @@ class TSFBridgeDelegate : public TSFBridge {
|
| DWORD cookie;
|
| };
|
|
|
| + // Returns a pointer to TSFDocument that is associated with the current
|
| + // TextInputType of |client_|.
|
| + TSFDocument* GetAssociatedDocument();
|
| +
|
| + // An ITfThreadMgr object to be used in focus and document management.
|
| + base::win::ScopedComPtr<ITfThreadMgr> thread_manager_;
|
| +
|
| // A map from TextInputType to an editable document for TSF. We use multiple
|
| // TSF documents that have different InputScopes and TSF attributes based on
|
| // the TextInputType associated with the target document. For a TextInputType
|
| - // that is not coverted by this map, a default document, e.g. the document
|
| + // that is not converted by this map, a default document, e.g. the document
|
| // for TEXT_INPUT_TYPE_TEXT, should be used.
|
| // Note that some IMEs don't change their state unless the document focus is
|
| // changed. This is why we use multiple documents instead of changing TSF
|
| @@ -198,8 +199,20 @@ void TSFBridgeDelegate::OnTextInputTypeChanged(TextInputClient* client) {
|
| // Called from not focusing client. Do nothing.
|
| return;
|
| }
|
| + TSFDocument* document = GetAssociatedDocument();
|
| + if (!document)
|
| + return;
|
| + thread_manager_->SetFocus(document->document_manager.get());
|
| + OnTextLayoutChanged();
|
| +}
|
|
|
| - thread_manager_->SetFocus(GetAssociatedDocumentManager().get());
|
| +void TSFBridgeDelegate::OnTextLayoutChanged() {
|
| + TSFDocument* document = GetAssociatedDocument();
|
| + if (!document)
|
| + return;
|
| + if (!document->text_store)
|
| + return;
|
| + document->text_store->SendOnLayoutChange();
|
| }
|
|
|
| bool TSFBridgeDelegate::CancelComposition() {
|
| @@ -417,13 +430,14 @@ bool TSFBridgeDelegate::IsInitialized() {
|
| return client_id_ != TF_CLIENTID_NULL;
|
| }
|
|
|
| -base::win::ScopedComPtr<ITfDocumentMgr>
|
| -TSFBridgeDelegate::GetAssociatedDocumentManager() {
|
| - TSFDocumentMap::const_iterator it =
|
| +TSFBridgeDelegate::TSFDocument* TSFBridgeDelegate::GetAssociatedDocument() {
|
| + if (!client_)
|
| + return NULL;
|
| + TSFDocumentMap::iterator it =
|
| tsf_document_map_.find(client_->GetTextInputType());
|
| if (it == tsf_document_map_.end())
|
| - return tsf_document_map_[TEXT_INPUT_TYPE_TEXT].document_manager;
|
| - return it->second.document_manager;
|
| + return &tsf_document_map_[TEXT_INPUT_TYPE_TEXT];
|
| + return &it->second;
|
| }
|
|
|
| } // namespace
|
|
|