OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_IBUS_CONTROLLER_IMPL_H_ | |
6 #define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_IBUS_CONTROLLER_IMPL_H_ | |
7 #pragma once | |
8 | |
9 #include <gio/gio.h> // GAsyncResult and related types. | |
10 #include <glib-object.h> | |
11 | |
12 #include <string> | |
13 #include <vector> | |
14 | |
15 #include "base/process_util.h" | |
16 #include "chrome/browser/chromeos/input_method/ibus_controller_base.h" | |
17 #include "chrome/browser/chromeos/input_method/input_method_whitelist.h" | |
18 #include "ui/base/glib/glib_signal.h" | |
19 | |
20 // Do not #include ibus.h here. That makes it impossible to compile unit tests | |
21 // for the class. | |
22 struct _IBusBus; | |
23 struct _IBusConfig; | |
24 struct _IBusPanelService; | |
25 struct _IBusPropList; | |
26 struct _IBusProperty; | |
27 typedef struct _IBusBus IBusBus; | |
28 typedef struct _IBusConfig IBusConfig; | |
29 typedef struct _IBusPanelService IBusPanelService; | |
30 typedef struct _IBusPropList IBusPropList; | |
31 typedef struct _IBusProperty IBusProperty; | |
32 | |
33 namespace chromeos { | |
34 namespace input_method { | |
35 | |
36 struct InputMethodConfigValue; | |
37 struct InputMethodProperty; | |
38 typedef std::vector<InputMethodProperty> InputMethodPropertyList; | |
39 | |
40 // The IBusController implementation. | |
41 class IBusControllerImpl : public IBusControllerBase { | |
42 public: | |
43 IBusControllerImpl(); | |
44 virtual ~IBusControllerImpl(); | |
45 | |
46 // IBusController overrides: | |
47 virtual bool Start(const std::vector<std::string>& ids) OVERRIDE; | |
48 virtual bool Stop() OVERRIDE; | |
49 virtual bool ChangeInputMethod(const std::string& id) OVERRIDE; | |
50 virtual bool ActivateInputMethodProperty(const std::string& key) OVERRIDE; | |
51 #if defined(USE_VIRTUAL_KEYBOARD) | |
52 virtual void SendHandwritingStroke(const HandwritingStroke& stroke) OVERRIDE; | |
53 virtual void CancelHandwriting(int n_strokes) OVERRIDE; | |
54 #endif | |
55 | |
56 // Calls <anonymous_namespace>::FindAndUpdateProperty. This method is just for | |
57 // unit testing. | |
58 static bool FindAndUpdatePropertyForTesting( | |
59 const InputMethodProperty& new_prop, | |
60 InputMethodPropertyList* prop_list); | |
61 | |
62 private: | |
63 // Functions that end with Thunk are used to deal with glib callbacks. | |
64 CHROMEG_CALLBACK_0(IBusControllerImpl, void, BusConnected, IBusBus*); | |
65 CHROMEG_CALLBACK_0(IBusControllerImpl, void, BusDisconnected, IBusBus*); | |
66 CHROMEG_CALLBACK_3(IBusControllerImpl, void, BusNameOwnerChanged, | |
67 IBusBus*, const gchar*, const gchar*, const gchar*); | |
68 CHROMEG_CALLBACK_1(IBusControllerImpl, void, FocusIn, | |
69 IBusPanelService*, const gchar*); | |
70 CHROMEG_CALLBACK_1(IBusControllerImpl, void, RegisterProperties, | |
71 IBusPanelService*, IBusPropList*); | |
72 CHROMEG_CALLBACK_1(IBusControllerImpl, void, UpdateProperty, | |
73 IBusPanelService*, IBusProperty*); | |
74 | |
75 // IBusControllerBase overrides: | |
76 virtual bool SetInputMethodConfigInternal( | |
77 const ConfigKeyType& key, | |
78 const InputMethodConfigValue& value) OVERRIDE; | |
79 | |
80 // Checks if |ibus_| and |ibus_config_| connections are alive. | |
81 bool IBusConnectionsAreAlive(); | |
82 | |
83 // Restores connections to ibus-daemon and ibus-memconf if they are not ready. | |
84 void MaybeRestoreConnections(); | |
85 | |
86 // Initializes IBusBus object if it's not yet done. | |
87 void MaybeInitializeIBusBus(); | |
88 | |
89 // Creates IBusConfig object if it's not created yet AND |ibus_| connection | |
90 // is ready. | |
91 void MaybeRestoreIBusConfig(); | |
92 | |
93 // Destroys IBusConfig object if |ibus_| connection is not ready. This | |
94 // function does nothing if |ibus_config_| is NULL or |ibus_| connection is | |
95 // still alive. Note that the IBusConfig object can't be used when |ibus_| | |
96 // connection is not ready. | |
97 void MaybeDestroyIBusConfig(); | |
98 | |
99 // Just calls ibus_bus_set_global_engine_async() with the |id|. | |
100 void SendChangeInputMethodRequest(const std::string& id); | |
101 | |
102 // Calls SetInputMethodConfigInternal() for each |current_config_values_|. | |
103 void SendAllInputMethodConfigs(); | |
104 | |
105 // Starts listening to the "connected", "disconnected", and | |
106 // "name-owner-changed" D-Bus signals from ibus-daemon. | |
107 void ConnectBusSignals(); | |
108 | |
109 // Starts listening to the "focus-in", "register-properties", and | |
110 // "update-property" D-Bus signals from ibus-daemon. | |
111 void ConnectPanelServiceSignals(); | |
112 | |
113 // Starts ibus-daemon if it's not yet started and |should_launch_daemon_| is | |
114 // true. | |
115 bool MaybeLaunchIBusDaemon(); | |
116 | |
117 // Launches an input method procsess specified by the given command | |
118 // line. On success, returns true and stores the process handle in | |
119 // |process_handle|. Otherwise, returns false, and the contents of | |
120 // |process_handle| is untouched. |watch_func| will be called when the | |
121 // process terminates. | |
122 bool LaunchProcess(const std::string& command_line, | |
123 base::ProcessHandle* process_handle, | |
124 GChildWatchFunc watch_func); | |
125 | |
126 // A callback function that will be called when ibus_config_set_value_async() | |
127 // request is finished. | |
128 static void SetInputMethodConfigCallback(GObject* source_object, | |
129 GAsyncResult* res, | |
130 gpointer user_data); | |
131 | |
132 // Called when the input method process is shut down. | |
133 static void OnIBusDaemonExit(GPid pid, | |
134 gint status, | |
135 IBusControllerImpl* controller); | |
136 | |
137 // Connection to the ibus-daemon via IBus API. These objects are used to | |
138 // call ibus-daemon's API (e.g. activate input methods, set config, ...) | |
139 IBusBus* ibus_; | |
140 IBusConfig* ibus_config_; | |
141 | |
142 // true when ibus-daemon should be running. | |
143 bool should_launch_daemon_; | |
144 | |
145 // The process handle of the IBus daemon. kNullProcessHandle if it's not | |
146 // running. | |
147 base::ProcessHandle process_handle_; | |
148 | |
149 // Current input context path. | |
150 std::string current_input_context_path_; | |
151 | |
152 // The input method ID which is currently selected. The ID is sent to the | |
153 // daemon when |ibus_| and |ibus_config_| connections are both established. | |
154 std::string current_input_method_id_; | |
155 | |
156 // An object which knows all valid input method and layout IDs. | |
kinaba
2012/04/13 08:08:53
nit: s/method/methods/
Yusuke Sato
2012/04/13 08:59:28
Done.
| |
157 InputMethodWhitelist whitelist_; | |
158 | |
159 DISALLOW_COPY_AND_ASSIGN(IBusControllerImpl); | |
160 }; | |
161 | |
162 } // namespace input_method | |
163 } // namespace chromeos | |
164 | |
165 #endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_IBUS_CONTROLLER_IMPL_H_ | |
OLD | NEW |