aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src')
-rw-r--r--alacritty/src/event.rs59
-rw-r--r--alacritty/src/scheduler.rs1
-rw-r--r--alacritty/src/window_context.rs3
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,