tree: support toggling floating with double clicks
This commit is contained in:
parent
a588b9044d
commit
d425768760
11 changed files with 137 additions and 14 deletions
35
src/utils/double_click_state.rs
Normal file
35
src/utils/double_click_state.rs
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
use crate::state::State;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct DoubleClickState {
|
||||
last_click: Option<(u64, i32, i32)>,
|
||||
}
|
||||
|
||||
impl DoubleClickState {
|
||||
pub fn click(&mut self, state: &State, time_usec: u64, x: i32, y: i32) -> bool {
|
||||
let res = self.click_(state, time_usec, x, y);
|
||||
if !res {
|
||||
self.last_click = Some((time_usec, x, y));
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
fn click_(&mut self, state: &State, time_usec: u64, x: i32, y: i32) -> bool {
|
||||
let Some((last_usec, last_x, last_y)) = self.last_click.take() else {
|
||||
return false;
|
||||
};
|
||||
if time_usec.wrapping_sub(last_usec) > state.double_click_interval_usec.get() {
|
||||
return false;
|
||||
}
|
||||
let max_dist = state.double_click_distance.get();
|
||||
if max_dist < 0 {
|
||||
return false;
|
||||
}
|
||||
let dist_x = last_x - x;
|
||||
let dist_y = last_y - y;
|
||||
if dist_x * dist_x + dist_y * dist_y > max_dist * max_dist {
|
||||
return false;
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue