Skip to content

Commit

Permalink
Prefer exact matches for bindings in mouse mode
Browse files Browse the repository at this point in the history
Only consider bindings without Shift if there are no actions defined for the
actual mouse event.

Closes alacritty#7292.
  • Loading branch information
proski authored Oct 25, 2023
1 parent d66db48 commit 500b696
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 10 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Apply `colors.transparent_background_colors` for selections, hints, and search matches
- Underline full hint during keyboard selection
- Synchronized updates now use `CSI 2026` instead of legacy `DCS` variant
- In mouse mode with `Shift` pressed, mouse bindings without `Shift` are only triggered
if no exact binding (i.e. one with `Shift`) is found.

### Fixed

Expand Down
21 changes: 14 additions & 7 deletions alacritty/src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1003,17 +1003,24 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> {
let mode = BindingMode::new(self.ctx.terminal().mode(), self.ctx.search_active());
let mouse_mode = self.ctx.mouse_mode();
let mods = self.ctx.modifiers().state();
let mouse_bindings = self.ctx.config().mouse_bindings().to_owned();

for i in 0..self.ctx.config().mouse_bindings().len() {
let mut binding = self.ctx.config().mouse_bindings()[i].clone();

// Require shift for all modifiers when mouse mode is active.
if mouse_mode {
binding.mods |= ModifiersState::SHIFT;
}
// If mouse mode is active, also look for bindings without shift.
let mut check_fallback = mouse_mode && mods.contains(ModifiersState::SHIFT);

for binding in &mouse_bindings {
if binding.is_triggered_by(mode, mods, &button) {
binding.action.execute(&mut self.ctx);
check_fallback = false;
}
}

if check_fallback {
let fallback_mods = mods & !ModifiersState::SHIFT;
for binding in &mouse_bindings {
if binding.is_triggered_by(mode, fallback_mods, &button) {
binding.action.execute(&mut self.ctx);
}
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions extra/man/alacritty.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -583,9 +583,10 @@ This section documents the *[mouse]* table of the configuration file.
See _keyboard.bindings_ for full documentation on _mods_, _mode_, _action_,
and _chars_.

To trigger mouse bindings when an application running within Alacritty
captures the mouse, the `Shift` modifier is automatically added as a
requirement.
When an application running within Alacritty captures the mouse, the `Shift`
modifier can be used to suppress mouse reporting. If no action is found for
the event, actions for the event without the `Shift` modifier are triggered
instead.

*mouse* "Middle" | "Left" | "Right" | "Back" | "Forward" | <number>

Expand Down

0 comments on commit 500b696

Please sign in to comment.