summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bar.rs27
-rw-r--r--src/config.rs7
-rw-r--r--src/river_protocols/status.rs8
-rw-r--r--src/river_protocols/status/dispatch.rs8
-rw-r--r--src/state.rs16
-rw-r--r--src/tags.rs6
6 files changed, 59 insertions, 13 deletions
diff --git a/src/bar.rs b/src/bar.rs
index ffc4d7c..18ad54c 100644
--- a/src/bar.rs
+++ b/src/bar.rs
@@ -127,24 +127,28 @@ impl Bar {
let mut offset_left = 0.0;
if self.has_tags_provider() {
if self.tags_computed.is_empty() {
- let mut x_offset = 0.0;
// TODO make configurable
- for (id, text) in ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
- .iter()
- .enumerate()
- {
- let tag = compute_tag_label(text, ss.config.font.clone(), &cairo_ctx);
- self.tags_btns.push(x_offset, tag.width, id);
- x_offset += tag.width;
- self.tags_computed.push(tag);
+ for text in ["1", "2", "3", "4", "5", "6", "7", "8", "9"] {
+ self.tags_computed.push(compute_tag_label(
+ text,
+ ss.config.font.clone(),
+ &cairo_ctx,
+ ));
}
}
+ self.tags_btns.clear();
for (i, label) in self.tags_computed.iter().enumerate() {
let state = self.tags_info.get_state(i);
let (bg, fg) = match state {
- TagState::Focused => (ss.config.tag_focused_bg, ss.config.tag_focused_fg),
- TagState::Inactive => (ss.config.tag_bg, ss.config.tag_fg),
TagState::Urgent => (ss.config.tag_urgent_bg, ss.config.tag_urgent_fg),
+ TagState::Focused => (ss.config.tag_focused_bg, ss.config.tag_focused_fg),
+ TagState::Active => (ss.config.tag_bg, ss.config.tag_fg),
+ TagState::Inactive => {
+ if ss.config.hide_inactive_tags {
+ continue;
+ }
+ (ss.config.tag_inactive_bg, ss.config.tag_inactive_fg)
+ }
};
label.render(
&cairo_ctx,
@@ -167,6 +171,7 @@ impl Bar {
overlap: 0.0,
},
);
+ self.tags_btns.push(offset_left, label.width, i);
offset_left += label.width;
}
}
diff --git a/src/config.rs b/src/config.rs
index bd7b91c..9ae2395 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -20,6 +20,8 @@ pub struct Config {
pub tag_focused_bg: Color,
pub tag_urgent_fg: Color,
pub tag_urgent_bg: Color,
+ pub tag_inactive_fg: Color,
+ pub tag_inactive_bg: Color,
// font and size
pub font: Font,
pub height: u32,
@@ -29,6 +31,8 @@ pub struct Config {
pub blocks_overlap: f64,
// command
pub command: Option<String>,
+ // misc
+ pub hide_inactive_tags: bool,
}
impl Default for Config {
@@ -44,6 +48,8 @@ impl Default for Config {
tag_focused_bg: Color::from_rgba_hex(0x689d68ff),
tag_urgent_fg: Color::from_rgba_hex(0x282828ff),
tag_urgent_bg: Color::from_rgba_hex(0xcc241dff),
+ tag_inactive_fg: Color::from_rgba_hex(0xd79921ff),
+ tag_inactive_bg: Color::from_rgba_hex(0x282828ff),
font: Font::new("monospace 10"),
height: 24,
separator_width: 2.0,
@@ -51,6 +57,7 @@ impl Default for Config {
blocks_r: 0.0,
blocks_overlap: 0.0,
command: None,
+ hide_inactive_tags: false,
}
}
}
diff --git a/src/river_protocols/status.rs b/src/river_protocols/status.rs
index 50c85e0..f19ac5f 100644
--- a/src/river_protocols/status.rs
+++ b/src/river_protocols/status.rs
@@ -96,6 +96,14 @@ pub trait RiverStatusHandler: Sized {
output_status: &RiverOutputStatus,
urgent: u32,
);
+
+ fn views_tags_updated(
+ &mut self,
+ conn: &Connection,
+ qh: &QueueHandle<Self>,
+ output_status: &RiverOutputStatus,
+ tags: Vec<u32>,
+ );
}
#[derive(Debug, Clone)]
diff --git a/src/river_protocols/status/dispatch.rs b/src/river_protocols/status/dispatch.rs
index d38037d..65d6e0c 100644
--- a/src/river_protocols/status/dispatch.rs
+++ b/src/river_protocols/status/dispatch.rs
@@ -79,7 +79,13 @@ where
match event {
Event::FocusedTags { tags } => data.focused_tags_updated(conn, qh, &status, tags),
Event::UrgentTags { tags } => data.urgent_tags_updated(conn, qh, &status, tags),
- Event::ViewTags { tags: _ } => (),
+ Event::ViewTags { tags } => {
+ let tags = tags
+ .chunks_exact(4)
+ .map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap()))
+ .collect();
+ data.views_tags_updated(conn, qh, &status, tags);
+ }
}
}
}
diff --git a/src/state.rs b/src/state.rs
index 131e20f..4dd9414 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -380,6 +380,22 @@ impl RiverStatusHandler for State {
bar.tags_info.urgent = urgent;
bar.draw(self.shared_state.as_mut().unwrap());
}
+
+ fn views_tags_updated(
+ &mut self,
+ _conn: &Connection,
+ _qh: &QueueHandle<Self>,
+ output_status: &RiverOutputStatus,
+ tags: Vec<u32>,
+ ) {
+ let bar = self
+ .bars
+ .iter_mut()
+ .find(|b| b.river_output_status.as_ref() == Some(output_status))
+ .unwrap();
+ bar.tags_info.active = tags.into_iter().fold(0, |a, b| a | b);
+ bar.draw(self.shared_state.as_mut().unwrap());
+ }
}
impl RiverControlHandler for State {
diff --git a/src/tags.rs b/src/tags.rs
index 0c63570..5a4a1b2 100644
--- a/src/tags.rs
+++ b/src/tags.rs
@@ -5,15 +5,17 @@ use pangocairo::{cairo, pango};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TagState {
+ Urgent,
Focused,
+ Active,
Inactive,
- Urgent,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct TagsInfo {
pub focused: u32,
pub urgent: u32,
+ pub active: u32,
}
impl TagsInfo {
@@ -22,6 +24,8 @@ impl TagsInfo {
TagState::Urgent
} else if self.focused >> tag & 1 == 1 {
TagState::Focused
+ } else if self.active >> tag & 1 == 1 {
+ TagState::Active
} else {
TagState::Inactive
}