diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-24 21:24:39 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-25 02:00:18 -0700 |
| commit | 929eaf0d694a9f0e8aa9b436004f0d054c9e2919 (patch) | |
| tree | ba9d951fc42d70f5d5b2b9a05aa8ead4f4c5dafb /src | |
| parent | ce3103949fe07bb656970da30c87accde83852fa (diff) | |
| download | niri-929eaf0d694a9f0e8aa9b436004f0d054c9e2919.tar.gz niri-929eaf0d694a9f0e8aa9b436004f0d054c9e2919.tar.bz2 niri-929eaf0d694a9f0e8aa9b436004f0d054c9e2919.zip | |
Pass target workspace to view offset grab
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 23 | ||||
| -rw-r--r-- | src/input/spatial_movement_grab.rs | 21 | ||||
| -rw-r--r-- | src/layout/mod.rs | 11 | ||||
| -rw-r--r-- | src/layout/tests.rs | 6 |
4 files changed, 52 insertions, 9 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index d9f610be..94914afc 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -2238,7 +2238,14 @@ impl State { if button == Some(MouseButton::Middle) && !pointer.is_grabbed() { let mod_down = modifiers_from_state(mods).contains(mod_key.to_modifiers()); if mod_down { - if let Some(output) = self.niri.output_under_cursor() { + let output_ws = self.niri.output_under_cursor().and_then(|output| { + let mon = self.niri.layout.monitor_for_output(&output)?; + Some((output, mon.active_workspace_ref())) + }); + + if let Some((output, ws)) = output_ws { + let ws_id = ws.id(); + self.niri.layout.focus_output(&output); let location = pointer.current_location(); @@ -2247,7 +2254,7 @@ impl State { button: button_code, location, }; - let grab = SpatialMovementGrab::new(start_data, output); + let grab = SpatialMovementGrab::new(start_data, output, ws_id); pointer.set_grab(self, grab, serial, Focus::Clear); self.niri .cursor_manager @@ -2828,7 +2835,17 @@ impl State { if let Some(output) = self.niri.output_under_cursor() { if cx.abs() > cy.abs() { - self.niri.layout.view_offset_gesture_begin(&output, true); + let output_ws = self.niri.output_under_cursor().and_then(|output| { + let mon = self.niri.layout.monitor_for_output(&output)?; + Some((output, mon.active_workspace_ref())) + }); + + if let Some((output, ws)) = output_ws { + let ws_idx = self.niri.layout.find_workspace_by_id(ws.id()).unwrap().0; + self.niri + .layout + .view_offset_gesture_begin(&output, Some(ws_idx), true); + } } else { self.niri .layout diff --git a/src/input/spatial_movement_grab.rs b/src/input/spatial_movement_grab.rs index d8b13b96..6eec7b0a 100644 --- a/src/input/spatial_movement_grab.rs +++ b/src/input/spatial_movement_grab.rs @@ -10,12 +10,14 @@ use smithay::input::SeatHandler; use smithay::output::Output; use smithay::utils::{Logical, Point}; +use crate::layout::workspace::WorkspaceId; use crate::niri::State; pub struct SpatialMovementGrab { start_data: PointerGrabStartData<State>, last_location: Point<f64, Logical>, output: Output, + workspace_id: WorkspaceId, gesture: GestureState, } @@ -27,11 +29,16 @@ enum GestureState { } impl SpatialMovementGrab { - pub fn new(start_data: PointerGrabStartData<State>, output: Output) -> Self { + pub fn new( + start_data: PointerGrabStartData<State>, + output: Output, + workspace_id: WorkspaceId, + ) -> Self { Self { last_location: start_data.location, start_data, output, + workspace_id, gesture: GestureState::Recognizing, } } @@ -79,8 +86,16 @@ impl PointerGrab<State> for SpatialMovementGrab { if c.x * c.x + c.y * c.y >= 8. * 8. { if c.x.abs() > c.y.abs() { self.gesture = GestureState::ViewOffset; - layout.view_offset_gesture_begin(&self.output, false); - layout.view_offset_gesture_update(-c.x, timestamp, false) + if let Some((ws_idx, ws)) = layout.find_workspace_by_id(self.workspace_id) { + if ws.current_output() == Some(&self.output) { + layout.view_offset_gesture_begin(&self.output, Some(ws_idx), false); + layout.view_offset_gesture_update(-c.x, timestamp, false) + } else { + None + } + } else { + None + } } else { self.gesture = GestureState::WorkspaceSwitch; layout.workspace_switch_gesture_begin(&self.output, false); diff --git a/src/layout/mod.rs b/src/layout/mod.rs index ceed2f60..9347fc73 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -3601,7 +3601,12 @@ impl<W: LayoutElement> Layout<W> { None } - pub fn view_offset_gesture_begin(&mut self, output: &Output, is_touchpad: bool) { + pub fn view_offset_gesture_begin( + &mut self, + output: &Output, + workspace_idx: Option<usize>, + is_touchpad: bool, + ) { let monitors = match &mut self.monitor_set { MonitorSet::Normal { monitors, .. } => monitors, MonitorSet::NoOutputs { .. } => unreachable!(), @@ -3610,7 +3615,9 @@ impl<W: LayoutElement> Layout<W> { for monitor in monitors { for (idx, ws) in monitor.workspaces.iter_mut().enumerate() { // Cancel the gesture on other workspaces. - if &monitor.output != output || idx != monitor.active_workspace_idx { + if &monitor.output != output + || idx != workspace_idx.unwrap_or(monitor.active_workspace_idx) + { ws.view_offset_gesture_end(None); continue; } diff --git a/src/layout/tests.rs b/src/layout/tests.rs index a49552a8..af8ba284 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -576,6 +576,8 @@ enum Op { ViewOffsetGestureBegin { #[proptest(strategy = "1..=5usize")] output_idx: usize, + #[proptest(strategy = "proptest::option::of(0..=4usize)")] + workspace_idx: Option<usize>, is_touchpad: bool, }, ViewOffsetGestureUpdate { @@ -1344,6 +1346,7 @@ impl Op { } Op::ViewOffsetGestureBegin { output_idx: id, + workspace_idx, is_touchpad: normalize, } => { let name = format!("output{id}"); @@ -1351,7 +1354,7 @@ impl Op { return; }; - layout.view_offset_gesture_begin(&output, normalize); + layout.view_offset_gesture_begin(&output, workspace_idx, normalize); } Op::ViewOffsetGestureUpdate { delta, @@ -2260,6 +2263,7 @@ fn unfullscreen_view_offset_not_reset_on_gesture() { Op::FullscreenWindow(1), Op::ViewOffsetGestureBegin { output_idx: 1, + workspace_idx: None, is_touchpad: true, }, Op::ViewOffsetGestureEnd { |
