aboutsummaryrefslogtreecommitdiff
path: root/src/input
diff options
context:
space:
mode:
Diffstat (limited to 'src/input')
-rw-r--r--src/input/mod.rs67
1 files changed, 55 insertions, 12 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs
index 8ce00712..c86e1467 100644
--- a/src/input/mod.rs
+++ b/src/input/mod.rs
@@ -1656,11 +1656,43 @@ impl State {
let serial = SERIAL_COUNTER.next_serial();
- let button = event.button_code();
+ let button = event.button();
+
+ let button_code = event.button_code();
let button_state = event.state();
+ // Ignore release events for mouse clicks that triggered a bind.
+ if self.niri.suppressed_buttons.remove(&button_code) {
+ return;
+ }
+
if ButtonState::Pressed == button_state {
+ let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
+ let modifiers = modifiers_from_state(mods);
+
+ if self.niri.mods_with_mouse_binds.contains(&modifiers) {
+ let comp_mod = self.backend.mod_key();
+
+ if let Some(bind) = match button {
+ Some(MouseButton::Left) => Some(Trigger::MouseLeft),
+ Some(MouseButton::Right) => Some(Trigger::MouseRight),
+ Some(MouseButton::Middle) => Some(Trigger::MouseMiddle),
+ Some(MouseButton::Back) => Some(Trigger::MouseBack),
+ Some(MouseButton::Forward) => Some(Trigger::MouseForward),
+ _ => None,
+ }
+ .and_then(|trigger| {
+ let config = self.niri.config.borrow();
+ let bindings = &config.binds;
+ find_configured_bind(bindings, comp_mod, trigger, mods)
+ }) {
+ self.niri.suppressed_buttons.insert(button_code);
+ self.handle_bind(bind.clone());
+ return;
+ };
+ }
+
// We received an event for the regular pointer, so show it now.
self.niri.pointer_hidden = false;
self.niri.tablet_cursor_location = None;
@@ -1669,8 +1701,7 @@ impl State {
let window = mapped.window.clone();
// Check if we need to start an interactive move.
- if event.button() == Some(MouseButton::Left) && !pointer.is_grabbed() {
- let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
+ if button == Some(MouseButton::Left) && !pointer.is_grabbed() {
let mod_down = match self.backend.mod_key() {
CompositorMod::Super => mods.logo,
CompositorMod::Alt => mods.alt,
@@ -1689,7 +1720,7 @@ impl State {
) {
let start_data = PointerGrabStartData {
focus: None,
- button: event.button_code(),
+ button: button_code,
location,
};
let grab = MoveGrab::new(start_data, window.clone());
@@ -1701,8 +1732,7 @@ impl State {
}
}
// Check if we need to start an interactive resize.
- else if event.button() == Some(MouseButton::Right) && !pointer.is_grabbed() {
- let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
+ else if button == Some(MouseButton::Right) && !pointer.is_grabbed() {
let mod_down = match self.backend.mod_key() {
CompositorMod::Super => mods.logo,
CompositorMod::Alt => mods.alt,
@@ -1762,7 +1792,7 @@ impl State {
{
let start_data = PointerGrabStartData {
focus: None,
- button: event.button_code(),
+ button: button_code,
location,
};
let grab = ResizeGrab::new(start_data, window.clone());
@@ -1786,8 +1816,7 @@ impl State {
self.niri.queue_redraw_all();
}
- if event.button() == Some(MouseButton::Middle) && !pointer.is_grabbed() {
- let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
+ if button == Some(MouseButton::Middle) && !pointer.is_grabbed() {
let mod_down = match self.backend.mod_key() {
CompositorMod::Super => mods.logo,
CompositorMod::Alt => mods.alt,
@@ -1797,7 +1826,7 @@ impl State {
let location = pointer.current_location();
let start_data = PointerGrabStartData {
focus: None,
- button: event.button_code(),
+ button: button_code,
location,
};
let grab = SpatialMovementGrab::new(start_data, output);
@@ -1817,7 +1846,7 @@ impl State {
self.niri.focus_layer_surface_if_on_demand(layer_under);
}
- if let Some(button) = event.button() {
+ if let Some(button) = button {
let pos = pointer.current_location();
if let Some((output, _)) = self.niri.output_under(pos) {
let output = output.clone();
@@ -1845,7 +1874,7 @@ impl State {
pointer.button(
self,
&ButtonEvent {
- button,
+ button: button_code,
state: button_state,
serial,
time: event.time_msec(),
@@ -3110,6 +3139,20 @@ pub fn mods_with_binds(
rv
}
+pub fn mods_with_mouse_binds(comp_mod: CompositorMod, binds: &Binds) -> HashSet<Modifiers> {
+ mods_with_binds(
+ comp_mod,
+ binds,
+ &[
+ Trigger::MouseLeft,
+ Trigger::MouseRight,
+ Trigger::MouseMiddle,
+ Trigger::MouseBack,
+ Trigger::MouseForward,
+ ],
+ )
+}
+
pub fn mods_with_wheel_binds(comp_mod: CompositorMod, binds: &Binds) -> HashSet<Modifiers> {
mods_with_binds(
comp_mod,