diff options
Diffstat (limited to 'src/input')
| -rw-r--r-- | src/input/mod.rs | 1 | ||||
| -rw-r--r-- | src/input/touch_resize_grab.rs | 119 |
2 files changed, 120 insertions, 0 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index 11612f2f..07c77e8c 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -46,6 +46,7 @@ pub mod scroll_tracker; pub mod spatial_movement_grab; pub mod swipe_tracker; pub mod touch_move_grab; +pub mod touch_resize_grab; pub const DOUBLE_CLICK_TIME: Duration = Duration::from_millis(400); diff --git a/src/input/touch_resize_grab.rs b/src/input/touch_resize_grab.rs new file mode 100644 index 00000000..91156411 --- /dev/null +++ b/src/input/touch_resize_grab.rs @@ -0,0 +1,119 @@ +use smithay::desktop::Window; +use smithay::input::touch::{ + DownEvent, GrabStartData as TouchGrabStartData, MotionEvent, OrientationEvent, ShapeEvent, + TouchGrab, TouchInnerHandle, UpEvent, +}; +use smithay::input::SeatHandler; +use smithay::utils::{IsAlive, Logical, Point, Serial}; + +use crate::niri::State; + +pub struct TouchResizeGrab { + start_data: TouchGrabStartData<State>, + window: Window, +} + +impl TouchResizeGrab { + pub fn new(start_data: TouchGrabStartData<State>, window: Window) -> Self { + Self { start_data, window } + } + + fn on_ungrab(&mut self, state: &mut State) { + state.niri.layout.interactive_resize_end(&self.window); + } +} + +impl TouchGrab<State> for TouchResizeGrab { + fn down( + &mut self, + data: &mut State, + handle: &mut TouchInnerHandle<'_, State>, + _focus: Option<(<State as SeatHandler>::TouchFocus, Point<f64, Logical>)>, + event: &DownEvent, + seq: Serial, + ) { + handle.down(data, None, event, seq); + } + + fn up( + &mut self, + data: &mut State, + handle: &mut TouchInnerHandle<'_, State>, + event: &UpEvent, + seq: Serial, + ) { + handle.up(data, event, seq); + + if event.slot != self.start_data.slot { + return; + } + + handle.unset_grab(self, data); + } + + fn motion( + &mut self, + data: &mut State, + handle: &mut TouchInnerHandle<'_, State>, + _focus: Option<(<State as SeatHandler>::TouchFocus, Point<f64, Logical>)>, + event: &MotionEvent, + seq: Serial, + ) { + handle.motion(data, None, event, seq); + + if event.slot != self.start_data.slot { + return; + } + + if self.window.alive() { + let delta = event.location - self.start_data.location; + let ongoing = data + .niri + .layout + .interactive_resize_update(&self.window, delta); + if ongoing { + return; + } + } + + // The resize is no longer ongoing. + handle.unset_grab(self, data); + } + + fn frame(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'_, State>, seq: Serial) { + handle.frame(data, seq); + } + + fn cancel(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'_, State>, seq: Serial) { + handle.cancel(data, seq); + handle.unset_grab(self, data); + } + + fn shape( + &mut self, + data: &mut State, + handle: &mut TouchInnerHandle<'_, State>, + event: &ShapeEvent, + seq: Serial, + ) { + handle.shape(data, event, seq); + } + + fn orientation( + &mut self, + data: &mut State, + handle: &mut TouchInnerHandle<'_, State>, + event: &OrientationEvent, + seq: Serial, + ) { + handle.orientation(data, event, seq); + } + + fn start_data(&self) -> &TouchGrabStartData<State> { + &self.start_data + } + + fn unset(&mut self, data: &mut State) { + self.on_ungrab(data); + } +} |
