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

Unified Diff: ui/base/ime/input_method_ibus.cc

Issue 15816003: Supports unicode composition(Ctrl+Shift+U) with C-S pressed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added a TODO. Created 7 years, 7 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
« no previous file with comments | « ui/base/ime/input_method_ibus.h ('k') | ui/base/ime/input_method_ibus_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « ui/base/ime/input_method_ibus.h ('k') | ui/base/ime/input_method_ibus_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698