diff options
-rw-r--r-- | chrome/browser/renderer_host/gtk_im_context_wrapper.cc | 48 | ||||
-rw-r--r-- | chrome/browser/renderer_host/gtk_im_context_wrapper.h | 5 |
2 files changed, 38 insertions, 15 deletions
diff --git a/chrome/browser/renderer_host/gtk_im_context_wrapper.cc b/chrome/browser/renderer_host/gtk_im_context_wrapper.cc index 25ec4f0..0c2002c 100644 --- a/chrome/browser/renderer_host/gtk_im_context_wrapper.cc +++ b/chrome/browser/renderer_host/gtk_im_context_wrapper.cc @@ -28,6 +28,22 @@ #include "grit/generated_resources.h" #include "third_party/skia/include/core/SkColor.h" +namespace { +// Copied from third_party/WebKit/WebCore/page/EventHandler.cpp +// +// Match key code of composition keydown event on windows. +// IE sends VK_PROCESSKEY which has value 229; +// +// Please refer to following documents for detals: +// - Virtual-Key Codes +// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx +// - How the IME System Works +// http://msdn.microsoft.com/en-us/library/cc194848.aspx +// - ImmGetVirtualKey Function +// http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx +const int kCompositionEventKeyCode = 229; +} // namespace + GtkIMContextWrapper::GtkIMContextWrapper(RenderWidgetHostViewGtk* host_view) : host_view_(host_view), context_(gtk_im_multicontext_new()), @@ -317,20 +333,6 @@ bool GtkIMContextWrapper::NeedCommitByForwardingCharEvent() { void GtkIMContextWrapper::ProcessFilteredKeyPressEvent( NativeWebKeyboardEvent* wke) { - // Copied from third_party/WebKit/WebCore/page/EventHandler.cpp - // - // Match key code of composition keydown event on windows. - // IE sends VK_PROCESSKEY which has value 229; - // - // Please refer to following documents for detals: - // - Virtual-Key Codes - // http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx - // - How the IME System Works - // http://msdn.microsoft.com/en-us/library/cc194848.aspx - // - ImmGetVirtualKey Function - // http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx - const int kCompositionEventKeyCode = 229; - // If IME has filtered this event, then replace virtual key code with // VK_PROCESSKEY. See comment in ProcessKeyEvent() for details. // It's only required for keydown events. @@ -450,8 +452,12 @@ void GtkIMContextWrapper::HandleCommit(const string16& text) { // It's possible that commit signal is fired without a key event, for // example when user input via a voice or handwriting recognition software. // In this case, the text must be committed directly. - if (!is_in_key_event_handler_ && host_view_->GetRenderWidgetHost()) + if (!is_in_key_event_handler_ && host_view_->GetRenderWidgetHost()) { + // Workaround http://crbug.com/45478 by sending fake key down/up events. + SendFakeCompositionKeyEvent(WebKit::WebInputEvent::RawKeyDown); host_view_->GetRenderWidgetHost()->ImeConfirmComposition(text); + SendFakeCompositionKeyEvent(WebKit::WebInputEvent::KeyUp); + } } void GtkIMContextWrapper::HandlePreeditStart() { @@ -490,9 +496,12 @@ void GtkIMContextWrapper::HandlePreeditChanged(const gchar* text, // Otherwise, we need send it here if it's been changed. if (!is_in_key_event_handler_ && is_composing_text_ && host_view_->GetRenderWidgetHost()) { + // Workaround http://crbug.com/45478 by sending fake key down/up events. + SendFakeCompositionKeyEvent(WebKit::WebInputEvent::RawKeyDown); host_view_->GetRenderWidgetHost()->ImeSetComposition( preedit_text_, preedit_underlines_, preedit_selection_start_, preedit_selection_end_); + SendFakeCompositionKeyEvent(WebKit::WebInputEvent::KeyUp); } } @@ -529,6 +538,15 @@ void GtkIMContextWrapper::HandleHostViewUnrealize() { gtk_im_context_set_client_window(context_simple_, NULL); } +void GtkIMContextWrapper::SendFakeCompositionKeyEvent( + WebKit::WebInputEvent::Type type) { + NativeWebKeyboardEvent fake_event; + fake_event.windowsKeyCode = kCompositionEventKeyCode; + fake_event.skip_in_browser = true; + fake_event.type = type; + host_view_->ForwardKeyboardEvent(fake_event); +} + void GtkIMContextWrapper::HandleCommitThunk( GtkIMContext* context, gchar* text, GtkIMContextWrapper* self) { self->HandleCommit(UTF8ToUTF16(text)); diff --git a/chrome/browser/renderer_host/gtk_im_context_wrapper.h b/chrome/browser/renderer_host/gtk_im_context_wrapper.h index 1538e26..94d6bfa 100644 --- a/chrome/browser/renderer_host/gtk_im_context_wrapper.h +++ b/chrome/browser/renderer_host/gtk_im_context_wrapper.h @@ -14,6 +14,7 @@ #include "base/gtest_prod_util.h" #include "base/string16.h" #include "third_party/WebKit/WebKit/chromium/public/WebCompositionUnderline.h" +#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" #include "third_party/WebKit/WebKit/chromium/public/WebTextInputType.h" namespace gfx { @@ -100,6 +101,10 @@ class GtkIMContextWrapper { // client window. void HandleHostViewUnrealize(); + // Sends a fake composition key event with specified event type. A composition + // key event is a key event with special key code 229. + void SendFakeCompositionKeyEvent(WebKit::WebInputEvent::Type type); + // Signal handlers of GtkIMContext object. static void HandleCommitThunk(GtkIMContext* context, gchar* text, GtkIMContextWrapper* self); |