mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-04-19 19:34:24 +02:00
Merge pull request #64 from JakeStanger/feat/build-flags
feat: add feature flags
This commit is contained in:
commit
181561fe2a
16 changed files with 249 additions and 62 deletions
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
|
@ -30,7 +30,13 @@ jobs:
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: cargo fmt --check
|
run: cargo fmt --check
|
||||||
|
|
||||||
- name: Clippy
|
- name: Clippy (base features)
|
||||||
|
uses: actions-rs/clippy-check@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
args: --no-default-features --features config+json
|
||||||
|
|
||||||
|
- name: Clippy (all features)
|
||||||
uses: actions-rs/clippy-check@v1
|
uses: actions-rs/clippy-check@v1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1346,6 +1346,7 @@ name = "ironbar"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async_once",
|
"async_once",
|
||||||
|
"cfg-if",
|
||||||
"chrono",
|
"chrono",
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
"dirs",
|
"dirs",
|
||||||
|
|
89
Cargo.toml
89
Cargo.toml
|
@ -5,11 +5,47 @@ edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
description = "Customisable GTK Layer Shell wlroots/sway bar"
|
description = "Customisable GTK Layer Shell wlroots/sway bar"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = [
|
||||||
|
"http",
|
||||||
|
"config+all",
|
||||||
|
"clock",
|
||||||
|
"music+all",
|
||||||
|
"sys_info",
|
||||||
|
"tray",
|
||||||
|
"workspaces+all"
|
||||||
|
]
|
||||||
|
|
||||||
|
http = ["dep:reqwest"]
|
||||||
|
|
||||||
|
"config+all" = ["config+json", "config+yaml", "config+toml", "config+corn"]
|
||||||
|
"config+json" = ["serde_json"]
|
||||||
|
"config+yaml" = ["serde_yaml"]
|
||||||
|
"config+toml" = ["toml"]
|
||||||
|
"config+corn" = ["libcorn"]
|
||||||
|
|
||||||
|
clock = ["chrono"]
|
||||||
|
|
||||||
|
music = ["regex"]
|
||||||
|
"music+all" = ["music", "music+mpris", "music+mpd"]
|
||||||
|
"music+mpris" = ["music", "mpris"]
|
||||||
|
"music+mpd" = ["music", "mpd_client"]
|
||||||
|
|
||||||
|
sys_info = ["sysinfo", "regex"]
|
||||||
|
|
||||||
|
tray = ["stray"]
|
||||||
|
|
||||||
|
workspaces = ["futures-util"]
|
||||||
|
"workspaces+all" = ["workspaces", "workspaces+sway", "workspaces+hyprland"]
|
||||||
|
"workspaces+sway" = ["workspaces", "swayipc-async"]
|
||||||
|
"workspaces+hyprland" = ["workspaces", "hyprland"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
# core
|
||||||
gtk = "0.16.0"
|
gtk = "0.16.0"
|
||||||
gtk-layer-shell = "0.5.0"
|
gtk-layer-shell = "0.5.0"
|
||||||
glib = "0.16.2"
|
glib = "0.16.2"
|
||||||
tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread", "time", "process"] }
|
tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread", "time", "process", "sync", "io-util", "net"] }
|
||||||
tracing = "0.1.37"
|
tracing = "0.1.37"
|
||||||
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
||||||
tracing-error = "0.2.0"
|
tracing-error = "0.2.0"
|
||||||
|
@ -17,26 +53,43 @@ tracing-appender = "0.2.2"
|
||||||
strip-ansi-escapes = "0.1.1"
|
strip-ansi-escapes = "0.1.1"
|
||||||
color-eyre = "0.6.2"
|
color-eyre = "0.6.2"
|
||||||
serde = { version = "1.0.141", features = ["derive"] }
|
serde = { version = "1.0.141", features = ["derive"] }
|
||||||
serde_json = "1.0.82"
|
|
||||||
serde_yaml = "0.9.4"
|
|
||||||
toml = "0.7.0"
|
|
||||||
libcorn = "0.6.1"
|
|
||||||
lazy_static = "1.4.0"
|
|
||||||
async_once = "0.2.6"
|
|
||||||
indexmap = "1.9.1"
|
indexmap = "1.9.1"
|
||||||
futures-util = "0.3.21"
|
|
||||||
chrono = "0.4.19"
|
|
||||||
reqwest = {version = "0.11.14" }
|
|
||||||
regex = { version = "1.6.0", default-features = false, features = ["std"] }
|
|
||||||
stray = { version = "0.1.3" }
|
|
||||||
dirs = "4.0.0"
|
dirs = "4.0.0"
|
||||||
walkdir = "2.3.2"
|
walkdir = "2.3.2"
|
||||||
notify = { version = "5.0.0", default-features = false }
|
notify = { version = "5.0.0", default-features = false }
|
||||||
mpd_client = "1.0.0"
|
|
||||||
mpris = "2.0.0"
|
|
||||||
swayipc-async = { version = "2.0.1" }
|
|
||||||
hyprland = "0.3.0"
|
|
||||||
sysinfo = "0.27.0"
|
|
||||||
wayland-client = "0.29.5"
|
wayland-client = "0.29.5"
|
||||||
wayland-protocols = { version = "0.29.5", features = ["unstable_protocols", "client"] }
|
wayland-protocols = { version = "0.29.5", features = ["unstable_protocols", "client"] }
|
||||||
smithay-client-toolkit = { version = "0.16.0", default-features = false, features = ["calloop"] }
|
smithay-client-toolkit = { version = "0.16.0", default-features = false, features = ["calloop"] }
|
||||||
|
lazy_static = "1.4.0"
|
||||||
|
async_once = "0.2.6"
|
||||||
|
cfg-if = "1.0.0"
|
||||||
|
|
||||||
|
# http
|
||||||
|
reqwest = { version = "0.11.14", optional = true }
|
||||||
|
|
||||||
|
# config
|
||||||
|
serde_json = { version = "1.0.82", optional = true }
|
||||||
|
serde_yaml = { version = "0.9.4", optional = true }
|
||||||
|
toml = { version = "0.7.0", optional = true }
|
||||||
|
libcorn = { version = "0.6.1", optional = true }
|
||||||
|
|
||||||
|
# clock
|
||||||
|
chrono = { version = "0.4.19", optional = true }
|
||||||
|
|
||||||
|
# music
|
||||||
|
mpd_client = { version = "1.0.0", optional = true }
|
||||||
|
mpris = { version = "2.0.0", optional = true }
|
||||||
|
|
||||||
|
# sys_info
|
||||||
|
sysinfo = { version = "0.27.0", optional = true }
|
||||||
|
|
||||||
|
# tray
|
||||||
|
stray = { version = "0.1.3", optional = true }
|
||||||
|
|
||||||
|
# workspaces
|
||||||
|
swayipc-async = { version = "2.0.1", optional = true }
|
||||||
|
hyprland = { version = "0.3.0", optional = true }
|
||||||
|
futures-util = { version = "0.3.21", optional = true }
|
||||||
|
|
||||||
|
# shared
|
||||||
|
regex = { version = "1.6.0", default-features = false, features = ["std"], optional = true } # music, sys_info
|
14
README.md
14
README.md
|
@ -28,9 +28,11 @@ yay -S ironbar-git
|
||||||
|
|
||||||
### Nix Flake
|
### Nix Flake
|
||||||
|
|
||||||
|
A flake is included with the repo which can be used with home-manager.
|
||||||
|
|
||||||
#### Example
|
#### Example
|
||||||
Here is an example nix flake that uses ironbar, this is just a
|
|
||||||
proof of concept, please adapt it to your config
|
Here is an example nix flake that uses Ironbar.
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{
|
{
|
||||||
|
@ -66,8 +68,9 @@ proof of concept, please adapt it to your config
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Binary Caching
|
#### Binary Caching
|
||||||
There is also a cachix cache at `https://app.cachix.org/cache/jakestanger`
|
|
||||||
incase you don't want to compile ironbar!
|
There is a Cachix cache available at `https://app.cachix.org/cache/jakestanger`
|
||||||
|
in case you don't want to compile Ironbar.
|
||||||
|
|
||||||
### Source
|
### Source
|
||||||
|
|
||||||
|
@ -79,6 +82,9 @@ cargo build --release
|
||||||
install target/release/ironbar ~/.local/bin/ironbar
|
install target/release/ironbar ~/.local/bin/ironbar
|
||||||
```
|
```
|
||||||
|
|
||||||
|
By default, all features are enabled.
|
||||||
|
See [here](https://github.com/JakeStanger/ironbar/wiki/compiling) for controlling which features are included.
|
||||||
|
|
||||||
[repo](https://github.com/jakestanger/ironbar)
|
[repo](https://github.com/jakestanger/ironbar)
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
51
docs/Compiling.md
Normal file
51
docs/Compiling.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
You can compile Ironbar from source using `cargo`.
|
||||||
|
Just clone the repo and build:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/jakestanger/ironbar.git
|
||||||
|
cd ironbar
|
||||||
|
cargo build --release
|
||||||
|
# change path to wherever you want to install
|
||||||
|
install target/release/ironbar ~/.local/bin/ironbar
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
By default, all features are enabled for convenience. This can result in a significant compile time.
|
||||||
|
If you know you are not going to need all the features, you can compile with only the features you need.
|
||||||
|
|
||||||
|
As of `v0.10.0`, compiling with no features is about 33% faster.
|
||||||
|
On a 3800X, it takes about 60 seconds for no features and 90 seconds for all.
|
||||||
|
This difference is expected to increase as the bar develops.
|
||||||
|
|
||||||
|
Features containing a `+` can be stacked, for example `config+json` and `config+yaml` could both be enabled.
|
||||||
|
|
||||||
|
To build using only specific features, disable default features and pass a comma separated list to `cargo build`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo build --release --no-default-features \
|
||||||
|
--features http,config+json,clock
|
||||||
|
```
|
||||||
|
|
||||||
|
> ⚠ Make sure you enable at least one `config` feature otherwise you will not be able to start the bar!
|
||||||
|
|
||||||
|
| Feature | Description |
|
||||||
|
|---------------------|-----------------------------------------------------------------------------------|
|
||||||
|
| **Core** | |
|
||||||
|
| http | Enables HTTP features. Currently this includes the ability to load remote images. |
|
||||||
|
| config+all | Enables support for all configuration languages. |
|
||||||
|
| config+json | Enables configuration support for JSON. |
|
||||||
|
| config+yaml | Enables configuration support for YAML. |
|
||||||
|
| config+toml | Enables configuration support for TOML. |
|
||||||
|
| config+corn | Enables configuration support for [Corn](https://github.com/jakestanger.corn). |
|
||||||
|
| **Modules** | |
|
||||||
|
| clock | Enables the `clock` module. |
|
||||||
|
| music+all | Enables the `music` module with support for all player types. |
|
||||||
|
| music+mpris | Enables the `music` module with MPRIS support. |
|
||||||
|
| music+mpd | Enables the `music` module with MPD support. |
|
||||||
|
| sys_info | Enables the `sys_info` module. |
|
||||||
|
| tray | Enables the `tray` module. |
|
||||||
|
| workspaces+all | Enables the `workspaces` module with support for all compositors. |
|
||||||
|
| workspaces+sway | Enables the `workspaces` module with support for Sway. |
|
||||||
|
| workspaces+hyprland | Enables the `workspaces` module with support for Hyprland. |
|
||||||
|
|
19
src/bar.rs
19
src/bar.rs
|
@ -195,15 +195,20 @@ fn add_modules(content: >k::Box, modules: Vec<ModuleConfig>, info: &ModuleInfo
|
||||||
|
|
||||||
for (id, config) in modules.into_iter().enumerate() {
|
for (id, config) in modules.into_iter().enumerate() {
|
||||||
match config {
|
match config {
|
||||||
|
#[cfg(feature = "clock")]
|
||||||
ModuleConfig::Clock(mut module) => add_module!(module, id),
|
ModuleConfig::Clock(mut module) => add_module!(module, id),
|
||||||
ModuleConfig::Script(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::SysInfo(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Focused(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Workspaces(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Tray(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Music(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Launcher(mut module) => add_module!(module, id),
|
|
||||||
ModuleConfig::Custom(mut module) => add_module!(module, id),
|
ModuleConfig::Custom(mut module) => add_module!(module, id),
|
||||||
|
ModuleConfig::Focused(mut module) => add_module!(module, id),
|
||||||
|
ModuleConfig::Launcher(mut module) => add_module!(module, id),
|
||||||
|
#[cfg(feature = "music")]
|
||||||
|
ModuleConfig::Music(mut module) => add_module!(module, id),
|
||||||
|
ModuleConfig::Script(mut module) => add_module!(module, id),
|
||||||
|
#[cfg(feature = "sys_info")]
|
||||||
|
ModuleConfig::SysInfo(mut module) => add_module!(module, id),
|
||||||
|
#[cfg(feature = "tray")]
|
||||||
|
ModuleConfig::Tray(mut module) => add_module!(module, id),
|
||||||
|
#[cfg(feature = "workspaces")]
|
||||||
|
ModuleConfig::Workspaces(mut module) => add_module!(module, id),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
|
use cfg_if::cfg_if;
|
||||||
use color_eyre::{Help, Report, Result};
|
use color_eyre::{Help, Report, Result};
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
use tokio::sync::broadcast;
|
use tokio::sync::broadcast;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
#[cfg(feature = "workspaces+hyprland")]
|
||||||
pub mod hyprland;
|
pub mod hyprland;
|
||||||
|
#[cfg(feature = "workspaces+sway")]
|
||||||
pub mod sway;
|
pub mod sway;
|
||||||
|
|
||||||
pub enum Compositor {
|
pub enum Compositor {
|
||||||
|
#[cfg(feature = "workspaces+sway")]
|
||||||
Sway,
|
Sway,
|
||||||
|
#[cfg(feature = "workspaces+hyprland")]
|
||||||
Hyprland,
|
Hyprland,
|
||||||
Unsupported,
|
Unsupported,
|
||||||
}
|
}
|
||||||
|
@ -18,7 +23,9 @@ impl Display for Compositor {
|
||||||
f,
|
f,
|
||||||
"{}",
|
"{}",
|
||||||
match self {
|
match self {
|
||||||
|
#[cfg(feature = "workspaces+sway")]
|
||||||
Self::Sway => "Sway",
|
Self::Sway => "Sway",
|
||||||
|
#[cfg(feature = "workspaces+hyprland")]
|
||||||
Self::Hyprland => "Hyprland",
|
Self::Hyprland => "Hyprland",
|
||||||
Self::Unsupported => "Unsupported",
|
Self::Unsupported => "Unsupported",
|
||||||
}
|
}
|
||||||
|
@ -31,9 +38,15 @@ impl Compositor {
|
||||||
/// This is done by checking system env vars.
|
/// This is done by checking system env vars.
|
||||||
fn get_current() -> Self {
|
fn get_current() -> Self {
|
||||||
if std::env::var("SWAYSOCK").is_ok() {
|
if std::env::var("SWAYSOCK").is_ok() {
|
||||||
Self::Sway
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "workspaces+sway")] { Self::Sway }
|
||||||
|
else { tracing::error!("Not compiled with Sway support"); Self::Unsupported }
|
||||||
|
}
|
||||||
} else if std::env::var("HYPRLAND_INSTANCE_SIGNATURE").is_ok() {
|
} else if std::env::var("HYPRLAND_INSTANCE_SIGNATURE").is_ok() {
|
||||||
Self::Hyprland
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "workspaces+hyprland")] { Self::Hyprland}
|
||||||
|
else { tracing::error!("Not compiled with Hyprland support"); Self::Unsupported }
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Self::Unsupported
|
Self::Unsupported
|
||||||
}
|
}
|
||||||
|
@ -44,7 +57,9 @@ impl Compositor {
|
||||||
let current = Self::get_current();
|
let current = Self::get_current();
|
||||||
debug!("Getting workspace client for: {current}");
|
debug!("Getting workspace client for: {current}");
|
||||||
match current {
|
match current {
|
||||||
|
#[cfg(feature = "workspaces+sway")]
|
||||||
Self::Sway => Ok(sway::get_sub_client()),
|
Self::Sway => Ok(sway::get_sub_client()),
|
||||||
|
#[cfg(feature = "workspaces+hyprland")]
|
||||||
Self::Hyprland => Ok(hyprland::get_client()),
|
Self::Hyprland => Ok(hyprland::get_client()),
|
||||||
Self::Unsupported => Err(Report::msg("Unsupported compositor")
|
Self::Unsupported => Err(Report::msg("Unsupported compositor")
|
||||||
.note("Currently workspaces are only supported by Sway and Hyprland")),
|
.note("Currently workspaces are only supported by Sway and Hyprland")),
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
|
#[cfg(feature = "workspaces")]
|
||||||
pub mod compositor;
|
pub mod compositor;
|
||||||
|
#[cfg(feature = "music")]
|
||||||
pub mod music;
|
pub mod music;
|
||||||
|
#[cfg(feature = "tray")]
|
||||||
pub mod system_tray;
|
pub mod system_tray;
|
||||||
pub mod wayland;
|
pub mod wayland;
|
||||||
|
|
|
@ -4,7 +4,9 @@ use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::sync::broadcast;
|
use tokio::sync::broadcast;
|
||||||
|
|
||||||
|
#[cfg(feature = "music+mpd")]
|
||||||
pub mod mpd;
|
pub mod mpd;
|
||||||
|
#[cfg(feature = "music+mpris")]
|
||||||
pub mod mpris;
|
pub mod mpris;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
|
@ -133,11 +133,16 @@ impl Config {
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
match extension {
|
match extension {
|
||||||
|
#[cfg(feature = "config+json")]
|
||||||
"json" => serde_json::from_str(str).wrap_err("Invalid JSON config"),
|
"json" => serde_json::from_str(str).wrap_err("Invalid JSON config"),
|
||||||
|
#[cfg(feature = "config+toml")]
|
||||||
"toml" => toml::from_str(str).wrap_err("Invalid TOML config"),
|
"toml" => toml::from_str(str).wrap_err("Invalid TOML config"),
|
||||||
|
#[cfg(feature = "config+yaml")]
|
||||||
"yaml" | "yml" => serde_yaml::from_str(str).wrap_err("Invalid YAML config"),
|
"yaml" | "yml" => serde_yaml::from_str(str).wrap_err("Invalid YAML config"),
|
||||||
|
#[cfg(feature = "config+corn")]
|
||||||
"corn" => libcorn::from_str(str).wrap_err("Invalid Corn config"),
|
"corn" => libcorn::from_str(str).wrap_err("Invalid Corn config"),
|
||||||
_ => unreachable!(),
|
_ => Err(Report::msg(format!("Unsupported config type: {extension}"))
|
||||||
|
.note("You may need to recompile with support if available")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
mod r#impl;
|
mod r#impl;
|
||||||
mod truncate;
|
mod truncate;
|
||||||
|
|
||||||
|
#[cfg(feature = "clock")]
|
||||||
use crate::modules::clock::ClockModule;
|
use crate::modules::clock::ClockModule;
|
||||||
use crate::modules::custom::CustomModule;
|
use crate::modules::custom::CustomModule;
|
||||||
use crate::modules::focused::FocusedModule;
|
use crate::modules::focused::FocusedModule;
|
||||||
use crate::modules::launcher::LauncherModule;
|
use crate::modules::launcher::LauncherModule;
|
||||||
|
#[cfg(feature = "music")]
|
||||||
use crate::modules::music::MusicModule;
|
use crate::modules::music::MusicModule;
|
||||||
use crate::modules::script::ScriptModule;
|
use crate::modules::script::ScriptModule;
|
||||||
|
#[cfg(feature = "sys_info")]
|
||||||
use crate::modules::sysinfo::SysInfoModule;
|
use crate::modules::sysinfo::SysInfoModule;
|
||||||
|
#[cfg(feature = "tray")]
|
||||||
use crate::modules::tray::TrayModule;
|
use crate::modules::tray::TrayModule;
|
||||||
|
#[cfg(feature = "workspaces")]
|
||||||
use crate::modules::workspaces::WorkspacesModule;
|
use crate::modules::workspaces::WorkspacesModule;
|
||||||
use crate::script::ScriptInput;
|
use crate::script::ScriptInput;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
@ -32,15 +37,20 @@ pub struct CommonConfig {
|
||||||
#[derive(Debug, Deserialize, Clone)]
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
#[serde(tag = "type", rename_all = "snake_case")]
|
#[serde(tag = "type", rename_all = "snake_case")]
|
||||||
pub enum ModuleConfig {
|
pub enum ModuleConfig {
|
||||||
|
#[cfg(feature = "clock")]
|
||||||
Clock(ClockModule),
|
Clock(ClockModule),
|
||||||
Music(MusicModule),
|
|
||||||
Tray(TrayModule),
|
|
||||||
Workspaces(WorkspacesModule),
|
|
||||||
SysInfo(SysInfoModule),
|
|
||||||
Launcher(LauncherModule),
|
|
||||||
Script(ScriptModule),
|
|
||||||
Focused(FocusedModule),
|
|
||||||
Custom(CustomModule),
|
Custom(CustomModule),
|
||||||
|
Focused(FocusedModule),
|
||||||
|
Launcher(LauncherModule),
|
||||||
|
#[cfg(feature = "music")]
|
||||||
|
Music(MusicModule),
|
||||||
|
Script(ScriptModule),
|
||||||
|
#[cfg(feature = "sys_info")]
|
||||||
|
SysInfo(SysInfoModule),
|
||||||
|
#[cfg(feature = "tray")]
|
||||||
|
Tray(TrayModule),
|
||||||
|
#[cfg(feature = "workspaces")]
|
||||||
|
Workspaces(WorkspacesModule),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
|
@ -3,6 +3,7 @@ use gtk::prelude::*;
|
||||||
use gtk::{Button, IconTheme, Image, Label, Orientation};
|
use gtk::{Button, IconTheme, Image, Label, Orientation};
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "music", feature = "workspaces"))]
|
||||||
pub fn new_icon_button(input: &str, icon_theme: &IconTheme, size: i32) -> Button {
|
pub fn new_icon_button(input: &str, icon_theme: &IconTheme, size: i32) -> Button {
|
||||||
let button = Button::new();
|
let button = Button::new();
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ pub fn new_icon_button(input: &str, icon_theme: &IconTheme, size: i32) -> Button
|
||||||
button
|
button
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "music")]
|
||||||
pub fn new_icon_label(input: &str, icon_theme: &IconTheme, size: i32) -> gtk::Box {
|
pub fn new_icon_label(input: &str, icon_theme: &IconTheme, size: i32) -> gtk::Box {
|
||||||
let container = gtk::Box::new(Orientation::Horizontal, 0);
|
let container = gtk::Box::new(Orientation::Horizontal, 0);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
#[cfg(any(feature = "music", feature = "workspaces"))]
|
||||||
mod gtk;
|
mod gtk;
|
||||||
mod provider;
|
mod provider;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "music", feature = "workspaces"))]
|
||||||
pub use self::gtk::*;
|
pub use self::gtk::*;
|
||||||
pub use provider::ImageProvider;
|
pub use provider::ImageProvider;
|
||||||
|
|
|
@ -1,22 +1,30 @@
|
||||||
use crate::desktop_file::get_desktop_icon_name;
|
use crate::desktop_file::get_desktop_icon_name;
|
||||||
use crate::send;
|
use cfg_if::cfg_if;
|
||||||
use color_eyre::{Report, Result};
|
use color_eyre::{Help, Report, Result};
|
||||||
use glib::Bytes;
|
|
||||||
use gtk::gdk_pixbuf::Pixbuf;
|
use gtk::gdk_pixbuf::Pixbuf;
|
||||||
use gtk::gio::{Cancellable, MemoryInputStream};
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::{IconLookupFlags, IconTheme};
|
use gtk::{IconLookupFlags, IconTheme};
|
||||||
use reqwest::Url;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use tokio::spawn;
|
|
||||||
use tracing::error;
|
cfg_if!(
|
||||||
|
if #[cfg(feature = "http")] {
|
||||||
|
use crate::send;
|
||||||
|
use gtk::gio::{Cancellable, MemoryInputStream};
|
||||||
|
use tokio::spawn;
|
||||||
|
use tracing::error;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum ImageLocation<'a> {
|
enum ImageLocation<'a> {
|
||||||
Icon { name: String, theme: &'a IconTheme },
|
Icon {
|
||||||
|
name: String,
|
||||||
|
theme: &'a IconTheme,
|
||||||
|
},
|
||||||
Local(PathBuf),
|
Local(PathBuf),
|
||||||
Steam(String),
|
Steam(String),
|
||||||
Remote(Url),
|
#[cfg(feature = "http")]
|
||||||
|
Remote(reqwest::Url),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ImageProvider<'a> {
|
pub struct ImageProvider<'a> {
|
||||||
|
@ -38,6 +46,7 @@ impl<'a> ImageProvider<'a> {
|
||||||
/// Returns true if the input starts with a prefix
|
/// Returns true if the input starts with a prefix
|
||||||
/// that is supported by the parser
|
/// that is supported by the parser
|
||||||
/// (ie the parser would not fallback to checking the input).
|
/// (ie the parser would not fallback to checking the input).
|
||||||
|
#[cfg(any(feature = "music", feature = "workspaces"))]
|
||||||
pub fn is_definitely_image_input(input: &str) -> bool {
|
pub fn is_definitely_image_input(input: &str) -> bool {
|
||||||
input.starts_with("icon:")
|
input.starts_with("icon:")
|
||||||
|| input.starts_with("file://")
|
|| input.starts_with("file://")
|
||||||
|
@ -58,6 +67,7 @@ impl<'a> ImageProvider<'a> {
|
||||||
Some(input_type) if input_type == "file" => Ok(ImageLocation::Local(PathBuf::from(
|
Some(input_type) if input_type == "file" => Ok(ImageLocation::Local(PathBuf::from(
|
||||||
input_name[2..].to_string(),
|
input_name[2..].to_string(),
|
||||||
))),
|
))),
|
||||||
|
#[cfg(feature = "http")]
|
||||||
Some(input_type) if input_type == "http" || input_type == "https" => {
|
Some(input_type) if input_type == "http" || input_type == "https" => {
|
||||||
Ok(ImageLocation::Remote(input.parse()?))
|
Ok(ImageLocation::Remote(input.parse()?))
|
||||||
}
|
}
|
||||||
|
@ -73,7 +83,8 @@ impl<'a> ImageProvider<'a> {
|
||||||
theme,
|
theme,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
Some(input_type) => Err(Report::msg(format!("Unsupported image type: {input_type}"))),
|
Some(input_type) => Err(Report::msg(format!("Unsupported image type: {input_type}"))
|
||||||
|
.note("You may need to recompile with support if available")),
|
||||||
None if PathBuf::from(input_name).is_file() => {
|
None if PathBuf::from(input_name).is_file() => {
|
||||||
Ok(ImageLocation::Local(PathBuf::from(input_name)))
|
Ok(ImageLocation::Local(PathBuf::from(input_name)))
|
||||||
}
|
}
|
||||||
|
@ -88,6 +99,7 @@ impl<'a> ImageProvider<'a> {
|
||||||
/// and load it into the provided `GTK::Image` widget.
|
/// and load it into the provided `GTK::Image` widget.
|
||||||
pub fn load_into_image(&self, image: gtk::Image) -> Result<()> {
|
pub fn load_into_image(&self, image: gtk::Image) -> Result<()> {
|
||||||
// handle remote locations async to avoid blocking UI thread while downloading
|
// handle remote locations async to avoid blocking UI thread while downloading
|
||||||
|
#[cfg(feature = "http")]
|
||||||
if let ImageLocation::Remote(url) = &self.location {
|
if let ImageLocation::Remote(url) = &self.location {
|
||||||
let url = url.clone();
|
let url = url.clone();
|
||||||
let (tx, rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
let (tx, rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
||||||
|
@ -120,16 +132,26 @@ impl<'a> ImageProvider<'a> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let pixbuf = match &self.location {
|
self.load_into_image_sync(image)?;
|
||||||
ImageLocation::Icon { name, theme } => self.get_from_icon(name, theme),
|
|
||||||
ImageLocation::Local(path) => self.get_from_file(path),
|
|
||||||
ImageLocation::Steam(steam_id) => self.get_from_steam_id(steam_id),
|
|
||||||
ImageLocation::Remote(_) => unreachable!(), // handled above
|
|
||||||
}?;
|
|
||||||
|
|
||||||
image.set_pixbuf(Some(&pixbuf));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(not(feature = "http"))]
|
||||||
|
self.load_into_image_sync(image)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_into_image_sync(&self, image: gtk::Image) -> Result<()> {
|
||||||
|
let pixbuf = match &self.location {
|
||||||
|
ImageLocation::Icon { name, theme } => self.get_from_icon(name, theme),
|
||||||
|
ImageLocation::Local(path) => self.get_from_file(path),
|
||||||
|
ImageLocation::Steam(steam_id) => self.get_from_steam_id(steam_id),
|
||||||
|
#[cfg(feature = "http")]
|
||||||
|
_ => unreachable!(), // handled above
|
||||||
|
}?;
|
||||||
|
|
||||||
|
image.set_pixbuf(Some(&pixbuf));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,8 +191,9 @@ impl<'a> ImageProvider<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to get `Bytes` from an HTTP resource asynchronously.
|
/// Attempts to get `Bytes` from an HTTP resource asynchronously.
|
||||||
async fn get_bytes_from_http(url: Url) -> Result<Bytes> {
|
#[cfg(feature = "http")]
|
||||||
|
async fn get_bytes_from_http(url: reqwest::Url) -> Result<glib::Bytes> {
|
||||||
let bytes = reqwest::get(url).await?.bytes().await?;
|
let bytes = reqwest::get(url).await?.bytes().await?;
|
||||||
Ok(Bytes::from_owned(bytes))
|
Ok(glib::Bytes::from_owned(bytes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,8 +294,6 @@ impl Module<gtk::Box> for LauncherModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok::<(), swayipc_async::Error>(())
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -4,14 +4,19 @@
|
||||||
///
|
///
|
||||||
/// Clicking the widget opens a popup containing the current time
|
/// Clicking the widget opens a popup containing the current time
|
||||||
/// with second-level precision and a calendar.
|
/// with second-level precision and a calendar.
|
||||||
|
#[cfg(feature = "clock")]
|
||||||
pub mod clock;
|
pub mod clock;
|
||||||
pub mod custom;
|
pub mod custom;
|
||||||
pub mod focused;
|
pub mod focused;
|
||||||
pub mod launcher;
|
pub mod launcher;
|
||||||
|
#[cfg(feature = "music")]
|
||||||
pub mod music;
|
pub mod music;
|
||||||
pub mod script;
|
pub mod script;
|
||||||
|
#[cfg(feature = "sys_info")]
|
||||||
pub mod sysinfo;
|
pub mod sysinfo;
|
||||||
|
#[cfg(feature = "tray")]
|
||||||
pub mod tray;
|
pub mod tray;
|
||||||
|
#[cfg(feature = "workspaces")]
|
||||||
pub mod workspaces;
|
pub mod workspaces;
|
||||||
|
|
||||||
use crate::config::BarPosition;
|
use crate::config::BarPosition;
|
||||||
|
|
Loading…
Add table
Reference in a new issue