aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/input/mod.rs68
-rw-r--r--src/niri.rs34
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,