| Index: ui/base/ime/input_method_ibus.cc
|
| diff --git a/ui/base/ime/input_method_ibus.cc b/ui/base/ime/input_method_ibus.cc
|
| index 16f1b62b1382c4952ccd888dd10a533ef045340b..bf467d92ff4a327844841e9ee5b136b135648d4c 100644
|
| --- a/ui/base/ime/input_method_ibus.cc
|
| +++ b/ui/base/ime/input_method_ibus.cc
|
| @@ -53,20 +53,20 @@ XKeyEvent* GetKeyEvent(XEvent* event) {
|
| return &event->xkey;
|
| }
|
|
|
| -// Converts X (and ibus) flags to event flags.
|
| -int EventFlagsFromXFlags(unsigned int flags) {
|
| - return (flags & LockMask ? ui::EF_CAPS_LOCK_DOWN : 0) |
|
| - (flags & ControlMask ? ui::EF_CONTROL_DOWN : 0) |
|
| - (flags & ShiftMask ? ui::EF_SHIFT_DOWN : 0) |
|
| - (flags & Mod1Mask ? ui::EF_ALT_DOWN : 0) |
|
| - (flags & Button1Mask ? ui::EF_LEFT_MOUSE_BUTTON : 0) |
|
| - (flags & Button2Mask ? ui::EF_MIDDLE_MOUSE_BUTTON : 0) |
|
| - (flags & Button3Mask ? ui::EF_RIGHT_MOUSE_BUTTON : 0);
|
| -}
|
| -
|
| -// Converts X flags to ibus key state flags.
|
| -uint32 IBusStateFromXFlags(unsigned int flags) {
|
| - return (flags & (LockMask | ControlMask | ShiftMask | Mod1Mask |
|
| +// Converts X (and ibus) state to event flags.
|
| +int EventFlagsFromXState(unsigned int state) {
|
| + return (state & LockMask ? ui::EF_CAPS_LOCK_DOWN : 0) |
|
| + (state & ControlMask ? ui::EF_CONTROL_DOWN : 0) |
|
| + (state & ShiftMask ? ui::EF_SHIFT_DOWN : 0) |
|
| + (state & Mod1Mask ? ui::EF_ALT_DOWN : 0) |
|
| + (state & Button1Mask ? ui::EF_LEFT_MOUSE_BUTTON : 0) |
|
| + (state & Button2Mask ? ui::EF_MIDDLE_MOUSE_BUTTON : 0) |
|
| + (state & Button3Mask ? ui::EF_RIGHT_MOUSE_BUTTON : 0);
|
| +}
|
| +
|
| +// Converts X state to ibus key and button state.
|
| +uint32 IBusStateFromXState(unsigned int state) {
|
| + return (state & (LockMask | ControlMask | ShiftMask | Mod1Mask |
|
| Button1Mask | Button2Mask | Button3Mask));
|
| }
|
|
|
| @@ -140,7 +140,9 @@ void InputMethodIBus::Init(bool focused) {
|
|
|
| void InputMethodIBus::ProcessKeyEventDone(uint32 id,
|
| XEvent* event,
|
| - uint32 keyval,
|
| + uint32 ibus_keyval,
|
| + uint32 ibus_keycode,
|
| + uint32 ibus_state,
|
| bool is_handled) {
|
| DCHECK(event);
|
| std::set<uint32>::iterator it = pending_key_events_.find(id);
|
| @@ -148,7 +150,8 @@ void InputMethodIBus::ProcessKeyEventDone(uint32 id,
|
| if (it == pending_key_events_.end())
|
| return; // Abandoned key event.
|
| if (event->type == KeyPress || event->type == KeyRelease)
|
| - ProcessKeyEventPostIME(event, keyval, is_handled);
|
| + ProcessKeyEventPostIME(event, ibus_keyval, ibus_keycode, ibus_state,
|
| + is_handled);
|
|
|
| // Do not use |it| for erasing, ProcessKeyEventPostIME may change the
|
| // |pending_key_events_|.
|
| @@ -164,7 +167,8 @@ bool InputMethodIBus::DispatchKeyEvent(const base::NativeEvent& native_event) {
|
| uint32 ibus_keycode = 0;
|
| uint32 ibus_state = 0;
|
| IBusKeyEventFromNativeKeyEvent(
|
| - native_event, &ibus_keyval, &ibus_keycode, &ibus_state);
|
| + native_event,
|
| + &ibus_keyval, &ibus_keycode, &ibus_state);
|
|
|
| // If |context_| is not usable, then we can only dispatch the key event as is.
|
| // We also dispatch the key event directly if the current text input type is
|
| @@ -176,7 +180,8 @@ bool InputMethodIBus::DispatchKeyEvent(const base::NativeEvent& native_event) {
|
| !GetInputContextClient() ||
|
| GetInputContextClient()->IsXKBLayout()) {
|
| if (native_event->type == KeyPress)
|
| - ProcessUnfilteredKeyPressEvent(native_event, ibus_keyval);
|
| + ProcessUnfilteredKeyPressEvent(native_event,
|
| + ibus_keyval, ibus_keycode, ibus_state);
|
| else
|
| DispatchKeyEventPostIME(native_event);
|
| return true;
|
| @@ -194,7 +199,9 @@ bool InputMethodIBus::DispatchKeyEvent(const base::NativeEvent& native_event) {
|
| weak_ptr_factory_.GetWeakPtr(),
|
| current_keyevent_id_,
|
| base::Owned(event), // Pass the ownership of |event|.
|
| - ibus_keyval);
|
| + ibus_keyval,
|
| + ibus_keycode,
|
| + ibus_state);
|
|
|
| GetInputContextClient()->ProcessKeyEvent(ibus_keyval,
|
| ibus_keycode,
|
| @@ -213,7 +220,7 @@ bool InputMethodIBus::DispatchFabricatedKeyEvent(const ui::KeyEvent& event) {
|
| // TODO(bryeung): The fabricated events should also pass through IME.
|
| if (event.type() == ET_KEY_PRESSED) {
|
| ProcessUnfilteredFabricatedKeyPressEvent(
|
| - ET_KEY_PRESSED, event.key_code(), event.flags(), 0);
|
| + ET_KEY_PRESSED, event.key_code(), event.flags(), 0, 0);
|
| } else {
|
| DispatchFabricatedKeyEventPostIME(
|
| ET_KEY_RELEASED,
|
| @@ -454,6 +461,8 @@ void InputMethodIBus::UpdateContextFocusState() {
|
| void InputMethodIBus::ProcessKeyEventPostIME(
|
| const base::NativeEvent& native_event,
|
| uint32 ibus_keyval,
|
| + uint32 ibus_keycode,
|
| + uint32 ibus_state,
|
| bool handled) {
|
| TextInputClient* client = GetTextInputClient();
|
|
|
| @@ -481,7 +490,8 @@ void InputMethodIBus::ProcessKeyEventPostIME(
|
| return;
|
|
|
| if (native_event->type == KeyPress && !handled)
|
| - ProcessUnfilteredKeyPressEvent(native_event, ibus_keyval);
|
| + ProcessUnfilteredKeyPressEvent(native_event,
|
| + ibus_keyval, ibus_keycode, ibus_state);
|
| else if (native_event->type == KeyRelease)
|
| DispatchKeyEventPostIME(native_event);
|
| }
|
| @@ -500,7 +510,7 @@ void InputMethodIBus::IBusKeyEventFromNativeKeyEvent(
|
| ::XLookupString(x_key, NULL, 0, &keysym, NULL);
|
| *ibus_keyval = keysym;
|
| *ibus_keycode = x_key->keycode;
|
| - *ibus_state = IBusStateFromXFlags(x_key->state);
|
| + *ibus_state = IBusStateFromXState(x_key->state);
|
| if (native_event->type == KeyRelease)
|
| *ibus_state |= kIBusReleaseMask;
|
| }
|
| @@ -513,12 +523,14 @@ void InputMethodIBus::ProcessFilteredKeyPressEvent(
|
| DispatchFabricatedKeyEventPostIME(
|
| ET_KEY_PRESSED,
|
| VKEY_PROCESSKEY,
|
| - EventFlagsFromXFlags(GetKeyEvent(native_event)->state));
|
| + EventFlagsFromXState(GetKeyEvent(native_event)->state));
|
| }
|
|
|
| void InputMethodIBus::ProcessUnfilteredKeyPressEvent(
|
| const base::NativeEvent& native_event,
|
| - uint32 ibus_keyval) {
|
| + uint32 ibus_keyval,
|
| + uint32 ibus_keycode,
|
| + uint32 ibus_state) {
|
| // For a fabricated event, ProcessUnfilteredFabricatedKeyPressEvent should be
|
| // called instead.
|
| DCHECK(native_event);
|
| @@ -536,11 +548,11 @@ void InputMethodIBus::ProcessUnfilteredKeyPressEvent(
|
| if (client != GetTextInputClient())
|
| return;
|
|
|
| - const uint32 state =
|
| - EventFlagsFromXFlags(GetKeyEvent(native_event)->state);
|
| + const uint32 event_flags = EventFlagsFromXState(ibus_state);
|
|
|
| // Process compose and dead keys
|
| - if (ProcessUnfilteredKeyPressEventWithCharacterComposer(ibus_keyval, state))
|
| + if (ProcessUnfilteredKeyPressEventWithCharacterComposer(
|
| + ibus_keyval, ibus_keycode, event_flags))
|
| return;
|
|
|
| // If a key event was not filtered by |context_| and |character_composer_|,
|
| @@ -549,40 +561,43 @@ void InputMethodIBus::ProcessUnfilteredKeyPressEvent(
|
| client = GetTextInputClient();
|
|
|
| uint16 ch = 0;
|
| - if (!(state & ui::EF_CONTROL_DOWN))
|
| + if (!(event_flags & ui::EF_CONTROL_DOWN))
|
| ch = ui::GetCharacterFromXEvent(native_event);
|
| if (!ch) {
|
| ch = ui::GetCharacterFromKeyCode(
|
| - ui::KeyboardCodeFromNative(native_event), state);
|
| + ui::KeyboardCodeFromNative(native_event), event_flags);
|
| }
|
|
|
| if (client && ch)
|
| - client->InsertChar(ch, state);
|
| + client->InsertChar(ch, event_flags);
|
| }
|
|
|
| void InputMethodIBus::ProcessUnfilteredFabricatedKeyPressEvent(
|
| EventType type,
|
| KeyboardCode key_code,
|
| - int flags,
|
| - uint32 ibus_keyval) {
|
| + int event_flags,
|
| + uint32 ibus_keyval,
|
| + uint32 ibus_keycode) {
|
| TextInputClient* client = GetTextInputClient();
|
| - DispatchFabricatedKeyEventPostIME(type, key_code, flags);
|
| + DispatchFabricatedKeyEventPostIME(type, key_code, event_flags);
|
|
|
| if (client != GetTextInputClient())
|
| return;
|
|
|
| - if (ProcessUnfilteredKeyPressEventWithCharacterComposer(ibus_keyval, flags))
|
| + if (ProcessUnfilteredKeyPressEventWithCharacterComposer(
|
| + ibus_keyval, ibus_keycode, event_flags))
|
| return;
|
|
|
| client = GetTextInputClient();
|
| - const uint16 ch = ui::GetCharacterFromKeyCode(key_code, flags);
|
| + const uint16 ch = ui::GetCharacterFromKeyCode(key_code, event_flags);
|
| if (client && ch)
|
| - client->InsertChar(ch, flags);
|
| + client->InsertChar(ch, event_flags);
|
| }
|
|
|
| bool InputMethodIBus::ProcessUnfilteredKeyPressEventWithCharacterComposer(
|
| uint32 ibus_keyval,
|
| - uint32 state) {
|
| + uint32 ibus_keycode,
|
| + int event_flags) {
|
| // We don't filter key presses for inappropriate input types.
|
| const TextInputType text_input_type = GetTextInputType();
|
| if (text_input_type == TEXT_INPUT_TYPE_NONE ||
|
| @@ -590,7 +605,8 @@ bool InputMethodIBus::ProcessUnfilteredKeyPressEventWithCharacterComposer(
|
| return false;
|
|
|
| // Do nothing if the key press is not filtered by our composer.
|
| - if (!character_composer_.FilterKeyPress(ibus_keyval, state))
|
| + if (!character_composer_.FilterKeyPress(ibus_keyval, ibus_keycode,
|
| + event_flags))
|
| return false;
|
|
|
| TextInputClient* client = GetTextInputClient();
|
| @@ -601,7 +617,7 @@ bool InputMethodIBus::ProcessUnfilteredKeyPressEventWithCharacterComposer(
|
| const string16 composed = character_composer_.composed_character();
|
| if (!composed.empty()) {
|
| if (composed.size() == 1) {
|
| - client->InsertChar(composed[0], state);
|
| + client->InsertChar(composed[0], event_flags);
|
| } else {
|
| CompositionText composition;
|
| composition.text = composed;
|
| @@ -621,7 +637,7 @@ void InputMethodIBus::ProcessInputMethodResult(
|
| if (result_text_.length()) {
|
| if (handled && NeedInsertChar()) {
|
| const uint32 state =
|
| - EventFlagsFromXFlags(GetKeyEvent(native_event)->state);
|
| + EventFlagsFromXState(GetKeyEvent(native_event)->state);
|
| for (string16::const_iterator i = result_text_.begin();
|
| i != result_text_.end(); ++i) {
|
| client->InsertChar(*i, state);
|
| @@ -696,15 +712,15 @@ void InputMethodIBus::CommitText(const chromeos::IBusText& text) {
|
| }
|
|
|
| void InputMethodIBus::ForwardKeyEvent(uint32 keyval,
|
| - uint32 keycode,
|
| - uint32 state) {
|
| + uint32 keycode,
|
| + uint32 state) {
|
| KeyboardCode ui_key_code = KeyboardCodeFromXKeysym(keyval);
|
| if (!ui_key_code)
|
| return;
|
|
|
| const EventType event_type =
|
| (state & kIBusReleaseMask) ? ET_KEY_RELEASED : ET_KEY_PRESSED;
|
| - const int event_flags = EventFlagsFromXFlags(state);
|
| + const int event_flags = EventFlagsFromXState(state);
|
|
|
| // It is not clear when the input method will forward us a fake key event.
|
| // If there is a pending key event, then we may already received some input
|
| @@ -713,7 +729,7 @@ void InputMethodIBus::ForwardKeyEvent(uint32 keyval,
|
| // results.
|
| if (event_type == ET_KEY_PRESSED) {
|
| ProcessUnfilteredFabricatedKeyPressEvent(
|
| - event_type, ui_key_code, event_flags, keyval);
|
| + event_type, ui_key_code, event_flags, keyval, keycode);
|
| } else {
|
| DispatchFabricatedKeyEventPostIME(event_type, ui_key_code, event_flags);
|
| }
|
|
|