From 1db3e03fc3427974985bc37a2ac5104c709444f1 Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Wed, 8 Oct 2025 16:02:21 +0800 Subject: [PATCH] context_menu: Fix subscription leak. (#1337) --- crates/ui/src/menu/context_menu.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/crates/ui/src/menu/context_menu.rs b/crates/ui/src/menu/context_menu.rs index aaec290e..5367c314 100644 --- a/crates/ui/src/menu/context_menu.rs +++ b/crates/ui/src/menu/context_menu.rs @@ -4,7 +4,7 @@ use gpui::{ anchored, deferred, div, prelude::FluentBuilder, px, relative, AnyElement, App, Context, Corner, DismissEvent, Element, ElementId, Entity, Focusable, GlobalElementId, 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; @@ -76,6 +76,7 @@ struct ContextMenuSharedState { menu_view: Option>, open: bool, position: Point, + _subscription: Option, } pub struct ContextMenuState { @@ -91,6 +92,7 @@ impl Default for ContextMenuState { menu_view: None, open: false, position: Default::default(), + _subscription: None, })), } } @@ -243,17 +245,16 @@ impl Element for ContextMenu { }) .into_element(); - window - .subscribe(&menu, cx, { - let shared_state = shared_state.clone(); - move |_, _: &DismissEvent, window, _| { - shared_state.borrow_mut().open = false; - window.refresh(); - } - }) - .detach(); + let _subscription = window.subscribe(&menu, cx, { + let shared_state = shared_state.clone(); + move |_, _: &DismissEvent, window, _| { + shared_state.borrow_mut().open = false; + window.refresh(); + } + }); shared_state.borrow_mut().menu_view = Some(menu.clone()); + shared_state.borrow_mut()._subscription = Some(_subscription); window.refresh(); } });