fix a caret issue which happens when parent widget is hidden
This commit is contained in:
parent
1dd61ffb24
commit
8be566214c
@ -118,9 +118,11 @@ namespace detail
|
|||||||
|
|
||||||
bool is_ancestor_of(const basic_window* wd) const;
|
bool is_ancestor_of(const basic_window* wd) const;
|
||||||
bool visible_parents() const;
|
bool visible_parents() const;
|
||||||
|
bool displayed() const;
|
||||||
bool belong_to_lazy() const;
|
bool belong_to_lazy() const;
|
||||||
|
const basic_window * child_caret() const; //Returns a child which owns a caret
|
||||||
|
|
||||||
bool is_draw_through() const; ///< Determines whether it is a draw-through window.
|
bool is_draw_through() const; // Determines whether it is a draw-through window.
|
||||||
public:
|
public:
|
||||||
//Override event_holder
|
//Override event_holder
|
||||||
bool set_events(const std::shared_ptr<general_events>&) override;
|
bool set_events(const std::shared_ptr<general_events>&) override;
|
||||||
|
|||||||
@ -282,6 +282,11 @@ namespace nana
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool basic_window::displayed() const
|
||||||
|
{
|
||||||
|
return (visible && visible_parents());
|
||||||
|
}
|
||||||
|
|
||||||
bool basic_window::belong_to_lazy() const
|
bool basic_window::belong_to_lazy() const
|
||||||
{
|
{
|
||||||
for (auto wd = this; wd; wd = wd->parent)
|
for (auto wd = this; wd; wd = wd->parent)
|
||||||
@ -292,6 +297,26 @@ namespace nana
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const basic_window* get_child_caret(const basic_window* wd, bool this_is_a_child)
|
||||||
|
{
|
||||||
|
if (this_is_a_child && wd->together.caret)
|
||||||
|
return wd;
|
||||||
|
|
||||||
|
for (auto child : wd->children)
|
||||||
|
{
|
||||||
|
auto caret_wd = get_child_caret(child, true);
|
||||||
|
if (caret_wd)
|
||||||
|
return caret_wd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const basic_window * basic_window::child_caret() const
|
||||||
|
{
|
||||||
|
return get_child_caret(this, false);
|
||||||
|
}
|
||||||
|
|
||||||
bool basic_window::is_draw_through() const
|
bool basic_window::is_draw_through() const
|
||||||
{
|
{
|
||||||
if (::nana::category::flags::root == this->other.category)
|
if (::nana::category::flags::root == this->other.category)
|
||||||
|
|||||||
@ -63,15 +63,16 @@ namespace nana
|
|||||||
arg.window_handle = reinterpret_cast<window>(wd);
|
arg.window_handle = reinterpret_cast<window>(wd);
|
||||||
if (emit(event_code::expose, wd, arg, false, get_thread_context()))
|
if (emit(event_code::expose, wd, arg, false, get_thread_context()))
|
||||||
{
|
{
|
||||||
if (wd->together.caret)
|
const core_window_t * caret_wd = (wd->together.caret ? wd : wd->child_caret());
|
||||||
|
if (caret_wd)
|
||||||
{
|
{
|
||||||
if (exposed)
|
if (exposed)
|
||||||
{
|
{
|
||||||
if (wd->root_widget->other.attribute.root->focus == wd)
|
if (wd->root_widget->other.attribute.root->focus == caret_wd)
|
||||||
wd->together.caret->visible(true);
|
caret_wd->together.caret->visible(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
wd->together.caret->visible(false);
|
caret_wd->together.caret->visible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!exposed)
|
if (!exposed)
|
||||||
|
|||||||
@ -363,7 +363,7 @@ namespace detail
|
|||||||
void bedrock::pump_event(window modal_window, bool is_modal)
|
void bedrock::pump_event(window modal_window, bool is_modal)
|
||||||
{
|
{
|
||||||
const unsigned tid = ::GetCurrentThreadId();
|
const unsigned tid = ::GetCurrentThreadId();
|
||||||
thread_context * context = this->open_thread_context(tid);
|
auto context = this->open_thread_context(tid);
|
||||||
if(0 == context->window_count)
|
if(0 == context->window_count)
|
||||||
{
|
{
|
||||||
//test if there is not a window
|
//test if there is not a window
|
||||||
|
|||||||
@ -354,7 +354,7 @@ namespace nana
|
|||||||
nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension);
|
nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension);
|
||||||
for (auto wd : data_sect.effects_bground_windows)
|
for (auto wd : data_sect.effects_bground_windows)
|
||||||
{
|
{
|
||||||
if (wd == sigwd || !wd->visible || !wd->visible_parents() ||
|
if (wd == sigwd || !wd->displayed() ||
|
||||||
(false == overlap(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd)))
|
(false == overlap(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@ -698,7 +698,7 @@ namespace detail
|
|||||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||||
if (impl_->wd_register.available(wd) == false) return false;
|
if (impl_->wd_register.available(wd) == false) return false;
|
||||||
|
|
||||||
if (wd->visible && wd->visible_parents())
|
if (wd->displayed())
|
||||||
{
|
{
|
||||||
if(forced || (false == wd->belong_to_lazy()))
|
if(forced || (false == wd->belong_to_lazy()))
|
||||||
{
|
{
|
||||||
@ -722,7 +722,7 @@ namespace detail
|
|||||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||||
|
|
||||||
//It's not worthy to redraw if visible is false
|
//It's not worthy to redraw if visible is false
|
||||||
if (impl_->wd_register.available(wd) && wd->visible && wd->visible_parents())
|
if (impl_->wd_register.available(wd) && wd->displayed())
|
||||||
window_layer::paint(wd, true, true);
|
window_layer::paint(wd, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,7 +1060,7 @@ namespace detail
|
|||||||
bool precondition = false;
|
bool precondition = false;
|
||||||
for (auto & tab_wd : tabs)
|
for (auto & tab_wd : tabs)
|
||||||
{
|
{
|
||||||
if (tab_wd->visible)
|
if (tab_wd->displayed())
|
||||||
{
|
{
|
||||||
precondition = true;
|
precondition = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user