diff --git a/escher/include/escher/responder.h b/escher/include/escher/responder.h index c8315c5bb..b0918b5fc 100644 --- a/escher/include/escher/responder.h +++ b/escher/include/escher/responder.h @@ -15,6 +15,7 @@ public: Responder * commonAncestorWith(Responder * responder); void setParentResponder(Responder * responder) { m_parentResponder = responder; } private: + bool hasAncestor(Responder * responder) const; Responder * m_parentResponder; }; diff --git a/escher/src/responder.cpp b/escher/src/responder.cpp index ba0a120f4..72f12c85e 100644 --- a/escher/src/responder.cpp +++ b/escher/src/responder.cpp @@ -7,33 +7,24 @@ Responder * Responder::commonAncestorWith(Responder * responder) { if (responder == nullptr) { return nullptr; } - if (this == responder) { - return this; + Responder * p = this; + while (p != nullptr) { + if (responder->hasAncestor(p)) { + return p; + } + p = p->parentResponder(); } - Responder * rootResponder = this; - while (rootResponder->parentResponder() != responder && rootResponder->parentResponder() != nullptr) { - rootResponder = rootResponder->parentResponder(); - } - if (rootResponder->parentResponder() == responder) { - return responder; - } - rootResponder = responder; - while (rootResponder->parentResponder() != this && rootResponder->parentResponder() != nullptr) { - rootResponder = rootResponder->parentResponder(); - } - if (rootResponder->parentResponder() == this) { - return this; - } - Responder * r = nullptr; - if (parentResponder()) { - r = parentResponder()->commonAncestorWith(responder); - } - Responder * s = nullptr; - if (responder->parentResponder()) { - s = commonAncestorWith(responder->parentResponder()); - } - if (r) { - return r; - } - return s; + return nullptr; +} + +bool Responder::hasAncestor(Responder * responder) const { + assert(responder != nullptr); + Responder * p = const_cast(this); + while (p != nullptr) { + if (p == responder) { + return true; + } + p = p->parentResponder(); + } + return false; }