diff --git a/crates/egui/src/data/input.rs b/crates/egui/src/data/input.rs index 8cf23732357..b3fbcba081e 100644 --- a/crates/egui/src/data/input.rs +++ b/crates/egui/src/data/input.rs @@ -191,6 +191,14 @@ pub enum Event { modifiers: Modifiers, }, + /// A key was repeated while pressed. + KeyRepeat { + key: Key, + + /// The state of the modifier keys at the time of the event. + modifiers: Modifiers, + }, + /// The mouse or touch moved to a new place. PointerMoved(Pos2), diff --git a/crates/egui/src/input_state.rs b/crates/egui/src/input_state.rs index 106a678f6ee..0d5593d8c3b 100644 --- a/crates/egui/src/input_state.rs +++ b/crates/egui/src/input_state.rs @@ -164,26 +164,36 @@ impl InputState { let mut keys_down = self.keys_down; let mut scroll_delta = Vec2::ZERO; let mut zoom_factor_delta = 1.0; - new.events.retain(|event| match event { - Event::Key { key, pressed, .. } => { - if *pressed { - // We only retain presses that are novel (i.e. the first Press event, not those generated by key-repeat) - keys_down.insert(*key) - } else { - keys_down.remove(key); - true + for event in &mut new.events { + match event { + Event::Key { + key, + pressed, + modifiers, + } => { + if *pressed { + // We only retain presses that are novel (i.e. the first Press event, not those generated by key-repeat) + // key repeats are represented by KeyRepeat. + if !keys_down.insert(*key) { + *event = Event::KeyRepeat { + key: *key, + modifiers: *modifiers, + }; + } + } else { + keys_down.remove(key); + } } + Event::Scroll(delta) => { + scroll_delta += *delta; + } + Event::Zoom(factor) => { + zoom_factor_delta *= *factor; + } + _ => {} } - Event::Scroll(delta) => { - scroll_delta += *delta; - true - } - Event::Zoom(factor) => { - zoom_factor_delta *= *factor; - true - } - _ => true, - }); + } + InputState { pointer, touch_states: self.touch_states,