diff --git a/Libraries/LibCore/CObject.cpp b/Libraries/LibCore/CObject.cpp index 4014fc032e..28928ac9ba 100644 --- a/Libraries/LibCore/CObject.cpp +++ b/Libraries/LibCore/CObject.cpp @@ -5,16 +5,24 @@ #include #include +IntrusiveList& CObject::all_objects() +{ + static IntrusiveList objects; + return objects; +} + CObject::CObject(CObject* parent, bool is_widget) : m_parent(parent) , m_widget(is_widget) { + all_objects().append(*this); if (m_parent) m_parent->add_child(*this); } CObject::~CObject() { + all_objects().remove(*this); stop_timer(); if (m_parent) m_parent->remove_child(*this); diff --git a/Libraries/LibCore/CObject.h b/Libraries/LibCore/CObject.h index 69e2b11cd8..c8c6f743c9 100644 --- a/Libraries/LibCore/CObject.h +++ b/Libraries/LibCore/CObject.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -18,6 +19,8 @@ public: \ class CObject : public Weakable { // NOTE: No C_OBJECT macro for CObject itself. public: + IntrusiveListNode m_all_objects_list_node; + virtual ~CObject(); virtual const char* class_name() const = 0; @@ -60,8 +63,10 @@ public: bool is_widget() const { return m_widget; } virtual bool is_window() const { return false; } + static IntrusiveList& all_objects(); + protected: - CObject(CObject* parent = nullptr, bool is_widget = false); + explicit CObject(CObject* parent = nullptr, bool is_widget = false); virtual void timer_event(CTimerEvent&); virtual void custom_event(CCustomEvent&);