use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Modifier {
Alt,
AltLeft,
AltRight,
Shift,
ShiftLeft,
ShiftRight,
Sym,
Function,
Ctrl,
CtrlLeft,
CtrlRight,
Meta,
MetaLeft,
MetaRight,
CapsLock,
NumLock,
ScrollLock,
Primary,
}
impl Modifier {
pub fn as_str(self) -> &'static str {
match self {
Self::Alt => "alt",
Self::AltLeft => "alt_left",
Self::AltRight => "alt_right",
Self::Shift => "shift",
Self::ShiftLeft => "shift_left",
Self::ShiftRight => "shift_right",
Self::Sym => "sym",
Self::Function => "function",
Self::Ctrl => "ctrl",
Self::CtrlLeft => "ctrl_left",
Self::CtrlRight => "ctrl_right",
Self::Meta => "meta",
Self::MetaLeft => "meta_left",
Self::MetaRight => "meta_right",
Self::CapsLock => "caps_lock",
Self::NumLock => "num_lock",
Self::ScrollLock => "scroll_lock",
Self::Primary => "primary",
}
}
}
impl Serialize for Modifier {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum BindingAction {
#[default]
Down,
Up,
Repeat,
}
impl BindingAction {
pub fn as_str(self) -> &'static str {
match self {
Self::Down => "down",
Self::Up => "up",
Self::Repeat => "repeat",
}
}
}
impl Serialize for BindingAction {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(self.as_str())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct Key(pub String);
impl Key {
pub fn new(name: impl Into<String>) -> Self {
Self(name.into())
}
}
impl<S: Into<String>> From<S> for Key {
fn from(s: S) -> Self {
Self(s.into())
}
}
impl Serialize for Key {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(&self.0)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Handedness {
#[default]
Right,
Left,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum PointerAcceleration {
Adaptive,
#[default]
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CursorFocusMode {
#[default]
Hover,
Click,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TouchpadClickMode {
#[default]
None,
AreaToClick,
FingerCount,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TouchpadScrollMode {
#[default]
None,
TwoFingerScroll,
EdgeScroll,
ButtonDownScroll,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AnimationPartType {
#[default]
Disabled,
Slide,
Grow,
Shrink,
Fade,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EasingFunction {
#[default]
Linear,
EaseInSine,
EaseOutSine,
EaseInOutSine,
EaseInQuad,
EaseOutQuad,
EaseInOutQuad,
EaseInCubic,
EaseOutCubic,
EaseInOutCubic,
EaseInQuart,
EaseOutQuart,
EaseInOutQuart,
EaseInQuint,
EaseOutQuint,
EaseInOutQuint,
EaseInExpo,
EaseOutExpo,
EaseInOutExpo,
EaseInCirc,
EaseOutCirc,
EaseInOutCirc,
EaseInBack,
EaseOutBack,
EaseInOutBack,
EaseInElastic,
EaseOutElastic,
EaseInOutElastic,
EaseInBounce,
EaseOutBounce,
EaseInOutBounce,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AnimationEvent {
#[default]
WindowOpen,
WindowMove,
WindowClose,
WorkspaceSwitch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AnimationKind {
#[default]
BuiltIn,
Plugin,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct Gaps {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, Serialize)]
pub struct CustomKeyAction {
pub action: BindingAction,
pub modifiers: Vec<Modifier>,
pub key: Key,
pub command: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct BuiltInKeyCommandOverride {
pub name: String,
pub action: BindingAction,
pub modifiers: Vec<Modifier>,
pub key: Key,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct StartupApp {
pub command: String,
#[serde(skip_serializing_if = "is_false")]
pub restart_on_death: bool,
#[serde(skip_serializing_if = "is_false")]
pub no_startup_id: bool,
#[serde(skip_serializing_if = "is_false")]
pub should_halt_compositor_on_death: bool,
#[serde(skip_serializing_if = "is_false")]
pub in_systemd_scope: bool,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct EnvironmentVariable {
pub key: String,
pub value: String,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct BorderConfig {
pub size: i32,
pub radius: f32,
pub color: String,
pub focus_color: String,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct WorkspaceConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub number: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct DragAndDropConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub modifiers: Vec<Modifier>,
}
impl Default for DragAndDropConfiguration {
fn default() -> Self {
Self {
enabled: true,
modifiers: Vec::new(),
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct BuiltInAnimationPart {
#[serde(rename = "type")]
pub type_: AnimationPartType,
pub function: EasingFunction,
#[serde(skip_serializing_if = "Option::is_none")]
pub c1: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub c2: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub c3: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub c4: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n1: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub d1: Option<f32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct AnimationDefinition {
pub event: AnimationEvent,
#[serde(rename = "type")]
pub type_: AnimationKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<f32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub parts: Vec<BuiltInAnimationPart>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct MouseConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub handedness: Option<Handedness>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acceleration: Option<PointerAcceleration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acceleration_bias: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vscroll_speed: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hscroll_speed: Option<f64>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct KeymapConfiguration {
pub language: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub variant: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub options: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct KeyboardConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub repeat_delay: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repeat_rate: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keymap: Option<KeymapConfiguration>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct HoverClickConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none", rename = "hover_duration")]
pub hover_duration_ms: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel_displacement_threshold: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reclick_displacement_threshold: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct SimulatedSecondaryClickConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none", rename = "hold_duration")]
pub hold_duration_ms: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub displacement_threshold: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct OutputFilterConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub shader_path: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct CursorConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub scale: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub focus_mode: Option<CursorFocusMode>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct SlowKeysConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none", rename = "hold_delay")]
pub hold_delay_ms: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct StickyKeysConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub should_disable_if_two_keys_are_pressed_together: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct TouchpadConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_while_typing: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_with_external_mouse: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acceleration_bias: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vscroll_speed: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hscroll_speed: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tap_to_click: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub middle_mouse_button_emulation: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub click_mode: Option<TouchpadClickMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scroll_mode: Option<TouchpadScrollMode>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct MagnifierConfiguration {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub scale: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scale_increment: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size_increment: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct Configuration {
#[serde(skip_serializing_if = "Option::is_none", rename = "action_key")]
pub primary_modifier: Option<Modifier>,
#[serde(skip_serializing_if = "Option::is_none", rename = "custom_actions")]
pub custom_key_actions: Option<Vec<CustomKeyAction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_action_overrides: Option<Vec<BuiltInKeyCommandOverride>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inner_gaps: Option<Gaps>,
#[serde(skip_serializing_if = "Option::is_none")]
pub outer_gaps: Option<Gaps>,
#[serde(skip_serializing_if = "Option::is_none")]
pub startup_apps: Option<Vec<StartupApp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub terminal: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resize_jump: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub environment_variables: Option<Vec<EnvironmentVariable>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub border: Option<BorderConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspaces: Option<Vec<WorkspaceConfig>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub animations: Option<Vec<AnimationDefinition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_animations: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub move_modifier: Option<Vec<Modifier>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub drag_and_drop: Option<DragAndDropConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mouse: Option<MouseConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub touchpad: Option<TouchpadConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keyboard: Option<KeyboardConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover_click: Option<HoverClickConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub simulated_secondary_click: Option<SimulatedSecondaryClickConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_filter: Option<OutputFilterConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<CursorConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slow_keys: Option<SlowKeysConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sticky_keys: Option<StickyKeysConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub magnifier: Option<MagnifierConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_back_and_forth: Option<bool>,
}
fn is_false(v: &bool) -> bool {
!v
}