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

Unified Diff: monitor_language.cc

Issue 460107: Adding IBus support to cros library. (Closed)
Patch Set: copied to writable tree Created 11 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « load.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: monitor_language.cc
diff --git a/monitor_language.cc b/monitor_language.cc
new file mode 100644
index 0000000000000000000000000000000000000000..81ed769a1a1064c090d847cc72c767a274045722
--- /dev/null
+++ b/monitor_language.cc
@@ -0,0 +1,136 @@
+// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <base/logging.h>
+#include <base/scoped_ptr.h>
+#include <dlfcn.h>
+#include <glib-object.h>
+
+#include <iostream> // NOLINT
+
+#include "chromeos_cros_api.h" // NOLINT
+#include "chromeos_language.h"
+#include "monitor_utils.h" //NOLINT
+
+// \file This is a simple console application which checks whether the cros
+// library (chromeos_language.cc) can monitor IME/XKB status changes or not.
+
+// How to use this tool:
+// 1. Set up your IBus daemon using ibus-setup command. Add at least one IME.
+// 2. Start the candidate_window for ChromeOS.
+// 3. Start this tool ***in your gnome-terminal***. You need to have X desktop.
+// 4. Verify that all IME languages and XKB layouts are displayed.
+// 5. Focus another X application, then focus back the gnome-terminal in order
+// to make candidate_window send "FocusIn" signal to this process. Please
+// note that Callback::Run() is called upon "FocusIn" and "StateChanged"
+// signals from candidate_window.
+// 6. Verify that this tool automatically exits in a second or so.
+
+namespace {
+
+const size_t kTestCount = 5;
+chromeos::LanguageStatusConnection* global_connection = NULL;
+
+} // namespace
+
+// Callback is an example object which can be passed to MonitorLanguageStatus.
+class Callback {
+ public:
+ // You can store whatever state is needed in the function object.
+ explicit Callback(GMainLoop* loop)
+ : count_(0), loop_(loop) {
+ }
+
+ static void Run(void* object, const chromeos::InputLanguage& language) {
+ Callback* self = static_cast<Callback*>(object);
+
+ ++self->count_;
+ if (self->count_ == kTestCount) {
+ std::cout << "*** Done ***" << std::endl;
+ ::g_main_loop_quit(self->loop_);
+ } else {
+ // Change the current IME engine or XKB layout by calling
+ // ChromeOSChangeLanguage() function in libcros.
+ //
+ // 1. Calls the ChromeOSChangeLanguage() function.
+ // 2. The function calls "SetEngine" method (if language->category is
+ // IME) or "Disable" method (if the category is XKB) in ibus-daemon.
+ // 3. ibus-daemon changes its state and calls "StateChanged" method in
+ // candidate_window.
+ // 4. candidate_window sends "StateChanged" signal to this process.
+ // 5. Since |self| is registered as a monitor function, libcros calls
+ // Callback::Run() function again.
+ //
+ // As a result, "SetEngine" method and "Disable" method in ibus-daemon
+ // are called in turn rapidly.
+ if (language.category == chromeos::LANGUAGE_CATEGORY_XKB) {
+ // This triggers the Run() function to be called again
+ // (see the comment above).
+ chromeos::ChangeLanguage(global_connection,
+ chromeos::LANGUAGE_CATEGORY_IME,
+ self->ime_id().c_str());
+ } else {
+ // Ditto.
+ chromeos::ChangeLanguage(global_connection,
+ chromeos::LANGUAGE_CATEGORY_XKB,
+ self->xkb_id().c_str());
+ }
+ }
+ }
+
+ std::string xkb_id() const {
+ return xkb_id_;
+ }
+ void set_xkb_id(const std::string& id) {
+ xkb_id_ = id;
+ }
+ std::string ime_id() const {
+ return ime_id_;
+ }
+ void set_ime_id(const std::string& id) {
+ ime_id_ = id;
+ }
+
+ private:
+ int count_;
+ GMainLoop* loop_;
+ std::string xkb_id_;
+ std::string ime_id_;
+};
+
+int main(int argc, const char** argv) {
+ // Initialize the g_type systems an g_main event loop, normally this would be
+ // done by chrome.
+ ::g_type_init();
+ GMainLoop* loop = ::g_main_loop_new(NULL, false);
+ DCHECK(LoadCrosLibrary(argv)) << "Failed to load cros.so";
+
+ Callback callback(loop);
+ global_connection
+ = chromeos::MonitorLanguageStatus(&Callback::Run, &callback);
+ DCHECK(global_connection) << "MonitorLanguageStatus() failed. "
+ << "candidate_window is not running?";
+
+ const scoped_ptr<chromeos::InputLanguageList> engines(
+ chromeos::GetLanguages(global_connection));
+ DCHECK(engines.get()) << "GetLanguages() failed";
+
+ std::cout << "Available IMEs and XKB layouts:" << std::endl;
+ for (size_t i = 0; i < engines->size(); ++i) {
+ const chromeos::InputLanguage &engine = engines->at(i);
+ std::cout << "* " << engine.display_name << std::endl;
+ // Remember (at least) one XKB id and one IME id.
+ if (engine.category == chromeos::LANGUAGE_CATEGORY_XKB) {
+ callback.set_xkb_id(engine.id);
+ } else {
+ callback.set_ime_id(engine.id);
+ }
+ }
+
+ ::g_main_loop_run(loop);
+ chromeos::DisconnectLanguageStatus(global_connection);
+ ::g_main_loop_unref(loop);
+
+ return 0;
+}
« no previous file with comments | « load.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698