1 /*************************************************************************/
2 /* os_server.cpp */
3 /*************************************************************************/
4 /* This file is part of: */
5 /* GODOT ENGINE */
6 /* https://godotengine.org */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
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 #include "os_server.h"
32
33 #include "core/print_string.h"
34 #include "drivers/dummy/rasterizer_dummy.h"
35 #include "drivers/dummy/texture_loader_dummy.h"
36 #include "servers/visual/visual_server_raster.h"
37
38 #include "main/main.h"
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <unistd.h>
43
get_video_driver_count() const44 int OS_Server::get_video_driver_count() const {
45
46 return 1;
47 }
get_video_driver_name(int p_driver) const48 const char *OS_Server::get_video_driver_name(int p_driver) const {
49
50 return "Dummy";
51 }
52
get_audio_driver_count() const53 int OS_Server::get_audio_driver_count() const {
54 return 1;
55 }
56
get_audio_driver_name(int p_driver) const57 const char *OS_Server::get_audio_driver_name(int p_driver) const {
58
59 return "Dummy";
60 }
61
get_current_video_driver() const62 int OS_Server::get_current_video_driver() const {
63 return video_driver_index;
64 }
65
initialize_core()66 void OS_Server::initialize_core() {
67
68 crash_handler.initialize();
69
70 OS_Unix::initialize_core();
71
72 #ifdef __APPLE__
73 SemaphoreOSX::make_default();
74 #endif
75 }
76
initialize(const VideoMode & p_desired,int p_video_driver,int p_audio_driver)77 Error OS_Server::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
78
79 args = OS::get_singleton()->get_cmdline_args();
80 current_videomode = p_desired;
81 main_loop = NULL;
82
83 RasterizerDummy::make_current();
84
85 video_driver_index = p_video_driver; // unused in server platform, but should still be initialized
86
87 visual_server = memnew(VisualServerRaster);
88 visual_server->init();
89
90 AudioDriverManager::initialize(p_audio_driver);
91
92 input = memnew(InputDefault);
93
94 #ifdef __APPLE__
95 power_manager = memnew(PowerOSX);
96 #else
97 power_manager = memnew(PowerX11);
98 #endif
99
100 _ensure_user_data_dir();
101
102 resource_loader_dummy.instance();
103 ResourceLoader::add_resource_format_loader(resource_loader_dummy);
104
105 return OK;
106 }
107
finalize()108 void OS_Server::finalize() {
109
110 if (main_loop)
111 memdelete(main_loop);
112 main_loop = NULL;
113
114 visual_server->finish();
115 memdelete(visual_server);
116
117 memdelete(input);
118
119 memdelete(power_manager);
120
121 ResourceLoader::remove_resource_format_loader(resource_loader_dummy);
122 resource_loader_dummy.unref();
123
124 args.clear();
125 }
126
set_mouse_show(bool p_show)127 void OS_Server::set_mouse_show(bool p_show) {
128 }
129
set_mouse_grab(bool p_grab)130 void OS_Server::set_mouse_grab(bool p_grab) {
131
132 grab = p_grab;
133 }
134
is_mouse_grab_enabled() const135 bool OS_Server::is_mouse_grab_enabled() const {
136
137 return grab;
138 }
139
get_mouse_button_state() const140 int OS_Server::get_mouse_button_state() const {
141
142 return 0;
143 }
144
get_mouse_position() const145 Point2 OS_Server::get_mouse_position() const {
146
147 return Point2();
148 }
149
set_window_title(const String & p_title)150 void OS_Server::set_window_title(const String &p_title) {
151 }
152
set_video_mode(const VideoMode & p_video_mode,int p_screen)153 void OS_Server::set_video_mode(const VideoMode &p_video_mode, int p_screen) {
154 }
155
get_video_mode(int p_screen) const156 OS::VideoMode OS_Server::get_video_mode(int p_screen) const {
157
158 return current_videomode;
159 }
160
get_window_size() const161 Size2 OS_Server::get_window_size() const {
162
163 return Vector2(current_videomode.width, current_videomode.height);
164 }
165
get_fullscreen_mode_list(List<VideoMode> * p_list,int p_screen) const166 void OS_Server::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const {
167 }
168
get_main_loop() const169 MainLoop *OS_Server::get_main_loop() const {
170
171 return main_loop;
172 }
173
delete_main_loop()174 void OS_Server::delete_main_loop() {
175
176 if (main_loop)
177 memdelete(main_loop);
178 main_loop = NULL;
179 }
180
set_main_loop(MainLoop * p_main_loop)181 void OS_Server::set_main_loop(MainLoop *p_main_loop) {
182
183 main_loop = p_main_loop;
184 input->set_main_loop(p_main_loop);
185 }
186
can_draw() const187 bool OS_Server::can_draw() const {
188
189 return false; //can never draw
190 };
191
get_name() const192 String OS_Server::get_name() const {
193
194 return "Server";
195 }
196
move_window_to_foreground()197 void OS_Server::move_window_to_foreground() {
198 }
199
get_power_state()200 OS::PowerState OS_Server::get_power_state() {
201 return power_manager->get_power_state();
202 }
203
get_power_seconds_left()204 int OS_Server::get_power_seconds_left() {
205 return power_manager->get_power_seconds_left();
206 }
207
get_power_percent_left()208 int OS_Server::get_power_percent_left() {
209 return power_manager->get_power_percent_left();
210 }
211
_check_internal_feature_support(const String & p_feature)212 bool OS_Server::_check_internal_feature_support(const String &p_feature) {
213 return p_feature == "pc";
214 }
215
run()216 void OS_Server::run() {
217
218 force_quit = false;
219
220 if (!main_loop)
221 return;
222
223 main_loop->init();
224
225 while (!force_quit) {
226
227 if (Main::iteration())
228 break;
229 };
230
231 main_loop->finish();
232 }
233
get_config_path() const234 String OS_Server::get_config_path() const {
235
236 if (has_environment("XDG_CONFIG_HOME")) {
237 return get_environment("XDG_CONFIG_HOME");
238 } else if (has_environment("HOME")) {
239 return get_environment("HOME").plus_file(".config");
240 } else {
241 return ".";
242 }
243 }
244
get_data_path() const245 String OS_Server::get_data_path() const {
246
247 if (has_environment("XDG_DATA_HOME")) {
248 return get_environment("XDG_DATA_HOME");
249 } else if (has_environment("HOME")) {
250 return get_environment("HOME").plus_file(".local/share");
251 } else {
252 return get_config_path();
253 }
254 }
255
get_cache_path() const256 String OS_Server::get_cache_path() const {
257
258 if (has_environment("XDG_CACHE_HOME")) {
259 return get_environment("XDG_CACHE_HOME");
260 } else if (has_environment("HOME")) {
261 return get_environment("HOME").plus_file(".cache");
262 } else {
263 return get_config_path();
264 }
265 }
266
get_system_dir(SystemDir p_dir) const267 String OS_Server::get_system_dir(SystemDir p_dir) const {
268
269 String xdgparam;
270
271 switch (p_dir) {
272 case SYSTEM_DIR_DESKTOP: {
273
274 xdgparam = "DESKTOP";
275 } break;
276 case SYSTEM_DIR_DCIM: {
277
278 xdgparam = "PICTURES";
279
280 } break;
281 case SYSTEM_DIR_DOCUMENTS: {
282
283 xdgparam = "DOCUMENTS";
284
285 } break;
286 case SYSTEM_DIR_DOWNLOADS: {
287
288 xdgparam = "DOWNLOAD";
289
290 } break;
291 case SYSTEM_DIR_MOVIES: {
292
293 xdgparam = "VIDEOS";
294
295 } break;
296 case SYSTEM_DIR_MUSIC: {
297
298 xdgparam = "MUSIC";
299
300 } break;
301 case SYSTEM_DIR_PICTURES: {
302
303 xdgparam = "PICTURES";
304
305 } break;
306 case SYSTEM_DIR_RINGTONES: {
307
308 xdgparam = "MUSIC";
309
310 } break;
311 }
312
313 String pipe;
314 List<String> arg;
315 arg.push_back(xdgparam);
316 Error err = const_cast<OS_Server *>(this)->execute("xdg-user-dir", arg, true, NULL, &pipe);
317 if (err != OK)
318 return ".";
319 return pipe.strip_edges();
320 }
321
disable_crash_handler()322 void OS_Server::disable_crash_handler() {
323 crash_handler.disable();
324 }
325
is_disable_crash_handler() const326 bool OS_Server::is_disable_crash_handler() const {
327 return crash_handler.is_disabled();
328 }
329
OS_Server()330 OS_Server::OS_Server() {
331
332 //adriver here
333 grab = false;
334 };
335