aboutsummaryrefslogtreecommitdiff
path: root/src/handlers/xdg_shell.rs
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/handlers/xdg_shell.rs
parent26ab4dfb87550b2f8ceed5d11be614a239703fd7 (diff)
downloadniri-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.rs60
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(