context_menu: Fix subscription leak. (#1337)

This commit is contained in:
Jason Lee 2025-10-08 16:02:21 +08:00 committed by GitHub
parent 66851c55e4
commit 1db3e03fc3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,7 +4,7 @@ use gpui::{
anchored, deferred, div, prelude::FluentBuilder, px, relative, AnyElement, App, Context, anchored, deferred, div, prelude::FluentBuilder, px, relative, AnyElement, App, Context,
Corner, DismissEvent, Element, ElementId, Entity, Focusable, GlobalElementId, Corner, DismissEvent, Element, ElementId, Entity, Focusable, GlobalElementId,
InspectorElementId, InteractiveElement, IntoElement, MouseButton, MouseDownEvent, InspectorElementId, InteractiveElement, IntoElement, MouseButton, MouseDownEvent,
ParentElement, Pixels, Point, Position, Stateful, Style, Window, ParentElement, Pixels, Point, Position, Stateful, Style, Subscription, Window,
}; };
use crate::menu::popup_menu::PopupMenu; use crate::menu::popup_menu::PopupMenu;
@ -76,6 +76,7 @@ struct ContextMenuSharedState {
menu_view: Option<Entity<PopupMenu>>, menu_view: Option<Entity<PopupMenu>>,
open: bool, open: bool,
position: Point<Pixels>, position: Point<Pixels>,
_subscription: Option<Subscription>,
} }
pub struct ContextMenuState { pub struct ContextMenuState {
@ -91,6 +92,7 @@ impl Default for ContextMenuState {
menu_view: None, menu_view: None,
open: false, open: false,
position: Default::default(), position: Default::default(),
_subscription: None,
})), })),
} }
} }
@ -243,17 +245,16 @@ impl Element for ContextMenu {
}) })
.into_element(); .into_element();
window let _subscription = window.subscribe(&menu, cx, {
.subscribe(&menu, cx, {
let shared_state = shared_state.clone(); let shared_state = shared_state.clone();
move |_, _: &DismissEvent, window, _| { move |_, _: &DismissEvent, window, _| {
shared_state.borrow_mut().open = false; shared_state.borrow_mut().open = false;
window.refresh(); window.refresh();
} }
}) });
.detach();
shared_state.borrow_mut().menu_view = Some(menu.clone()); shared_state.borrow_mut().menu_view = Some(menu.clone());
shared_state.borrow_mut()._subscription = Some(_subscription);
window.refresh(); window.refresh();
} }
}); });