summaryrefslogtreecommitdiffstats
path: root/src/i3bar.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-06-26 15:24:40 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-06-27 14:13:49 -0500
commit712f381b1ba65d40e03e530b871e34a73dbb615d (patch)
treec98a1a692877c9b29c84824ded789d9235331542 /src/i3bar.rs
parent07038dc2c3221336e60d31f2b2bd2590c30e3ec7 (diff)
feat: add color module
Diffstat (limited to 'src/i3bar.rs')
-rw-r--r--src/i3bar.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/i3bar.rs b/src/i3bar.rs
new file mode 100644
index 0000000..8cf5f0c
--- /dev/null
+++ b/src/i3bar.rs
@@ -0,0 +1,80 @@
+use serde::Serialize;
+
+use crate::color::Color;
+
+/// Represent block as described in <https://i3wm.org/docs/i3bar-protocol.html>
+#[derive(Serialize, Debug, Clone)]
+pub struct Block {
+ pub full_text: String,
+ #[serde(skip_serializing_if = "String::is_empty")]
+ pub short_text: String,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub color: Option<Color>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub background: Option<Color>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub border: Option<Color>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub border_top: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub border_right: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub border_bottom: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub border_left: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub min_width: Option<MinWidth>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub align: Option<Align>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub name: Option<String>,
+ #[serde(skip_serializing_if = "String::is_empty")]
+ pub instance: String,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub urgent: Option<bool>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub separator: Option<bool>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub separator_block_width: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub markup: Option<String>,
+}
+
+impl Default for Block {
+ fn default() -> Self {
+ Self {
+ full_text: String::new(),
+ short_text: String::new(),
+ color: None,
+ background: None,
+ border: None,
+ border_top: None,
+ border_right: None,
+ border_bottom: None,
+ border_left: None,
+ min_width: None,
+ align: None,
+ name: None,
+ instance: String::new(),
+ urgent: None,
+ separator: Some(false),
+ separator_block_width: Some(0),
+ markup: Some("pango".to_string()),
+ }
+ }
+}
+
+#[derive(Serialize, Debug, Clone, Copy)]
+#[serde(rename_all = "lowercase")]
+pub enum Align {
+ Center,
+ Right,
+ Left,
+}
+
+#[derive(Serialize, Debug, Clone)]
+#[serde(untagged)]
+pub enum MinWidth {
+ Pixels(usize),
+ Text(String),
+}