This commit is contained in:
Jinhao
2017-03-29 04:43:00 +08:00
parent 7130cc798c
commit 5917b1eb36
4 changed files with 31 additions and 91 deletions

View File

@@ -1,7 +1,7 @@
/*
* A Bedrock Platform-Independent Implementation
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com)
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
@@ -119,6 +119,27 @@ namespace nana
}
}
void bedrock::close_thread_window(unsigned thread_id)
{
std::vector<core_window_t*> v;
wd_manager().all_handles(v);
std::vector<native_window_type> roots;
native_window_type root = nullptr;
for (auto wd : v)
{
if (((0 == thread_id) || (wd->thread_id == thread_id)) && (wd->root != root))
{
root = wd->root;
if (roots.cend() == std::find(roots.cbegin(), roots.cend(), root))
roots.emplace_back(root);
}
}
for (auto i : roots)
native_interface::close_window(i);
}
void bedrock::event_expose(core_window_t * wd, bool exposed)
{
if (nullptr == wd) return;
@@ -585,29 +606,5 @@ namespace nana
throw std::runtime_error("Invalid event code");
}
}
void bedrock::_m_except_handler()
{
std::vector<core_window_t*> v;
wd_manager().all_handles(v);
if (v.size())
{
std::vector<native_window_type> roots;
native_window_type root = nullptr;
unsigned tid = nana::system::this_thread_id();
for (auto wd : v)
{
if ((wd->thread_id == tid) && (wd->root != root))
{
root = wd->root;
if (roots.cend() == std::find(roots.cbegin(), roots.cend(), root))
roots.emplace_back(root);
}
}
for (auto i : roots)
native_interface::close_window(i);
}
}
}//end namespace detail
}//end namespace nana

View File

@@ -443,7 +443,7 @@ namespace detail
).show();
internal_scope_guard lock;
_m_except_handler();
this->close_thread_window(nana::system::this_thread_id());
intr_locker.forward();
if (0 == --(context->event_pump_ref_count))
@@ -460,7 +460,7 @@ namespace detail
<< "\n in form: " << API::window_caption(condition_wd)
).show();
internal_scope_guard lock;
_m_except_handler();
this->close_thread_window(nana::system::this_thread_id());
intr_locker.forward();
if(0 == --(context->event_pump_ref_count))

View File

@@ -348,74 +348,15 @@ namespace API
//close all windows in current thread
void exit()
{
std::vector<basic_window*> v;
internal_scope_guard lock;
restrict::wd_manager().all_handles(v);
if(v.size())
{
std::vector<native_window_type> roots;
native_window_type root = nullptr;
unsigned tid = nana::system::this_thread_id();
for(auto wd : v)
{
if((wd->thread_id == tid) && (wd->root != root))
{
root = wd->root;
bool exists = false;
for (auto i = roots.cbegin(); i != roots.cend(); ++i)
{
if (*i == root)
{
exists = true;
break;
}
}
if (!exists)
roots.emplace_back(root);
}
}
for(auto i : roots)
interface_type::close_window(i);
}
restrict::bedrock.close_thread_window(nana::system::this_thread_id());
}
//close all windows
void exit_all()
{
std::vector<basic_window*> v;
internal_scope_guard lock;
restrict::wd_manager().all_handles(v);
if (v.size())
{
std::vector<native_window_type> roots;
native_window_type root = nullptr;
//unsigned tid = nana::system::this_thread_id();
for (auto wd : v)
{
if (/*(wd->thread_id == tid) &&*/ (wd->root != root))
{
root = wd->root;
bool exists = false;
for (auto i = roots.cbegin(); i != roots.cend(); ++i)
{
if (*i == root)
{
exists = true;
break;
}
}
if (!exists)
roots.emplace_back(root);
}
}
for (auto i : roots)
interface_type::close_window(i);
}
restrict::bedrock.close_thread_window(0);
}
//transform_shortkey_text