| 1 | /**************************************************************************/ |
| 2 | /* display_server_headless.h */ |
| 3 | /**************************************************************************/ |
| 4 | /* This file is part of: */ |
| 5 | /* GODOT ENGINE */ |
| 6 | /* https://godotengine.org */ |
| 7 | /**************************************************************************/ |
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
| 10 | /* */ |
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
| 12 | /* a copy of this software and associated documentation files (the */ |
| 13 | /* "Software"), to deal in the Software without restriction, including */ |
| 14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
| 16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
| 17 | /* the following conditions: */ |
| 18 | /* */ |
| 19 | /* The above copyright notice and this permission notice shall be */ |
| 20 | /* included in all copies or substantial portions of the Software. */ |
| 21 | /* */ |
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 29 | /**************************************************************************/ |
| 30 | |
| 31 | #ifndef DISPLAY_SERVER_HEADLESS_H |
| 32 | #define DISPLAY_SERVER_HEADLESS_H |
| 33 | |
| 34 | #include "servers/display_server.h" |
| 35 | |
| 36 | #include "servers/rendering/dummy/rasterizer_dummy.h" |
| 37 | |
| 38 | class DisplayServerHeadless : public DisplayServer { |
| 39 | private: |
| 40 | friend class DisplayServer; |
| 41 | |
| 42 | static Vector<String> get_rendering_drivers_func() { |
| 43 | Vector<String> drivers; |
| 44 | drivers.push_back("dummy" ); |
| 45 | return drivers; |
| 46 | } |
| 47 | |
| 48 | static DisplayServer *create_func(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Error &r_error) { |
| 49 | r_error = OK; |
| 50 | RasterizerDummy::make_current(); |
| 51 | return memnew(DisplayServerHeadless()); |
| 52 | } |
| 53 | |
| 54 | public: |
| 55 | bool has_feature(Feature p_feature) const override { return false; } |
| 56 | String get_name() const override { return "headless" ; } |
| 57 | |
| 58 | int get_screen_count() const override { return 0; } |
| 59 | int get_primary_screen() const override { return 0; }; |
| 60 | Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return Point2i(); } |
| 61 | Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return Size2i(); } |
| 62 | Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return Rect2i(); } |
| 63 | int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return 96; /* 0 might cause issues */ } |
| 64 | float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return 1; } |
| 65 | float screen_get_max_scale() const override { return 1; } |
| 66 | float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override { return SCREEN_REFRESH_RATE_FALLBACK; } |
| 67 | |
| 68 | Vector<DisplayServer::WindowID> get_window_list() const override { return Vector<DisplayServer::WindowID>(); } |
| 69 | |
| 70 | WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i()) override { return 0; } |
| 71 | void show_window(WindowID p_id) override {} |
| 72 | void delete_sub_window(WindowID p_id) override {} |
| 73 | |
| 74 | WindowID get_window_at_screen_position(const Point2i &p_position) const override { return 0; } |
| 75 | |
| 76 | void window_attach_instance_id(ObjectID p_instance, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 77 | ObjectID window_get_attached_instance_id(WindowID p_window = MAIN_WINDOW_ID) const override { return ObjectID(); } |
| 78 | |
| 79 | void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 80 | |
| 81 | void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 82 | void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 83 | void window_set_input_text_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 84 | void window_set_drop_files_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 85 | |
| 86 | void window_set_title(const String &p_title, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 87 | |
| 88 | void window_set_mouse_passthrough(const Vector<Vector2> &p_region, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 89 | |
| 90 | int window_get_current_screen(WindowID p_window = MAIN_WINDOW_ID) const override { return -1; } |
| 91 | void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 92 | |
| 93 | Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override { return Point2i(); } |
| 94 | Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override { return Point2i(); } |
| 95 | void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 96 | |
| 97 | void window_set_transient(WindowID p_window, WindowID p_parent) override {} |
| 98 | |
| 99 | void window_set_max_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 100 | Size2i window_get_max_size(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } |
| 101 | |
| 102 | void window_set_min_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 103 | Size2i window_get_min_size(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } |
| 104 | |
| 105 | void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 106 | Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } |
| 107 | Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } |
| 108 | |
| 109 | void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 110 | WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override { return WINDOW_MODE_MINIMIZED; } |
| 111 | |
| 112 | void window_set_vsync_mode(VSyncMode p_vsync_mode, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 113 | VSyncMode window_get_vsync_mode(WindowID p_window) const override { return VSyncMode::VSYNC_ENABLED; } |
| 114 | |
| 115 | bool window_is_maximize_allowed(WindowID p_window = MAIN_WINDOW_ID) const override { return false; } |
| 116 | |
| 117 | void window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 118 | bool window_get_flag(WindowFlags p_flag, WindowID p_window = MAIN_WINDOW_ID) const override { return false; } |
| 119 | |
| 120 | void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override {} |
| 121 | void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override {} |
| 122 | bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override { return true; }; |
| 123 | |
| 124 | bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override { return false; } |
| 125 | |
| 126 | bool can_any_window_draw() const override { return false; } |
| 127 | |
| 128 | void window_set_ime_active(const bool p_active, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 129 | void window_set_ime_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID) override {} |
| 130 | |
| 131 | void process_events() override {} |
| 132 | |
| 133 | void set_icon(const Ref<Image> &p_icon) override {} |
| 134 | |
| 135 | DisplayServerHeadless() {} |
| 136 | ~DisplayServerHeadless() {} |
| 137 | }; |
| 138 | |
| 139 | #endif // DISPLAY_SERVER_HEADLESS_H |
| 140 | |