halley-config 0.3.1

Configuration loading and parsing for the Halley Wayland compositor.
Documentation
use rune_cfg::RuneConfig;

use crate::layout::RuntimeTuning;

use super::super::primitives::{
    pick_bool, pick_expanded_placement_strategy, pick_f32, pick_find_empty_mode,
    pick_landmark_placement_strategy, pick_normal_blocker_policy, pick_pan_to_new_mode,
    pick_pinned_blocker_policy, pick_u64,
};

pub(crate) fn load_placement_section(cfg: &RuneConfig, out: &mut RuntimeTuning) {
    out.placement.expanded.strategy = pick_expanded_placement_strategy(
        cfg,
        &[
            "placement.expanded.strategy",
            "placement.expanded.spawn-placement",
            "placement.expanded.spawn_placement",
        ],
        out.placement.expanded.strategy,
    );
    out.placement.expanded.fallback = pick_expanded_placement_strategy(
        cfg,
        &["placement.expanded.fallback"],
        out.placement.expanded.fallback,
    );
    out.placement.expanded.find_empty_mode = pick_find_empty_mode(
        cfg,
        &[
            "placement.expanded.find-empty-mode",
            "placement.expanded.find_empty_mode",
        ],
        out.placement.expanded.find_empty_mode,
    );

    out.placement.landmarks.strategy = pick_landmark_placement_strategy(
        cfg,
        &["placement.landmarks.strategy"],
        out.placement.landmarks.strategy,
    );
    out.placement.landmarks.normal_blocker = pick_normal_blocker_policy(
        cfg,
        &[
            "placement.landmarks.normal-blocker",
            "placement.landmarks.normal_blocker",
        ],
        out.placement.landmarks.normal_blocker,
    );
    out.placement.landmarks.pinned_blocker = pick_pinned_blocker_policy(
        cfg,
        &[
            "placement.landmarks.pinned-blocker",
            "placement.landmarks.pinned_blocker",
        ],
        out.placement.landmarks.pinned_blocker,
    );

    out.placement.reveal.enabled = pick_bool(
        cfg,
        &["placement.reveal.enabled"],
        out.placement.reveal.enabled,
    );
    out.placement.reveal.max_pan_px = pick_f32(
        cfg,
        &["placement.reveal.max-pan-px", "placement.reveal.max_pan_px"],
        out.placement.reveal.max_pan_px,
    );
    out.placement.reveal.animation_ms = pick_u64(
        cfg,
        &[
            "placement.reveal.animation-ms",
            "placement.reveal.animation_ms",
        ],
        out.placement.reveal.animation_ms,
    );

    out.pan_to_new = pick_pan_to_new_mode(
        cfg,
        &["placement.reveal.pan-to-new", "placement.reveal.pan_to_new"],
        out.pan_to_new,
    );
}

#[cfg(test)]
mod tests {
    use rune_cfg::RuneConfig;

    use crate::layout::{ExpandedPlacementStrategy, RuntimeTuning};

    use super::load_placement_section;

    #[test]
    fn placement_section_parses_expanded_strategy() {
        let cfg = RuneConfig::from_str(
            r##"
placement:
  expanded:
    strategy "find-empty"
    fallback "center"
    find-empty-mode "best-effort"
  end
end
"##,
        )
        .expect("placement config should parse");

        let mut out = RuntimeTuning::default();
        load_placement_section(&cfg, &mut out);

        assert_eq!(
            out.placement.expanded.strategy,
            ExpandedPlacementStrategy::FindEmpty
        );
        assert_eq!(
            out.placement.expanded.fallback,
            ExpandedPlacementStrategy::Center
        );
    }
}