diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-10-20 09:13:00 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-10-27 23:07:39 -0700 |
| commit | da3e5c44248fdb12b700e3a99c3e777c57942dc7 (patch) | |
| tree | ed2f9b1dd8040a16735ad3949f01aef72d5e86ba /src/handlers/xdg_shell.rs | |
| parent | 26ab4dfb87550b2f8ceed5d11be614a239703fd7 (diff) | |
| download | niri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.tar.gz niri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.tar.bz2 niri-da3e5c44248fdb12b700e3a99c3e777c57942dc7.zip | |
Implement touch interactive resize
Diffstat (limited to 'src/handlers/xdg_shell.rs')
| -rw-r--r-- | src/handlers/xdg_shell.rs | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs index 856a0453..8cccfd9e 100644 --- a/src/handlers/xdg_shell.rs +++ b/src/handlers/xdg_shell.rs @@ -39,6 +39,7 @@ use tracing::field::Empty; use crate::input::move_grab::MoveGrab; use crate::input::resize_grab::ResizeGrab; use crate::input::touch_move_grab::TouchMoveGrab; +use crate::input::touch_resize_grab::TouchResizeGrab; use crate::input::{PointerOrTouchStartData, DOUBLE_CLICK_TIME}; use crate::layout::workspace::ColumnWidth; use crate::niri::{PopupGrabState, State}; @@ -149,24 +150,39 @@ impl XdgShellHandler for State { serial: Serial, edges: xdg_toplevel::ResizeEdge, ) { + let wl_surface = surface.wl_surface(); + + let mut grab_start_data = None; + + // See if this comes from a pointer grab. let pointer = self.niri.seat.get_pointer().unwrap(); - if !pointer.has_grab(serial) { - return; + if pointer.has_grab(serial) { + if let Some(start_data) = pointer.grab_start_data() { + if let Some((focus, _)) = &start_data.focus { + if focus.id().same_client_as(&wl_surface.id()) { + grab_start_data = Some(PointerOrTouchStartData::Pointer(start_data)); + } + } + } } - let Some(start_data) = pointer.grab_start_data() else { - return; - }; + // See if this comes from a touch grab. + if let Some(touch) = self.niri.seat.get_touch() { + if touch.has_grab(serial) { + if let Some(start_data) = touch.grab_start_data() { + if let Some((focus, _)) = &start_data.focus { + if focus.id().same_client_as(&wl_surface.id()) { + grab_start_data = Some(PointerOrTouchStartData::Touch(start_data)); + } + } + } + } + } - let Some((focus, _)) = &start_data.focus else { + let Some(start_data) = grab_start_data else { return; }; - let wl_surface = surface.wl_surface(); - if !focus.id().same_client_as(&wl_surface.id()) { - return; - } - let Some((mapped, _)) = self.niri.layout.find_window_and_output(wl_surface) else { return; }; @@ -201,14 +217,26 @@ impl XdgShellHandler for State { } } - let grab = ResizeGrab::new(start_data, window.clone()); - - if !self.niri.layout.interactive_resize_begin(window, edges) { + if !self + .niri + .layout + .interactive_resize_begin(window.clone(), edges) + { return; } - pointer.set_grab(self, grab, serial, Focus::Clear); - self.niri.pointer_grab_ongoing = true; + match start_data { + PointerOrTouchStartData::Pointer(start_data) => { + let grab = ResizeGrab::new(start_data, window); + pointer.set_grab(self, grab, serial, Focus::Clear); + self.niri.pointer_grab_ongoing = true; + } + PointerOrTouchStartData::Touch(start_data) => { + let touch = self.niri.seat.get_touch().unwrap(); + let grab = TouchResizeGrab::new(start_data, window); + touch.set_grab(self, grab, serial); + } + } } fn reposition_request( |
