Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: chromeos/dbus/ibus/ibus_input_context_client.cc

Issue 12039019: Introduce bypass logic for SetCursorLocation message. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: disable some unittests Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chromeos/dbus/ibus/ibus_input_context_client.h ('k') | chromeos/dbus/ibus/ibus_input_context_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698