| 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 // An implementation of IBusInputContextClient without ibus-daemon interaction. | 361 // An implementation of IBusInputContextClient without ibus-daemon interaction. |
| 340 // Currently this class is used only on linux desktop. | 362 // Currently this class is used only on linux desktop. |
| 341 // TODO(nona): Use this on ChromeOS device once crbug.com/171351 is fixed. | 363 // TODO(nona): Use this on ChromeOS device once crbug.com/171351 is fixed. |
| 342 class IBusInputContextClientDaemonlessImpl : public IBusInputContextClient { | 364 class IBusInputContextClientDaemonlessImpl : public IBusInputContextClient { |
| 343 public: | 365 public: |
| 344 IBusInputContextClientDaemonlessImpl() {} | 366 IBusInputContextClientDaemonlessImpl() {} |
| 345 virtual ~IBusInputContextClientDaemonlessImpl() {} | 367 virtual ~IBusInputContextClientDaemonlessImpl() {} |
| 346 | 368 |
| 347 // IBusInputContextClient override. | 369 // IBusInputContextClient override. |
| 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 // TODO(nona): Implement this. | 372 // TODO(nona): Implement this. |
| 351 } | 373 } |
| 352 | 374 |
| 353 virtual void SetInputContextHandler( | 375 virtual void SetInputContextHandler( |
| 354 IBusInputContextHandlerInterface* handler) OVERRIDE { | 376 IBusInputContextHandlerInterface* handler) OVERRIDE { |
| 355 // TODO(nona): Implement this. | 377 // TODO(nona): Implement this. |
| 356 } | 378 } |
| 357 | 379 |
| 380 virtual void SetSetCursorLocationHandler( |
| 381 const SetCursorLocationHandler& set_cursor_location_handler) OVERRIDE { |
| 382 // TODO(nona): Implement this. |
| 383 } |
| 384 |
| 385 virtual void UnsetSetCursorLocationHandler() OVERRIDE { |
| 386 // TODO(nona): Implement this. |
| 387 } |
| 388 |
| 358 virtual void ResetObjectProxy() OVERRIDE { | 389 virtual void ResetObjectProxy() OVERRIDE { |
| 359 // TODO(nona): Implement this. | 390 // TODO(nona): Implement this. |
| 360 } | 391 } |
| 361 | 392 |
| 362 virtual bool IsObjectProxyReady() const OVERRIDE { | 393 virtual bool IsObjectProxyReady() const OVERRIDE { |
| 363 // Always true on daemon-less implementation. | 394 // Always true on daemon-less implementation. |
| 364 return true; | 395 return true; |
| 365 } | 396 } |
| 366 | 397 |
| 367 virtual void SetCapabilities(uint32 capability) OVERRIDE { | 398 virtual void SetCapabilities(uint32 capability) OVERRIDE { |
| 368 // TODO(nona): Implement this. | 399 // TODO(nona): Implement this. |
| 369 } | 400 } |
| 370 | 401 |
| 371 virtual void FocusIn() OVERRIDE { | 402 virtual void FocusIn() OVERRIDE { |
| 372 // TODO(nona): Implement this. | 403 // TODO(nona): Implement this. |
| 373 } | 404 } |
| 374 | 405 |
| 375 virtual void FocusOut() OVERRIDE { | 406 virtual void FocusOut() OVERRIDE { |
| 376 // TODO(nona): Implement this. | 407 // TODO(nona): Implement this. |
| 377 } | 408 } |
| 378 | 409 |
| 379 virtual void Reset() OVERRIDE { | 410 virtual void Reset() OVERRIDE { |
| 380 // TODO(nona): Implement this. | 411 // TODO(nona): Implement this. |
| 381 } | 412 } |
| 382 | 413 |
| 383 virtual void SetCursorLocation(int32 x, int32 y, int32 w, int32 h) OVERRIDE { | 414 virtual void SetCursorLocation(const ibus::Rect& cursor_location, |
| 415 const ibus::Rect& composition_head) OVERRIDE { |
| 384 // TODO(nona): Implement this. | 416 // TODO(nona): Implement this. |
| 385 } | 417 } |
| 386 | 418 |
| 387 virtual void ProcessKeyEvent( | 419 virtual void ProcessKeyEvent( |
| 388 uint32 keyval, | 420 uint32 keyval, |
| 389 uint32 keycode, | 421 uint32 keycode, |
| 390 uint32 state, | 422 uint32 state, |
| 391 const ProcessKeyEventCallback& callback, | 423 const ProcessKeyEventCallback& callback, |
| 392 const ErrorCallback& error_callback) OVERRIDE { | 424 const ErrorCallback& error_callback) OVERRIDE { |
| 393 // TODO(nona): Implement this. | 425 // TODO(nona): Implement this. |
| 394 callback.Run(false); | 426 callback.Run(false); |
| 395 } | 427 } |
| 396 | 428 |
| 397 virtual void SetSurroundingText(const std::string& text, | 429 virtual void SetSurroundingText(const std::string& text, |
| 398 uint32 start_index, | 430 uint32 start_index, |
| 399 uint32 end_index) OVERRIDE { | 431 uint32 end_index) OVERRIDE { |
| 400 // TODO(nona): Implement this. | 432 // TODO(nona): Implement this. |
| 401 } | 433 } |
| 402 | 434 |
| 403 virtual void PropertyActivate(const std::string& key, | 435 virtual void PropertyActivate(const std::string& key, |
| 404 ibus::IBusPropertyState state) OVERRIDE { | 436 ibus::IBusPropertyState state) OVERRIDE { |
| 405 // TODO(nona): Implement this. | 437 // TODO(nona): Implement this. |
| 406 } | 438 } |
| 407 | 439 |
| 440 virtual bool IsXKBLayout() OVERRIDE { |
| 441 // TODO(nona): Implement this. |
| 442 return true; |
| 443 } |
| 444 |
| 445 virtual void SetIsXKBLayout(bool is_xkb_layout) OVERRIDE { |
| 446 // TODO(nona): Implement this. |
| 447 } |
| 448 |
| 408 private: | 449 private: |
| 409 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientDaemonlessImpl); | 450 DISALLOW_COPY_AND_ASSIGN(IBusInputContextClientDaemonlessImpl); |
| 410 }; | 451 }; |
| 411 | 452 |
| 412 } // namespace | 453 } // namespace |
| 413 | 454 |
| 414 /////////////////////////////////////////////////////////////////////////////// | 455 /////////////////////////////////////////////////////////////////////////////// |
| 415 // IBusInputContextClient | 456 // IBusInputContextClient |
| 416 | 457 |
| 417 IBusInputContextClient::IBusInputContextClient() {} | 458 IBusInputContextClient::IBusInputContextClient() {} |
| 418 | 459 |
| 419 IBusInputContextClient::~IBusInputContextClient() {} | 460 IBusInputContextClient::~IBusInputContextClient() {} |
| 420 | 461 |
| 421 // static | 462 // static |
| 422 IBusInputContextClient* IBusInputContextClient::Create( | 463 IBusInputContextClient* IBusInputContextClient::Create( |
| 423 DBusClientImplementationType type) { | 464 DBusClientImplementationType type) { |
| 424 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { | 465 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { |
| 425 return new IBusInputContextClientImpl(); | 466 return new IBusInputContextClientImpl(); |
| 426 } | 467 } |
| 427 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 468 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
| 428 return new IBusInputContextClientDaemonlessImpl(); | 469 return new IBusInputContextClientDaemonlessImpl(); |
| 429 } | 470 } |
| 430 } // namespace chromeos | 471 } // namespace chromeos |
| OLD | NEW |