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