diff options
Diffstat (limited to 'src/input')
| -rw-r--r-- | src/input/mod.rs | 23 | ||||
| -rw-r--r-- | src/input/spatial_movement_grab.rs | 21 |
2 files changed, 38 insertions, 6 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); |
