EventReceiver.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/Assertions.h>
  8. #include <AK/Badge.h>
  9. #include <AK/JsonObject.h>
  10. #include <LibCore/Event.h>
  11. #include <LibCore/EventLoop.h>
  12. #include <LibCore/EventReceiver.h>
  13. #include <stdio.h>
  14. namespace Core {
  15. EventReceiver::EventReceiver(EventReceiver* parent)
  16. : m_parent(parent)
  17. {
  18. if (m_parent)
  19. m_parent->add_child(*this);
  20. }
  21. EventReceiver::~EventReceiver()
  22. {
  23. // NOTE: We move our children out to a stack vector to prevent other
  24. // code from trying to iterate over them.
  25. auto children = move(m_children);
  26. // NOTE: We also unparent the children, so that they won't try to unparent
  27. // themselves in their own destructors.
  28. for (auto& child : children)
  29. child->m_parent = nullptr;
  30. stop_timer();
  31. if (m_parent)
  32. m_parent->remove_child(*this);
  33. }
  34. void EventReceiver::event(Core::Event& event)
  35. {
  36. switch (event.type()) {
  37. case Core::Event::Timer:
  38. if (!m_timer_id)
  39. break; // Too late, the timer was already stopped.
  40. return timer_event(static_cast<TimerEvent&>(event));
  41. case Core::Event::ChildAdded:
  42. case Core::Event::ChildRemoved:
  43. return child_event(static_cast<ChildEvent&>(event));
  44. case Core::Event::Invalid:
  45. VERIFY_NOT_REACHED();
  46. break;
  47. case Core::Event::Custom:
  48. return custom_event(static_cast<CustomEvent&>(event));
  49. default:
  50. break;
  51. }
  52. }
  53. ErrorOr<void> EventReceiver::try_add_child(EventReceiver& object)
  54. {
  55. // FIXME: Should we support reparenting objects?
  56. VERIFY(!object.parent() || object.parent() == this);
  57. TRY(m_children.try_append(object));
  58. object.m_parent = this;
  59. Core::ChildEvent child_event(Core::Event::ChildAdded, object);
  60. event(child_event);
  61. return {};
  62. }
  63. void EventReceiver::add_child(EventReceiver& object)
  64. {
  65. MUST(try_add_child(object));
  66. }
  67. void EventReceiver::insert_child_before(EventReceiver& new_child, EventReceiver& before_child)
  68. {
  69. // FIXME: Should we support reparenting objects?
  70. VERIFY(!new_child.parent() || new_child.parent() == this);
  71. new_child.m_parent = this;
  72. m_children.insert_before_matching(new_child, [&](auto& existing_child) { return existing_child.ptr() == &before_child; });
  73. Core::ChildEvent child_event(Core::Event::ChildAdded, new_child, &before_child);
  74. event(child_event);
  75. }
  76. void EventReceiver::remove_child(EventReceiver& object)
  77. {
  78. for (size_t i = 0; i < m_children.size(); ++i) {
  79. if (m_children[i] == &object) {
  80. // NOTE: We protect the child so it survives the handling of ChildRemoved.
  81. NonnullRefPtr<EventReceiver> protector = object;
  82. object.m_parent = nullptr;
  83. m_children.remove(i);
  84. Core::ChildEvent child_event(Core::Event::ChildRemoved, object);
  85. event(child_event);
  86. return;
  87. }
  88. }
  89. VERIFY_NOT_REACHED();
  90. }
  91. void EventReceiver::remove_all_children()
  92. {
  93. while (!m_children.is_empty())
  94. m_children.first()->remove_from_parent();
  95. }
  96. void EventReceiver::timer_event(Core::TimerEvent&)
  97. {
  98. }
  99. void EventReceiver::child_event(Core::ChildEvent&)
  100. {
  101. }
  102. void EventReceiver::custom_event(CustomEvent&)
  103. {
  104. }
  105. void EventReceiver::start_timer(int ms, TimerShouldFireWhenNotVisible fire_when_not_visible)
  106. {
  107. if (m_timer_id) {
  108. dbgln("{} {:p} already has a timer!", class_name(), this);
  109. VERIFY_NOT_REACHED();
  110. }
  111. m_timer_id = Core::EventLoop::register_timer(*this, ms, true, fire_when_not_visible);
  112. }
  113. void EventReceiver::stop_timer()
  114. {
  115. if (!m_timer_id)
  116. return;
  117. Core::EventLoop::unregister_timer(m_timer_id);
  118. m_timer_id = 0;
  119. }
  120. void EventReceiver::deferred_invoke(Function<void()> invokee)
  121. {
  122. Core::deferred_invoke([invokee = move(invokee), strong_this = NonnullRefPtr(*this)] { invokee(); });
  123. }
  124. bool EventReceiver::is_ancestor_of(EventReceiver const& other) const
  125. {
  126. if (&other == this)
  127. return false;
  128. for (auto* ancestor = other.parent(); ancestor; ancestor = ancestor->parent()) {
  129. if (ancestor == this)
  130. return true;
  131. }
  132. return false;
  133. }
  134. void EventReceiver::dispatch_event(Core::Event& e, EventReceiver* stay_within)
  135. {
  136. VERIFY(!stay_within || stay_within == this || stay_within->is_ancestor_of(*this));
  137. auto* target = this;
  138. do {
  139. // If there's an event filter on this target, ask if it wants to swallow this event.
  140. if (target->m_event_filter && !target->m_event_filter(e))
  141. return;
  142. target->event(e);
  143. target = target->parent();
  144. if (target == stay_within) {
  145. // Prevent the event from bubbling any further.
  146. return;
  147. }
  148. } while (target && !e.is_accepted());
  149. }
  150. bool EventReceiver::is_visible_for_timer_purposes() const
  151. {
  152. if (parent())
  153. return parent()->is_visible_for_timer_purposes();
  154. return true;
  155. }
  156. void EventReceiver::set_event_filter(Function<bool(Core::Event&)> filter)
  157. {
  158. m_event_filter = move(filter);
  159. }
  160. }