diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-28 10:14:02 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-30 20:12:37 +0300 |
| commit | 5b4750a009a9ce1d3c98045c18509b1157e5519b (patch) | |
| tree | e135f66fee5c5d3b4e6abb950b500cda55e01b99 | |
| parent | ad50dd21fea1912b9e21fb66a22fce517dac3aee (diff) | |
| download | niri-5b4750a009a9ce1d3c98045c18509b1157e5519b.tar.gz niri-5b4750a009a9ce1d3c98045c18509b1157e5519b.tar.bz2 niri-5b4750a009a9ce1d3c98045c18509b1157e5519b.zip | |
Add focus-floating/tiling actions
| -rw-r--r-- | niri-config/src/lib.rs | 4 | ||||
| -rw-r--r-- | niri-ipc/src/lib.rs | 4 | ||||
| -rw-r--r-- | src/input/mod.rs | 10 | ||||
| -rw-r--r-- | src/layout/mod.rs | 22 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 12 |
5 files changed, 52 insertions, 0 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index 1807f06c..38391ed4 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -1277,6 +1277,8 @@ pub enum Action { MoveWindowToTiling, #[knuffel(skip)] MoveWindowToTilingById(u64), + FocusFloating, + FocusTiling, SwitchFocusBetweenFloatingAndTiling, } @@ -1427,6 +1429,8 @@ impl From<niri_ipc::Action> for Action { niri_ipc::Action::MoveWindowToTiling { id: Some(id) } => { Self::MoveWindowToTilingById(id) } + niri_ipc::Action::FocusFloating {} => Self::FocusFloating, + niri_ipc::Action::FocusTiling {} => Self::FocusTiling, niri_ipc::Action::SwitchFocusBetweenFloatingAndTiling {} => { Self::SwitchFocusBetweenFloatingAndTiling } diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index c3878941..fea7543f 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -470,6 +470,10 @@ pub enum Action { #[cfg_attr(feature = "clap", arg(long))] id: Option<u64>, }, + /// Switches focus to the floating layout. + FocusFloating {}, + /// Switches focus to the tiling layout. + FocusTiling {}, /// Toggles the focus between the floating and the tiling layout. SwitchFocusBetweenFloatingAndTiling {}, } diff --git a/src/input/mod.rs b/src/input/mod.rs index c510a958..d874ee34 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1346,6 +1346,16 @@ impl State { self.niri.queue_redraw_all(); } } + Action::FocusFloating => { + self.niri.layout.focus_floating(); + // FIXME: granular + self.niri.queue_redraw_all(); + } + Action::FocusTiling => { + self.niri.layout.focus_tiling(); + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::SwitchFocusBetweenFloatingAndTiling => { self.niri.layout.switch_focus_floating_tiling(); // FIXME: granular diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 53c9ce6b..c11eb6ab 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -2729,6 +2729,20 @@ impl<W: LayoutElement> Layout<W> { workspace.set_window_floating(window, floating); } + pub fn focus_floating(&mut self) { + let Some(workspace) = self.active_workspace_mut() else { + return; + }; + workspace.focus_floating(); + } + + pub fn focus_tiling(&mut self) { + let Some(workspace) = self.active_workspace_mut() else { + return; + }; + workspace.focus_tiling(); + } + pub fn switch_focus_floating_tiling(&mut self) { let Some(workspace) = self.active_workspace_mut() else { return; @@ -4393,6 +4407,8 @@ mod tests { id: Option<usize>, floating: bool, }, + FocusFloating, + FocusTiling, SwitchFocusFloatingTiling, SetParent { #[proptest(strategy = "1..=5usize")] @@ -4909,6 +4925,12 @@ mod tests { let id = id.filter(|id| layout.has_window(id)); layout.set_window_floating(id.as_ref(), floating); } + Op::FocusFloating => { + layout.focus_floating(); + } + Op::FocusTiling => { + layout.focus_tiling(); + } Op::SwitchFocusFloatingTiling => { layout.switch_focus_floating_tiling(); } diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 099b449c..06900afc 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1157,6 +1157,18 @@ impl<W: LayoutElement> Workspace<W> { self.toggle_window_floating(id); } + pub fn focus_floating(&mut self) { + if !self.floating_is_active.get() { + self.switch_focus_floating_tiling(); + } + } + + pub fn focus_tiling(&mut self) { + if self.floating_is_active.get() { + self.switch_focus_floating_tiling(); + } + } + pub fn switch_focus_floating_tiling(&mut self) { if self.floating.is_empty() { // If floating is empty, keep focus on scrolling. |
