i3status_rs/protocol/
i3bar_block.rs

1use crate::themes::color::Color;
2use serde::Serialize;
3
4/// Represent block as described in <https://i3wm.org/docs/i3bar-protocol.html>
5#[derive(Serialize, Debug, Clone)]
6pub struct I3BarBlock {
7    pub full_text: String,
8    #[serde(skip_serializing_if = "String::is_empty")]
9    pub short_text: String,
10    #[serde(skip_serializing_if = "Color::skip_ser")]
11    pub color: Color,
12    #[serde(skip_serializing_if = "Color::skip_ser")]
13    pub background: Color,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub border: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub border_top: Option<usize>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub border_right: Option<usize>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub border_bottom: Option<usize>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub border_left: Option<usize>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub min_width: Option<I3BarBlockMinWidth>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub align: Option<I3BarBlockAlign>,
28    /// This project uses `name` field to uniquely identify each "logical block". For example two
29    /// "config blocks" merged using `merge_with_next` will have the same `name`. This information
30    /// could be used by some bar frontends (such as `i3bar-river`) and will be ignored by `i3bar`
31    /// and `swaybar`.
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub name: Option<String>,
34    /// This project uses `instance` field to uniquely identify each block and optionally a part
35    /// of the block, e.g. a "button". The format is `{block_id}:{optional_widget_name}`. This info
36    /// is used when dispatching click events.
37    #[serde(skip_serializing_if = "String::is_empty")]
38    pub instance: String,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub urgent: Option<bool>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub separator: Option<bool>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub separator_block_width: Option<usize>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub markup: Option<String>,
47}
48
49impl Default for I3BarBlock {
50    fn default() -> Self {
51        #[cfg(not(feature = "debug_borders"))]
52        let border = None;
53        #[cfg(feature = "debug_borders")]
54        let border = Some("#ff0000".to_string());
55        Self {
56            full_text: String::new(),
57            short_text: String::new(),
58            color: Color::None,
59            background: Color::None,
60            border,
61            border_top: None,
62            border_right: None,
63            border_bottom: None,
64            border_left: None,
65            min_width: None,
66            align: None,
67            name: None,
68            instance: String::new(),
69            urgent: None,
70            separator: Some(false),
71            separator_block_width: Some(0),
72            markup: Some("pango".to_string()),
73        }
74    }
75}
76
77#[derive(Serialize, Debug, Clone, Copy)]
78#[allow(dead_code)]
79#[serde(rename_all = "lowercase")]
80pub enum I3BarBlockAlign {
81    Center,
82    Right,
83    Left,
84}
85
86#[derive(Serialize, Debug, Clone)]
87#[allow(dead_code)]
88#[serde(untagged)]
89pub enum I3BarBlockMinWidth {
90    Pixels(usize),
91    Text(String),
92}