diff options
author | Christian Duerr <contact@christianduerr.com> | 2021-04-17 19:28:23 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-17 19:28:23 +0000 |
commit | a312e415951fcb9156572f124b42f68c09f60ae9 (patch) | |
tree | 55f5a931fb8b720783bad5159b0a0ec175106270 | |
parent | 33d4b833dca46b775f485d0547f9f8804849fe8a (diff) | |
download | alacritty-a312e415951fcb9156572f124b42f68c09f60ae9.tar.gz alacritty-a312e415951fcb9156572f124b42f68c09f60ae9.zip |
Fix selection flooding Wayland connection
This resolves an issue where an excessive clipboard update frequency
would cause the Wayland display server to ignore necessary selection
updates.
Instead of copying the selection to the clipboard during the selection
process, it is now only copied once the mouse button is released.
Fixes #4953.
-rw-r--r-- | alacritty/src/event.rs | 7 | ||||
-rw-r--r-- | alacritty/src/input.rs | 3 |
2 files changed, 7 insertions, 3 deletions
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index e61354b8..612a0cc0 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -206,7 +206,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon // Update selection. if self.terminal.mode().contains(TermMode::VI) - && self.terminal.selection.as_ref().map(|s| s.is_empty()) != Some(true) + && self.terminal.selection.as_ref().map_or(true, |s| !s.is_empty()) { self.update_selection(self.terminal.vi_mode_cursor.point, Side::Right); } else if self.mouse.left_button_state == ElementState::Pressed @@ -216,6 +216,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon let point = self.mouse.point(&self.size_info(), display_offset); self.update_selection(point, self.mouse.cell_side); } + self.copy_selection(ClipboardType::Selection); *self.dirty = true; } @@ -262,8 +263,6 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon self.terminal.selection = Some(selection); *self.dirty = true; - - self.copy_selection(ClipboardType::Selection); } fn start_selection(&mut self, ty: SelectionType, point: Point, side: Side) { @@ -461,6 +460,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon let end = *focused_match.end(); self.start_selection(SelectionType::Simple, start, Side::Left); self.update_selection(end, Side::Right); + self.copy_selection(ClipboardType::Selection); } self.search_state.dfas = None; @@ -656,6 +656,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon HintAction::Action(HintInternalAction::Select) => { self.start_selection(SelectionType::Simple, *hint.bounds.start(), Side::Left); self.update_selection(*hint.bounds.end(), Side::Right); + self.copy_selection(ClipboardType::Selection); }, // Move the vi mode cursor. HintAction::Action(HintInternalAction::MoveViModeCursor) => { diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs index 977a6e5d..3559b85e 100644 --- a/alacritty/src/input.rs +++ b/alacritty/src/input.rs @@ -634,6 +634,9 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { self.ctx.display().highlighted_hint = hint; self.ctx.scheduler_mut().unschedule(TimerId::SelectionScrolling); + + // Copy selection on release, to prevent flooding the display server. + self.ctx.copy_selection(ClipboardType::Selection); } pub fn mouse_wheel_input(&mut self, delta: MouseScrollDelta, phase: TouchPhase) { |