diff --git a/CHANGELOG.md b/CHANGELOG.md index aa38d016..77119b8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to eww will be listed here, starting at changes since versio ### Features - Update rust toolchain to 1.80.1 (By: w-lfchen) +- Add `:fill-svg` and `:preserve-aspect-ratio` properties to images (By: hypernova7, w-lfchen) - Add `:truncate` property to labels, disabled by default (except in cases where truncation would be enabled in version `0.5.0` and before) (By: Rayzeq). - Add support for `:hover` css selectors for tray items (By: zeapoz) - Add `min` and `max` function calls to simplexpr (By: ovalkonia) diff --git a/crates/eww/src/widgets/widget_definitions.rs b/crates/eww/src/widgets/widget_definitions.rs index dc8aae77..12225bd0 100644 --- a/crates/eww/src/widgets/widget_definitions.rs +++ b/crates/eww/src/widgets/widget_definitions.rs @@ -571,12 +571,35 @@ fn build_gtk_image(bargs: &mut BuilderArgs) -> Result { // @prop path - path to the image file // @prop image-width - width of the image // @prop image-height - height of the image - prop(path: as_string, image_width: as_i32 = -1, image_height: as_i32 = -1) { + // @prop preserve-aspect-ratio - whether to keep the aspect ratio when resizing an image. Default: true, false doesn't work for all image types + // @prop fill-svg - sets the color of svg images + prop(path: as_string, image_width: as_i32 = -1, image_height: as_i32 = -1, preserve_aspect_ratio: as_bool = true, fill_svg: as_string = "") { + if !path.ends_with(".svg") && !fill_svg.is_empty() { + log::warn!("Fill attribute ignored, file is not an svg image"); + } + if path.ends_with(".gif") { let pixbuf_animation = gtk::gdk_pixbuf::PixbufAnimation::from_file(std::path::PathBuf::from(path))?; gtk_widget.set_from_animation(&pixbuf_animation); } else { - let pixbuf = gtk::gdk_pixbuf::Pixbuf::from_file_at_size(std::path::PathBuf::from(path), image_width, image_height)?; + let pixbuf; + // populate the pixel buffer + if path.ends_with(".svg") && !fill_svg.is_empty() { + let svg_data = std::fs::read_to_string(std::path::PathBuf::from(path.clone()))?; + // The fastest way to add/change fill color + let svg_data = if svg_data.contains("fill=") { + let reg = regex::Regex::new(r#"fill="[^"]*""#)?; + reg.replace(&svg_data, &format!("fill=\"{}\"", fill_svg)) + } else { + let reg = regex::Regex::new(r")?; + stream.close(None::<>k::gio::Cancellable>)?; + } else { + pixbuf = gtk::gdk_pixbuf::Pixbuf::from_file_at_scale(std::path::PathBuf::from(path), image_width, image_height, preserve_aspect_ratio)?; + } gtk_widget.set_from_pixbuf(Some(&pixbuf)); } },