mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 09:28:11 +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
9 changed files with 54 additions and 17 deletions
|
@ -48,6 +48,8 @@ public:
|
|||
template<typename T, typename Callback>
|
||||
void for_each_child_of_type(Callback callback);
|
||||
|
||||
bool is_ancestor_of(const CObject&) const;
|
||||
|
||||
CObject* parent() { return m_parent; }
|
||||
const CObject* parent() const { return m_parent; }
|
||||
|
||||
|
@ -71,6 +73,8 @@ public:
|
|||
|
||||
static IntrusiveList<CObject, &CObject::m_all_objects_list_node>& all_objects();
|
||||
|
||||
void dispatch_event(CEvent&, CObject* stay_within = nullptr);
|
||||
|
||||
protected:
|
||||
explicit CObject(CObject* parent = nullptr, bool is_widget = false);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue