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 "chromeos/dbus/ibus/ibus_input_context_client.h" | 5 #include "chromeos/dbus/ibus/ibus_input_context_client.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "chromeos/dbus/ibus/ibus_constants.h" | 10 #include "chromeos/dbus/ibus/ibus_constants.h" |
11 #include "chromeos/dbus/ibus/ibus_text.h" | 11 #include "chromeos/dbus/ibus/ibus_text.h" |
12 #include "dbus/bus.h" | 12 #include "dbus/bus.h" |
13 #include "dbus/message.h" | 13 #include "dbus/message.h" |
14 #include "dbus/object_path.h" | 14 #include "dbus/object_path.h" |
15 #include "dbus/object_proxy.h" | 15 #include "dbus/object_proxy.h" |
16 | 16 |
17 namespace chromeos { | 17 namespace chromeos { |
18 | 18 |
19 // TODO(nona): Remove after complete libibus removal. | 19 // TODO(nona): Remove after complete libibus removal. |
20 using chromeos::ibus::IBusText; | 20 using chromeos::ibus::IBusText; |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 // The IBusInputContextClient implementation. | 24 // The IBusInputContextClient implementation. |
25 class IBusInputContextClientImpl : public IBusInputContextClient { | 25 class IBusInputContextClientImpl : public IBusInputContextClient { |
26 public: | 26 public: |
27 IBusInputContextClientImpl() | 27 IBusInputContextClientImpl() |
28 : proxy_(NULL), | 28 : proxy_(NULL), |
| 29 is_xkb_layout_(true), |
29 weak_ptr_factory_(this) { | 30 weak_ptr_factory_(this) { |
30 } | 31 } |
31 | 32 |
32 virtual ~IBusInputContextClientImpl() {} | 33 virtual ~IBusInputContextClientImpl() {} |
33 | 34 |
34 public: | 35 public: |
35 // IBusInputContextClient override. | 36 // IBusInputContextClient override. |
36 virtual void Initialize(dbus::Bus* bus, | 37 virtual void Initialize(dbus::Bus* bus, |
37 const dbus::ObjectPath& object_path) OVERRIDE { | 38 const dbus::ObjectPath& object_path) OVERRIDE { |
38 if (proxy_ != NULL) { | 39 if (proxy_ != NULL) { |
39 LOG(ERROR) << "IBusInputContextClient is already initialized."; | 40 LOG(ERROR) << "IBusInputContextClient is already initialized."; |
40 return; | 41 return; |
41 } | 42 } |
42 proxy_ = bus->GetObjectProxy(ibus::kServiceName, object_path); | 43 proxy_ = bus->GetObjectProxy(ibus::kServiceName, object_path); |
43 | 44 |
44 ConnectSignals(); | 45 ConnectSignals(); |
45 } | 46 } |
46 | 47 |
47 // IBusInputContextClient override. | 48 // IBusInputContextClient override. |
48 virtual void SetInputContextHandler( | 49 virtual void SetInputContextHandler( |
49 IBusInputContextHandlerInterface* handler) OVERRIDE { | 50 IBusInputContextHandlerInterface* handler) OVERRIDE { |
50 handler_ = handler; | 51 handler_ = handler; |
51 } | 52 } |
52 | 53 |
53 // IBusInputContextClient override. | 54 // IBusInputContextClient override. |
| 55 virtual void SetSetCursorLocationHandler( |
| 56 const SetCursorLocationHandler& set_cursor_location_handler) OVERRIDE { |
| 57 DCHECK(!set_cursor_location_handler.is_null()); |
| 58 set_cursor_location_handler_ = set_cursor_location_handler; |
| 59 } |
| 60 |
| 61 // IBusInputContextClient override. |
| 62 virtual void UnsetSetCursorLocationHandler() OVERRIDE { |
| 63 set_cursor_location_handler_.Reset(); |
| 64 } |
| 65 |
| 66 // IBusInputContextClient override. |
54 virtual void ResetObjectProxy() OVERRIDE { | 67 virtual void ResetObjectProxy() OVERRIDE { |
55 // Do not delete proxy here, proxy object is managed by dbus::Bus object. | 68 // Do not delete proxy here, proxy object is managed by dbus::Bus object. |
56 proxy_ = NULL; | 69 proxy_ = NULL; |
57 } | 70 } |
58 | 71 |
59 // IBusInputContextClient override. | 72 // IBusInputContextClient override. |
60 virtual bool IsObjectProxyReady() const OVERRIDE { | 73 virtual bool IsObjectProxyReady() const OVERRIDE { |
61 return proxy_ != NULL; | 74 return proxy_ != NULL; |
62 } | 75 } |
63 | 76 |
(...skipping 22 matching lines...) Expand all Loading... |
86 } | 99 } |
87 | 100 |
88 // IBusInputContextClient override. | 101 // IBusInputContextClient override. |
89 virtual void Reset() OVERRIDE { | 102 virtual void Reset() OVERRIDE { |
90 dbus::MethodCall method_call(ibus::input_context::kServiceInterface, | 103 dbus::MethodCall method_call(ibus::input_context::kServiceInterface, |
91 ibus::input_context::kResetMethod); | 104 ibus::input_context::kResetMethod); |
92 CallNoResponseMethod(&method_call, ibus::input_context::kResetMethod); | 105 CallNoResponseMethod(&method_call, ibus::input_context::kResetMethod); |
93 } | 106 } |
94 | 107 |
95 // IBusInputContextClient override. | 108 // IBusInputContextClient override. |
96 virtual void SetCursorLocation(int32 x, int32 y, int32 width, | 109 virtual void SetCursorLocation(const ibus::Rect& cursor_location, |
97 int32 height) OVERRIDE { | 110 const ibus::Rect& composition_head) OVERRIDE { |
98 dbus::MethodCall method_call(ibus::input_context::kServiceInterface, | 111 if (!set_cursor_location_handler_.is_null()) |
99 ibus::input_context::kSetCursorLocationMethod); | 112 set_cursor_location_handler_.Run(cursor_location, composition_head); |
100 dbus::MessageWriter writer(&method_call); | |
101 writer.AppendInt32(x); | |
102 writer.AppendInt32(y); | |
103 writer.AppendInt32(width); | |
104 writer.AppendInt32(height); | |
105 CallNoResponseMethod(&method_call, | |
106 ibus::input_context::kSetCursorLocationMethod); | |
107 } | 113 } |
108 | 114 |
109 // IBusInputContextClient override. | 115 // IBusInputContextClient override. |
110 virtual void ProcessKeyEvent( | 116 virtual void ProcessKeyEvent( |
111 uint32 keyval, | 117 uint32 keyval, |
112 uint32 keycode, | 118 uint32 keycode, |
113 uint32 state, | 119 uint32 state, |
114 const ProcessKeyEventCallback& callback, | 120 const ProcessKeyEventCallback& callback, |
115 const ErrorCallback& error_callback) OVERRIDE { | 121 const ErrorCallback& error_callback) OVERRIDE { |
116 dbus::MethodCall method_call(ibus::input_context::kServiceInterface, | 122 dbus::MethodCall method_call(ibus::input_context::kServiceInterface, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 dbus::MessageWriter writer(&method_call); | 158 dbus::MessageWriter writer(&method_call); |
153 writer.AppendString(key); | 159 writer.AppendString(key); |
154 if (state == ibus::IBUS_PROPERTY_STATE_CHECKED) { | 160 if (state == ibus::IBUS_PROPERTY_STATE_CHECKED) { |
155 writer.AppendUint32(ibus::IBUS_PROPERTY_STATE_CHECKED); | 161 writer.AppendUint32(ibus::IBUS_PROPERTY_STATE_CHECKED); |
156 } else { | 162 } else { |
157 writer.AppendUint32(ibus::IBUS_PROPERTY_STATE_UNCHECKED); | 163 writer.AppendUint32(ibus::IBUS_PROPERTY_STATE_UNCHECKED); |
158 } | 164 } |
159 CallNoResponseMethod(&method_call, | 165 CallNoResponseMethod(&method_call, |
160 ibus::input_context::kPropertyActivateMethod); | 166 ibus::input_context::kPropertyActivateMethod); |
161 } | 167 } |
| 168 |
| 169 // IBusInputContextClient override. |
| 170 virtual bool IsXKBLayout() OVERRIDE { |
| 171 return is_xkb_layout_; |
| 172 } |
| 173 |
| 174 // IBusInputContextClient override. |
| 175 virtual void SetIsXKBLayout(bool is_xkb_layout) OVERRIDE { |
| 176 is_xkb_layout_ = is_xkb_layout; |
| 177 } |
| 178 |
162 private: | 179 private: |
163 void CallNoResponseMethod(dbus::MethodCall* method_call, | 180 void CallNoResponseMethod(dbus::MethodCall* method_call, |
164 const std::string& method_name) { | 181 const std::string& method_name) { |
165 proxy_->CallMethodWithErrorCallback( | 182 proxy_->CallMethodWithErrorCallback( |
166 method_call, | 183 method_call, |
167 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 184 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
168 base::Bind(&IBusInputContextClientImpl::DefaultCallback, | 185 base::Bind(&IBusInputContextClientImpl::DefaultCallback, |
169 method_name), | 186 method_name), |
170 base::Bind(&IBusInputContextClientImpl::DefaultErrorCallback, | 187 base::Bind(&IBusInputContextClientImpl::DefaultErrorCallback, |
171 method_name)); | 188 method_name)); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 bool succeeded) { | 341 bool succeeded) { |
325 LOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " | 342 LOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " |
326 << signal << " failed."; | 343 << signal << " failed."; |
327 } | 344 } |
328 | 345 |
329 dbus::ObjectProxy* proxy_; | 346 dbus::ObjectProxy* proxy_; |
330 | 347 |
331 // The pointer for input context handler. This can be NULL. | 348 // The pointer for input context handler. This can be NULL. |
332 IBusInputContextHandlerInterface* handler_; | 349 IBusInputContextHandlerInterface* handler_; |
333 | 350 |
| 351 SetCursorLocationHandler set_cursor_location_handler_; |
| 352 |
| 353 // True if the current input method is xkb layout. |
| 354 bool is_xkb_layout_; |
| 355 |
334 base::WeakPtrFactory<IBusInputContextClientImpl> weak_ptr_factory_; | 356 base::WeakPtrFactory<IBusInputContextClientImpl> weak_ptr_factory_; |
335 | 357 |
336 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientImpl); | 358 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientImpl); |
337 }; | 359 }; |
338 | 360 |
339 // A stub implementation of IBusInputContextClient. | 361 // A stub implementation of IBusInputContextClient. |
340 class IBusInputContextClientStubImpl : public IBusInputContextClient { | 362 class IBusInputContextClientStubImpl : public IBusInputContextClient { |
341 public: | 363 public: |
342 IBusInputContextClientStubImpl() {} | 364 IBusInputContextClientStubImpl() {} |
343 | 365 |
344 virtual ~IBusInputContextClientStubImpl() {} | 366 virtual ~IBusInputContextClientStubImpl() {} |
345 | 367 |
346 public: | 368 public: |
347 // IBusInputContextClient override. | 369 // IBusInputContextClient overrides. |
348 virtual void Initialize(dbus::Bus* bus, | 370 virtual void Initialize(dbus::Bus* bus, |
349 const dbus::ObjectPath& object_path) OVERRIDE {} | 371 const dbus::ObjectPath& object_path) OVERRIDE {} |
350 virtual void SetInputContextHandler( | 372 virtual void SetInputContextHandler( |
351 IBusInputContextHandlerInterface* handler) OVERRIDE {} | 373 IBusInputContextHandlerInterface* handler) OVERRIDE {} |
352 // IBusInputContextClient override. | 374 virtual void SetSetCursorLocationHandler( |
| 375 const SetCursorLocationHandler& set_cursor_location_handler) OVERRIDE {} |
| 376 virtual void UnsetSetCursorLocationHandler() OVERRIDE {} |
353 virtual void ResetObjectProxy() OVERRIDE {} | 377 virtual void ResetObjectProxy() OVERRIDE {} |
354 // IBusInputContextClient override. | |
355 virtual bool IsObjectProxyReady() const OVERRIDE { | 378 virtual bool IsObjectProxyReady() const OVERRIDE { |
356 return true; | 379 return true; |
357 } | 380 } |
358 // IBusInputContextClient overrides. | |
359 virtual void SetCapabilities(uint32 capability) OVERRIDE {} | 381 virtual void SetCapabilities(uint32 capability) OVERRIDE {} |
360 virtual void FocusIn() OVERRIDE {} | 382 virtual void FocusIn() OVERRIDE {} |
361 virtual void FocusOut() OVERRIDE {} | 383 virtual void FocusOut() OVERRIDE {} |
362 virtual void Reset() OVERRIDE {} | 384 virtual void Reset() OVERRIDE {} |
363 virtual void SetCursorLocation(int32 x, int32 y, int32 w, int32 h) OVERRIDE {} | 385 virtual void SetCursorLocation(const ibus::Rect& cursor_location, |
| 386 const ibus::Rect& composition_head) OVERRIDE {} |
364 virtual void ProcessKeyEvent( | 387 virtual void ProcessKeyEvent( |
365 uint32 keyval, | 388 uint32 keyval, |
366 uint32 keycode, | 389 uint32 keycode, |
367 uint32 state, | 390 uint32 state, |
368 const ProcessKeyEventCallback& callback, | 391 const ProcessKeyEventCallback& callback, |
369 const ErrorCallback& error_callback) OVERRIDE { | 392 const ErrorCallback& error_callback) OVERRIDE { |
370 callback.Run(false); | 393 callback.Run(false); |
371 } | 394 } |
372 virtual void SetSurroundingText(const std::string& text, | 395 virtual void SetSurroundingText(const std::string& text, |
373 uint32 start_index, | 396 uint32 start_index, |
374 uint32 end_index) OVERRIDE {} | 397 uint32 end_index) OVERRIDE {} |
375 virtual void PropertyActivate(const std::string& key, | 398 virtual void PropertyActivate(const std::string& key, |
376 ibus::IBusPropertyState state) OVERRIDE {} | 399 ibus::IBusPropertyState state) OVERRIDE {} |
| 400 virtual bool IsXKBLayout() OVERRIDE { return true; } |
| 401 virtual void SetIsXKBLayout(bool is_xkb_layout) OVERRIDE {} |
377 | 402 |
378 private: | 403 private: |
379 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientStubImpl); | 404 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientStubImpl); |
380 }; | 405 }; |
381 | 406 |
382 } // namespace | 407 } // namespace |
383 | 408 |
384 /////////////////////////////////////////////////////////////////////////////// | 409 /////////////////////////////////////////////////////////////////////////////// |
385 // IBusInputContextClient | 410 // IBusInputContextClient |
386 | 411 |
387 IBusInputContextClient::IBusInputContextClient() {} | 412 IBusInputContextClient::IBusInputContextClient() {} |
388 | 413 |
389 IBusInputContextClient::~IBusInputContextClient() {} | 414 IBusInputContextClient::~IBusInputContextClient() {} |
390 | 415 |
391 // static | 416 // static |
392 IBusInputContextClient* IBusInputContextClient::Create( | 417 IBusInputContextClient* IBusInputContextClient::Create( |
393 DBusClientImplementationType type) { | 418 DBusClientImplementationType type) { |
394 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { | 419 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { |
395 return new IBusInputContextClientImpl(); | 420 return new IBusInputContextClientImpl(); |
396 } | 421 } |
397 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 422 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
398 return new IBusInputContextClientStubImpl(); | 423 return new IBusInputContextClientStubImpl(); |
399 } | 424 } |
400 } // namespace chromeos | 425 } // namespace chromeos |
OLD | NEW |