From 57ff293a51d97742d50987950c86dfcde55e6ad1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 19 Mar 2019 00:01:02 +0100 Subject: LibGUI: Implement nested event loops to support dialog boxes. This patch adds a simple GMessageBox that can run in a nested event loop. Here's how you use it: GMessageBox box("Message text here", "Message window title"); int result = box.exec(); The next step is to make the WindowServer respect the modality flag of these windows and prevent interaction with other windows in the same process until the modal window has been closed. --- LibGUI/GObject.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'LibGUI/GObject.cpp') diff --git a/LibGUI/GObject.cpp b/LibGUI/GObject.cpp index 1d2c59b427..4dbbe4bc0b 100644 --- a/LibGUI/GObject.cpp +++ b/LibGUI/GObject.cpp @@ -2,6 +2,7 @@ #include "GEvent.h" #include "GEventLoop.h" #include +#include GObject::GObject(GObject* parent) : m_parent(parent) @@ -42,7 +43,7 @@ void GObject::event(GEvent& event) void GObject::add_child(GObject& object) { m_children.append(&object); - GEventLoop::main().post_event(*this, make(GEvent::ChildAdded, object)); + GEventLoop::current().post_event(*this, make(GEvent::ChildAdded, object)); } void GObject::remove_child(GObject& object) @@ -50,7 +51,7 @@ void GObject::remove_child(GObject& object) for (ssize_t i = 0; i < m_children.size(); ++i) { if (m_children[i] == &object) { m_children.remove(i); - GEventLoop::main().post_event(*this, make(GEvent::ChildRemoved, object)); + GEventLoop::current().post_event(*this, make(GEvent::ChildRemoved, object)); return; } } @@ -71,20 +72,32 @@ void GObject::start_timer(int ms) ASSERT_NOT_REACHED(); } - m_timer_id = GEventLoop::main().register_timer(*this, ms, true); + m_timer_id = GEventLoop::register_timer(*this, ms, true); } void GObject::stop_timer() { if (!m_timer_id) return; - bool success = GEventLoop::main().unregister_timer(m_timer_id); + bool success = GEventLoop::unregister_timer(m_timer_id); ASSERT(success); m_timer_id = 0; } void GObject::delete_later() { - GEventLoop::main().post_event(*this, make(GEvent::DeferredDestroy)); + GEventLoop::current().post_event(*this, make(GEvent::DeferredDestroy)); } +void GObject::dump_tree(int indent) +{ + for (int i = 0; i < indent; ++i) { + printf(" "); + } + printf("%s{%p}\n", class_name(), this); + + for (auto* child : children()) { + child->dump_tree(indent + 2); + } + +} -- cgit v1.2.3