aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/event.rs')
-rw-r--r--alacritty/src/event.rs92
1 files changed, 53 insertions, 39 deletions
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs
index 225dc2b5..75e06f30 100644
--- a/alacritty/src/event.rs
+++ b/alacritty/src/event.rs
@@ -1,5 +1,6 @@
//! Process window events
use std::borrow::Cow;
+use std::cmp::max;
use std::env;
#[cfg(unix)]
use std::fs;
@@ -20,6 +21,7 @@ use serde_json as json;
use font::Size;
use alacritty_terminal::clipboard::ClipboardType;
+use alacritty_terminal::config::Font;
use alacritty_terminal::config::LOG_TARGET_CONFIG;
use alacritty_terminal::event::OnResize;
use alacritty_terminal::event::{Event, EventListener, Notify};
@@ -36,25 +38,19 @@ use alacritty_terminal::util::{limit, start_daemon};
use crate::config;
use crate::config::Config;
use crate::display::Display;
-use crate::input::{self, ActionContext as _, Modifiers};
+use crate::input::{self, ActionContext as _, Modifiers, FONT_SIZE_STEP};
use crate::window::Window;
-#[derive(Copy, Clone, Debug, PartialEq)]
-pub enum FontResize {
- Delta(f32),
- Reset,
-}
-
-#[derive(Default, Copy, Clone, Debug, PartialEq)]
-pub struct Resize {
+#[derive(Default, Clone, Debug, PartialEq)]
+pub struct DisplayUpdate {
pub dimensions: Option<PhysicalSize>,
pub message_buffer: Option<()>,
- pub font_size: Option<FontResize>,
+ pub font: Option<Font>,
}
-impl Resize {
+impl DisplayUpdate {
fn is_empty(&self) -> bool {
- self.dimensions.is_none() && self.font_size.is_none() && self.message_buffer.is_none()
+ self.dimensions.is_none() && self.font.is_none() && self.message_buffer.is_none()
}
}
@@ -68,8 +64,9 @@ pub struct ActionContext<'a, N, T> {
pub modifiers: &'a mut Modifiers,
pub window: &'a mut Window,
pub message_buffer: &'a mut MessageBuffer,
- pub resize_pending: &'a mut Resize,
- pub font_size: &'a Size,
+ pub display_update_pending: &'a mut DisplayUpdate,
+ pub config: &'a mut Config,
+ font_size: &'a mut Size,
}
impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionContext<'a, N, T> {
@@ -227,23 +224,30 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon
}
fn change_font_size(&mut self, delta: f32) {
- self.resize_pending.font_size = Some(FontResize::Delta(delta));
+ *self.font_size = max(*self.font_size + delta, Size::new(FONT_SIZE_STEP));
+ let font = self.config.font.clone().with_size(*self.font_size);
+ self.display_update_pending.font = Some(font);
self.terminal.dirty = true;
}
fn reset_font_size(&mut self) {
- self.resize_pending.font_size = Some(FontResize::Reset);
+ *self.font_size = self.config.font.size;
+ self.display_update_pending.font = Some(self.config.font.clone());
self.terminal.dirty = true;
}
fn pop_message(&mut self) {
- self.resize_pending.message_buffer = Some(());
+ self.display_update_pending.message_buffer = Some(());
self.message_buffer.pop();
}
fn message(&self) -> Option<&Message> {
self.message_buffer.message()
}
+
+ fn config(&self) -> &Config {
+ self.config
+ }
}
pub enum ClickState {
@@ -306,6 +310,7 @@ pub struct Processor<N> {
pty_resize_handle: Box<dyn OnResize>,
message_buffer: MessageBuffer,
display: Display,
+ font_size: Size,
}
impl<N: Notify> Processor<N> {
@@ -326,6 +331,7 @@ impl<N: Notify> Processor<N> {
received_count: 0,
suppress_chars: false,
modifiers: Default::default(),
+ font_size: config.font.size,
config,
pty_resize_handle,
message_buffer,
@@ -374,7 +380,7 @@ impl<N: Notify> Processor<N> {
let mut terminal = terminal.lock();
- let mut resize_pending = Resize::default();
+ let mut display_update_pending = DisplayUpdate::default();
let context = ActionContext {
terminal: &mut terminal,
@@ -385,11 +391,12 @@ impl<N: Notify> Processor<N> {
suppress_chars: &mut self.suppress_chars,
modifiers: &mut self.modifiers,
message_buffer: &mut self.message_buffer,
- resize_pending: &mut resize_pending,
+ display_update_pending: &mut display_update_pending,
window: &mut self.display.window,
- font_size: &self.display.font_size,
+ font_size: &mut self.font_size,
+ config: &mut self.config,
};
- let mut processor = input::Processor::new(context, &mut self.config);
+ let mut processor = input::Processor::new(context);
for event in event_queue.drain(..) {
Processor::handle_event(event, &mut processor);
@@ -407,21 +414,21 @@ impl<N: Notify> Processor<N> {
let size = self.display.window.inner_size().to_physical(dpr);
- resize_pending.font_size = Some(FontResize::Delta(0.));
- resize_pending.dimensions = Some(size);
+ display_update_pending.font = Some(self.config.font.clone());
+ display_update_pending.dimensions = Some(size);
terminal.dirty = true;
}
}
- // Process resize events
- if !resize_pending.is_empty() {
- self.display.handle_resize(
+ // Process DisplayUpdate events
+ if !display_update_pending.is_empty() {
+ self.display.handle_update(
&mut terminal,
self.pty_resize_handle.as_mut(),
&self.message_buffer,
&self.config,
- resize_pending,
+ display_update_pending,
);
}
@@ -460,23 +467,29 @@ impl<N: Notify> Processor<N> {
},
Event::ConfigReload(path) => {
processor.ctx.message_buffer.remove_target(LOG_TARGET_CONFIG);
- processor.ctx.resize_pending.message_buffer = Some(());
+ processor.ctx.display_update_pending.message_buffer = Some(());
if let Ok(config) = config::reload_from(&path) {
processor.ctx.terminal.update_config(&config);
- if *processor.ctx.font_size == processor.config.font.size {
- processor.ctx.resize_pending.font_size = Some(FontResize::Reset);
+ if processor.ctx.config.font != config.font {
+ // Do not update font size if it has been changed at runtime
+ if *processor.ctx.font_size == processor.ctx.config.font.size {
+ *processor.ctx.font_size = config.font.size;
+ }
+
+ let font = config.font.clone().with_size(*processor.ctx.font_size);
+ processor.ctx.display_update_pending.font = Some(font);
}
- *processor.config = config;
+ *processor.ctx.config = config;
processor.ctx.terminal.dirty = true;
}
},
Event::Message(message) => {
processor.ctx.message_buffer.push(message);
- processor.ctx.resize_pending.message_buffer = Some(());
+ processor.ctx.display_update_pending.message_buffer = Some(());
processor.ctx.terminal.dirty = true;
},
Event::MouseCursorDirty => processor.reset_mouse_cursor(),
@@ -488,14 +501,14 @@ impl<N: Notify> Processor<N> {
CloseRequested => processor.ctx.terminal.exit(),
Resized(lsize) => {
let psize = lsize.to_physical(processor.ctx.size_info.dpr);
- processor.ctx.resize_pending.dimensions = Some(psize);
+ processor.ctx.display_update_pending.dimensions = Some(psize);
processor.ctx.terminal.dirty = true;
},
KeyboardInput { input, .. } => {
processor.process_key(input);
if input.state == ElementState::Pressed {
// Hide cursor while typing
- if processor.config.ui_config.mouse.hide_when_typing {
+ if processor.ctx.config.ui_config.mouse.hide_when_typing {
processor.ctx.window.set_mouse_visible(false);
}
}
@@ -540,17 +553,18 @@ impl<N: Notify> Processor<N> {
},
HiDpiFactorChanged(dpr) => {
let dpr_change = (dpr / processor.ctx.size_info.dpr) as f32;
- let resize_pending = &mut processor.ctx.resize_pending;
+ let display_update_pending = &mut processor.ctx.display_update_pending;
// Push current font to update its DPR
- resize_pending.font_size = Some(FontResize::Delta(0.));
+ display_update_pending.font = Some(processor.ctx.config.font.clone());
// Scale window dimensions with new DPR
let old_width = processor.ctx.size_info.width;
let old_height = processor.ctx.size_info.height;
- let dimensions = resize_pending.dimensions.get_or_insert_with(|| {
- PhysicalSize::new(f64::from(old_width), f64::from(old_height))
- });
+ let dimensions =
+ display_update_pending.dimensions.get_or_insert_with(|| {
+ PhysicalSize::new(f64::from(old_width), f64::from(old_height))
+ });
dimensions.width *= f64::from(dpr_change);
dimensions.height *= f64::from(dpr_change);