From f92b19609975517b4756069ba99084fec223ca75 Mon Sep 17 00:00:00 2001 From: Mikael Hermansson Date: Wed, 5 Jun 2024 17:51:40 +0200 Subject: [PATCH] Add input event callback to `DisplayServerHeadless` --- servers/display_server_headless.h | 23 +++++++++++++++++++++-- tests/display_server_mock.h | 22 +--------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/servers/display_server_headless.h b/servers/display_server_headless.h index 51755ddfbdc8..cf8299ad64e1 100644 --- a/servers/display_server_headless.h +++ b/servers/display_server_headless.h @@ -51,7 +51,18 @@ class DisplayServerHeadless : public DisplayServer { return memnew(DisplayServerHeadless()); } + static void _dispatch_input_events(const Ref &p_event) { + static_cast(get_singleton())->_dispatch_input_event(p_event); + } + + void _dispatch_input_event(const Ref &p_event) { + if (input_event_callback.is_valid()) { + input_event_callback.call(p_event); + } + } + NativeMenu *native_menu = nullptr; + Callable input_event_callback; public: bool has_feature(Feature p_feature) const override { return false; } @@ -86,7 +97,11 @@ class DisplayServerHeadless : public DisplayServer { void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} - void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} + + void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override { + input_event_callback = p_callable; + } + void window_set_input_text_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} void window_set_drop_files_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} @@ -137,7 +152,9 @@ class DisplayServerHeadless : public DisplayServer { int64_t window_get_native_handle(HandleType p_handle_type, WindowID p_window = MAIN_WINDOW_ID) const override { return 0; } - void process_events() override {} + void process_events() override { + Input::get_singleton()->flush_buffered_events(); + } void set_native_icon(const String &p_filename) override {} void set_icon(const Ref &p_icon) override {} @@ -178,7 +195,9 @@ class DisplayServerHeadless : public DisplayServer { DisplayServerHeadless() { native_menu = memnew(NativeMenu); + Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); } + ~DisplayServerHeadless() { if (native_menu) { memdelete(native_menu); diff --git a/tests/display_server_mock.h b/tests/display_server_mock.h index e4946995a7fb..b44ff06b3546 100644 --- a/tests/display_server_mock.h +++ b/tests/display_server_mock.h @@ -36,7 +36,7 @@ #include "servers/rendering/dummy/rasterizer_dummy.h" // Specialized DisplayServer for unittests based on DisplayServerHeadless, that -// additionally supports rudimentary InputEvent handling and mouse position. +// additionally supports things like mouse enter/exit events and clipboard. class DisplayServerMock : public DisplayServerHeadless { private: friend class DisplayServer; @@ -45,7 +45,6 @@ class DisplayServerMock : public DisplayServerHeadless { CursorShape cursor_shape = CursorShape::CURSOR_ARROW; bool window_over = false; Callable event_callback; - Callable input_event_callback; String clipboard_text; String primary_clipboard_text; @@ -62,16 +61,6 @@ class DisplayServerMock : public DisplayServerHeadless { return memnew(DisplayServerMock()); } - static void _dispatch_input_events(const Ref &p_event) { - static_cast(get_singleton())->_dispatch_input_event(p_event); - } - - void _dispatch_input_event(const Ref &p_event) { - if (input_event_callback.is_valid()) { - input_event_callback.call(p_event); - } - } - void _set_mouse_position(const Point2i &p_position) { if (mouse_position == p_position) { return; @@ -153,18 +142,9 @@ class DisplayServerMock : public DisplayServerHeadless { event_callback = p_callable; } - virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override { - input_event_callback = p_callable; - } - static void register_mock_driver() { register_create_function("mock", create_func, get_rendering_drivers_func); } - - DisplayServerMock() { - Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); - } - ~DisplayServerMock() {} }; #endif // DISPLAY_SERVER_MOCK_H