#widgets #toolkit #front-end #wayland-compositor

chunks-rs

A library for making GTK4 widgets, inspired by Elkowar's Wacky Widgets

24 releases (5 breaking)

new 0.6.0 Nov 22, 2024
0.5.2 Oct 31, 2024
0.4.8 Oct 21, 2024
0.3.5 Oct 10, 2024
0.1.1 Oct 10, 2024

#607 in GUI

Download history 787/week @ 2024-10-05 722/week @ 2024-10-12 422/week @ 2024-10-19 212/week @ 2024-10-26 50/week @ 2024-11-02 1/week @ 2024-11-09 111/week @ 2024-11-16

397 downloads per month

MIT/Apache and GPL-3.0-or-later

3MB
578 lines

Chunks-rs

Crates.io

A library that simplifies the process of making widgets for Wayland Compositors.

Chunks uses GTK4 and GTK4 Layer Shell at its core, and comes stock with a listener for the Hyprland IPC. This helps with changing Widget states when something changes, such as making the current window fullscreen.

Usage

Make sure you have GTK4 and GTK4-Layer-Shell installed on your system.

For more in depth examples, please refer to example-chunks

[dependencies]
chunks-rs = "0.6.0"

This will create a storage widget, similar to the one in the screenshot:

const STYLE: &str = "
window {
    background-color: transparent;
}

#storage {
    font-size: 34px;
    background-color: #000000;
    color: #FFFFFF;
}
";

fn main() {
    let factory = Factory::new("chunk.factory");

    let chunks = |factory: Application| {
        storage(&factory);

        load_css(STYLE);
    };

    factory.pollute(chunks);
}

fn storage(factory: &Application) {
    let tag = tag("storage");
    let margins = vec![(Edge::Top, 20), (Edge::Right, 160)];
    let anchors = EdgeConfig::TOP_RIGHT.to_vec();

    let storage_closure = || {
        let text = format!(
            "<span foreground='#FFFFFF'>{:.0}%</span>",
            Internal::get_storage(),
        );
        text
    };

    Internal::update_storage(&tag, storage_closure);

    Chunk::new(
        factory.clone(),
        "Storage".to_string(),
        tag,
        margins,
        anchors,
        Layer::Bottom,
    )
    .build();
}

Slabs & Plates

Chunks recently introduced two new popup widget types: Slabs and Plates.

Slabs: Display dynamically, triggered by changes in underlying text (e.g., volume detection).
Plates: Display once at startup, then disappear after a set duration (e.g., welcome messages).

Both share similar implementations but differ in their display behavior.

These widget types do not need a designated layer, as they are set to Overlay by default. Instead of a layer, enter the amount of seconds you would like the Popups to display for.

Slab::new(
    factory.clone(),
    "Volume".to_string(),
    tag,
    margins,
    anchors,
    2,
)
.build();
Plate::new(
    factory.clone(),
    "Greeter".to_string(),
    tag,
    margins,
    anchors,
    2,
)
.build();

Dependencies

~23–36MB
~653K SLoC