From 49e492338443a3411a5f1abf5543a473f4e94987 Mon Sep 17 00:00:00 2001 From: Jesse Yurkovich Date: Mon, 16 Oct 2023 04:00:15 +0200 Subject: [PATCH] Fix #113697: Fix timer leak from panel drag/animate processing When clicking or dragging a Panel's drag handle, a PANEL_STATE_DRAG state transition is followed immediately by a PANEL_STATE_ANIMATE transition. Both transitions start a timer. Unfortunately, a subtle change introduced in f3ab698951a54ce29418b464744c86d7a99dd507 meant the first timer would no longer be destroyed before starting the second one. The fix is to just reuse the timer if it's already present so that a second one is not created in the first place. Pull Request: https://projects.blender.org/blender/blender/pulls/113711 --- source/blender/editors/interface/interface_panel.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface_panel.cc b/source/blender/editors/interface/interface_panel.cc index f25093cbc96..52aad5be1ed 100644 --- a/source/blender/editors/interface/interface_panel.cc +++ b/source/blender/editors/interface/interface_panel.cc @@ -2509,6 +2509,8 @@ static void panel_handle_data_ensure(const bContext *C, Panel *panel, const uiHandlePanelState state) { + BLI_assert(ELEM(state, PANEL_STATE_DRAG, PANEL_STATE_ANIMATION)); + if (panel->activedata == nullptr) { panel->activedata = MEM_callocN(sizeof(uiHandlePanelData), __func__); WM_event_add_ui_handler(C, @@ -2521,7 +2523,11 @@ static void panel_handle_data_ensure(const bContext *C, uiHandlePanelData *data = static_cast(panel->activedata); - data->animtimer = WM_event_timer_add(CTX_wm_manager(C), win, TIMER, ANIMATION_INTERVAL); + /* Only create a new timer if necessary. Reuse can occur when PANEL_STATE_ANIMATION follows + * PANEL_STATE_DRAG for example (i.e. panel->activedata was present already). */ + if (!data->animtimer) { + data->animtimer = WM_event_timer_add(CTX_wm_manager(C), win, TIMER, ANIMATION_INTERVAL); + } data->state = state; data->startx = win->eventstate->xy[0];