fix memory leak that widgets wouldn't be deleted
This commit is contained in:
@@ -1193,6 +1193,14 @@ namespace detail
|
||||
native_interface::enable_window(owner_native, true);
|
||||
}
|
||||
|
||||
//Before exit of pump_event, it should call the remove_trash_handle.
|
||||
//Under Linux, if the windows are closed in other threads, all the widgets handles
|
||||
//will be marked as deleted after exit of the event loop and in other threads. So the
|
||||
//handle should be deleted from trash before exit the pump_event.
|
||||
auto thread_id = ::nana::system::this_thread_id();
|
||||
wd_manager().call_safe_place(thread_id);
|
||||
wd_manager().remove_trash_handle(thread_id);
|
||||
|
||||
lock.forward();
|
||||
|
||||
if(0 == --(context->event_pump_ref_count))
|
||||
|
||||
@@ -28,6 +28,8 @@ namespace nana
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NANA_AUTOMATIC_GUI_TESTING
|
||||
|
||||
void click(widget& w)
|
||||
{
|
||||
std::cout << "Automatically clicking widget "<<w.caption()<<":\n";
|
||||
@@ -41,11 +43,11 @@ namespace nana
|
||||
{
|
||||
if (!wait) return;
|
||||
std::cout << "waiting " << wait << " sec...\n";
|
||||
#ifdef STD_THREAD_NOT_SUPPORTED
|
||||
# ifdef STD_THREAD_NOT_SUPPORTED
|
||||
boost::this_thread::sleep_for(boost::chrono::seconds{ wait });
|
||||
#else
|
||||
# else
|
||||
std::this_thread::sleep_for(std::chrono::seconds{ wait });
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void pump()
|
||||
@@ -61,7 +63,6 @@ namespace nana
|
||||
std::function<void()>f // = {} ///< emit events to mimics user actions and may asert results
|
||||
)
|
||||
{
|
||||
#ifdef NANA_AUTOMATIC_GUI_TESTING
|
||||
|
||||
std::cout << "Will wait " << wait << " sec...\n";
|
||||
|
||||
@@ -87,13 +88,12 @@ namespace nana
|
||||
pump();
|
||||
if (t.joinable())
|
||||
t.join();
|
||||
|
||||
#else
|
||||
static_cast<void>(wait);
|
||||
static_cast<void>(wait_end);
|
||||
static_cast<void>(f); //to eliminte unused parameter compiler warning.
|
||||
|
||||
pump();
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
void exec()
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
detail::bedrock::instance().pump_event(nullptr, false);
|
||||
}
|
||||
#endif
|
||||
}//end namespace nana
|
||||
|
||||
Reference in New Issue
Block a user