mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-07-01 10:41:03 +02:00
fix(tray): icons ignoring scaling
This commit is contained in:
parent
72440e69c9
commit
0675b917f2
3 changed files with 17 additions and 12 deletions
|
@ -171,7 +171,7 @@ impl<'a> ImageProvider<'a> {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Different error types makes this a bit awkward
|
// Different error types makes this a bit awkward
|
||||||
match pixbuf.map(|pixbuf| Self::create_and_load_surface(&pixbuf, &image, scale))
|
match pixbuf.map(|pixbuf| Self::create_and_load_surface(&pixbuf, &image))
|
||||||
{
|
{
|
||||||
Ok(Err(err)) => error!("{err:?}"),
|
Ok(Err(err)) => error!("{err:?}"),
|
||||||
Err(err) => error!("{err:?}"),
|
Err(err) => error!("{err:?}"),
|
||||||
|
@ -202,7 +202,7 @@ impl<'a> ImageProvider<'a> {
|
||||||
_ => unreachable!(), // handled above
|
_ => unreachable!(), // handled above
|
||||||
}?;
|
}?;
|
||||||
|
|
||||||
Self::create_and_load_surface(&pixbuf, image, scale)
|
Self::create_and_load_surface(&pixbuf, image)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to create a Cairo surface from the provided `Pixbuf`,
|
/// Attempts to create a Cairo surface from the provided `Pixbuf`,
|
||||||
|
@ -210,10 +210,13 @@ impl<'a> ImageProvider<'a> {
|
||||||
/// The surface is then loaded into the provided image.
|
/// The surface is then loaded into the provided image.
|
||||||
///
|
///
|
||||||
/// This is necessary for HiDPI since `Pixbuf`s are always treated as scale factor 1.
|
/// This is necessary for HiDPI since `Pixbuf`s are always treated as scale factor 1.
|
||||||
fn create_and_load_surface(pixbuf: &Pixbuf, image: >k::Image, scale: i32) -> Result<()> {
|
pub fn create_and_load_surface(pixbuf: &Pixbuf, image: >k::Image) -> Result<()> {
|
||||||
let surface = unsafe {
|
let surface = unsafe {
|
||||||
let ptr =
|
let ptr = gdk_cairo_surface_create_from_pixbuf(
|
||||||
gdk_cairo_surface_create_from_pixbuf(pixbuf.as_ptr(), scale, std::ptr::null_mut());
|
pixbuf.as_ptr(),
|
||||||
|
image.scale_factor(),
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
);
|
||||||
Surface::from_raw_full(ptr)
|
Surface::from_raw_full(ptr)
|
||||||
}?;
|
}?;
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,7 @@ fn get_icon_theme_search_paths(icon_theme: &IconTheme) -> HashSet<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_image(item: &StatusNotifierItem, icon_theme: &IconTheme, size: u32) -> Result<Image> {
|
pub fn get_image(item: &StatusNotifierItem, icon_theme: &IconTheme, size: u32) -> Result<Image> {
|
||||||
get_image_from_icon_name(item, icon_theme, size)
|
get_image_from_icon_name(item, icon_theme, size).or_else(|_| get_image_from_pixmap(item, size))
|
||||||
.or_else(|_| get_image_from_pixmap(item, size))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to get a GTK `Image` component
|
/// Attempts to get a GTK `Image` component
|
||||||
|
@ -77,10 +76,11 @@ fn get_image_from_pixmap(item: &StatusNotifierItem, size: u32) -> Result<Image>
|
||||||
let pixmap = item
|
let pixmap = item
|
||||||
.icon_pixmap
|
.icon_pixmap
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|pixmap| pixmap.first())?;
|
.and_then(|pixmap| pixmap.first())
|
||||||
|
.ok_or_else(|| Report::msg("Failed to get pixmap from tray icon"))?;
|
||||||
|
|
||||||
let bytes = glib::Bytes::from(&pixmap.pixels);
|
let bytes = glib::Bytes::from(&pixmap.pixels);
|
||||||
let row_stride = pixmap.width * 4; //
|
let row_stride = pixmap.width * 4;
|
||||||
|
|
||||||
let pixbuf = gdk_pixbuf::Pixbuf::from_bytes(
|
let pixbuf = gdk_pixbuf::Pixbuf::from_bytes(
|
||||||
&bytes,
|
&bytes,
|
||||||
|
@ -95,5 +95,8 @@ fn get_image_from_pixmap(item: &StatusNotifierItem, size: u32) -> Result<Image>
|
||||||
let pixbuf = pixbuf
|
let pixbuf = pixbuf
|
||||||
.scale_simple(size as i32, size as i32, InterpType::Bilinear)
|
.scale_simple(size as i32, size as i32, InterpType::Bilinear)
|
||||||
.unwrap_or(pixbuf);
|
.unwrap_or(pixbuf);
|
||||||
Some(Image::from_pixbuf(Some(&pixbuf)))
|
|
||||||
|
let image = Image::new();
|
||||||
|
ImageProvider::create_and_load_surface(&pixbuf, &image)?;
|
||||||
|
Ok(image)
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,8 +157,7 @@ fn on_update(
|
||||||
}
|
}
|
||||||
|
|
||||||
if item.icon_name.as_ref() != menu_item.icon_name() {
|
if item.icon_name.as_ref() != menu_item.icon_name() {
|
||||||
match icon::get_image(&item, icon_theme, icon_size)
|
match icon::get_image(&item, icon_theme, icon_size) {
|
||||||
{
|
|
||||||
Ok(image) => menu_item.set_image(&image),
|
Ok(image) => menu_item.set_image(&image),
|
||||||
Err(_) => menu_item.set_label(label),
|
Err(_) => menu_item.set_label(label),
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue