2023-01-10 15:26:54 +01:00
/**************************************************************************/
/* os_server.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2019-01-01 12:46:36 +01:00
2014-02-10 02:10:30 +01:00
# include "os_server.h"
2018-07-20 08:37:10 +02:00
2018-09-11 18:13:45 +02:00
# include "core/print_string.h"
2017-12-27 01:31:51 +01:00
# include "drivers/dummy/rasterizer_dummy.h"
2018-05-07 14:56:47 +02:00
# include "drivers/dummy/texture_loader_dummy.h"
2017-12-27 01:31:51 +01:00
# include "servers/visual/visual_server_raster.h"
2014-02-10 02:10:30 +01:00
# include "main/main.h"
2018-07-20 08:37:10 +02:00
# include <stdio.h>
# include <stdlib.h>
2014-02-10 02:10:30 +01:00
# include <unistd.h>
int OS_Server : : get_video_driver_count ( ) const {
return 1 ;
}
2017-03-05 16:44:50 +01:00
const char * OS_Server : : get_video_driver_name ( int p_driver ) const {
2014-02-10 02:10:30 +01:00
return " Dummy " ;
}
2017-12-27 01:31:51 +01:00
int OS_Server : : get_audio_driver_count ( ) const {
2018-02-13 02:36:03 +01:00
return 1 ;
2017-12-27 01:31:51 +01:00
}
2014-02-10 02:10:30 +01:00
2017-12-27 01:31:51 +01:00
const char * OS_Server : : get_audio_driver_name ( int p_driver ) const {
2018-02-13 02:36:03 +01:00
return " Dummy " ;
2017-12-27 01:31:51 +01:00
}
2014-02-10 02:10:30 +01:00
2018-07-20 08:37:10 +02:00
int OS_Server : : get_current_video_driver ( ) const {
return video_driver_index ;
}
2017-12-27 01:31:51 +01:00
void OS_Server : : initialize_core ( ) {
crash_handler . initialize ( ) ;
2014-02-10 02:10:30 +01:00
2017-12-27 01:31:51 +01:00
OS_Unix : : initialize_core ( ) ;
}
2014-02-10 02:10:30 +01:00
2018-01-09 11:08:10 +01:00
Error OS_Server : : initialize ( const VideoMode & p_desired , int p_video_driver , int p_audio_driver ) {
2017-12-27 01:31:51 +01:00
args = OS : : get_singleton ( ) - > get_cmdline_args ( ) ;
current_videomode = p_desired ;
main_loop = NULL ;
RasterizerDummy : : make_current ( ) ;
2018-07-20 08:37:10 +02:00
video_driver_index = p_video_driver ; // unused in server platform, but should still be initialized
2017-12-27 01:31:51 +01:00
visual_server = memnew ( VisualServerRaster ) ;
2014-02-10 02:10:30 +01:00
visual_server - > init ( ) ;
2017-12-27 01:31:51 +01:00
AudioDriverManager : : initialize ( p_audio_driver ) ;
2017-03-05 16:44:50 +01:00
input = memnew ( InputDefault ) ;
2014-02-10 02:10:30 +01:00
2018-10-25 15:59:26 +02:00
# ifdef __APPLE__
2019-02-12 15:43:54 +01:00
power_manager = memnew ( PowerOSX ) ;
2018-10-25 15:59:26 +02:00
# else
2017-12-27 01:31:51 +01:00
power_manager = memnew ( PowerX11 ) ;
2018-10-25 15:59:26 +02:00
# endif
2018-01-03 18:26:44 +01:00
2018-06-11 02:59:53 +02:00
resource_loader_dummy . instance ( ) ;
2018-05-07 14:56:47 +02:00
ResourceLoader : : add_resource_format_loader ( resource_loader_dummy ) ;
2018-01-09 11:08:10 +01:00
return OK ;
2014-02-10 02:10:30 +01:00
}
2018-01-09 11:08:10 +01:00
2014-02-10 02:10:30 +01:00
void OS_Server : : finalize ( ) {
2017-03-05 16:44:50 +01:00
if ( main_loop )
2014-02-10 02:10:30 +01:00
memdelete ( main_loop ) ;
2017-03-05 16:44:50 +01:00
main_loop = NULL ;
2014-02-10 02:10:30 +01:00
visual_server - > finish ( ) ;
memdelete ( visual_server ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
memdelete ( input ) ;
2017-12-27 01:31:51 +01:00
memdelete ( power_manager ) ;
2018-06-11 02:59:53 +02:00
ResourceLoader : : remove_resource_format_loader ( resource_loader_dummy ) ;
resource_loader_dummy . unref ( ) ;
2018-05-07 14:56:47 +02:00
2014-02-10 02:10:30 +01:00
args . clear ( ) ;
}
void OS_Server : : set_mouse_show ( bool p_show ) {
}
2018-01-09 11:08:10 +01:00
2014-02-10 02:10:30 +01:00
void OS_Server : : set_mouse_grab ( bool p_grab ) {
2017-03-05 16:44:50 +01:00
grab = p_grab ;
2014-02-10 02:10:30 +01:00
}
2018-01-09 11:08:10 +01:00
2014-02-10 02:10:30 +01:00
bool OS_Server : : is_mouse_grab_enabled ( ) const {
return grab ;
}
int OS_Server : : get_mouse_button_state ( ) const {
return 0 ;
}
2017-03-29 17:29:38 +02:00
Point2 OS_Server : : get_mouse_position ( ) const {
2014-02-10 02:10:30 +01:00
return Point2 ( ) ;
}
2017-03-05 16:44:50 +01:00
void OS_Server : : set_window_title ( const String & p_title ) {
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void OS_Server : : set_video_mode ( const VideoMode & p_video_mode , int p_screen ) {
2014-02-10 02:10:30 +01:00
}
2018-01-09 11:08:10 +01:00
2014-02-10 02:10:30 +01:00
OS : : VideoMode OS_Server : : get_video_mode ( int p_screen ) const {
return current_videomode ;
}
2015-04-02 17:59:23 +02:00
Size2 OS_Server : : get_window_size ( ) const {
2017-03-05 16:44:50 +01:00
return Vector2 ( current_videomode . width , current_videomode . height ) ;
2015-04-02 17:59:23 +02:00
}
2017-03-05 16:44:50 +01:00
void OS_Server : : get_fullscreen_mode_list ( List < VideoMode > * p_list , int p_screen ) const {
2014-02-10 02:10:30 +01:00
}
MainLoop * OS_Server : : get_main_loop ( ) const {
return main_loop ;
}
void OS_Server : : delete_main_loop ( ) {
if ( main_loop )
memdelete ( main_loop ) ;
2017-03-05 16:44:50 +01:00
main_loop = NULL ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void OS_Server : : set_main_loop ( MainLoop * p_main_loop ) {
main_loop = p_main_loop ;
2014-02-10 02:10:30 +01:00
input - > set_main_loop ( p_main_loop ) ;
}
bool OS_Server : : can_draw ( ) const {
return false ; //can never draw
} ;
2019-05-20 19:36:24 +02:00
String OS_Server : : get_name ( ) const {
2014-02-10 02:10:30 +01:00
return " Server " ;
}
void OS_Server : : move_window_to_foreground ( ) {
}
2017-09-12 21:09:06 +02:00
OS : : PowerState OS_Server : : get_power_state ( ) {
2016-07-23 13:15:55 +02:00
return power_manager - > get_power_state ( ) ;
}
int OS_Server : : get_power_seconds_left ( ) {
return power_manager - > get_power_seconds_left ( ) ;
}
int OS_Server : : get_power_percent_left ( ) {
return power_manager - > get_power_percent_left ( ) ;
}
2017-12-27 01:31:51 +01:00
bool OS_Server : : _check_internal_feature_support ( const String & p_feature ) {
return p_feature = = " pc " ;
}
2014-02-10 02:10:30 +01:00
void OS_Server : : run ( ) {
force_quit = false ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( ! main_loop )
return ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
main_loop - > init ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
while ( ! force_quit ) {
2018-10-03 19:40:37 +02:00
if ( Main : : iteration ( ) )
2014-02-10 02:10:30 +01:00
break ;
} ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
main_loop - > finish ( ) ;
}
2017-12-27 01:31:51 +01:00
String OS_Server : : get_config_path ( ) const {
2022-10-07 19:03:24 +02:00
# ifndef __APPLE__
2017-12-27 01:31:51 +01:00
if ( has_environment ( " XDG_CONFIG_HOME " ) ) {
2022-10-07 19:03:24 +02:00
if ( get_environment ( " XDG_CONFIG_HOME " ) . is_abs_path ( ) ) {
return get_environment ( " XDG_CONFIG_HOME " ) ;
} else {
WARN_PRINT_ONCE ( " `XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.config` or `.` per the XDG Base Directory specification. " ) ;
}
}
# endif
if ( has_environment ( " HOME " ) ) {
2017-12-27 01:31:51 +01:00
return get_environment ( " HOME " ) . plus_file ( " .config " ) ;
}
2022-10-07 19:03:24 +02:00
return " . " ;
2017-12-27 01:31:51 +01:00
}
String OS_Server : : get_data_path ( ) const {
2022-10-07 19:03:24 +02:00
# ifndef __APPLE__
2017-12-27 01:31:51 +01:00
if ( has_environment ( " XDG_DATA_HOME " ) ) {
2022-10-07 19:03:24 +02:00
if ( get_environment ( " XDG_DATA_HOME " ) . is_abs_path ( ) ) {
return get_environment ( " XDG_DATA_HOME " ) ;
} else {
WARN_PRINT_ONCE ( " `XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.local/share` or `get_config_path()` per the XDG Base Directory specification. " ) ;
}
}
# endif
if ( has_environment ( " HOME " ) ) {
2017-12-27 01:31:51 +01:00
return get_environment ( " HOME " ) . plus_file ( " .local/share " ) ;
}
2022-10-07 19:03:24 +02:00
return get_config_path ( ) ;
2017-12-27 01:31:51 +01:00
}
String OS_Server : : get_cache_path ( ) const {
2022-10-07 19:03:24 +02:00
# ifndef __APPLE__
2017-12-27 01:31:51 +01:00
if ( has_environment ( " XDG_CACHE_HOME " ) ) {
2022-10-07 19:03:24 +02:00
if ( get_environment ( " XDG_CACHE_HOME " ) . is_abs_path ( ) ) {
return get_environment ( " XDG_CACHE_HOME " ) ;
} else {
WARN_PRINT_ONCE ( " `XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.cache` or `get_config_path()` per the XDG Base Directory specification. " ) ;
}
}
# endif
if ( has_environment ( " HOME " ) ) {
2017-12-27 01:31:51 +01:00
return get_environment ( " HOME " ) . plus_file ( " .cache " ) ;
}
2022-10-07 19:03:24 +02:00
return get_config_path ( ) ;
2017-12-27 01:31:51 +01:00
}
2021-07-11 03:39:31 +02:00
String OS_Server : : get_system_dir ( SystemDir p_dir , bool p_shared_storage ) const {
2017-12-27 01:31:51 +01:00
String xdgparam ;
switch ( p_dir ) {
case SYSTEM_DIR_DESKTOP : {
xdgparam = " DESKTOP " ;
} break ;
case SYSTEM_DIR_DCIM : {
xdgparam = " PICTURES " ;
} break ;
case SYSTEM_DIR_DOCUMENTS : {
xdgparam = " DOCUMENTS " ;
} break ;
case SYSTEM_DIR_DOWNLOADS : {
xdgparam = " DOWNLOAD " ;
} break ;
case SYSTEM_DIR_MOVIES : {
xdgparam = " VIDEOS " ;
} break ;
case SYSTEM_DIR_MUSIC : {
xdgparam = " MUSIC " ;
} break ;
case SYSTEM_DIR_PICTURES : {
xdgparam = " PICTURES " ;
} break ;
case SYSTEM_DIR_RINGTONES : {
xdgparam = " MUSIC " ;
} break ;
}
String pipe ;
List < String > arg ;
arg . push_back ( xdgparam ) ;
Error err = const_cast < OS_Server * > ( this ) - > execute ( " xdg-user-dir " , arg , true , NULL , & pipe ) ;
if ( err ! = OK )
return " . " ;
return pipe . strip_edges ( ) ;
}
void OS_Server : : disable_crash_handler ( ) {
crash_handler . disable ( ) ;
}
bool OS_Server : : is_disable_crash_handler ( ) const {
return crash_handler . is_disabled ( ) ;
}
2014-02-10 02:10:30 +01:00
OS_Server : : OS_Server ( ) {
//adriver here
2017-03-05 16:44:50 +01:00
grab = false ;
2014-02-10 02:10:30 +01:00
} ;