mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-13 06:32:54 +00:00
LibCore+LibGUI+WindowServer: Make events bubble up through ancestors
With this patch, CEvents no longer stop at the target object, but will bubble up the ancestor chain as long as CEvent::is_accepted() is false. To the set accepted flag, call CEvent::accept(). To clear the accepted flag, call CEvent::ignore(). Events start out in the accepted state, so if you want them to bubble up, you have to call ignore() on them. Using this mechanism, we now ignore non-tabbing keydown events in GWidget, causing them to bubble up through the widget's ancestors. :^)
This commit is contained in:
parent
74c4e62659
commit
fcc3745b02
Notes:
sideshowbarker
2024-07-19 12:02:50 +09:00
Author: https://github.com/awesomekling
Commit: fcc3745b02
9 changed files with 54 additions and 17 deletions
|
@ -134,3 +134,24 @@ void CObject::save_to(JsonObject& json)
|
|||
json.set("name", name());
|
||||
json.set("parent", String::format("%p", parent()));
|
||||
}
|
||||
|
||||
bool CObject::is_ancestor_of(const CObject& other) const
|
||||
{
|
||||
if (&other == this)
|
||||
return false;
|
||||
for (auto* ancestor = other.parent(); ancestor; ancestor = ancestor->parent()) {
|
||||
if (ancestor == this)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CObject::dispatch_event(CEvent& e, CObject* stay_within)
|
||||
{
|
||||
ASSERT(!stay_within || stay_within == this || stay_within->is_ancestor_of(*this));
|
||||
auto* target = this;
|
||||
do {
|
||||
target->event(e);
|
||||
target = target->parent();
|
||||
} while (target && target != stay_within && !e.is_accepted());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue