From b8568a2b626bd4d5f50ee24c304d19177bda5d4b Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Tue, 20 May 2025 19:58:57 +0200 Subject: [PATCH] feat(crate::bar): Put the leftmost block in the middle of the bar This is a workaround for the limitation in the i3 blocks protocol, as this does not allow for centred blocks. --- src/bar.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/src/bar.rs b/src/bar.rs index fb88150..e66c2cf 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -344,16 +344,56 @@ impl Bar { } // Display the blocks - render_blocks( - &cairo_ctx, - ss, - &self.output, - ss.blocks_cache.get_computed(), - &mut self.blocks_btns, - offset_left, - width_f, - height_f, - ); + { + if !ss.blocks_cache.get_computed().is_empty() { + let first_block = &ss.blocks_cache.get_computed()[0]; + + let blocks = &ss.blocks_cache.get_computed()[1..]; + + let other_start = render_blocks( + &cairo_ctx, + ss, + &self.output, + blocks, + &mut self.blocks_btns, + offset_left, + width_f, + height_f, + ); + + // Draw the first block _after_ the other ones, so that we can nudge it more to the + // left, if the others are spanning over the middle. + let mut start = (width_f / 2.0) - (first_block.full.width / 2.0); + if start + first_block.full.width > other_start { + start = other_start - first_block.full.width - first_block.block.separator_block_width as f64; + } + + first_block.full.render( + &cairo_ctx, + RenderOptions { + x_offset: start, + bar_height: height_f, + fg_color: first_block + .block + .color + .unwrap_or(sfo!(ss, &self.output, color)), + bg_color: first_block.block.background, + r_left: ss.config.blocks_r, + r_right: ss.config.blocks_r, + overlap: ss.config.blocks_overlap, + }, + ); + + self.blocks_btns.push( + start, + first_block.full.width, + ( + first_block.block.name.clone(), + first_block.block.instance.clone(), + ), + ); + } + } self.viewport .set_destination(conn, self.width as i32, self.height as i32); @@ -428,7 +468,7 @@ fn render_blocks( offset_left: f64, full_width: f64, full_height: f64, -) { +) -> f64 { context.rectangle(offset_left, 0.0, full_width - offset_left, full_height); context.clip(); @@ -513,6 +553,7 @@ fn render_blocks( } // Render blocks + let leftmost_start = full_width - blocks_width; buttons.clear(); for series in blocks_computed { let s_len = series.blocks.len(); @@ -560,6 +601,7 @@ fn render_blocks( } context.reset_clip(); + leftmost_start } fn layer_surface_cb(ctx: EventCtx) { -- 2.49.0