aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-12-28 10:14:02 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-12-30 20:12:37 +0300
commit5b4750a009a9ce1d3c98045c18509b1157e5519b (patch)
treee135f66fee5c5d3b4e6abb950b500cda55e01b99
parentad50dd21fea1912b9e21fb66a22fce517dac3aee (diff)
downloadniri-5b4750a009a9ce1d3c98045c18509b1157e5519b.tar.gz
niri-5b4750a009a9ce1d3c98045c18509b1157e5519b.tar.bz2
niri-5b4750a009a9ce1d3c98045c18509b1157e5519b.zip
Add focus-floating/tiling actions
-rw-r--r--niri-config/src/lib.rs4
-rw-r--r--niri-ipc/src/lib.rs4
-rw-r--r--src/input/mod.rs10
-rw-r--r--src/layout/mod.rs22
-rw-r--r--src/layout/workspace.rs12
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.