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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « ui/events/event.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/events/event.h" 5 #include "ui/events/event.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 10
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 183 }
184 184
185 bool IsX11SendEventTrue(const base::NativeEvent& event) { 185 bool IsX11SendEventTrue(const base::NativeEvent& event) {
186 #if defined(USE_X11) 186 #if defined(USE_X11)
187 return event && event->xany.send_event; 187 return event && event->xany.send_event;
188 #else 188 #else
189 return false; 189 return false;
190 #endif 190 #endif
191 } 191 }
192 192
193 #if defined(USE_X11)
193 bool X11EventHasNonStandardState(const base::NativeEvent& event) { 194 bool X11EventHasNonStandardState(const base::NativeEvent& event) {
194 #if defined(USE_X11)
195 const unsigned int kAllStateMask = 195 const unsigned int kAllStateMask =
196 Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | 196 Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask |
197 Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | 197 Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask |
198 LockMask | ControlMask | AnyModifier; 198 LockMask | ControlMask | AnyModifier;
199
199 return event && (event->xkey.state & ~kAllStateMask) != 0; 200 return event && (event->xkey.state & ~kAllStateMask) != 0;
200 #else 201 }
201 return false;
202 #endif 202 #endif
203 }
204 203
205 } // namespace 204 } // namespace
206 205
207 //////////////////////////////////////////////////////////////////////////////// 206 ////////////////////////////////////////////////////////////////////////////////
208 // Event 207 // Event
209 208
210 // static 209 // static
211 std::unique_ptr<Event> Event::Clone(const Event& event) { 210 std::unique_ptr<Event> Event::Clone(const Event& event) {
212 if (event.IsKeyEvent()) { 211 if (event.IsKeyEvent()) {
213 return base::MakeUnique<KeyEvent>(static_cast<const KeyEvent&>(event)); 212 return base::MakeUnique<KeyEvent>(static_cast<const KeyEvent&>(event));
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 else if (type == ET_POINTER_WHEEL_CHANGED) 1076 else if (type == ET_POINTER_WHEEL_CHANGED)
1078 latency()->set_source_event_type(ui::SourceEventType::WHEEL); 1077 latency()->set_source_event_type(ui::SourceEventType::WHEEL);
1079 else 1078 else
1080 latency()->set_source_event_type(ui::SourceEventType::OTHER); 1079 latency()->set_source_event_type(ui::SourceEventType::OTHER);
1081 } 1080 }
1082 1081
1083 //////////////////////////////////////////////////////////////////////////////// 1082 ////////////////////////////////////////////////////////////////////////////////
1084 // KeyEvent 1083 // KeyEvent
1085 1084
1086 // static 1085 // static
1087 KeyEvent* KeyEvent::last_key_event_ = NULL; 1086 KeyEvent* KeyEvent::last_key_event_ = nullptr;
1087 #if defined(USE_X11)
1088 KeyEvent* KeyEvent::last_ibus_key_event_ = nullptr;
1089 #endif
1088 1090
1089 // static 1091 // static
1090 bool KeyEvent::IsRepeated(const KeyEvent& event) { 1092 bool KeyEvent::IsRepeated(const KeyEvent& event) {
1091 // A safe guard in case if there were continous key pressed events that are 1093 // A safe guard in case if there were continous key pressed events that are
1092 // not auto repeat. 1094 // not auto repeat.
1093 const int kMaxAutoRepeatTimeMs = 2000; 1095 const int kMaxAutoRepeatTimeMs = 2000;
1094 // Ignore key events that have non standard state masks as it may be 1096 KeyEvent** last_key_event;
1095 // reposted by an IME. IBUS-GTK uses this field to detect the 1097 #if defined(USE_X11)
1096 // re-posted event for example. crbug.com/385873. 1098 // Use a different static variable for key events that have non standard
1097 if (X11EventHasNonStandardState(event.native_event())) 1099 // state masks as it may be reposted by an IME. IBUS-GTK uses this field
1098 return false; 1100 // to detect the re-posted event for example. crbug.com/385873.
1101 last_key_event = X11EventHasNonStandardState(event.native_event())
1102 ? &last_ibus_key_event_
1103 : &last_key_event_;
1104 #else
1105 last_key_event = &last_key_event_;
1106 #endif
1099 if (event.is_char()) 1107 if (event.is_char())
1100 return false; 1108 return false;
1101 if (event.type() == ui::ET_KEY_RELEASED) { 1109 if (event.type() == ui::ET_KEY_RELEASED) {
1102 delete last_key_event_; 1110 delete *last_key_event;
1103 last_key_event_ = NULL; 1111 *last_key_event = nullptr;
1104 return false; 1112 return false;
1105 } 1113 }
1114
1106 CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); 1115 CHECK_EQ(ui::ET_KEY_PRESSED, event.type());
1107 if (!last_key_event_) { 1116 if (!(*last_key_event)) {
1108 last_key_event_ = new KeyEvent(event); 1117 *last_key_event = new KeyEvent(event);
1109 return false; 1118 return false;
1110 } else if (event.time_stamp() == last_key_event_->time_stamp()) { 1119 } else if (event.time_stamp() == (*last_key_event)->time_stamp()) {
1111 // The KeyEvent is created from the same native event. 1120 // The KeyEvent is created from the same native event.
1112 return (last_key_event_->flags() & ui::EF_IS_REPEAT) != 0; 1121 return ((*last_key_event)->flags() & ui::EF_IS_REPEAT) != 0;
1113 } 1122 }
1114 if (event.key_code() == last_key_event_->key_code() && 1123 if (event.key_code() == (*last_key_event)->key_code() &&
1115 event.flags() == (last_key_event_->flags() & ~ui::EF_IS_REPEAT) && 1124 event.flags() == ((*last_key_event)->flags() & ~ui::EF_IS_REPEAT) &&
1116 (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < 1125 (event.time_stamp() - (*last_key_event)->time_stamp()).InMilliseconds() <
1117 kMaxAutoRepeatTimeMs) { 1126 kMaxAutoRepeatTimeMs) {
1118 last_key_event_->set_time_stamp(event.time_stamp()); 1127 (*last_key_event)->set_time_stamp(event.time_stamp());
1119 last_key_event_->set_flags(last_key_event_->flags() | ui::EF_IS_REPEAT); 1128 (*last_key_event)->set_flags((*last_key_event)->flags() | ui::EF_IS_REPEAT);
1120 return true; 1129 return true;
1121 } 1130 }
1122 delete last_key_event_; 1131 delete *last_key_event;
1123 last_key_event_ = new KeyEvent(event); 1132 *last_key_event = new KeyEvent(event);
1124 return false; 1133 return false;
1125 } 1134 }
1126 1135
1127 KeyEvent::KeyEvent(const base::NativeEvent& native_event) 1136 KeyEvent::KeyEvent(const base::NativeEvent& native_event)
1128 : KeyEvent(native_event, EventFlagsFromNative(native_event)) {} 1137 : KeyEvent(native_event, EventFlagsFromNative(native_event)) {}
1129 1138
1130 KeyEvent::KeyEvent(const base::NativeEvent& native_event, int event_flags) 1139 KeyEvent::KeyEvent(const base::NativeEvent& native_event, int event_flags)
1131 : Event(native_event, EventTypeFromNative(native_event), event_flags), 1140 : Event(native_event, EventTypeFromNative(native_event), event_flags),
1132 key_code_(KeyboardCodeFromNative(native_event)), 1141 key_code_(KeyboardCodeFromNative(native_event)),
1133 code_(CodeFromNative(native_event)), 1142 code_(CodeFromNative(native_event)),
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 flags | EF_FROM_TOUCH), 1446 flags | EF_FROM_TOUCH),
1438 details_(details), 1447 details_(details),
1439 unique_touch_event_id_(unique_touch_event_id) { 1448 unique_touch_event_id_(unique_touch_event_id) {
1440 latency()->set_source_event_type(ui::SourceEventType::TOUCH); 1449 latency()->set_source_event_type(ui::SourceEventType::TOUCH);
1441 } 1450 }
1442 1451
1443 GestureEvent::~GestureEvent() { 1452 GestureEvent::~GestureEvent() {
1444 } 1453 }
1445 1454
1446 } // namespace ui 1455 } // namespace ui
OLDNEW
« 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