aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-04-24 21:24:39 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-04-25 02:00:18 -0700
commit929eaf0d694a9f0e8aa9b436004f0d054c9e2919 (patch)
treeba9d951fc42d70f5d5b2b9a05aa8ead4f4c5dafb /src
parentce3103949fe07bb656970da30c87accde83852fa (diff)
downloadniri-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.rs23
-rw-r--r--src/input/spatial_movement_grab.rs21
-rw-r--r--src/layout/mod.rs11
-rw-r--r--src/layout/tests.rs6
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 {