aboutsummaryrefslogtreecommitdiff
path: root/src/input
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-10-20 09:13:00 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-10-27 23:07:39 -0700
commitda3e5c44248fdb12b700e3a99c3e777c57942dc7 (patch)
treeed2f9b1dd8040a16735ad3949f01aef72d5e86ba /src/input
parent26ab4dfb87550b2f8ceed5d11be614a239703fd7 (diff)
downloadniri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.tar.gz
niri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.tar.bz2
niri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.zip
Implement touch interactive resize
Diffstat (limited to 'src/input')
-rw-r--r--src/input/mod.rs1
-rw-r--r--src/input/touch_resize_grab.rs119
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);
+ }
+}