Files
barbar/src/main.rs
T
2026-08-31 22:51:49 +01:00

85 lines
2.5 KiB
Rust

//! barbar — a Wayland layer-shell status bar built on `iced` + `iced_layershell`.
//!
//! Renders a full-width bar pinned to the top of the screen via the
//! `wlr-layer-shell` protocol. Optionally target a specific output by
//! passing its name as the first CLI argument.
use iced::widget::{row, text};
use iced::{Alignment, Element, Length, Task, Theme};
use iced_layershell::application;
use iced_layershell::reexport::Anchor;
use iced_layershell::settings::{LayerShellSettings, StartMode, Settings};
use iced_layershell::to_layer_message;
/// Height of the bar in logical pixels.
const BAR_HEIGHT: u32 = 36;
/// Optional width of the bar; `None` means "as wide as the output".
const BAR_WIDTH: Option<u32> = None;
pub fn main() -> Result<(), iced_layershell::Error> {
// Target a specific output if one was given, otherwise the active one.
let start_mode = match std::env::args().nth(1) {
Some(output) => StartMode::TargetScreen(output),
None => StartMode::Active,
};
application(Bar::default, namespace, update, view)
.style(style)
.settings(Settings {
layer_settings: LayerShellSettings {
size: Some((BAR_WIDTH.unwrap_or(0), BAR_HEIGHT)),
exclusive_zone: BAR_HEIGHT as i32,
anchor: Anchor::Top | Anchor::Left | Anchor::Right,
start_mode,
..Default::default()
},
..Default::default()
})
.run()
}
/// Application state. Empty for now; placeholders will evolve into
/// workspace/clock/system modules.
#[derive(Debug, Default)]
struct Bar;
/// Messages produced by user input, events and subscriptions.
#[to_layer_message]
#[derive(Debug, Clone)]
enum Message {
/// No-op used as a fallback target for pending subscriptions.
Noop,
}
fn namespace() -> String {
String::from("barbar")
}
fn update(_bar: &mut Bar, _message: Message) -> Task<Message> {
Task::none()
}
fn view(_bar: &Bar) -> Element<'_, Message> {
row![
text("workspaces").size(14),
text("|").size(14),
text("clock").size(14),
text("|").size(14),
text("system").size(14),
]
.spacing(12)
.padding(8)
.align_y(Alignment::Center)
.width(Length::Fill)
.height(Length::Fill)
.into()
}
fn style(_bar: &Bar, theme: &Theme) -> iced::theme::Style {
use iced::theme::Style;
Style {
background_color: theme.palette().background,
text_color: theme.palette().text,
}
}