cosmic-comp/src/shell/layout/tiling/grabs/swap.rs

108 lines
2.9 KiB
Rust
Raw Normal View History

2024-04-03 16:02:27 +02:00
use cosmic_settings_config::shortcuts;
use smithay::{
2024-09-18 12:58:45 -07:00
backend::input::{KeyState, Keycode},
input::{
2025-10-16 18:53:57 +02:00
Seat, SeatHandler,
keyboard::{
GrabStartData as KeyboardGrabStartData, KeyboardGrab, KeyboardInnerHandle,
ModifiersState,
},
},
utils::Serial,
};
use crate::{
2024-04-03 16:02:27 +02:00
config::key_bindings::cosmic_modifiers_from_smithay,
2025-10-16 18:53:57 +02:00
shell::{Trigger, layout::tiling::NodeDesc},
state::State,
};
pub struct SwapWindowGrab {
seat: Seat<State>,
desc: NodeDesc,
}
impl SwapWindowGrab {
pub fn new(seat: Seat<State>, desc: NodeDesc) -> Self {
SwapWindowGrab { seat, desc }
}
}
impl KeyboardGrab<State> for SwapWindowGrab {
fn input(
&mut self,
data: &mut State,
handle: &mut KeyboardInnerHandle<'_, State>,
2024-09-18 12:58:45 -07:00
keycode: Keycode,
state: KeyState,
modifiers: Option<ModifiersState>,
serial: Serial,
time: u32,
) {
if !matches!(&data.common.shell.read().overview_mode.active_trigger(), Some(Trigger::KeyboardSwap(_, d)) if d == &self.desc)
{
handle.unset_grab(self, data, serial, false);
return;
}
if state == KeyState::Released {
return;
}
2025-10-16 13:50:32 +02:00
let syms = handle.keysym_handle(keycode).raw_syms();
let focus_bindings = &data
.common
.config
2024-04-03 16:02:27 +02:00
.shortcuts
.iter()
2024-04-03 16:02:27 +02:00
.filter(|(_, action)| matches!(action, shortcuts::Action::Focus(_)))
.map(|(pattern, action)| {
2024-04-03 16:02:27 +02:00
let shortcuts::Action::Focus(direction) = action else {
unreachable!()
};
(pattern.key, *direction)
})
.collect::<Vec<_>>();
let Some(direction) = syms.iter().find_map(|sym| {
focus_bindings.iter().find_map(|(key, direction)| {
(key.is_some() && sym == key.as_ref().unwrap()).then_some(*direction)
})
}) else {
return;
};
2024-04-03 16:02:27 +02:00
data.handle_shortcut_action(
shortcuts::Action::Focus(direction),
&self.seat,
serial,
time,
2024-04-03 16:02:27 +02:00
shortcuts::Binding {
modifiers: modifiers
.map(cosmic_modifiers_from_smithay)
.unwrap_or_default(),
2025-09-19 09:33:10 -04:00
keycode: None,
key: Some(handle.keysym_handle(keycode).modified_sym()),
2024-04-03 16:02:27 +02:00
description: None,
},
None,
true,
);
}
fn set_focus(
&mut self,
data: &mut State,
handle: &mut KeyboardInnerHandle<'_, State>,
focus: Option<<State as SeatHandler>::KeyboardFocus>,
serial: Serial,
) {
handle.set_focus(data, focus, serial)
}
fn start_data(&self) -> &KeyboardGrabStartData<State> {
&KeyboardGrabStartData { focus: None }
}
fn unset(&mut self, _state: &mut State) {}
}