mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-04-19 11:24:24 +02:00
feat(tray): icon size setting
This commit is contained in:
parent
18e8244580
commit
72440e69c9
3 changed files with 39 additions and 17 deletions
|
@ -7,9 +7,10 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
|
|||
> Type: `tray`
|
||||
|
||||
|
||||
| Name | Type | Default | Description |
|
||||
|-------------|----------|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
|
||||
| `direction` | `string` | `left_to_right` if bar is horizontal, `top_to_bottom` otherwise | Direction to display the tray items. Possible values: `top_to_bottom`, `bottom_to_top`, `left_to_right`, `right_to_left` |
|
||||
| Name | Type | Default | Description |
|
||||
|-------------|-----------|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
|
||||
| `direction` | `string` | `left_to_right` if bar is horizontal, `top_to_bottom` otherwise | Direction to display the tray items. Possible values: `top_to_bottom`, `bottom_to_top`, `left_to_right`, `right_to_left` |
|
||||
| `icon_size` | `integer` | `16` | Size in pixels to display tray icons as |
|
||||
|
||||
<details>
|
||||
<summary>JSON</summary>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use crate::image::ImageProvider;
|
||||
use color_eyre::{Report, Result};
|
||||
use glib::ffi::g_strfreev;
|
||||
use glib::translate::ToGlibPtr;
|
||||
use gtk::ffi::gtk_icon_theme_get_search_path;
|
||||
|
@ -36,29 +38,40 @@ fn get_icon_theme_search_paths(icon_theme: &IconTheme) -> HashSet<String> {
|
|||
paths
|
||||
}
|
||||
|
||||
pub fn get_image(item: &StatusNotifierItem, icon_theme: &IconTheme, size: u32) -> Result<Image> {
|
||||
get_image_from_icon_name(item, icon_theme, size)
|
||||
.or_else(|_| get_image_from_pixmap(item, size))
|
||||
}
|
||||
|
||||
/// Attempts to get a GTK `Image` component
|
||||
/// for the status notifier item's icon.
|
||||
pub(crate) fn get_image_from_icon_name(
|
||||
fn get_image_from_icon_name(
|
||||
item: &StatusNotifierItem,
|
||||
icon_theme: &IconTheme,
|
||||
) -> Option<Image> {
|
||||
size: u32,
|
||||
) -> Result<Image> {
|
||||
if let Some(path) = item.icon_theme_path.as_ref() {
|
||||
if !path.is_empty() && !get_icon_theme_search_paths(icon_theme).contains(path) {
|
||||
icon_theme.append_search_path(path);
|
||||
}
|
||||
}
|
||||
|
||||
item.icon_name.as_ref().and_then(|icon_name| {
|
||||
let icon_info = icon_theme.lookup_icon(icon_name, 16, IconLookupFlags::empty());
|
||||
icon_info.map(|icon_info| Image::from_pixbuf(icon_info.load_icon().ok().as_ref()))
|
||||
})
|
||||
let icon_info = item.icon_name.as_ref().and_then(|icon_name| {
|
||||
icon_theme.lookup_icon(icon_name, size as i32, IconLookupFlags::empty())
|
||||
});
|
||||
|
||||
let pixbuf = icon_info.unwrap().load_icon()?;
|
||||
|
||||
let image = Image::new();
|
||||
ImageProvider::create_and_load_surface(&pixbuf, &image)?;
|
||||
Ok(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`.
|
||||
pub(crate) fn get_image_from_pixmap(item: &StatusNotifierItem) -> Option<Image> {
|
||||
fn get_image_from_pixmap(item: &StatusNotifierItem, size: u32) -> Result<Image> {
|
||||
const BITS_PER_SAMPLE: i32 = 8;
|
||||
|
||||
let pixmap = item
|
||||
|
@ -80,7 +93,7 @@ pub(crate) fn get_image_from_pixmap(item: &StatusNotifierItem) -> Option<Image>
|
|||
);
|
||||
|
||||
let pixbuf = pixbuf
|
||||
.scale_simple(16, 16, InterpType::Bilinear)
|
||||
.scale_simple(size as i32, size as i32, InterpType::Bilinear)
|
||||
.unwrap_or(pixbuf);
|
||||
Some(Image::from_pixbuf(Some(&pixbuf)))
|
||||
}
|
||||
|
|
|
@ -18,12 +18,20 @@ use tokio::sync::mpsc;
|
|||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct TrayModule {
|
||||
#[serde(default = "default_icon_size")]
|
||||
icon_size: u32,
|
||||
|
||||
#[serde(default, deserialize_with = "deserialize_orientation")]
|
||||
pub direction: Option<PackDirection>,
|
||||
direction: Option<PackDirection>,
|
||||
|
||||
#[serde(flatten)]
|
||||
pub common: Option<CommonConfig>,
|
||||
}
|
||||
|
||||
const fn default_icon_size() -> u32 {
|
||||
16
|
||||
}
|
||||
|
||||
fn deserialize_orientation<'de, D>(deserializer: D) -> Result<Option<PackDirection>, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
|
@ -106,7 +114,7 @@ impl Module<MenuBar> for TrayModule {
|
|||
|
||||
// listen for UI updates
|
||||
glib_recv!(context.subscribe(), update =>
|
||||
on_update(update, &container, &mut menus, &icon_theme, &context.controller_tx)
|
||||
on_update(update, &container, &mut menus, &icon_theme, self.icon_size, &context.controller_tx)
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -124,6 +132,7 @@ fn on_update(
|
|||
container: &MenuBar,
|
||||
menus: &mut HashMap<Box<str>, TrayMenu>,
|
||||
icon_theme: &IconTheme,
|
||||
icon_size: u32,
|
||||
tx: &mpsc::Sender<NotifierItemCommand>,
|
||||
) {
|
||||
match update {
|
||||
|
@ -148,11 +157,10 @@ fn on_update(
|
|||
}
|
||||
|
||||
if item.icon_name.as_ref() != menu_item.icon_name() {
|
||||
match icon::get_image_from_icon_name(&item, icon_theme)
|
||||
.or_else(|| icon::get_image_from_pixmap(&item))
|
||||
match icon::get_image(&item, icon_theme, icon_size)
|
||||
{
|
||||
Some(image) => menu_item.set_image(&image),
|
||||
None => menu_item.set_label(label),
|
||||
Ok(image) => menu_item.set_image(&image),
|
||||
Err(_) => menu_item.set_label(label),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue