| 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 |