summaryrefslogtreecommitdiffstats
path: root/views/ime/input_method_gtk.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/ime/input_method_gtk.cc')
-rw-r--r--views/ime/input_method_gtk.cc72
1 files changed, 27 insertions, 45 deletions
diff --git a/views/ime/input_method_gtk.cc b/views/ime/input_method_gtk.cc
index 023bcc6..07da18f 100644
--- a/views/ime/input_method_gtk.cc
+++ b/views/ime/input_method_gtk.cc
@@ -110,13 +110,13 @@ void InputMethodGtk::OnBlur() {
}
void InputMethodGtk::DispatchKeyEvent(const KeyEvent& key) {
+ DCHECK(key.type() == ui::ET_KEY_PRESSED || key.type() == ui::ET_KEY_RELEASED);
suppress_next_result_ = false;
// We should bypass |context_| and |context_simple_| only if there is no
- // text input client is focused at all. Otherwise, we should always send the
- // key event to either |context_| or |context_simple_| even if the text input
- // type is ui::TEXT_INPUT_TYPE_NONE, to make sure we can get correct character
- // result.
+ // text input client focused. Otherwise, always send the key event to either
+ // |context_| or |context_simple_| even if the text input type is
+ // ui::TEXT_INPUT_TYPE_NONE, to make sure we can get correct character result.
if (!GetTextInputClient()) {
DispatchKeyEventPostIME(key);
return;
@@ -126,22 +126,11 @@ void InputMethodGtk::DispatchKeyEvent(const KeyEvent& key) {
composition_changed_ = false;
result_text_.clear();
- GdkEvent* event = key.native_event();
- DCHECK(!event || event->type == GDK_KEY_PRESS ||
- event->type == GDK_KEY_RELEASE);
-
- // If it's a fake key event, then we need to synthesis a GdkEventKey.
- bool need_free_event = false;
- if (!event) {
- event = SynthesizeGdkEventKey(key);
- need_free_event = true;
- }
-
- gboolean filtered = false;
- if (context_focused_)
- filtered = gtk_im_context_filter_keypress(context_, &event->key);
- else
- filtered = gtk_im_context_filter_keypress(context_simple_, &event->key);
+ // If it's a fake key event, then we need to synthesize a GdkEventKey.
+ GdkEvent* event = key.native_event() ? key.native_event() :
+ SynthesizeGdkEventKey(key);
+ gboolean filtered = gtk_im_context_filter_keypress(
+ context_focused_ ? context_ : context_simple_, &event->key);
handling_key_event_ = false;
@@ -149,24 +138,21 @@ void InputMethodGtk::DispatchKeyEvent(const KeyEvent& key) {
if (key.type() == ui::ET_KEY_PRESSED && filtered)
ProcessFilteredKeyPressEvent(key);
- // In case the focus was changed by the key event.
- if (old_focused_view != focused_view())
- return;
-
- if (HasInputMethodResult())
- ProcessInputMethodResult(key, filtered);
-
- // In case the focus was changed when sending input method results to the
- // focused View.
- if (old_focused_view != focused_view())
- return;
-
- if (key.type() == ui::ET_KEY_PRESSED && !filtered)
- ProcessUnfilteredKeyPressEvent(key);
- else if (key.type() == ui::ET_KEY_RELEASED)
- DispatchKeyEventPostIME(key);
+ // Ensure no focus change from processing the key event.
+ if (old_focused_view == focused_view()) {
+ if (HasInputMethodResult())
+ ProcessInputMethodResult(key, filtered);
+ // Ensure no focus change sending input method results to the focused View.
+ if (old_focused_view == focused_view()) {
+ if (key.type() == ui::ET_KEY_PRESSED && !filtered)
+ ProcessUnfilteredKeyPressEvent(key);
+ else if (key.type() == ui::ET_KEY_RELEASED)
+ DispatchKeyEventPostIME(key);
+ }
+ }
- if (need_free_event)
+ // Free the synthesized event if there was no underlying native event.
+ if (event != key.native_event())
gdk_event_free(event);
}
@@ -360,14 +346,10 @@ GdkEvent* InputMethodGtk::SynthesizeGdkEventKey(const KeyEvent& key) const {
guint keyval =
ui::GdkKeyCodeForWindowsKeyCode(key.key_code(), key.IsShiftDown());
guint state = 0;
- if (key.IsShiftDown())
- state |= GDK_SHIFT_MASK;
- if (key.IsControlDown())
- state |= GDK_CONTROL_MASK;
- if (key.IsAltDown())
- state |= GDK_MOD1_MASK;
- if (key.IsCapsLockDown())
- state |= GDK_LOCK_MASK;
+ state |= key.IsShiftDown() ? GDK_SHIFT_MASK : 0;
+ state |= key.IsControlDown() ? GDK_CONTROL_MASK : 0;
+ state |= key.IsAltDown() ? GDK_MOD1_MASK : 0;
+ state |= key.IsCapsLockDown() ? GDK_LOCK_MASK : 0;
DCHECK(widget()->GetNativeView()->window);
return ui::SynthesizeKeyEvent(widget()->GetNativeView()->window,