Skip to content

Commit bdf6b3b

Browse files
authored
Merge pull request #782 from JakeStanger/fix/tray-fixes2
More tray fixes
2 parents 42e25f5 + f364bb6 commit bdf6b3b

File tree

5 files changed

+15
-107
lines changed

5 files changed

+15
-107
lines changed

Diff for: Cargo.lock

+1-65
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ notifications = ["zbus"]
6868

6969
sys_info = ["sysinfo", "regex"]
7070

71-
tray = ["system-tray", "png"]
71+
tray = ["system-tray"]
7272

7373
upower = ["upower_dbus", "zbus", "futures-lite"]
7474

@@ -149,7 +149,6 @@ sysinfo = { version = "0.29.11", optional = true }
149149

150150
# tray
151151
system-tray = { version = "0.4.0", features = ["dbusmenu-gtk3"], optional = true }
152-
png = { version = "0.17.14", optional = true }
153152

154153
# upower
155154
upower_dbus = { version = "0.3.2", optional = true }

Diff for: src/modules/tray/icon.rs

-34
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use gtk::ffi::gtk_icon_theme_get_search_path;
77
use gtk::gdk_pixbuf::{Colorspace, InterpType, Pixbuf};
88
use gtk::prelude::IconThemeExt;
99
use gtk::{IconLookupFlags, IconTheme, Image};
10-
use png::ColorType;
1110
use std::collections::HashSet;
1211
use std::ffi::CStr;
1312
use std::os::raw::{c_char, c_int};
@@ -126,36 +125,3 @@ fn get_image_from_pixmap(item: &TrayMenu, size: u32) -> Result<Image> {
126125
ImageProvider::create_and_load_surface(&pixbuf, &image)?;
127126
Ok(image)
128127
}
129-
130-
pub struct PngData<'a>(pub &'a [u8]);
131-
impl TryFrom<PngData<'_>> for Image {
132-
type Error = Report;
133-
134-
fn try_from(value: PngData) -> std::result::Result<Self, Self::Error> {
135-
let data = value.0;
136-
137-
let decoder = png::Decoder::new(data);
138-
let mut reader = decoder.read_info()?;
139-
let mut buf = vec![0; reader.output_buffer_size()];
140-
141-
let info = reader.next_frame(&mut buf)?;
142-
let bytes = glib::Bytes::from(&buf[..info.buffer_size()]);
143-
144-
let has_alpha = matches!(info.color_type, ColorType::Rgba | ColorType::GrayscaleAlpha);
145-
let row_stride_multiplier = if has_alpha { 4 } else { 3 };
146-
147-
let pixbuf = Pixbuf::from_bytes(
148-
&bytes,
149-
Colorspace::Rgb,
150-
has_alpha,
151-
info.bit_depth as i32,
152-
info.width as i32,
153-
info.height as i32,
154-
(info.width * row_stride_multiplier) as i32,
155-
);
156-
157-
let image = Image::new();
158-
ImageProvider::create_and_load_surface(&pixbuf, &image)?;
159-
Ok(image)
160-
}
161-
}

Diff for: src/modules/tray/interface.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use system_tray::item::{IconPixmap, StatusNotifierItem, Tooltip};
77
/// Main tray icon to show on the bar
88
pub(crate) struct TrayMenu {
99
pub event_box: EventBox,
10-
pub widget: MenuItem,
10+
widget: MenuItem,
1111
image_widget: Option<Image>,
1212
label_widget: Option<Label>,
1313

@@ -18,7 +18,7 @@ pub(crate) struct TrayMenu {
1818
}
1919

2020
impl TrayMenu {
21-
pub fn new(item: StatusNotifierItem) -> Self {
21+
pub fn new(address: &str, item: StatusNotifierItem) -> Self {
2222
let event_box = EventBox::new();
2323

2424
let widget = MenuItem::new();
@@ -27,7 +27,7 @@ impl TrayMenu {
2727

2828
event_box.show_all();
2929

30-
Self {
30+
let mut slf = Self {
3131
event_box,
3232
widget,
3333
image_widget: None,
@@ -36,7 +36,14 @@ impl TrayMenu {
3636
icon_name: item.icon_name,
3737
icon_theme_path: item.icon_theme_path,
3838
icon_pixmap: item.icon_pixmap,
39+
};
40+
41+
if let Some(menu) = item.menu {
42+
let menu = system_tray::gtk_menu::Menu::new(address, &menu);
43+
slf.set_menu_widget(menu);
3944
}
45+
46+
slf
4047
}
4148

4249
/// Updates the label text, and shows it in favour of the image.

Diff for: src/modules/tray/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ fn on_update(
150150
Event::Add(address, item) => {
151151
debug!("Received new tray item at '{address}': {item:?}");
152152

153-
let mut menu_item = TrayMenu::new(*item);
153+
let mut menu_item = TrayMenu::new(&address, *item);
154154
container.pack_start(&menu_item.event_box, true, true, 0);
155155

156156
if let Ok(image) = icon::get_image(&menu_item, icon_theme, icon_size, prefer_icons) {
@@ -160,7 +160,7 @@ fn on_update(
160160
menu_item.set_label(&label);
161161
};
162162

163-
menu_item.widget.show();
163+
menu_item.event_box.show();
164164
menus.insert(address.into(), menu_item);
165165
}
166166
Event::Update(address, update) => {
@@ -210,7 +210,7 @@ fn on_update(
210210
debug!("Removing tray item at '{address}'");
211211

212212
if let Some(menu) = menus.get(address.as_str()) {
213-
container.remove(&menu.widget);
213+
container.remove(&menu.event_box);
214214
}
215215
}
216216
};

0 commit comments

Comments
 (0)