diff options
Diffstat (limited to 'alacritty/src')
-rw-r--r-- | alacritty/src/event.rs | 59 | ||||
-rw-r--r-- | alacritty/src/scheduler.rs | 1 | ||||
-rw-r--r-- | alacritty/src/window_context.rs | 3 |
3 files changed, 52 insertions, 11 deletions
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index 2955ab8c..f91ef962 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -90,6 +90,7 @@ pub enum EventType { Scroll(Scroll), CreateWindow(WindowOptions), BlinkCursor, + BlinkCursorTimeout, SearchNext, } @@ -180,6 +181,7 @@ pub struct ActionContext<'a, N, T> { pub display: &'a mut Display, pub message_buffer: &'a mut MessageBuffer, pub config: &'a mut UiConfig, + pub cursor_blink_timed_out: &'a mut bool, pub event_loop: &'a EventLoopWindowTarget<Event>, pub event_proxy: &'a EventLoopProxy<Event>, pub scheduler: &'a mut Scheduler, @@ -647,14 +649,15 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon fn on_typing_start(&mut self) { // Disable cursor blinking. let timer_id = TimerId::new(Topic::BlinkCursor, self.display.window.id()); - if let Some(timer) = self.scheduler.unschedule(timer_id) { - let interval = - Duration::from_millis(self.config.terminal_config.cursor.blink_interval()); - self.scheduler.schedule(timer.event, interval, true, timer.id); + if self.scheduler.unschedule(timer_id).is_some() { + self.schedule_blinking(); self.display.cursor_hidden = false; - *self.dirty = true; + } else if *self.cursor_blink_timed_out { + self.update_cursor_blinking(); } + *self.dirty = true; + // Hide mouse cursor. if self.config.mouse.hide_when_typing { self.display.window.set_mouse_visible(false); @@ -945,18 +948,44 @@ impl<'a, N: Notify + 'a, T: EventListener> ActionContext<'a, N, T> { blinking &= vi_mode || self.terminal().mode().contains(TermMode::SHOW_CURSOR); // Update cursor blinking state. - let timer_id = TimerId::new(Topic::BlinkCursor, self.display.window.id()); - self.scheduler.unschedule(timer_id); + let window_id = self.display.window.id(); + self.scheduler.unschedule(TimerId::new(Topic::BlinkCursor, window_id)); + self.scheduler.unschedule(TimerId::new(Topic::BlinkTimeout, window_id)); + + // Reset blinkinig timeout. + *self.cursor_blink_timed_out = false; + if blinking && self.terminal.is_focused { - let event = Event::new(EventType::BlinkCursor, self.display.window.id()); - let interval = - Duration::from_millis(self.config.terminal_config.cursor.blink_interval()); - self.scheduler.schedule(event, interval, true, timer_id); + self.schedule_blinking(); + self.schedule_blinking_timeout(); } else { self.display.cursor_hidden = false; *self.dirty = true; } } + + fn schedule_blinking(&mut self) { + let window_id = self.display.window.id(); + let timer_id = TimerId::new(Topic::BlinkCursor, window_id); + let event = Event::new(EventType::BlinkCursor, window_id); + let blinking_interval = + Duration::from_millis(self.config.terminal_config.cursor.blink_interval()); + self.scheduler.schedule(event, blinking_interval, true, timer_id); + } + + fn schedule_blinking_timeout(&mut self) { + let blinking_timeout = self.config.terminal_config.cursor.blink_timeout(); + if blinking_timeout == 0 { + return; + } + + let window_id = self.display.window.id(); + let blinking_timeout_interval = Duration::from_secs(blinking_timeout); + let event = Event::new(EventType::BlinkCursorTimeout, window_id); + let timer_id = TimerId::new(Topic::BlinkTimeout, window_id); + + self.scheduler.schedule(event, blinking_timeout_interval, false, timer_id); + } } #[derive(Debug, Eq, PartialEq)] @@ -1048,6 +1077,14 @@ impl input::Processor<EventProxy, ActionContext<'_, Notifier, EventProxy>> { self.ctx.display.cursor_hidden ^= true; *self.ctx.dirty = true; }, + EventType::BlinkCursorTimeout => { + // Disable blinking after timeout reached. + let timer_id = TimerId::new(Topic::BlinkCursor, self.ctx.display.window.id()); + self.ctx.scheduler.unschedule(timer_id); + self.ctx.display.cursor_hidden = false; + *self.ctx.cursor_blink_timed_out = true; + *self.ctx.dirty = true; + }, EventType::Message(message) => { self.ctx.message_buffer.push(message); self.ctx.display.pending_update.dirty = true; diff --git a/alacritty/src/scheduler.rs b/alacritty/src/scheduler.rs index 924f5904..08388b94 100644 --- a/alacritty/src/scheduler.rs +++ b/alacritty/src/scheduler.rs @@ -27,6 +27,7 @@ pub enum Topic { SelectionScrolling, DelayedSearch, BlinkCursor, + BlinkTimeout, } /// Event scheduled to be emitted at a specific time. diff --git a/alacritty/src/window_context.rs b/alacritty/src/window_context.rs index f04a8e04..a45b9404 100644 --- a/alacritty/src/window_context.rs +++ b/alacritty/src/window_context.rs @@ -43,6 +43,7 @@ pub struct WindowContext { pub display: Display, event_queue: Vec<GlutinEvent<'static, Event>>, terminal: Arc<FairMutex<Term<EventProxy>>>, + cursor_blink_timed_out: bool, modifiers: ModifiersState, search_state: SearchState, received_count: usize, @@ -151,6 +152,7 @@ impl WindowContext { master_fd, #[cfg(not(windows))] shell_pid, + cursor_blink_timed_out: Default::default(), suppress_chars: Default::default(), message_buffer: Default::default(), received_count: Default::default(), @@ -267,6 +269,7 @@ impl WindowContext { let old_is_searching = self.search_state.history_index.is_some(); let context = ActionContext { + cursor_blink_timed_out: &mut self.cursor_blink_timed_out, message_buffer: &mut self.message_buffer, received_count: &mut self.received_count, suppress_chars: &mut self.suppress_chars, |