Chromium Code Reviews| Index: ui/events/event.cc |
| diff --git a/ui/events/event.cc b/ui/events/event.cc |
| index 07c1753c80fa920d8a47bc385aa76942a59d2105..2a373af656628909a893c131703e23bfbbc94ae0 100644 |
| --- a/ui/events/event.cc |
| +++ b/ui/events/event.cc |
| @@ -190,17 +190,16 @@ bool IsX11SendEventTrue(const base::NativeEvent& event) { |
| #endif |
| } |
| -bool X11EventHasNonStandardState(const base::NativeEvent& event) { |
| #if defined(USE_X11) |
| +bool X11EventHasNonStandardState(const base::NativeEvent& event) { |
| const unsigned int kAllStateMask = |
| Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | |
| Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | |
| LockMask | ControlMask | AnyModifier; |
| + |
| return event && (event->xkey.state & ~kAllStateMask) != 0; |
| -#else |
| - return false; |
| -#endif |
| } |
| +#endif |
| } // namespace |
| @@ -1085,42 +1084,52 @@ PointerEvent::PointerEvent(EventType type, |
| // static |
| KeyEvent* KeyEvent::last_key_event_ = NULL; |
| +#if defined(USE_X11) |
| +KeyEvent* KeyEvent::last_ibus_key_event_ = NULL; |
|
sadrul
2017/04/21 03:08:22
nullptr
dtapuska
2017/04/21 13:22:54
Done.
|
| +#endif |
| // static |
| bool KeyEvent::IsRepeated(const KeyEvent& event) { |
| // A safe guard in case if there were continous key pressed events that are |
| // not auto repeat. |
| const int kMaxAutoRepeatTimeMs = 2000; |
| - // Ignore key events that have non standard state masks as it may be |
| - // reposted by an IME. IBUS-GTK uses this field to detect the |
| - // re-posted event for example. crbug.com/385873. |
| - if (X11EventHasNonStandardState(event.native_event())) |
| - return false; |
| + KeyEvent** last_key_event; |
| +#if defined(USE_X11) |
| + // Use a different static variable for key events that have non standard |
| + // state masks as it may be reposted by an IME. IBUS-GTK uses this field |
| + // to detect the re-posted event for example. crbug.com/385873. |
| + last_key_event = X11EventHasNonStandardState(event.native_event()) |
| + ? &last_ibus_key_event_ |
| + : &last_key_event_; |
| +#else |
| + last_key_event = &last_key_event_; |
| +#endif |
| if (event.is_char()) |
| return false; |
| if (event.type() == ui::ET_KEY_RELEASED) { |
| - delete last_key_event_; |
| - last_key_event_ = NULL; |
| + delete *last_key_event; |
| + *last_key_event = NULL; |
| return false; |
| } |
| + |
| CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); |
| - if (!last_key_event_) { |
| - last_key_event_ = new KeyEvent(event); |
| + if (!(*last_key_event)) { |
| + *last_key_event = new KeyEvent(event); |
| return false; |
| - } else if (event.time_stamp() == last_key_event_->time_stamp()) { |
| + } else if (event.time_stamp() == (*last_key_event)->time_stamp()) { |
| // The KeyEvent is created from the same native event. |
| - return (last_key_event_->flags() & ui::EF_IS_REPEAT) != 0; |
| + return ((*last_key_event)->flags() & ui::EF_IS_REPEAT) != 0; |
| } |
| - if (event.key_code() == last_key_event_->key_code() && |
| - event.flags() == (last_key_event_->flags() & ~ui::EF_IS_REPEAT) && |
| - (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < |
| + if (event.key_code() == (*last_key_event)->key_code() && |
| + event.flags() == ((*last_key_event)->flags() & ~ui::EF_IS_REPEAT) && |
| + (event.time_stamp() - (*last_key_event)->time_stamp()).InMilliseconds() < |
| kMaxAutoRepeatTimeMs) { |
| - last_key_event_->set_time_stamp(event.time_stamp()); |
| - last_key_event_->set_flags(last_key_event_->flags() | ui::EF_IS_REPEAT); |
| + (*last_key_event)->set_time_stamp(event.time_stamp()); |
| + (*last_key_event)->set_flags((*last_key_event)->flags() | ui::EF_IS_REPEAT); |
| return true; |
| } |
| - delete last_key_event_; |
| - last_key_event_ = new KeyEvent(event); |
| + delete *last_key_event; |
| + *last_key_event = new KeyEvent(event); |
| return false; |
| } |