refactor
This commit is contained in:
parent
7130cc798c
commit
5917b1eb36
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* A Bedrock Implementation
|
* A Bedrock Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* 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.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -70,6 +70,9 @@ namespace detail
|
|||||||
|
|
||||||
element_store& get_element_store() const;
|
element_store& get_element_store() const;
|
||||||
void map_through_widgets(core_window_t*, native_drawable_type);
|
void map_through_widgets(core_window_t*, native_drawable_type);
|
||||||
|
|
||||||
|
//Closes the windows which are associated with the specified thread. If the given thread_id is 0, it closes all windows
|
||||||
|
void close_thread_window(unsigned thread_id);
|
||||||
public:
|
public:
|
||||||
void event_expose(core_window_t *, bool exposed);
|
void event_expose(core_window_t *, bool exposed);
|
||||||
void event_move(core_window_t*, int x, int y);
|
void event_move(core_window_t*, int x, int y);
|
||||||
@ -92,7 +95,6 @@ namespace detail
|
|||||||
private:
|
private:
|
||||||
void _m_emit_core(event_code, core_window_t*, bool draw_only, const event_arg&);
|
void _m_emit_core(event_code, core_window_t*, bool draw_only, const event_arg&);
|
||||||
void _m_event_filter(event_code, core_window_t*, thread_context*);
|
void _m_event_filter(event_code, core_window_t*, thread_context*);
|
||||||
void _m_except_handler();
|
|
||||||
private:
|
private:
|
||||||
static bedrock bedrock_object;
|
static bedrock bedrock_object;
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* A Bedrock Platform-Independent Implementation
|
* A Bedrock Platform-Independent Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* 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.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (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)
|
void bedrock::event_expose(core_window_t * wd, bool exposed)
|
||||||
{
|
{
|
||||||
if (nullptr == wd) return;
|
if (nullptr == wd) return;
|
||||||
@ -585,29 +606,5 @@ namespace nana
|
|||||||
throw std::runtime_error("Invalid event code");
|
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 detail
|
||||||
}//end namespace nana
|
}//end namespace nana
|
||||||
@ -443,7 +443,7 @@ namespace detail
|
|||||||
).show();
|
).show();
|
||||||
|
|
||||||
internal_scope_guard lock;
|
internal_scope_guard lock;
|
||||||
_m_except_handler();
|
this->close_thread_window(nana::system::this_thread_id());
|
||||||
|
|
||||||
intr_locker.forward();
|
intr_locker.forward();
|
||||||
if (0 == --(context->event_pump_ref_count))
|
if (0 == --(context->event_pump_ref_count))
|
||||||
@ -460,7 +460,7 @@ namespace detail
|
|||||||
<< "\n in form: " << API::window_caption(condition_wd)
|
<< "\n in form: " << API::window_caption(condition_wd)
|
||||||
).show();
|
).show();
|
||||||
internal_scope_guard lock;
|
internal_scope_guard lock;
|
||||||
_m_except_handler();
|
this->close_thread_window(nana::system::this_thread_id());
|
||||||
|
|
||||||
intr_locker.forward();
|
intr_locker.forward();
|
||||||
if(0 == --(context->event_pump_ref_count))
|
if(0 == --(context->event_pump_ref_count))
|
||||||
|
|||||||
@ -348,74 +348,15 @@ namespace API
|
|||||||
//close all windows in current thread
|
//close all windows in current thread
|
||||||
void exit()
|
void exit()
|
||||||
{
|
{
|
||||||
std::vector<basic_window*> v;
|
|
||||||
|
|
||||||
internal_scope_guard lock;
|
internal_scope_guard lock;
|
||||||
restrict::wd_manager().all_handles(v);
|
restrict::bedrock.close_thread_window(nana::system::this_thread_id());
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//close all windows
|
//close all windows
|
||||||
void exit_all()
|
void exit_all()
|
||||||
{
|
{
|
||||||
std::vector<basic_window*> v;
|
|
||||||
|
|
||||||
internal_scope_guard lock;
|
internal_scope_guard lock;
|
||||||
restrict::wd_manager().all_handles(v);
|
restrict::bedrock.close_thread_window(0);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//transform_shortkey_text
|
//transform_shortkey_text
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user