From eb7d20c638e8912747ee21a4b8de95dd27bb7aba Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Thu, 2 Nov 2023 00:09:31 +0400 Subject: Add action to switch layouts Allow users to trigger layout change with custom bindings. --- src/config.rs | 7 +++++++ src/input.rs | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/config.rs b/src/config.rs index 1ad27ed7..ac1917bc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -288,6 +288,7 @@ pub enum Action { SwitchPresetColumnWidth, MaximizeColumn, SetColumnWidth(#[knuffel(argument, str)] SizeChange), + SwitchLayout(#[knuffel(argument)] LayoutAction), } #[derive(Debug, Clone, Copy, PartialEq)] @@ -298,6 +299,12 @@ pub enum SizeChange { AdjustProportion(f64), } +#[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq)] +pub enum LayoutAction { + Next, + Prev, +} + #[derive(knuffel::Decode, Debug, PartialEq)] pub struct DebugConfig { #[knuffel(child, unwrap(argument), default = 1.)] diff --git a/src/input.rs b/src/input.rs index b57c4c20..83f186fd 100644 --- a/src/input.rs +++ b/src/input.rs @@ -17,7 +17,7 @@ use smithay::input::pointer::{ use smithay::utils::SERIAL_COUNTER; use smithay::wayland::tablet_manager::{TabletDescriptor, TabletSeatTrait}; -use crate::config::{Action, Binds, Modifiers}; +use crate::config::{Action, Binds, LayoutAction, Modifiers}; use crate::niri::State; use crate::screenshot_ui::ScreenshotUi; use crate::utils::{center, get_monotonic_time, spawn}; @@ -90,6 +90,7 @@ impl State { | Action::ChangeVt(_) | Action::Suspend | Action::PowerOffMonitors + | Action::SwitchLayout(_) ) { return; @@ -186,6 +187,16 @@ impl State { self.niri.layout.toggle_fullscreen(&window); } } + Action::SwitchLayout(action) => { + self.niri + .seat + .get_keyboard() + .unwrap() + .with_kkb_state(self, |mut state| match action { + LayoutAction::Next => state.cycle_next_layout(), + LayoutAction::Prev => state.cycle_prev_layout(), + }); + } Action::MoveColumnLeft => { self.niri.layout.move_left(); // FIXME: granular -- cgit