• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_BASE_IME_REMOTE_INPUT_METHOD_WIN_H_
6 #define UI_BASE_IME_REMOTE_INPUT_METHOD_WIN_H_
7 
8 #include <Windows.h>
9 
10 #include <string>
11 
12 #include "base/basictypes.h"
13 #include "base/compiler_specific.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/strings/string16.h"
16 #include "ui/base/ui_base_export.h"
17 #include "ui/gfx/native_widget_types.h"
18 
19 namespace ui {
20 namespace internal {
21 class InputMethodDelegate;
22 class RemoteInputMethodDelegateWin;
23 }  // namespace internal
24 
25 class InputMethod;
26 struct CompositionText;
27 
28 // RemoteInputMethodWin is a special implementation of ui::InputMethod that
29 // works as a proxy of an IME handler running in the metro_driver process.
30 // RemoteInputMethodWin works as follows.
31 // - Any action to RemoteInputMethodWin should be delegated to the
32 //   metro_driver process via RemoteInputMethodDelegateWin.
33 // - Data retrieval from RemoteInputMethodPrivateWin is implemented with
34 //   data cache. Whenever the IME state in the metro_driver process is changed,
35 //   RemoteWindowTreeHostWin, which receives IPCs from metro_driver process,
36 //   will call RemoteInputMethodPrivateWin::OnCandidatePopupChanged and/or
37 //   RemoteInputMethodPrivateWin::OnInputSourceChanged accordingly so that
38 //   the state cache should be updated.
39 // - Some IPC messages that represent actions to TextInputClient should be
40 //   delegated to RemoteInputMethodPrivateWin so that RemoteInputMethodWin can
41 //   work as a real proxy.
42 
43 // Returns true if |widget| requires RemoteInputMethodWin.
44 bool IsRemoteInputMethodWinRequired(gfx::AcceleratedWidget widget);
45 
46 // Returns the public interface of RemoteInputMethodWin.
47 // Caveats: Currently only one instance of RemoteInputMethodWin is able to run
48 // at the same time.
49 UI_BASE_EXPORT scoped_ptr<InputMethod> CreateRemoteInputMethodWin(
50     internal::InputMethodDelegate* delegate);
51 
52 // Private interface of RemoteInputMethodWin.
53 class UI_BASE_EXPORT RemoteInputMethodPrivateWin {
54  public:
55   RemoteInputMethodPrivateWin();
56 
57   // Returns the private interface of RemoteInputMethodWin when and only when
58   // |input_method| is instanciated via CreateRemoteInputMethodWin. Caller does
59   // not take the ownership of the returned object.
60   // As you might notice, this is yet another reinplementation of dynamic_cast
61   // or IUnknown::QueryInterface.
62   static RemoteInputMethodPrivateWin* Get(InputMethod* input_method);
63 
64   // Installs RemoteInputMethodDelegateWin delegate. Set NULL to |delegate| to
65   // unregister.
66   virtual void SetRemoteDelegate(
67       internal::RemoteInputMethodDelegateWin* delegate) = 0;
68 
69   // Updates internal cache so that subsequent calls of
70   // RemoteInputMethodWin::IsCandidatePopupOpen can return the correct value
71   // based on remote IME activities in the metro_driver process.
72   virtual void OnCandidatePopupChanged(bool visible) = 0;
73 
74   // Updates internal cache so that subsequent calls of
75   // RemoteInputMethodWin::GetInputLocale can return the correct values based on
76   // remote IME activities in the metro_driver process.
77   virtual void OnInputSourceChanged(LANGID langid, bool is_ime) = 0;
78 
79   // Handles composition-update events occurred in the metro_driver process.
80   // Caveats: This method is designed to be used only with
81   // metro_driver::TextService. In other words, there is no garantee that this
82   // method works a wrapper to call ui::TextInputClient::SetCompositionText.
83   virtual void OnCompositionChanged(
84       const CompositionText& composition_text) = 0;
85 
86   // Handles text-commit events occurred in the metro_driver process.
87   // Caveats: This method is designed to be used only with
88   // metro_driver::TextService. In other words, there is no garantee that this
89   // method works a wrapper to call ui::TextInputClient::InsertText. In fact,
90   // this method may call ui::TextInputClient::InsertChar when the text input
91   // type of the focused text input client is TEXT_INPUT_TYPE_NONE.
92   virtual void OnTextCommitted(const base::string16& text) = 0;
93 
94  private:
95   DISALLOW_COPY_AND_ASSIGN(RemoteInputMethodPrivateWin);
96 };
97 
98 }  // namespace ui
99 
100 #endif  // UI_BASE_IME_REMOTE_INPUT_METHOD_WIN_H_
101