diff options
| author | MaxVerevkin <maxxverrr@gmail.com> | 2022-08-26 13:21:52 +0300 |
|---|---|---|
| committer | MaxVerevkin <maxxverrr@gmail.com> | 2022-08-26 13:21:52 +0300 |
| commit | a68c55c3462fa9c716a4d286a11cc451ac917800 (patch) | |
| tree | f75ee9bd55958c932d1b2b320d0c2e455a366c63 /src | |
| parent | 39cc147656e2f61f7467f4b67b4c76fd9207c2f6 (diff) | |
| download | i3bar-mango-a68c55c3462fa9c716a4d286a11cc451ac917800.tar.gz | |
feat: add invert_touchpad_scrolling option
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.rs | 4 | ||||
| -rw-r--r-- | src/state.rs | 68 |
2 files changed, 56 insertions, 16 deletions
diff --git a/src/config.rs b/src/config.rs index 9ae2395..2af9af0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -33,6 +33,7 @@ pub struct Config { pub command: Option<String>, // misc pub hide_inactive_tags: bool, + pub invert_touchpad_scrolling: bool, } impl Default for Config { @@ -57,7 +58,8 @@ impl Default for Config { blocks_r: 0.0, blocks_overlap: 0.0, command: None, - hide_inactive_tags: false, + hide_inactive_tags: true, + invert_touchpad_scrolling: true, } } } diff --git a/src/state.rs b/src/state.rs index 4dd9414..0390525 100644 --- a/src/state.rs +++ b/src/state.rs @@ -45,11 +45,17 @@ pub struct State { river_status_state: RiverStatusState, river_control_state: RiverControlState, - pointers: Vec<(wl_pointer::WlPointer, wl_seat::WlSeat)>, + seats: Vec<Seat>, bars: Vec<Bar>, pub shared_state: Option<SharedState>, } +struct Seat { + seat: wl_seat::WlSeat, + pointer: wl_pointer::WlPointer, + finger_scroll: f64, +} + impl State { pub fn new(conn: &Connection, event_queue: &mut EventQueue<Self>) -> Self { let mut error = Ok(()); @@ -77,7 +83,7 @@ impl State { river_status_state: RiverStatusState::new(), river_control_state: RiverControlState::new(), - pointers: Vec::new(), + seats: Vec::new(), bars: Vec::new(), shared_state: None, }; @@ -269,7 +275,11 @@ impl SeatHandler for State { .seat_state .get_pointer(qh, &seat) .expect("Failed to create pointer"); - self.pointers.push((pointer, seat)); + self.seats.push(Seat { + seat, + pointer, + finger_scroll: 0.0, + }); } } @@ -281,7 +291,7 @@ impl SeatHandler for State { capability: Capability, ) { if capability == Capability::Pointer { - self.pointers.retain(|p| p.1 == seat); + self.seats.retain(|p| p.seat == seat); } } @@ -296,7 +306,12 @@ impl PointerHandler for State { pointer: &wl_pointer::WlPointer, events: &[PointerEvent], ) { - let seat = &self.pointers.iter().find(|p| &p.0 == pointer).unwrap().1; + let seat = self + .seats + .iter_mut() + .find(|p| &p.pointer == pointer) + .unwrap(); + let shared_state = self.shared_state.as_mut().unwrap(); for event in events { if let Some(bar) = self .bars @@ -309,23 +324,46 @@ impl PointerHandler for State { } PointerEventKind::Press { button, .. } => { bar.click( - self.shared_state.as_mut().unwrap(), + shared_state, button.into(), - seat, + &seat.seat, event.position.0, event.position.1, ) .unwrap(); } - PointerEventKind::Axis { vertical, .. } => { - bar.click( - self.shared_state.as_mut().unwrap(), - if vertical.discrete > 0 { - PointerBtn::WheelDown + PointerEventKind::Axis { + vertical, source, .. + } => { + if source == Some(wl_pointer::AxisSource::Finger) { + if shared_state.config.invert_touchpad_scrolling { + seat.finger_scroll -= vertical.absolute; } else { - PointerBtn::WheelUp - }, - seat, + seat.finger_scroll += vertical.absolute; + } + if vertical.stop { + seat.finger_scroll = 0.0; + } + } + + let btn = if vertical.discrete > 0 { + PointerBtn::WheelDown + } else if vertical.discrete < 0 { + PointerBtn::WheelUp + } else if seat.finger_scroll >= 15.0 { + seat.finger_scroll = 0.0; + PointerBtn::WheelDown + } else if seat.finger_scroll <= -15.0 { + seat.finger_scroll = 0.0; + PointerBtn::WheelUp + } else { + continue; + }; + + bar.click( + shared_state, + btn, + &seat.seat, event.position.0, event.position.1, ) |
