#bar #panel #linux #customization #dock

bar-config

用于轻松创建系统栏/面板/托盘的包

3 个不稳定版本

0.2.1 2018 年 9 月 3 日
0.2.0 2018 年 9 月 3 日
0.1.0 2018 年 9 月 2 日

#5 in #dock

MIT/Apache

33KB
458

Bar Config

用于轻松创建系统栏/面板/托盘的包。

本包的目标是在 Linux 上尽可能简单地创建复杂的栏/面板/托盘,而不必担心任何与渲染无关的事情。

要开始使用本包,需要创建一个新的栏。这通过在 Bar 中使用 load 方法来完成。一旦获取到这个对象,recvtry_recvlock 方法就可以用来接收事件和渲染栏。

示例

use std::io::Cursor;

use bar_config::Bar;

fn main() {
    let input = Cursor::new(String::from(
        "\
         height: 30\n\
         monitors:\n\
         - { name: \"DVI-1\" }\n\
         left:\n\
         - { text: \"Hello, World!\" }\n\
         center:\n\
         - { name: \"clock\" }\n\
         right:\n\
         - { text: \"VOLUME\" }",
    ));

    let mut bar = Bar::load(input).unwrap();

    print_bar(&bar);
    loop {
        let _ = bar.recv();
        print_bar(&bar);
    }
}

fn print_bar(bar: &Bar) {
    let config = bar.lock();
    for comp in config
        .left
        .iter()
        .chain(&config.center)
        .chain(&config.right)
    {
        if let Some(text) = comp.text() {
            print!("{}\t", text);
        }
    }
    println!("");
}

Bar 配置语法

这是用户配置的语法。它旨在映射到如 YAML 或 JSON 这样的数据格式,但同时也应允许在 Rust 中轻松表示。

# Legend
#     !   Field is required
#     ?   Field is optional

# Root element of the bar
Bar
    # General configuration options
    !height: u8
    ?position: Position
    ?background: Background
    !monitors: [Monitor]

    # Default fallback values for components
    ?defaults: ComponentSettings

    # Component containers
    ?left: [Component]
    ?center: [Component]
    ?right: [Component]

# A single component/block/module in the bar
Component
    # Name used to identify which component should be loaded
    ?name: String

    # Text which will be displayed inside the component
    ?text: String

    # Options available for every component
    ?settings: ComponentSettings

    # Extra options are passed to the component
    ?_: T

# Default options available for every component
ComponentSettings
    ?foreground: (r: u8, g: u8, b: u8, a: u8)
    ?background: Background
    ?width: u8
    ?padding: u8
    ?offset_x: i8
    ?offset_y: i8
    ?fonts: [Font]
    ?border: Border

# Background of a component or the bar
Background
    !Image(path: String) | Color(r: u8, g: u8, b: u8, a: u8)

# Dinstinct identification for a font
Font
    !description: String
    !size: u8

# Distinct identification for a monitor
Monitor
    !name: String
    ?fallback_names: [String]

# Border separating the bar from the rest of the WM
Border
    !height: u8
    !color: (r: u8, g: u8, b: u8, a: u8)

# Available positions for the bar
Position
    !Top | Bottom

依赖关系

~7MB
~116K SLoC