diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index 3290d797c65..f3e418dcf84 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -84,6 +84,7 @@ set(SOURCES BrowserWindow.cpp ConsoleWidget.cpp EventLoopImplementationQt.cpp + EventLoopImplementationQtEventTarget.cpp HelperProcess.cpp InspectorWidget.cpp LocationEdit.cpp diff --git a/Ladybird/EventLoopImplementationQt.cpp b/Ladybird/EventLoopImplementationQt.cpp index 82e2adf32f7..6b9bb3409e1 100644 --- a/Ladybird/EventLoopImplementationQt.cpp +++ b/Ladybird/EventLoopImplementationQt.cpp @@ -5,6 +5,7 @@ */ #include "EventLoopImplementationQt.h" +#include "EventLoopImplementationQtEventTarget.h" #include #include #include @@ -149,16 +150,21 @@ void EventLoopManagerQt::unregister_notifier(Core::Notifier& notifier) void EventLoopManagerQt::did_post_event() { - m_process_core_events_timer.start(); + QCoreApplication::postEvent(m_main_thread_event_target.ptr(), new QtEventLoopManagerEvent(QtEventLoopManagerEvent::process_event_queue_event_type())); +} + +bool EventLoopManagerQt::event_target_received_event(Badge, QEvent* event) +{ + if (event->type() == QtEventLoopManagerEvent::process_event_queue_event_type()) { + Core::ThreadEventQueue::current().process(); + return true; + } + return false; } EventLoopManagerQt::EventLoopManagerQt() + : m_main_thread_event_target(make()) { - m_process_core_events_timer.setSingleShot(true); - m_process_core_events_timer.setInterval(0); - QObject::connect(&m_process_core_events_timer, &QTimer::timeout, [] { - Core::ThreadEventQueue::current().process(); - }); } EventLoopManagerQt::~EventLoopManagerQt() = default; diff --git a/Ladybird/EventLoopImplementationQt.h b/Ladybird/EventLoopImplementationQt.h index 36a36da74a6..5308c752048 100644 --- a/Ladybird/EventLoopImplementationQt.h +++ b/Ladybird/EventLoopImplementationQt.h @@ -6,16 +6,20 @@ #pragma once +#include #include #include #include #include +#include #include #include #include namespace Ladybird { +class EventLoopImplementationQtEventTarget; + class EventLoopManagerQt final : public Core::EventLoopManager { public: EventLoopManagerQt(); @@ -29,13 +33,28 @@ public: virtual void unregister_notifier(Core::Notifier&) override; virtual void did_post_event() override; + static bool event_target_received_event(Badge, QEvent* event); // FIXME: These APIs only exist for obscure use-cases inside SerenityOS. Try to get rid of them. virtual int register_signal(int, Function) override { return 0; } virtual void unregister_signal(int) override { } private: - QTimer m_process_core_events_timer; + NonnullOwnPtr m_main_thread_event_target; +}; + +class QtEventLoopManagerEvent final : public QEvent { +public: + static QEvent::Type process_event_queue_event_type() + { + static auto const type = static_cast(QEvent::registerEventType()); + return type; + } + + QtEventLoopManagerEvent(QEvent::Type type) + : QEvent(type) + { + } }; class EventLoopImplementationQt final : public Core::EventLoopImplementation { diff --git a/Ladybird/EventLoopImplementationQtEventTarget.cpp b/Ladybird/EventLoopImplementationQtEventTarget.cpp new file mode 100644 index 00000000000..5c8eb25a8cd --- /dev/null +++ b/Ladybird/EventLoopImplementationQtEventTarget.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2023, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "EventLoopImplementationQtEventTarget.h" + +namespace Ladybird { + +bool EventLoopImplementationQtEventTarget::event(QEvent* event) +{ + return EventLoopManagerQt::event_target_received_event({}, event); +} + +} diff --git a/Ladybird/EventLoopImplementationQtEventTarget.h b/Ladybird/EventLoopImplementationQtEventTarget.h new file mode 100644 index 00000000000..bf15fc23435 --- /dev/null +++ b/Ladybird/EventLoopImplementationQtEventTarget.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2023, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +#include "EventLoopImplementationQt.h" + +namespace Ladybird { + +class EventLoopImplementationQtEventTarget final : public QObject { + Q_OBJECT + +public: + virtual bool event(QEvent* event) override; +}; + +} diff --git a/Ladybird/WebContent/CMakeLists.txt b/Ladybird/WebContent/CMakeLists.txt index e9bf7d4d474..f7ce3dd4e69 100644 --- a/Ladybird/WebContent/CMakeLists.txt +++ b/Ladybird/WebContent/CMakeLists.txt @@ -9,6 +9,7 @@ set(WEBCONTENT_SOURCES ../AudioCodecPluginQt.cpp ../AudioThread.cpp ../EventLoopImplementationQt.cpp + ../EventLoopImplementationQtEventTarget.cpp ../FontPlugin.cpp ../HelperProcess.cpp ../ImageCodecPlugin.cpp