GEventLoop.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include "GEvent.h"
  3. #include <AK/Badge.h>
  4. #include <AK/HashMap.h>
  5. #include <AK/OwnPtr.h>
  6. #include <AK/Vector.h>
  7. #include <WindowServer/WSAPITypes.h>
  8. class GObject;
  9. class GNotifier;
  10. class GWindow;
  11. class GEventLoop {
  12. public:
  13. GEventLoop();
  14. ~GEventLoop();
  15. int exec();
  16. void post_event(GObject* receiver, OwnPtr<GEvent>&&);
  17. static GEventLoop& main();
  18. static void initialize();
  19. bool running() const { return m_running; }
  20. int register_timer(GObject&, int milliseconds, bool should_reload);
  21. bool unregister_timer(int timer_id);
  22. void register_notifier(Badge<GNotifier>, GNotifier&);
  23. void unregister_notifier(Badge<GNotifier>, GNotifier&);
  24. void quit(int);
  25. bool post_message_to_server(const WSAPI_ClientMessage&);
  26. bool wait_for_specific_event(WSAPI_ServerMessage::Type, WSAPI_ServerMessage&);
  27. WSAPI_ServerMessage sync_request(const WSAPI_ClientMessage& request, WSAPI_ServerMessage::Type response_type);
  28. pid_t server_pid() const { return m_server_pid; }
  29. private:
  30. void wait_for_event();
  31. bool drain_messages_from_server();
  32. void process_unprocessed_messages();
  33. void handle_paint_event(const WSAPI_ServerMessage&, GWindow&);
  34. void handle_resize_event(const WSAPI_ServerMessage&, GWindow&);
  35. void handle_mouse_event(const WSAPI_ServerMessage&, GWindow&);
  36. void handle_key_event(const WSAPI_ServerMessage&, GWindow&);
  37. void handle_window_activation_event(const WSAPI_ServerMessage&, GWindow&);
  38. void handle_window_close_request_event(const WSAPI_ServerMessage&, GWindow&);
  39. void handle_menu_event(const WSAPI_ServerMessage&);
  40. void handle_window_entered_or_left_event(const WSAPI_ServerMessage&, GWindow&);
  41. void get_next_timer_expiration(timeval&);
  42. struct QueuedEvent {
  43. GObject* receiver { nullptr };
  44. OwnPtr<GEvent> event;
  45. };
  46. Vector<QueuedEvent> m_queued_events;
  47. Vector<WSAPI_ServerMessage> m_unprocessed_messages;
  48. int m_event_fd { -1 };
  49. bool m_running { false };
  50. bool m_exit_requested { false };
  51. int m_exit_code { 0 };
  52. int m_next_timer_id { 1 };
  53. pid_t m_server_pid { 0 };
  54. struct EventLoopTimer {
  55. int timer_id { 0 };
  56. int interval { 0 };
  57. timeval fire_time;
  58. bool should_reload { false };
  59. GObject* owner { nullptr };
  60. void reload();
  61. bool has_expired() const;
  62. };
  63. HashMap<int, OwnPtr<EventLoopTimer>> m_timers;
  64. HashTable<GNotifier*> m_notifiers;
  65. };