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:
parent
944006f859
commit
ce48fc9d0d
1 changed files with 8 additions and 2 deletions
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue