use { crate::{fixed::Fixed, ifs::wl_seat::WlSeatGlobal, tree::Node, utils::clonecell::CloneCell}, std::rc::Rc, }; pub struct GestureOwnerHolder { default: Rc, owner: CloneCell>, } impl Default for GestureOwnerHolder { fn default() -> Self { let default = Rc::new(NoGesture); Self { owner: CloneCell::new(default.clone()), default, } } } impl GestureOwnerHolder { pub fn revert_to_default(&self, seat: &Rc) { self.owner.get().revert_to_default(seat); self.set_default_owner(); } pub fn swipe_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { self.owner.get().swipe_begin(seat, time_usec, finger_count) } pub fn swipe_update(&self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed) { self.owner.get().swipe_update(seat, time_usec, dx, dy) } pub fn swipe_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.owner.get().swipe_end(seat, time_usec, cancelled) } pub fn pinch_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { self.owner.get().pinch_begin(seat, time_usec, finger_count) } pub fn pinch_update( &self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed, scale: Fixed, rotation: Fixed, ) { self.owner .get() .pinch_update(seat, time_usec, dx, dy, scale, rotation) } pub fn pinch_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.owner.get().pinch_end(seat, time_usec, cancelled) } pub fn hold_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { self.owner.get().hold_begin(seat, time_usec, finger_count) } pub fn hold_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.owner.get().hold_end(seat, time_usec, cancelled) } fn set_default_owner(&self) { self.owner.set(self.default.clone()); } } trait GestureOwner { fn revert_to_default(&self, seat: &Rc); fn swipe_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let _ = seat; let _ = time_usec; let _ = finger_count; } fn swipe_update(&self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed) { let _ = seat; let _ = time_usec; let _ = dx; let _ = dy; } fn swipe_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { let _ = seat; let _ = time_usec; let _ = cancelled; } fn pinch_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let _ = seat; let _ = time_usec; let _ = finger_count; } fn pinch_update( &self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed, scale: Fixed, rotation: Fixed, ) { let _ = seat; let _ = time_usec; let _ = dx; let _ = dy; let _ = scale; let _ = rotation; } fn pinch_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { let _ = seat; let _ = time_usec; let _ = cancelled; } fn hold_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let _ = seat; let _ = time_usec; let _ = finger_count; } fn hold_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { let _ = seat; let _ = time_usec; let _ = cancelled; } } struct NoGesture; impl GestureOwner for NoGesture { fn revert_to_default(&self, seat: &Rc) { let _ = seat; } fn swipe_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let Some(node) = seat.pointer_node() else { return; }; node.node_seat_state().gesture_begin(seat); node.node_on_swipe_begin(seat, time_usec, finger_count); seat.gesture_owner.owner.set(Rc::new(SwipeGesture { node })); } fn pinch_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let Some(node) = seat.pointer_node() else { return; }; node.node_seat_state().gesture_begin(seat); node.node_on_pinch_begin(seat, time_usec, finger_count); seat.gesture_owner.owner.set(Rc::new(PinchGesture { node })); } fn hold_begin(&self, seat: &Rc, time_usec: u64, finger_count: u32) { let Some(node) = seat.pointer_node() else { return; }; node.node_seat_state().gesture_begin(seat); node.node_on_hold_begin(seat, time_usec, finger_count); seat.gesture_owner.owner.set(Rc::new(HoldGesture { node })); } } struct SwipeGesture { node: Rc, } impl GestureOwner for SwipeGesture { fn revert_to_default(&self, seat: &Rc) { self.swipe_end(seat, seat.state.now_usec(), true); } fn swipe_update(&self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed) { self.node.node_on_swipe_update(seat, time_usec, dx, dy); } fn swipe_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.node.node_on_swipe_end(seat, time_usec, cancelled); self.node.node_seat_state().gesture_end(seat); seat.gesture_owner.set_default_owner(); } } struct PinchGesture { node: Rc, } impl GestureOwner for PinchGesture { fn revert_to_default(&self, seat: &Rc) { self.pinch_end(seat, seat.state.now_usec(), true); } fn pinch_update( &self, seat: &Rc, time_usec: u64, dx: Fixed, dy: Fixed, scale: Fixed, rotation: Fixed, ) { self.node .node_on_pinch_update(seat, time_usec, dx, dy, scale, rotation) } fn pinch_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.node.node_on_pinch_end(seat, time_usec, cancelled); self.node.node_seat_state().gesture_end(seat); seat.gesture_owner.set_default_owner(); } } struct HoldGesture { node: Rc, } impl GestureOwner for HoldGesture { fn revert_to_default(&self, seat: &Rc) { self.hold_end(seat, seat.state.now_usec(), true); } fn hold_end(&self, seat: &Rc, time_usec: u64, cancelled: bool) { self.node.node_on_hold_end(seat, time_usec, cancelled); self.node.node_seat_state().gesture_end(seat); seat.gesture_owner.set_default_owner(); } }