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

Unified Diff: chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc

Issue 1068093002: Refactoring for InputMethodAuraLinux. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removes unexpected 229 keydown for non-IME users. Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc
diff --git a/chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc b/chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc
index c6b517d51e5fe1b0ef89e002103a1a335a4a24d3..0a0b081530fb0d8f41b256e89ce087576519e979 100644
--- a/chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc
+++ b/chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.cc
@@ -25,44 +25,36 @@
namespace libgtk2ui {
X11InputMethodContextImplGtk2::X11InputMethodContextImplGtk2(
- ui::LinuxInputMethodContextDelegate* delegate)
+ ui::LinuxInputMethodContextDelegate* delegate,
+ bool is_simple)
: delegate_(delegate),
- gtk_context_simple_(NULL),
- gtk_multicontext_(NULL),
gtk_context_(NULL),
gdk_last_set_client_window_(NULL) {
CHECK(delegate_);
ResetXModifierKeycodesCache();
- gtk_context_simple_ = gtk_im_context_simple_new();
- gtk_multicontext_ = gtk_im_multicontext_new();
-
- GtkIMContext* contexts[] = {gtk_context_simple_, gtk_multicontext_};
- for (size_t i = 0; i < arraysize(contexts); ++i) {
- g_signal_connect(contexts[i], "commit",
- G_CALLBACK(OnCommitThunk), this);
- g_signal_connect(contexts[i], "preedit-changed",
- G_CALLBACK(OnPreeditChangedThunk), this);
- g_signal_connect(contexts[i], "preedit-end",
- G_CALLBACK(OnPreeditEndThunk), this);
- g_signal_connect(contexts[i], "preedit-start",
- G_CALLBACK(OnPreeditStartThunk), this);
- // TODO(yukishiino): Handle operations on surrounding text.
- // "delete-surrounding" and "retrieve-surrounding" signals should be
- // handled.
- }
+ if (is_simple)
+ gtk_context_ = gtk_im_context_simple_new();
+ else
+ gtk_context_ = gtk_im_multicontext_new();
James Su 2015/04/09 08:40:02 nit: gtk_context_ = is_simple ? gtk_im_context_sim
Shu Chen 2015/04/10 05:26:52 Done.
+
+ g_signal_connect(gtk_context_, "commit", G_CALLBACK(OnCommitThunk), this);
+ g_signal_connect(gtk_context_, "preedit-changed",
+ G_CALLBACK(OnPreeditChangedThunk), this);
+ g_signal_connect(gtk_context_, "preedit-end", G_CALLBACK(OnPreeditEndThunk),
+ this);
+ g_signal_connect(gtk_context_, "preedit-start",
+ G_CALLBACK(OnPreeditStartThunk), this);
+ // TODO(yukishiino): Handle operations on surrounding text.
James Su 2015/04/09 08:40:02 change this to TODO(shuchen) ?
Shu Chen 2015/04/10 05:26:52 Done.
+ // "delete-surrounding" and "retrieve-surrounding" signals should be
+ // handled.
}
X11InputMethodContextImplGtk2::~X11InputMethodContextImplGtk2() {
- gtk_context_ = NULL;
- if (gtk_context_simple_) {
- g_object_unref(gtk_context_simple_);
- gtk_context_simple_ = NULL;
- }
- if (gtk_multicontext_) {
- g_object_unref(gtk_multicontext_);
- gtk_multicontext_ = NULL;
+ if (gtk_context_) {
+ g_object_unref(gtk_context_);
+ gtk_context_ = NULL;
}
}
@@ -70,11 +62,7 @@ X11InputMethodContextImplGtk2::~X11InputMethodContextImplGtk2() {
bool X11InputMethodContextImplGtk2::DispatchKeyEvent(
const ui::KeyEvent& key_event) {
- if (!key_event.HasNativeEvent())
- return false;
-
- // The caller must call Focus() first.
- if (!gtk_context_)
+ if (!key_event.HasNativeEvent() || !gtk_context_)
return false;
// Translate a XKeyEvent to a GdkEventKey.
@@ -84,11 +72,11 @@ bool X11InputMethodContextImplGtk2::DispatchKeyEvent(
return false;
}
- // Set the client window and cursor location.
if (event->key.window != gdk_last_set_client_window_) {
gtk_im_context_set_client_window(gtk_context_, event->key.window);
gdk_last_set_client_window_ = event->key.window;
}
+
// Convert the last known caret bounds relative to the screen coordinates
// to a GdkRectangle relative to the client window.
gint x = 0;
@@ -100,48 +88,31 @@ bool X11InputMethodContextImplGtk2::DispatchKeyEvent(
last_caret_bounds_.height()};
gtk_im_context_set_cursor_location(gtk_context_, &rect);
- // Let an IME handle the key event.
- commit_signal_trap_.StartTrap(event->key.keyval);
- const gboolean handled = gtk_im_context_filter_keypress(gtk_context_,
- &event->key);
- commit_signal_trap_.StopTrap();
+ const bool handled =
+ gtk_im_context_filter_keypress(gtk_context_, &event->key);
gdk_event_free(event);
-
- return handled && !commit_signal_trap_.IsSignalCaught();
+ return handled;
}
void X11InputMethodContextImplGtk2::Reset() {
- // Reset all the states of the context, not only preedit, caret but also
- // focus.
- gtk_context_ = NULL;
- gtk_im_context_reset(gtk_context_simple_);
- gtk_im_context_reset(gtk_multicontext_);
- gtk_im_context_focus_out(gtk_context_simple_);
- gtk_im_context_focus_out(gtk_multicontext_);
- gdk_last_set_client_window_ = NULL;
+ gtk_im_context_reset(gtk_context_);
}
-void X11InputMethodContextImplGtk2::OnTextInputTypeChanged(
- ui::TextInputType text_input_type) {
- switch (text_input_type) {
- case ui::TEXT_INPUT_TYPE_NONE:
- case ui::TEXT_INPUT_TYPE_PASSWORD:
- gtk_context_ = gtk_context_simple_;
- break;
- default:
- gtk_context_ = gtk_multicontext_;
- }
+void X11InputMethodContextImplGtk2::Focus() {
gtk_im_context_focus_in(gtk_context_);
}
-void X11InputMethodContextImplGtk2::OnCaretBoundsChanged(
- const gfx::Rect& caret_bounds) {
+void X11InputMethodContextImplGtk2::Blur() {
+ gtk_im_context_focus_out(gtk_context_);
+}
+
+void X11InputMethodContextImplGtk2::SetCursorLocation(const gfx::Rect& rect) {
// Remember the caret bounds so that we can set the cursor location later.
// gtk_im_context_set_cursor_location() takes the location relative to the
// client window, which is unknown at this point. So we'll call
// gtk_im_context_set_cursor_location() later in ProcessKeyEvent() where
// (and only where) we know the client window.
- last_caret_bounds_ = caret_bounds;
+ last_caret_bounds_ = rect;
}
// private:
@@ -309,16 +280,7 @@ void X11InputMethodContextImplGtk2::OnCommit(GtkIMContext* context,
if (context != gtk_context_)
return;
- const base::string16& text_in_utf16 = base::UTF8ToUTF16(text);
- // If an underlying IME is emitting the "commit" signal to insert a character
- // for a direct input key event, ignores the insertion of the character at
- // this point, because we have to call DispatchKeyEventPostIME() for direct
- // input key events. DispatchKeyEvent() takes care of the trapped character
- // and calls DispatchKeyEventPostIME().
- if (commit_signal_trap_.Trap(text_in_utf16))
- return;
-
- delegate_->OnCommit(text_in_utf16);
+ delegate_->OnCommit(base::UTF8ToUTF16(text));
}
void X11InputMethodContextImplGtk2::OnPreeditChanged(GtkIMContext* context) {
@@ -352,39 +314,4 @@ void X11InputMethodContextImplGtk2::OnPreeditStart(GtkIMContext* context) {
delegate_->OnPreeditStart();
}
-// GtkCommitSignalTrap
-
-X11InputMethodContextImplGtk2::GtkCommitSignalTrap::GtkCommitSignalTrap()
- : is_trap_enabled_(false),
-#if GTK_CHECK_VERSION (2,22,0)
- gdk_event_key_keyval_(GDK_KEY_VoidSymbol),
-#else
- gdk_event_key_keyval_(GDK_VoidSymbol),
-#endif
- is_signal_caught_(false) {}
-
-void X11InputMethodContextImplGtk2::GtkCommitSignalTrap::StartTrap(
- guint keyval) {
- is_signal_caught_ = false;
- gdk_event_key_keyval_ = keyval;
- is_trap_enabled_ = true;
-}
-
-void X11InputMethodContextImplGtk2::GtkCommitSignalTrap::StopTrap() {
- is_trap_enabled_ = false;
-}
-
-bool X11InputMethodContextImplGtk2::GtkCommitSignalTrap::Trap(
- const base::string16& text) {
- DCHECK(!is_signal_caught_);
- if (is_trap_enabled_ &&
- text.length() == 1 &&
- text[0] == gdk_keyval_to_unicode(gdk_event_key_keyval_)) {
- is_signal_caught_ = true;
- return true;
- } else {
- return false;
- }
-}
-
} // namespace libgtk2ui

Powered by Google App Engine
This is Rietveld 408576698