# Dynisland A dynamic and extensible GTK4 bar for compositors implementing wlr-layer-shell, written in Rust. Dynisland is designed to look and feel like Apple's Dynamic Island. ## Demo ## Status This project is still in early development; There will likely be bugs and breaking changes, including changes to the config format. ## Features - Easy to configure with a dynamically generated default config - Animated transitions - Themable with hot loaded css - Extensible with third party Rust modules and layout managers **Planned features:** - [ ] multi-monitor support - [ ] loading modules after startup - [ ] ? unload modules at runtime - [ ] ? custom widgets in lua ## Usage ### Start/restart the daemon ```bash dynisland daemon # or dynisland restart ``` ### Open the gtk debugger ```bash dynisland inspector ``` - this can be useful for css theming ## Dependencies - gtk4 - gtk4-layer-shell ## Installation ### Using cargo ```bash cargo install dynisland ``` ### Arch Linux ```bash yay -S dynisland-git ``` ## Configuration ### Create the directory structure ```bash mkdir ~/.config/dynisland mkdir ~/.config/dynisland/modules mkdir ~/.config/dynisland/layouts ``` ### Download or compile the modules and put them in the modules directory > [!NOTE] > If dynisland was compiled with the `embed_modules` feature (dynisland v0.1.2 has this as the default), the [official](https://github.com/cr3eperall/dynisland-modules) modules are already included in the binary. > You would only have to do this if you want to use third party modules. Download the precompiled modules from the [Release page](https://github.com/cr3eperall/dynisland-modules/releases/latest) ```bash mv Download/libmusic_module.so Download/libscript_module.so Download/libclock_module.so ~/.config/dynisland/modules mv Download/libdynamic_layoutmanager.so ~/.config/dynisland/layouts ``` Or build the modules from source ```bash git clone --recursive https://github.com/cr3eperall/dynisland cargo build --release --no-default-features --package dynisland_clock_module --package dynisland_dynamic_layoutmanager --package dynisland_music_module --package dynisland_script_module mv target/release/libmusic_module.so target/release/libscript_module.so target/release/libclock_module.so ~/.config/dynisland/modules mv targer/release/libdynamic_layoutmanager.so ~/.config/dynisland/layouts ``` ### Generate the default config file ```bash dynisland default-config >> ~/.config/dynisland/dynisland.ron touch ~/.config/dynisland/dynisland.scss ``` ### See the [Wiki](https://github.com/cr3eperall/dynisland/wiki) for the main config options ### See [dynisland-modules](https://github.com/cr3eperall/dynisland-modules) for the module specific configs Then edit the configs and scss to your liking. ## Building ### Without including the modules ```bash git clone https://github.com/cr3eperall/dynisland cd dynisland cargo build --release --no-default-features --features completions cd target/release install dynisland ~/.local/bin/dynisland ``` ### Including the modules ```bash git clone https://github.com/cr3eperall/dynisland cd dynisland cargo build --release --features completions cd target/release install -Dm755 dynisland ~/.local/bin/dynisland ``` ### Install shell completions ```bash install -Dm644 "target/_dynisland" "/usr/share/zsh/site-functions/_dynisland" install -Dm644 "target/dynisland.bash" "/usr/share/bash-completion/completions/dynisland.bash" install -Dm644 "target/dynisland.fish" "/usr/share/fish/vendor_completions.d/dynisland.fish" ``` ## Acknowledgements - [eww](https://github.com/elkowar/eww) - For reference on how to do IPC and custom gtk widgets - [Nullderef](https://nullderef.com/) - For a deep dive on how to implement a plugin system in rust