140 lines
4.6 KiB
Rust
140 lines
4.6 KiB
Rust
use cosmic_comp_config::workspace::WorkspaceLayout;
|
|
use cosmic_settings_config::shortcuts::State as KeyState;
|
|
use cosmic_settings_config::shortcuts::{self, Modifiers, Shortcuts};
|
|
use smithay::input::keyboard::ModifiersState;
|
|
use xkbcommon::xkb;
|
|
|
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
pub enum Action {
|
|
/// Behaviors managed internally by cosmic-comp.
|
|
Private(PrivateAction),
|
|
/// Behaviors managed via cosmic-settings.
|
|
Shortcut(shortcuts::Action),
|
|
}
|
|
|
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
// Behaviors which are internally defined and emitted.
|
|
pub enum PrivateAction {
|
|
Escape,
|
|
Resizing(
|
|
shortcuts::action::ResizeDirection,
|
|
shortcuts::action::ResizeEdge,
|
|
shortcuts::State,
|
|
),
|
|
}
|
|
|
|
pub fn add_default_bindings(shortcuts: &mut Shortcuts, workspace_layout: WorkspaceLayout) {
|
|
let (
|
|
workspace_previous,
|
|
workspace_next,
|
|
(output_previous, output_previous_dir),
|
|
(output_next, output_next_dir),
|
|
) = match workspace_layout {
|
|
WorkspaceLayout::Horizontal => (
|
|
[xkb::Keysym::Left, xkb::Keysym::h],
|
|
[xkb::Keysym::Right, xkb::Keysym::l],
|
|
(
|
|
[xkb::Keysym::Up, xkb::Keysym::k],
|
|
shortcuts::action::Direction::Up,
|
|
),
|
|
(
|
|
[xkb::Keysym::Down, xkb::Keysym::j],
|
|
shortcuts::action::Direction::Down,
|
|
),
|
|
),
|
|
WorkspaceLayout::Vertical => (
|
|
[xkb::Keysym::Up, xkb::Keysym::k],
|
|
[xkb::Keysym::Down, xkb::Keysym::j],
|
|
(
|
|
[xkb::Keysym::Left, xkb::Keysym::h],
|
|
shortcuts::action::Direction::Left,
|
|
),
|
|
(
|
|
[xkb::Keysym::Right, xkb::Keysym::l],
|
|
shortcuts::action::Direction::Right,
|
|
),
|
|
),
|
|
};
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl(),
|
|
workspace_previous.iter().copied(),
|
|
shortcuts::Action::PreviousWorkspace,
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl(),
|
|
workspace_next.iter().copied(),
|
|
shortcuts::Action::NextWorkspace,
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl().shift(),
|
|
workspace_previous.iter().copied(),
|
|
shortcuts::Action::MoveToPreviousWorkspace,
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl().shift(),
|
|
workspace_next.iter().copied(),
|
|
shortcuts::Action::MoveToNextWorkspace,
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl(),
|
|
output_previous.iter().copied(),
|
|
shortcuts::Action::SwitchOutput(output_previous_dir),
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl(),
|
|
output_next.iter().copied(),
|
|
shortcuts::Action::SwitchOutput(output_next_dir),
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl().shift(),
|
|
output_previous.iter().copied(),
|
|
shortcuts::Action::MoveToOutput(output_previous_dir),
|
|
);
|
|
|
|
shortcuts.insert_default_binding(
|
|
Modifiers::new().logo().ctrl().shift(),
|
|
output_next.iter().copied(),
|
|
shortcuts::Action::MoveToOutput(output_next_dir),
|
|
);
|
|
}
|
|
|
|
/// Convert `cosmic_settings_config::shortcuts::State` to `smithay::backend::input::KeyState`.
|
|
pub fn cosmic_keystate_to_smithay(value: KeyState) -> smithay::backend::input::KeyState {
|
|
match value {
|
|
KeyState::Pressed => smithay::backend::input::KeyState::Pressed,
|
|
KeyState::Released => smithay::backend::input::KeyState::Released,
|
|
}
|
|
}
|
|
|
|
/// Convert `smithay::backend::input::KeyState` to `cosmic_settings_config::shortcuts::State`.
|
|
pub fn cosmic_keystate_from_smithay(value: smithay::backend::input::KeyState) -> KeyState {
|
|
match value {
|
|
smithay::backend::input::KeyState::Pressed => KeyState::Pressed,
|
|
smithay::backend::input::KeyState::Released => KeyState::Released,
|
|
}
|
|
}
|
|
|
|
/// Compare `cosmic_settings_config::shortcuts::Modifiers` to `smithay::input::keyboard::ModifiersState`.
|
|
pub fn cosmic_modifiers_eq_smithay(this: &Modifiers, other: &ModifiersState) -> bool {
|
|
this.ctrl == other.ctrl
|
|
&& this.alt == other.alt
|
|
&& this.shift == other.shift
|
|
&& this.logo == other.logo
|
|
}
|
|
|
|
/// Convert `smithay::input::keyboard::ModifiersState` to `cosmic_settings_config::shortcuts::Modifiers`
|
|
pub fn cosmic_modifiers_from_smithay(value: ModifiersState) -> Modifiers {
|
|
Modifiers {
|
|
ctrl: value.ctrl,
|
|
alt: value.alt,
|
|
shift: value.shift,
|
|
logo: value.logo,
|
|
}
|
|
}
|