1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-08-17 14:51:04 +02:00

fix(tray): prevent widget buttons from piling up (#788)

each call to set_menu_widget registered a new event handler,
resulting in multiple popups to be created. each popup tried
to issue a grab with the same serial.
prevent this by disconnecting any previously registered handler.
This commit is contained in:
Christian Meissl 2024-11-19 23:07:52 +01:00 committed by GitHub
parent 944006f859
commit ce48fc9d0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,4 @@
use glib::Propagation; use glib::{Propagation, SignalHandlerId};
use gtk::gdk::Gravity; use gtk::gdk::Gravity;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{EventBox, Image, Label, MenuItem}; use gtk::{EventBox, Image, Label, MenuItem};
@ -7,6 +7,7 @@ use system_tray::item::{IconPixmap, StatusNotifierItem, Tooltip};
/// Main tray icon to show on the bar /// Main tray icon to show on the bar
pub(crate) struct TrayMenu { pub(crate) struct TrayMenu {
pub event_box: EventBox, pub event_box: EventBox,
button_handler: Option<SignalHandlerId>,
widget: MenuItem, widget: MenuItem,
image_widget: Option<Image>, image_widget: Option<Image>,
label_widget: Option<Label>, label_widget: Option<Label>,
@ -29,6 +30,7 @@ impl TrayMenu {
let mut slf = Self { let mut slf = Self {
event_box, event_box,
button_handler: None,
widget, widget,
image_widget: None, image_widget: None,
label_widget: None, label_widget: None,
@ -113,10 +115,14 @@ impl TrayMenu {
} }
pub fn set_menu_widget(&mut self, menu: system_tray::gtk_menu::Menu) { pub fn set_menu_widget(&mut self, menu: system_tray::gtk_menu::Menu) {
self.event_box let button_handler = self
.event_box
.connect_button_press_event(move |event_box, _event| { .connect_button_press_event(move |event_box, _event| {
menu.popup_at_widget(event_box, Gravity::North, Gravity::South, None); menu.popup_at_widget(event_box, Gravity::North, Gravity::South, None);
Propagation::Proceed Propagation::Proceed
}); });
if let Some(handler) = self.button_handler.replace(button_handler) {
self.event_box.disconnect(handler);
}
} }
} }