diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 68 | ||||
| -rw-r--r-- | src/niri.rs | 34 |
2 files changed, 102 insertions, 0 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index c86e1467..f30bf168 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1186,6 +1186,22 @@ impl State { } } } + Action::FocusMonitorPrevious => { + if let Some(output) = self.niri.output_previous() { + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } + Action::FocusMonitorNext => { + if let Some(output) = self.niri.output_next() { + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::MoveWindowToMonitorLeft => { if let Some(output) = self.niri.output_left() { self.niri.layout.move_to_output(None, &output, None); @@ -1222,6 +1238,24 @@ impl State { } } } + Action::MoveWindowToMonitorPrevious => { + if let Some(output) = self.niri.output_previous() { + self.niri.layout.move_to_output(None, &output, None); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } + Action::MoveWindowToMonitorNext => { + if let Some(output) = self.niri.output_next() { + self.niri.layout.move_to_output(None, &output, None); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::MoveColumnToMonitorLeft => { if let Some(output) = self.niri.output_left() { self.niri.layout.move_column_to_output(&output); @@ -1258,6 +1292,24 @@ impl State { } } } + Action::MoveColumnToMonitorPrevious => { + if let Some(output) = self.niri.output_previous() { + self.niri.layout.move_column_to_output(&output); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } + Action::MoveColumnToMonitorNext => { + if let Some(output) = self.niri.output_next() { + self.niri.layout.move_column_to_output(&output); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::SetColumnWidth(change) => { self.niri.layout.set_column_width(change); } @@ -1328,6 +1380,22 @@ impl State { } } } + Action::MoveWorkspaceToMonitorPrevious => { + if let Some(output) = self.niri.output_previous() { + self.niri.layout.move_workspace_to_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } + Action::MoveWorkspaceToMonitorNext => { + if let Some(output) = self.niri.output_next() { + self.niri.layout.move_workspace_to_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::ToggleWindowFloating => { self.niri.layout.toggle_window_floating(None); // FIXME: granular diff --git a/src/niri.rs b/src/niri.rs index ada6039e..5786bf54 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -194,6 +194,9 @@ pub struct Niri { // according to their global position. pub global_space: Space<Window>, + /// Mapped outputs, sorted by their name and position. + pub sorted_outputs: Vec<Output>, + // Windows which don't have a buffer attached yet. pub unmapped_windows: HashMap<WlSurface, Unmapped>, @@ -1959,6 +1962,7 @@ impl Niri { layout, global_space: Space::default(), + sorted_outputs: Vec::default(), output_state: HashMap::new(), unmapped_windows: HashMap::new(), unmapped_layer_surfaces: HashSet::new(), @@ -2148,6 +2152,11 @@ impl Niri { outputs.iter().map(|d| &d.name.connector) ); + self.sorted_outputs = outputs + .iter() + .map(|Data { output, .. }| output.clone()) + .collect(); + for data in outputs.into_iter() { let Data { output, @@ -2658,6 +2667,31 @@ impl Niri { .cloned() } + pub fn output_previous(&self) -> Option<Output> { + let active = self.layout.active_output()?; + + self.sorted_outputs + .iter() + .rev() + .skip_while(|&output| output != active) + .nth(1) + .or(self.sorted_outputs.last()) + .filter(|&output| output != active) + .cloned() + } + + pub fn output_next(&self) -> Option<Output> { + let active = self.layout.active_output()?; + + self.sorted_outputs + .iter() + .skip_while(|&output| output != active) + .nth(1) + .or(self.sorted_outputs.first()) + .filter(|&output| output != active) + .cloned() + } + pub fn find_output_and_workspace_index( &self, workspace_reference: WorkspaceReference, |
