Browse Source

Merge pull request #92806 from mihe/headless-input

Add input event callback to `DisplayServerHeadless`
Rémi Verschelde 1 year ago
parent
commit
d4fdf16353
2 changed files with 22 additions and 23 deletions
  1. 21 2
      servers/display_server_headless.h
  2. 1 21
      tests/display_server_mock.h

+ 21 - 2
servers/display_server_headless.h

@@ -51,7 +51,18 @@ private:
 		return memnew(DisplayServerHeadless());
 	}
 
+	static void _dispatch_input_events(const Ref<InputEvent> &p_event) {
+		static_cast<DisplayServerHeadless *>(get_singleton())->_dispatch_input_event(p_event);
+	}
+
+	void _dispatch_input_event(const Ref<InputEvent> &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 @@ public:
 	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 @@ public:
 
 	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<Image> &p_icon) override {}
@@ -179,7 +196,9 @@ public:
 
 	DisplayServerHeadless() {
 		native_menu = memnew(NativeMenu);
+		Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
 	}
+
 	~DisplayServerHeadless() {
 		if (native_menu) {
 			memdelete(native_menu);

+ 1 - 21
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 @@ private:
 	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 @@ private:
 		return memnew(DisplayServerMock());
 	}
 
-	static void _dispatch_input_events(const Ref<InputEvent> &p_event) {
-		static_cast<DisplayServerMock *>(get_singleton())->_dispatch_input_event(p_event);
-	}
-
-	void _dispatch_input_event(const Ref<InputEvent> &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 @@ public:
 		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