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

Unified Diff: chrome/browser/renderer_host/gtk_im_context_wrapper.cc

Issue 174217: Fix issue 19081: Linux: Not able to switch input method correctly in web page... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 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/renderer_host/gtk_im_context_wrapper.cc
===================================================================
--- chrome/browser/renderer_host/gtk_im_context_wrapper.cc (revision 24439)
+++ chrome/browser/renderer_host/gtk_im_context_wrapper.cc (working copy)
@@ -51,6 +51,17 @@
G_CALLBACK(HandlePreeditChangedThunk), this);
g_signal_connect(context_simple_, "commit",
G_CALLBACK(HandleCommitThunk), this);
+
+ GtkWidget* widget = host_view->native_view();
+ DCHECK(widget);
+
+ g_signal_connect(widget, "realize",
+ G_CALLBACK(HandleHostViewRealizeThunk), this);
+ g_signal_connect(widget, "unrealize",
+ G_CALLBACK(HandleHostViewUnrealizeThunk), this);
+
+ // Set client window if the widget is already realized.
+ HandleHostViewRealize(widget);
}
GtkIMContextWrapper::~GtkIMContextWrapper() {
@@ -193,22 +204,11 @@
// GtkIMContext object correctly later when IME is enabled by WebKit.
is_focused_ = true;
- // We should call gtk_im_context_set_client_window() only when this window
- // gain (or release) the window focus because an immodule may reset its
- // internal status when processing this function.
- gtk_im_context_set_client_window(context_,
- host_view_->native_view()->window);
-
// Notify the GtkIMContext object of this focus-in event only if IME is
// enabled by WebKit.
if (is_enabled_)
gtk_im_context_focus_in(context_);
- // Actually current GtkIMContextSimple implementation doesn't care about
- // client window. This line is just for safe.
- gtk_im_context_set_client_window(context_simple_,
- host_view_->native_view()->window);
-
// context_simple_ is always enabled.
// Actually it doesn't care focus state at all.
gtk_im_context_focus_in(context_simple_);
@@ -234,13 +234,9 @@
gtk_im_context_focus_out(context_);
}
- // Detach this GtkIMContext object from this window.
- gtk_im_context_set_client_window(context_, NULL);
-
// To make sure it'll be in correct state when focused in again.
gtk_im_context_reset(context_simple_);
gtk_im_context_focus_out(context_simple_);
- gtk_im_context_set_client_window(context_simple_, NULL);
// Reset stored IME status.
is_composing_text_ = false;
@@ -472,6 +468,21 @@
// signal may be fired before "commit" signal.
}
+void GtkIMContextWrapper::HandleHostViewRealize(GtkWidget* widget) {
+ // We should only set im context's client window once, because when setting
+ // client window.im context may destroy and recreate its internal states and
+ // objects.
+ if (widget->window) {
+ gtk_im_context_set_client_window(context_, widget->window);
+ gtk_im_context_set_client_window(context_simple_, widget->window);
+ }
+}
+
+void GtkIMContextWrapper::HandleHostViewUnrealize() {
+ gtk_im_context_set_client_window(context_, NULL);
+ gtk_im_context_set_client_window(context_simple_, NULL);
+}
+
void GtkIMContextWrapper::HandleCommitThunk(
GtkIMContext* context, gchar* text, GtkIMContextWrapper* self) {
self->HandleCommit(UTF8ToUTF16(text));
@@ -495,3 +506,13 @@
GtkIMContext* context, GtkIMContextWrapper* self) {
self->HandlePreeditEnd();
}
+
+void GtkIMContextWrapper::HandleHostViewRealizeThunk(
+ GtkWidget* widget, GtkIMContextWrapper* self) {
+ self->HandleHostViewRealize(widget);
+}
+
+void GtkIMContextWrapper::HandleHostViewUnrealizeThunk(
+ GtkWidget* widget, GtkIMContextWrapper* self) {
+ self->HandleHostViewUnrealize();
+}
« no previous file with comments | « chrome/browser/renderer_host/gtk_im_context_wrapper.h ('k') | chrome/browser/renderer_host/render_widget_host_view_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698