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_click_collapsed_outside_focus_mode, pick_click_collapsed_pan_mode, pick_f32,
    pick_node_background_color_mode, pick_node_border_color_mode, pick_node_display_policy,
    pick_shape_style, pick_u64,
};

pub(crate) fn load_nodes_section(cfg: &RuneConfig, out: &mut RuntimeTuning) {
    out.primary_to_node_ms = pick_u64(
        cfg,
        &[
            "node.primary-to-node-ms",
            "node.primary_to_node_ms",
            "nodes.primary-to-node-ms",
            "nodes.primary_to_node_ms",
            "nodes.node-delay",
            "nodes.node_delay",
        ],
        out.primary_to_node_ms,
    );

    let legacy_preview = pick_u64(
        cfg,
        &[
            "node.primary-to-preview-ms",
            "node.primary_to_preview_ms",
            "nodes.primary-to-preview-ms",
            "nodes.primary_to_preview_ms",
            "nodes.preview-delay",
            "nodes.preview_delay",
        ],
        0,
    );
    let legacy_preview_to_node = pick_u64(
        cfg,
        &[
            "node.primary-preview-to-node-ms",
            "node.primary_preview_to_node_ms",
            "node.preview-to-node-ms",
            "node.preview_to_node_ms",
            "nodes.primary-preview-to-node-ms",
            "nodes.primary_preview_to_node_ms",
            "nodes.preview-to-node-ms",
            "nodes.preview_to_node_ms",
        ],
        0,
    );

    if legacy_preview > 0 || legacy_preview_to_node > 0 {
        let combined = legacy_preview.saturating_add(legacy_preview_to_node);
        if combined > 0 {
            out.primary_to_node_ms = combined;
        }
    }

    out.primary_hot_inner_frac = pick_f32(
        cfg,
        &[
            "node.primary-hot-inner-frac",
            "node.primary_hot_inner_frac",
            "node.hot-inner-frac",
            "node.hot_inner_frac",
            "nodes.primary-hot-inner-frac",
            "nodes.primary_hot_inner_frac",
            "nodes.hot-inner-frac",
            "nodes.hot_inner_frac",
        ],
        out.primary_hot_inner_frac,
    );

    out.node_show_labels = pick_node_display_policy(
        cfg,
        &[
            "node.show-labels",
            "node.show_labels",
            "nodes.show-labels",
            "nodes.show_labels",
        ],
        out.node_show_labels,
    );
    out.node_show_app_icons = pick_node_display_policy(
        cfg,
        &[
            "node.show-app-icons",
            "node.show_app_icons",
            "node.show-icons",
            "node.show_icons",
            "nodes.show-app-icons",
            "nodes.show_app_icons",
            "nodes.show-icons",
            "nodes.show_icons",
        ],
        out.node_show_app_icons,
    );
    out.node_shape = pick_shape_style(
        cfg,
        &[
            "node.node-shape",
            "node.node_shape",
            "node.shape",
            "nodes.node-shape",
            "nodes.node_shape",
            "nodes.shape",
        ],
        out.node_shape,
    );
    out.node_label_shape = pick_shape_style(
        cfg,
        &[
            "node.node-label-shape",
            "node.node_label_shape",
            "node.label-shape",
            "node.label_shape",
            "nodes.node-label-shape",
            "nodes.node_label_shape",
            "nodes.label-shape",
            "nodes.label_shape",
        ],
        out.node_label_shape,
    );
    out.node_icon_size = pick_f32(
        cfg,
        &[
            "node.icon-size",
            "node.icon_size",
            "nodes.icon-size",
            "nodes.icon_size",
        ],
        out.node_icon_size,
    );
    out.node_background_color = pick_node_background_color_mode(
        cfg,
        &[
            "node.background-colour",
            "node.background_colour",
            "node.background-color",
            "node.background_color",
            "nodes.background-colour",
            "nodes.background_colour",
            "nodes.background-color",
            "nodes.background_color",
        ],
        out.node_background_color,
    );

    out.node_border_color_hover = pick_node_border_color_mode(
        cfg,
        &[
            "node.border-colour-hover",
            "node.border_colour_hover",
            "node.border-color-hover",
            "node.border_color_hover",
            "nodes.border-colour-hover",
            "nodes.border_colour_hover",
            "nodes.border-color-hover",
            "nodes.border_color_hover",
        ],
        out.node_border_color_hover,
    );
    out.node_border_color_inactive = pick_node_border_color_mode(
        cfg,
        &[
            "node.border-colour-inactive",
            "node.border_colour_inactive",
            "node.border-color-inactive",
            "node.border_color_inactive",
            "nodes.border-colour-inactive",
            "nodes.border_colour_inactive",
            "nodes.border-color-inactive",
            "nodes.border_color_inactive",
        ],
        out.node_border_color_inactive,
    );
    out.click_collapsed_outside_focus = pick_click_collapsed_outside_focus_mode(
        cfg,
        &[
            "node.click-collapsed-outside-focus",
            "node.click_collapsed_outside_focus",
            "nodes.click-collapsed-outside-focus",
            "nodes.click_collapsed_outside_focus",
        ],
        out.click_collapsed_outside_focus,
    );
    out.click_collapsed_pan = pick_click_collapsed_pan_mode(
        cfg,
        &[
            "node.click-collapsed-pan",
            "node.click_collapsed_pan",
            "nodes.click-collapsed-pan",
            "nodes.click_collapsed_pan",
        ],
        out.click_collapsed_pan,
    );
}

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

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

    use super::load_nodes_section;

    #[test]
    fn nodes_section_parses_secondary_border_color_modes() {
        let cfg = RuneConfig::from_str(
            r##"
node:
  border-colour-hover "use-window-secondary-active"
  border-colour-inactive "use-window-secondary-inactive"
end
"##,
        )
        .expect("node config should parse");

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

        assert_eq!(
            out.node_border_color_hover,
            NodeBorderColorMode::UseWindowSecondaryActive
        );
        assert_eq!(
            out.node_border_color_inactive,
            NodeBorderColorMode::UseWindowSecondaryInactive
        );
    }
}