Index: ui/base/ime/input_method_auralinux.cc |
diff --git a/ui/base/ime/input_method_auralinux.cc b/ui/base/ime/input_method_auralinux.cc |
index 1bf20174b4ea951c0851d468f7b2fb69b4c279cf..3bc817d48d4315a43f5c6b3aa932e223392f71b3 100644 |
--- a/ui/base/ime/input_method_auralinux.cc |
+++ b/ui/base/ime/input_method_auralinux.cc |
@@ -12,7 +12,8 @@ |
namespace ui { |
InputMethodAuraLinux::InputMethodAuraLinux( |
- internal::InputMethodDelegate* delegate) { |
+ internal::InputMethodDelegate* delegate) |
+ : allowed_to_fire_vkey_process_key_(false), vkey_processkey_flags_(0) { |
SetDelegate(delegate); |
} |
@@ -50,22 +51,21 @@ bool InputMethodAuraLinux::DispatchKeyEvent(const ui::KeyEvent& event) { |
DCHECK(event.type() == ET_KEY_PRESSED || event.type() == ET_KEY_RELEASED); |
DCHECK(system_toplevel_window_focused()); |
+ // In order to not dispatch key events out of order, stop firing a |
+ // VKEY_PROCESSKEY key event once a new key event arrives. |
+ StopFiringProcessKey(); |
+ |
// If no text input client, do nothing. |
if (!GetTextInputClient()) |
return DispatchKeyEventPostIME(event); |
// Let an IME handle the key event first. |
- if (input_method_context_->DispatchKeyEvent(event)) { |
- if (event.type() == ET_KEY_PRESSED && |
- (event.flags() & ui::EF_IME_FABRICATED_KEY) == 0) { |
- const ui::KeyEvent fabricated_event(ET_KEY_PRESSED, |
- VKEY_PROCESSKEY, |
- event.flags(), |
- false); // is_char |
- DispatchKeyEventPostIME(fabricated_event); |
- } |
+ if (event.type() == ET_KEY_PRESSED && |
Seigo Nonaka
2014/05/14 14:01:38
Could you add comment why we don't allow the vkey
Yuki
2014/05/16 14:22:27
Done.
It's not trivial if we should fire keyup ev
|
+ (event.flags() & ui::EF_IME_FABRICATED_KEY) == 0) |
+ AllowToFireProcessKey(event); |
+ if (input_method_context_->DispatchKeyEvent(event)) |
return true; |
- } |
+ StopFiringProcessKey(); |
// Otherwise, insert the character. |
const bool handled = DispatchKeyEventPostIME(event); |
@@ -124,6 +124,7 @@ bool InputMethodAuraLinux::IsCandidatePopupOpen() const { |
void InputMethodAuraLinux::OnCommit(const base::string16& text) { |
if (!IsTextInputTypeNone()) |
GetTextInputClient()->InsertText(text); |
+ MaybeFireProcessKey(); |
} |
void InputMethodAuraLinux::OnPreeditChanged( |
@@ -131,15 +132,19 @@ void InputMethodAuraLinux::OnPreeditChanged( |
TextInputClient* text_input_client = GetTextInputClient(); |
if (text_input_client) |
text_input_client->SetCompositionText(composition_text); |
+ MaybeFireProcessKey(); |
} |
void InputMethodAuraLinux::OnPreeditEnd() { |
TextInputClient* text_input_client = GetTextInputClient(); |
if (text_input_client && text_input_client->HasCompositionText()) |
text_input_client->ClearCompositionText(); |
+ MaybeFireProcessKey(); |
} |
-void InputMethodAuraLinux::OnPreeditStart() {} |
+void InputMethodAuraLinux::OnPreeditStart() { |
+ MaybeFireProcessKey(); |
Seigo Nonaka
2014/05/14 14:01:38
Please double check the key down event is fired be
Yuki
2014/05/16 14:22:27
Done. I've changed the order of calls to MaybeFir
|
+} |
// Overridden from InputMethodBase. |
@@ -153,4 +158,28 @@ void InputMethodAuraLinux::OnDidChangeFocusedClient( |
InputMethodBase::OnDidChangeFocusedClient(focused_before, focused); |
} |
+// Helper functions to support VKEY_PROCESSKEY. |
+ |
+void InputMethodAuraLinux::AllowToFireProcessKey(const ui::KeyEvent& event) { |
+ allowed_to_fire_vkey_process_key_ = true; |
+ vkey_processkey_flags_ = event.flags(); |
+} |
+ |
+void InputMethodAuraLinux::MaybeFireProcessKey() { |
+ if (!allowed_to_fire_vkey_process_key_) |
+ return; |
+ |
+ const ui::KeyEvent fabricated_event(ET_KEY_PRESSED, |
+ VKEY_PROCESSKEY, |
+ vkey_processkey_flags_, |
+ false); // is_char |
+ DispatchKeyEventPostIME(fabricated_event); |
+ StopFiringProcessKey(); |
+} |
+ |
+void InputMethodAuraLinux::StopFiringProcessKey() { |
+ allowed_to_fire_vkey_process_key_ = false; |
+ vkey_processkey_flags_ = 0; |
+} |
+ |
} // namespace ui |