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

Unified Diff: ui/events/event.cc

Issue 2825343002: Fix key repeat on linux. (Closed)
Patch Set: Fix nit Created 3 years, 8 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/events/event.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/events/event.cc
diff --git a/ui/events/event.cc b/ui/events/event.cc
index 07c1753c80fa920d8a47bc385aa76942a59d2105..ce99ff82d68ee08dd10cdfe51f89c3bedfcfc56a 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
@@ -1084,43 +1083,53 @@ PointerEvent::PointerEvent(EventType type,
// KeyEvent
// static
-KeyEvent* KeyEvent::last_key_event_ = NULL;
+KeyEvent* KeyEvent::last_key_event_ = nullptr;
+#if defined(USE_X11)
+KeyEvent* KeyEvent::last_ibus_key_event_ = nullptr;
+#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 = nullptr;
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;
}
« no previous file with comments | « ui/events/event.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698