EventLoopImplementationQt.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (c) 2022-2023, Andreas Kling <andreas@ladybird.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Badge.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/NonnullOwnPtr.h>
  10. #include <AK/OwnPtr.h>
  11. #include <LibCore/EventLoopImplementation.h>
  12. #include <QEvent>
  13. #include <QEventLoop>
  14. #include <QSocketNotifier>
  15. #include <QTimer>
  16. namespace Ladybird {
  17. class EventLoopImplementationQt;
  18. class EventLoopImplementationQtEventTarget;
  19. class EventLoopManagerQt final : public Core::EventLoopManager {
  20. public:
  21. EventLoopManagerQt();
  22. virtual ~EventLoopManagerQt() override;
  23. virtual NonnullOwnPtr<Core::EventLoopImplementation> make_implementation() override;
  24. virtual intptr_t register_timer(Core::EventReceiver&, int milliseconds, bool should_reload, Core::TimerShouldFireWhenNotVisible) override;
  25. virtual void unregister_timer(intptr_t timer_id) override;
  26. virtual void register_notifier(Core::Notifier&) override;
  27. virtual void unregister_notifier(Core::Notifier&) override;
  28. virtual void did_post_event() override;
  29. static bool event_target_received_event(Badge<EventLoopImplementationQtEventTarget>, QEvent* event);
  30. virtual int register_signal(int, Function<void(int)>) override;
  31. virtual void unregister_signal(int) override;
  32. void set_main_loop_signal_notifiers(Badge<EventLoopImplementationQt>);
  33. private:
  34. static void handle_signal(int);
  35. NonnullOwnPtr<EventLoopImplementationQtEventTarget> m_main_thread_event_target;
  36. QSocketNotifier* m_signal_socket_notifier { nullptr };
  37. int m_signal_socket_fds[2] = { -1, -1 };
  38. };
  39. class QtEventLoopManagerEvent final : public QEvent {
  40. public:
  41. static QEvent::Type process_event_queue_event_type()
  42. {
  43. static auto const type = static_cast<QEvent::Type>(QEvent::registerEventType());
  44. return type;
  45. }
  46. QtEventLoopManagerEvent(QEvent::Type type)
  47. : QEvent(type)
  48. {
  49. }
  50. };
  51. class EventLoopImplementationQt final : public Core::EventLoopImplementation {
  52. public:
  53. static NonnullOwnPtr<EventLoopImplementationQt> create() { return adopt_own(*new EventLoopImplementationQt); }
  54. virtual ~EventLoopImplementationQt() override;
  55. virtual int exec() override;
  56. virtual size_t pump(PumpMode) override;
  57. virtual void quit(int) override;
  58. virtual void wake() override;
  59. virtual void post_event(Core::EventReceiver& receiver, NonnullOwnPtr<Core::Event>&&) override;
  60. // FIXME: These APIs only exist for obscure use-cases inside SerenityOS. Try to get rid of them.
  61. virtual void unquit() override { }
  62. virtual bool was_exit_requested() const override { return false; }
  63. virtual void notify_forked_and_in_child() override { }
  64. void set_main_loop();
  65. private:
  66. friend class EventLoopManagerQt;
  67. EventLoopImplementationQt();
  68. bool is_main_loop() const { return m_main_loop; }
  69. QEventLoop m_event_loop;
  70. bool m_main_loop { false };
  71. };
  72. }