void UIManager::onWidgetDestroy(const UIWidgetPtr& widget) { // release input grabs if(m_keyboardReceiver == widget) resetKeyboardReceiver(); if(m_mouseReceiver == widget) resetMouseReceiver(); if(m_hoveredWidget == widget) updateHoveredWidget(); if(m_pressedWidget == widget) updatePressedWidget(nullptr); if(m_draggingWidget == widget) updateDraggingWidget(nullptr); #ifndef NDEBUG if(widget == m_rootWidget || !m_rootWidget) return; m_destroyedWidgets.push_back(widget); if(m_checkEvent && !m_checkEvent->isExecuted()) return; m_checkEvent = g_dispatcher.scheduleEvent([this] { g_lua.collectGarbage(); UIWidgetList backupList = m_destroyedWidgets; m_destroyedWidgets.clear(); g_dispatcher.scheduleEvent([backupList] { g_lua.collectGarbage(); for(const UIWidgetPtr& widget : backupList) { if(widget->ref_count() != 1) g_logger.warning(stdext::format("widget '%s' destroyed but still have %d reference(s) left", widget->getId(), widget->getUseCount()-1)); } }, 1); }, 1000); #endif }