mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-07-01 18:51:04 +02:00
Merge pull request #109 from JakeStanger/fix/tray-icons
fix(tray): icons sometimes not showing
This commit is contained in:
commit
9d09855fce
1 changed files with 54 additions and 7 deletions
|
@ -3,8 +3,12 @@ use crate::config::CommonConfig;
|
||||||
use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext};
|
use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext};
|
||||||
use crate::{await_sync, try_send};
|
use crate::{await_sync, try_send};
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
|
use gtk::gdk_pixbuf::{Colorspace, InterpType};
|
||||||
use gtk::prelude::*;
|
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 serde::Deserialize;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use stray::message::menu::{MenuItem as MenuItemInfo, MenuType};
|
use stray::message::menu::{MenuItem as MenuItemInfo, MenuType};
|
||||||
|
@ -20,9 +24,9 @@ pub struct TrayModule {
|
||||||
pub common: Option<CommonConfig>,
|
pub common: Option<CommonConfig>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets a GTK `Image` component
|
/// Attempts to get a GTK `Image` component
|
||||||
/// for the status notifier item's icon.
|
/// for the status notifier item's icon.
|
||||||
fn get_icon(item: &StatusNotifierItem) -> Option<Image> {
|
fn get_image_from_icon_name(item: &StatusNotifierItem) -> Option<Image> {
|
||||||
item.icon_theme_path.as_ref().and_then(|path| {
|
item.icon_theme_path.as_ref().and_then(|path| {
|
||||||
let theme = IconTheme::new();
|
let theme = IconTheme::new();
|
||||||
theme.append_search_path(path);
|
theme.append_search_path(path);
|
||||||
|
@ -34,6 +38,37 @@ fn get_icon(item: &StatusNotifierItem) -> Option<Image> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Attempts to get an image from the item pixmap.
|
||||||
|
///
|
||||||
|
/// The pixmap is supplied in ARGB32 format,
|
||||||
|
/// which has 8 bits per sample and a bit stride of `4*width`.
|
||||||
|
fn get_image_from_pixmap(item: &StatusNotifierItem) -> Option<Image> {
|
||||||
|
const BITS_PER_SAMPLE: i32 = 8; //
|
||||||
|
|
||||||
|
let pixmap = item
|
||||||
|
.icon_pixmap
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|pixmap| pixmap.first())?;
|
||||||
|
|
||||||
|
let bytes = glib::Bytes::from(&pixmap.pixels);
|
||||||
|
let row_stride = pixmap.width * 4; //
|
||||||
|
|
||||||
|
let pixbuf = gdk_pixbuf::Pixbuf::from_bytes(
|
||||||
|
&bytes,
|
||||||
|
Colorspace::Rgb,
|
||||||
|
true,
|
||||||
|
BITS_PER_SAMPLE,
|
||||||
|
pixmap.width,
|
||||||
|
pixmap.height,
|
||||||
|
row_stride,
|
||||||
|
);
|
||||||
|
|
||||||
|
let pixbuf = pixbuf
|
||||||
|
.scale_simple(16, 16, InterpType::Bilinear)
|
||||||
|
.unwrap_or(pixbuf);
|
||||||
|
Some(Image::from_pixbuf(Some(&pixbuf)))
|
||||||
|
}
|
||||||
|
|
||||||
/// Recursively gets GTK `MenuItem` components
|
/// Recursively gets GTK `MenuItem` components
|
||||||
/// for the provided submenu array.
|
/// for the provided submenu array.
|
||||||
fn get_menu_items(
|
fn get_menu_items(
|
||||||
|
@ -147,13 +182,25 @@ impl Module<MenuBar> for TrayModule {
|
||||||
address,
|
address,
|
||||||
menu,
|
menu,
|
||||||
} => {
|
} => {
|
||||||
|
let addr = &address;
|
||||||
let menu_item = widgets.remove(address.as_str()).unwrap_or_else(|| {
|
let menu_item = widgets.remove(address.as_str()).unwrap_or_else(|| {
|
||||||
let menu_item = MenuItem::new();
|
let menu_item = MenuItem::new();
|
||||||
menu_item.style_context().add_class("item");
|
menu_item.style_context().add_class("item");
|
||||||
if let Some(image) = get_icon(&item) {
|
|
||||||
|
get_image_from_icon_name(&item)
|
||||||
|
.or_else(|| get_image_from_pixmap(&item))
|
||||||
|
.map_or_else(
|
||||||
|
|| {
|
||||||
|
let label =
|
||||||
|
Label::new(Some(item.title.as_ref().unwrap_or(addr)));
|
||||||
|
menu_item.add(&label);
|
||||||
|
},
|
||||||
|
|image| {
|
||||||
image.set_widget_name(address.as_str());
|
image.set_widget_name(address.as_str());
|
||||||
menu_item.add(&image);
|
menu_item.add(&image);
|
||||||
}
|
},
|
||||||
|
);
|
||||||
|
|
||||||
container.add(&menu_item);
|
container.add(&menu_item);
|
||||||
menu_item.show_all();
|
menu_item.show_all();
|
||||||
menu_item
|
menu_item
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue