1
1
mirror of https://github.com/wez/wezterm.git synced 2025-01-03 03:04:04 +03:00

Ignore mouse clicks that coincide with window focusing

Now that we can track focus changes, we can eliminate an annoyance:
clicking in the window to focus it would cause a click event to
be passed to the terminal and clear the selection.

This commit will swallow button events that occur within 200ms
of the focus being gained by the window.
This commit is contained in:
Wez Furlong 2019-12-31 14:01:41 -08:00
parent 8485e5db0c
commit 699d092a6b

View File

@ -102,7 +102,8 @@ impl PrevCursorPos {
pub struct TermWindow { pub struct TermWindow {
window: Option<Window>, window: Option<Window>,
focused: bool, /// When we most recently received keyboard focus
focused: Option<Instant>,
fonts: Rc<FontConfiguration>, fonts: Rc<FontConfiguration>,
/// Window dimensions and dpi /// Window dimensions and dpi
dimensions: Dimensions, dimensions: Dimensions,
@ -189,7 +190,7 @@ impl WindowCallbacks for TermWindow {
fn focus_change(&mut self, focused: bool) { fn focus_change(&mut self, focused: bool) {
log::trace!("Setting focus to {:?}", focused); log::trace!("Setting focus to {:?}", focused);
self.focused = focused; self.focused = if focused { Some(Instant::now()) } else { None };
// Reset the cursor blink phase // Reset the cursor blink phase
self.prev_cursor.bump(); self.prev_cursor.bump();
@ -219,6 +220,15 @@ impl WindowCallbacks for TermWindow {
return; return;
} }
} }
WMEK::Press(_) => {
if let Some(focused) = self.focused.as_ref() {
let now = Instant::now();
if now - *focused <= Duration::from_millis(200) {
log::trace!("discard mouse click because it focused the window");
return;
}
}
}
WMEK::Move => { WMEK::Move => {
if let Some(from_top) = self.scroll_drag_start.as_ref() { if let Some(from_top) = self.scroll_drag_start.as_ref() {
// Dragging the scroll bar // Dragging the scroll bar
@ -633,7 +643,7 @@ impl TermWindow {
dimensions.pixel_height, dimensions.pixel_height,
Box::new(Self { Box::new(Self {
window: None, window: None,
focused: false, focused: None,
mux_window_id, mux_window_id,
fonts: Rc::clone(fontconfig), fonts: Rc::clone(fontconfig),
render_metrics, render_metrics,
@ -2135,7 +2145,8 @@ impl TermWindow {
let shape = config.default_cursor_style.effective_shape(cursor.shape); let shape = config.default_cursor_style.effective_shape(cursor.shape);
// Work out the blinking shape if its a blinking cursor and it hasn't been disabled // Work out the blinking shape if its a blinking cursor and it hasn't been disabled
// and the window is focused. // and the window is focused.
let blinking = shape.is_blinking() && config.cursor_blink_rate != 0 && self.focused; let blinking =
shape.is_blinking() && config.cursor_blink_rate != 0 && self.focused.is_some();
if blinking { if blinking {
// Divide the time since we last moved by the blink rate. // Divide the time since we last moved by the blink rate.
// If the result is even then the cursor is "on", else it // If the result is even then the cursor is "on", else it
@ -2157,7 +2168,7 @@ impl TermWindow {
CursorShape::Hidden CursorShape::Hidden
}; };
let (fg_color, bg_color) = match (selected, self.focused, cursor_shape) { let (fg_color, bg_color) = match (selected, self.focused.is_some(), cursor_shape) {
// Selected text overrides colors // Selected text overrides colors
(true, _, CursorShape::Hidden) => ( (true, _, CursorShape::Hidden) => (
rgbcolor_to_window_color(palette.selection_fg), rgbcolor_to_window_color(palette.selection_fg),