mirror of
https://github.com/JakeStanger/ironbar.git
synced 2024-11-27 02:54:33 +03:00
fix(tray): icons sometimes not showing
Previously icons were only loaded from the theme based on the provided icon name. Sometimes no icon name was provided, and sometimes the name is just missing from the theme. This falls back to using the provided pixbuf, and then falls back to just displaying the name as text if that is not available.
This commit is contained in:
parent
246313136f
commit
68bc8230dd
@ -3,8 +3,9 @@ use crate::config::CommonConfig;
|
||||
use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext};
|
||||
use crate::{await_sync, try_send};
|
||||
use color_eyre::Result;
|
||||
use gtk::gio::{Cancellable, MemoryInputStream};
|
||||
use gtk::prelude::*;
|
||||
use gtk::{IconLookupFlags, IconTheme, Image, Menu, MenuBar, MenuItem, SeparatorMenuItem};
|
||||
use gtk::{gdk_pixbuf, IconLookupFlags, IconTheme, Image, Label, Menu, MenuBar, MenuItem, SeparatorMenuItem};
|
||||
use serde::Deserialize;
|
||||
use std::collections::HashMap;
|
||||
use stray::message::menu::{MenuItem as MenuItemInfo, MenuType};
|
||||
@ -147,12 +148,35 @@ impl Module<MenuBar> for TrayModule {
|
||||
address,
|
||||
menu,
|
||||
} => {
|
||||
let addr = &address;
|
||||
let menu_item = widgets.remove(address.as_str()).unwrap_or_else(|| {
|
||||
let menu_item = MenuItem::new();
|
||||
menu_item.style_context().add_class("item");
|
||||
|
||||
if let Some(image) = get_icon(&item) {
|
||||
image.set_widget_name(address.as_str());
|
||||
menu_item.add(&image);
|
||||
} else if let Some(pixmap) =
|
||||
item.icon_pixmap.as_ref().and_then(|vec| vec.first())
|
||||
{
|
||||
let bytes = glib::Bytes::from(&pixmap.pixels);
|
||||
let stream = MemoryInputStream::from_bytes(&bytes);
|
||||
let pixbuf = gdk_pixbuf::Pixbuf::from_stream_at_scale(
|
||||
&stream,
|
||||
pixmap.width,
|
||||
pixmap.height,
|
||||
true,
|
||||
Some(&Cancellable::new()),
|
||||
);
|
||||
|
||||
if let Ok(pixbuf) = pixbuf {
|
||||
let image = Image::new();
|
||||
image.set_pixbuf(Some(&pixbuf));
|
||||
menu_item.add(&image);
|
||||
}
|
||||
} else {
|
||||
let label = Label::new(Some(&item.title.as_ref().unwrap_or(addr)));
|
||||
menu_item.add(&label);
|
||||
}
|
||||
container.add(&menu_item);
|
||||
menu_item.show_all();
|
||||
|
Loading…
Reference in New Issue
Block a user