diff options
author | Matt Keeler <mkeeler@users.noreply.github.com> | 2018-11-10 11:08:48 -0500 |
---|---|---|
committer | Christian Duerr <chrisduerr@users.noreply.github.com> | 2018-11-10 16:08:48 +0000 |
commit | 2434547fce7bf47a848f088f2600e8ba7027a62b (patch) | |
tree | 551a50b1071e6208c76c9e26b38b40f60605f2c7 /src/event.rs | |
parent | 81617983bb4b3b17f18dab938bb572757aa54920 (diff) | |
download | alacritty-2434547fce7bf47a848f088f2600e8ba7027a62b.tar.gz alacritty-2434547fce7bf47a848f088f2600e8ba7027a62b.zip |
Upgrade Glutin to v0.19.0
Some changes include:
• Use the with_hardware_acceleration function on the ContextBuilder to not require the discrete GPU
• Remove the LMenu and RMenu virtual key codes (winit 0.16.0 removed these because Windows now generates LAlt and RAlt instead
• Replace set_cursor_state with hide_cursor (winit 0.16.0 removed the set_cursor_state function)
• Replace GlWindow::hidpi_factor with GlWindow::get_hidpi_factor and change to expecting an f64
• Use the glutin/winit dpi size and position types where possible
Glutin's dpi change event has been implemented. All size events now
return logical sizes. As a result of that, the logical sizes are translated
in the `display::handle_rezize` method so DPI scaling works correctly.
When the DPI is changed, the glyph cache is updated to make use of the
correct font size again.
Moving a window to a different screen which is a different DPI caused a
racing condition where the logical size of the event was sent to the
`handle_resize` method in `src/display.rs`, however if there was a DPI
change event before `handle_resize` is able to process this message, it
would incorrectly use the new DPI to scale the resize event.
To solve this issue instead of sending the logical size to the
`handle_resize` method and then converting it to a physical size in
there, the `LogicalSize` of the resize event is transformed into a
`PhysicalSize` as soon as it's received. This fixes potential racing
conditions since all events are processed in order.
The padding has been changed so it's also scaled by DPR.
The `scale_with_dpi` config option has been removed. If it's not present
a warning will be emitted.
The `winit` dependency on Windows has been removed. All interactions
with winit in Alacritty are handled through glutin.
Diffstat (limited to 'src/event.rs')
-rw-r--r-- | src/event.rs | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/event.rs b/src/event.rs index b3def0eb..a61450f3 100644 --- a/src/event.rs +++ b/src/event.rs @@ -23,6 +23,7 @@ use term::{Term, SizeInfo, TermMode, Search}; use util::limit; use util::fmt::Red; use window::Window; +use PhysicalSize; /// Byte sequences are sent to a `Notify` in response to some events pub trait Notify { @@ -35,7 +36,7 @@ pub trait Notify { pub struct ActionContext<'a, N: 'a> { pub notifier: &'a mut N, pub terminal: &'a mut Term, - pub size_info: &'a SizeInfo, + pub size_info: &'a mut SizeInfo, pub mouse: &'a mut Mouse, pub received_count: &'a mut usize, pub suppress_chars: &'a mut bool, @@ -251,7 +252,7 @@ pub struct Processor<N> { wait_for_event: bool, notifier: N, mouse: Mouse, - resize_tx: mpsc::Sender<(u32, u32)>, + resize_tx: mpsc::Sender<PhysicalSize>, ref_test: bool, size_info: SizeInfo, hide_mouse_when_typing: bool, @@ -280,7 +281,7 @@ impl<N: Notify> Processor<N> { /// pty. pub fn new( notifier: N, - resize_tx: mpsc::Sender<(u32, u32)>, + resize_tx: mpsc::Sender<PhysicalSize>, options: &Options, config: &Config, ref_test: bool, @@ -316,7 +317,7 @@ impl<N: Notify> Processor<N> { processor: &mut input::Processor<'a, ActionContext<'a, N>>, event: Event, ref_test: bool, - resize_tx: &mpsc::Sender<(u32, u32)>, + resize_tx: &mpsc::Sender<PhysicalSize>, hide_mouse: &mut bool, window_is_focused: &mut bool, ) { @@ -350,8 +351,13 @@ impl<N: Notify> Processor<N> { // FIXME should do a more graceful shutdown ::std::process::exit(0); }, - Resized(w, h) => { - resize_tx.send((w, h)).expect("send new size"); + Resized(lsize) => { + // Resize events are emitted via glutin/winit with logical sizes + // However the terminal, window and renderer use physical sizes + // so a conversion must be done here + resize_tx + .send(lsize.to_physical(processor.ctx.size_info.dpr)) + .expect("send new size"); processor.ctx.terminal.dirty = true; }, KeyboardInput { input, .. } => { @@ -371,9 +377,10 @@ impl<N: Notify> Processor<N> { processor.ctx.terminal.dirty = true; } }, - CursorMoved { position: (x, y), modifiers, .. } => { - let x = limit(x as i32, 0, processor.ctx.size_info.width as i32); - let y = limit(y as i32, 0, processor.ctx.size_info.height as i32); + CursorMoved { position: lpos, modifiers, .. } => { + let (x, y) = lpos.to_physical(processor.ctx.size_info.dpr).into(); + let x: i32 = limit(x, 0, processor.ctx.size_info.width as i32); + let y: i32 = limit(y, 0, processor.ctx.size_info.height as i32); *hide_mouse = false; processor.mouse_moved(x as usize, y as usize, modifiers); @@ -402,7 +409,11 @@ impl<N: Notify> Processor<N> { use input::ActionContext; let path: String = path.to_string_lossy().into(); processor.ctx.write_to_pty(path.into_bytes()); - } + }, + HiDpiFactorChanged(new_dpr) => { + processor.ctx.size_info.dpr = new_dpr; + processor.ctx.terminal.dirty = true; + }, _ => (), } }, @@ -453,7 +464,7 @@ impl<N: Notify> Processor<N> { terminal: &mut terminal, notifier: &mut self.notifier, mouse: &mut self.mouse, - size_info: &self.size_info, + size_info: &mut self.size_info, received_count: &mut self.received_count, suppress_chars: &mut self.suppress_chars, last_modifiers: &mut self.last_modifiers, |