Jelajahi Sumber

CObject: Put all CObjects on a global IntrusiveList for introspection

This will allow us to easily traverse the entire CObject graph.
Andreas Kling 6 tahun lalu
induk
melakukan
2fa2d72761
2 mengubah file dengan 14 tambahan dan 1 penghapusan
  1. 8 0
      Libraries/LibCore/CObject.cpp
  2. 6 1
      Libraries/LibCore/CObject.h

+ 8 - 0
Libraries/LibCore/CObject.cpp

@@ -5,16 +5,24 @@
 #include <LibCore/CObject.h>
 #include <stdio.h>
 
+IntrusiveList<CObject, &CObject::m_all_objects_list_node>& CObject::all_objects()
+{
+    static IntrusiveList<CObject, &CObject::m_all_objects_list_node> 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);

+ 6 - 1
Libraries/LibCore/CObject.h

@@ -2,6 +2,7 @@
 
 #include <AK/AKString.h>
 #include <AK/Function.h>
+#include <AK/IntrusiveList.h>
 #include <AK/StdLibExtras.h>
 #include <AK/Vector.h>
 #include <AK/Weakable.h>
@@ -18,6 +19,8 @@ public:                 \
 class CObject : public Weakable<CObject> {
     // 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<CObject, &CObject::m_all_objects_list_node>& 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&);