Effective DisplayServer separation, rename X11 -> LinuxBSD

This commit is contained in:
Juan Linietsky 2020-03-03 10:36:29 -03:00 committed by Juan Linietsky
parent 4396e98834
commit f8a79a97c7
83 changed files with 1304 additions and 5378 deletions

View file

@ -236,7 +236,7 @@ elif env_base['p'] != "":
else: else:
# Missing `platform` argument, try to detect platform automatically # Missing `platform` argument, try to detect platform automatically
if sys.platform.startswith('linux'): if sys.platform.startswith('linux'):
selected_platform = 'x11' selected_platform = 'linuxbsd'
elif sys.platform == 'darwin': elif sys.platform == 'darwin':
selected_platform = 'osx' selected_platform = 'osx'
elif sys.platform == 'win32': elif sys.platform == 'win32':

View file

@ -194,82 +194,6 @@ _ResourceSaver::_ResourceSaver() {
singleton = this; singleton = this;
} }
/////////////////OS
void _OS::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) {
OS::get_singleton()->global_menu_add_item(p_menu, p_label, p_signal, p_meta);
}
void _OS::global_menu_add_separator(const String &p_menu) {
OS::get_singleton()->global_menu_add_separator(p_menu);
}
void _OS::global_menu_remove_item(const String &p_menu, int p_idx) {
OS::get_singleton()->global_menu_remove_item(p_menu, p_idx);
}
void _OS::global_menu_clear(const String &p_menu) {
OS::get_singleton()->global_menu_clear(p_menu);
}
Point2 _OS::get_mouse_position() const {
return OS::get_singleton()->get_mouse_position();
}
void _OS::set_window_title(const String &p_title) {
OS::get_singleton()->set_window_title(p_title);
}
int _OS::get_mouse_button_state() const {
return OS::get_singleton()->get_mouse_button_state();
}
String _OS::get_unique_id() const {
return OS::get_singleton()->get_unique_id();
}
bool _OS::has_touchscreen_ui_hint() const {
return OS::get_singleton()->has_touchscreen_ui_hint();
}
void _OS::set_clipboard(const String &p_text) {
OS::get_singleton()->set_clipboard(p_text);
}
String _OS::get_clipboard() const {
return OS::get_singleton()->get_clipboard();
}
int _OS::get_video_driver_count() const {
return OS::get_singleton()->get_video_driver_count();
}
String _OS::get_video_driver_name(VideoDriver p_driver) const {
return OS::get_singleton()->get_video_driver_name((int)p_driver);
}
_OS::VideoDriver _OS::get_current_video_driver() const {
return (VideoDriver)OS::get_singleton()->get_current_video_driver();
}
int _OS::get_audio_driver_count() const {
return OS::get_singleton()->get_audio_driver_count();
}
String _OS::get_audio_driver_name(int p_driver) const {
return OS::get_singleton()->get_audio_driver_name(p_driver);
}
PackedStringArray _OS::get_connected_midi_inputs() { PackedStringArray _OS::get_connected_midi_inputs() {
return OS::get_singleton()->get_connected_midi_inputs(); return OS::get_singleton()->get_connected_midi_inputs();
} }
@ -282,198 +206,11 @@ void _OS::close_midi_inputs() {
OS::get_singleton()->close_midi_inputs(); OS::get_singleton()->close_midi_inputs();
} }
void _OS::set_video_mode(const Size2 &p_size, bool p_fullscreen, bool p_resizeable, int p_screen) {
OS::VideoMode vm;
vm.width = p_size.width;
vm.height = p_size.height;
vm.fullscreen = p_fullscreen;
vm.resizable = p_resizeable;
OS::get_singleton()->set_video_mode(vm, p_screen);
}
Size2 _OS::get_video_mode(int p_screen) const {
OS::VideoMode vm;
vm = OS::get_singleton()->get_video_mode(p_screen);
return Size2(vm.width, vm.height);
}
bool _OS::is_video_mode_fullscreen(int p_screen) const {
OS::VideoMode vm;
vm = OS::get_singleton()->get_video_mode(p_screen);
return vm.fullscreen;
}
int _OS::get_screen_count() const {
return OS::get_singleton()->get_screen_count();
}
int _OS::get_current_screen() const {
return OS::get_singleton()->get_current_screen();
}
void _OS::set_current_screen(int p_screen) {
OS::get_singleton()->set_current_screen(p_screen);
}
Point2 _OS::get_screen_position(int p_screen) const {
return OS::get_singleton()->get_screen_position(p_screen);
}
Size2 _OS::get_screen_size(int p_screen) const {
return OS::get_singleton()->get_screen_size(p_screen);
}
int _OS::get_screen_dpi(int p_screen) const {
return OS::get_singleton()->get_screen_dpi(p_screen);
}
Point2 _OS::get_window_position() const {
return OS::get_singleton()->get_window_position();
}
void _OS::set_window_position(const Point2 &p_position) {
OS::get_singleton()->set_window_position(p_position);
}
Size2 _OS::get_max_window_size() const {
return OS::get_singleton()->get_max_window_size();
}
Size2 _OS::get_min_window_size() const {
return OS::get_singleton()->get_min_window_size();
}
Size2 _OS::get_window_size() const {
return OS::get_singleton()->get_window_size();
}
Size2 _OS::get_real_window_size() const {
return OS::get_singleton()->get_real_window_size();
}
void _OS::set_max_window_size(const Size2 &p_size) {
OS::get_singleton()->set_max_window_size(p_size);
}
void _OS::set_min_window_size(const Size2 &p_size) {
OS::get_singleton()->set_min_window_size(p_size);
}
void _OS::set_window_size(const Size2 &p_size) {
OS::get_singleton()->set_window_size(p_size);
}
Rect2 _OS::get_window_safe_area() const {
return OS::get_singleton()->get_window_safe_area();
}
void _OS::set_window_fullscreen(bool p_enabled) {
OS::get_singleton()->set_window_fullscreen(p_enabled);
}
bool _OS::is_window_fullscreen() const {
return OS::get_singleton()->is_window_fullscreen();
}
void _OS::set_window_resizable(bool p_enabled) {
OS::get_singleton()->set_window_resizable(p_enabled);
}
bool _OS::is_window_resizable() const {
return OS::get_singleton()->is_window_resizable();
}
void _OS::set_window_minimized(bool p_enabled) {
OS::get_singleton()->set_window_minimized(p_enabled);
}
bool _OS::is_window_minimized() const {
return OS::get_singleton()->is_window_minimized();
}
void _OS::set_window_maximized(bool p_enabled) {
OS::get_singleton()->set_window_maximized(p_enabled);
}
bool _OS::is_window_maximized() const {
return OS::get_singleton()->is_window_maximized();
}
void _OS::set_window_always_on_top(bool p_enabled) {
OS::get_singleton()->set_window_always_on_top(p_enabled);
}
bool _OS::is_window_always_on_top() const {
return OS::get_singleton()->is_window_always_on_top();
}
bool _OS::is_window_focused() const {
return OS::get_singleton()->is_window_focused();
}
void _OS::set_borderless_window(bool p_borderless) {
OS::get_singleton()->set_borderless_window(p_borderless);
}
bool _OS::get_window_per_pixel_transparency_enabled() const {
return OS::get_singleton()->get_window_per_pixel_transparency_enabled();
}
void _OS::set_window_per_pixel_transparency_enabled(bool p_enabled) {
OS::get_singleton()->set_window_per_pixel_transparency_enabled(p_enabled);
}
bool _OS::get_borderless_window() const {
return OS::get_singleton()->get_borderless_window();
}
void _OS::set_ime_active(const bool p_active) {
OS::get_singleton()->set_ime_active(p_active);
}
void _OS::set_ime_position(const Point2 &p_pos) {
OS::get_singleton()->set_ime_position(p_pos);
}
Point2 _OS::get_ime_selection() const {
return OS::get_singleton()->get_ime_selection();
}
String _OS::get_ime_text() const {
return OS::get_singleton()->get_ime_text();
}
void _OS::set_use_file_access_save_and_swap(bool p_enable) { void _OS::set_use_file_access_save_and_swap(bool p_enable) {
FileAccess::set_backup_save(p_enable); FileAccess::set_backup_save(p_enable);
} }
bool _OS::is_video_mode_resizable(int p_screen) const {
OS::VideoMode vm;
vm = OS::get_singleton()->get_video_mode(p_screen);
return vm.resizable;
}
Array _OS::get_fullscreen_mode_list(int p_screen) const {
List<OS::VideoMode> vmlist;
OS::get_singleton()->get_fullscreen_mode_list(&vmlist, p_screen);
Array vmarr;
for (List<OS::VideoMode>::Element *E = vmlist.front(); E; E = E->next()) {
vmarr.push_back(Size2(E->get().width, E->get().height));
}
return vmarr;
}
void _OS::set_low_processor_usage_mode(bool p_enabled) { void _OS::set_low_processor_usage_mode(bool p_enabled) {
OS::get_singleton()->set_low_processor_usage_mode(p_enabled); OS::get_singleton()->set_low_processor_usage_mode(p_enabled);
@ -562,52 +299,16 @@ String _OS::get_locale() const {
return OS::get_singleton()->get_locale(); return OS::get_singleton()->get_locale();
} }
String _OS::get_latin_keyboard_variant() const {
switch (OS::get_singleton()->get_latin_keyboard_variant()) {
case OS::LATIN_KEYBOARD_QWERTY: return "QWERTY";
case OS::LATIN_KEYBOARD_QWERTZ: return "QWERTZ";
case OS::LATIN_KEYBOARD_AZERTY: return "AZERTY";
case OS::LATIN_KEYBOARD_QZERTY: return "QZERTY";
case OS::LATIN_KEYBOARD_DVORAK: return "DVORAK";
case OS::LATIN_KEYBOARD_NEO: return "NEO";
case OS::LATIN_KEYBOARD_COLEMAK: return "COLEMAK";
default: return "ERROR";
}
}
String _OS::get_model_name() const { String _OS::get_model_name() const {
return OS::get_singleton()->get_model_name(); return OS::get_singleton()->get_model_name();
} }
bool _OS::is_ok_left_and_cancel_right() const {
return OS::get_singleton()->get_swap_ok_cancel();
}
Error _OS::set_thread_name(const String &p_name) { Error _OS::set_thread_name(const String &p_name) {
return Thread::set_name(p_name); return Thread::set_name(p_name);
}; };
void _OS::set_use_vsync(bool p_enable) {
OS::get_singleton()->set_use_vsync(p_enable);
}
bool _OS::is_vsync_enabled() const {
return OS::get_singleton()->is_vsync_enabled();
}
void _OS::set_vsync_via_compositor(bool p_enable) {
OS::get_singleton()->set_vsync_via_compositor(p_enable);
}
bool _OS::is_vsync_via_compositor_enabled() const {
return OS::get_singleton()->is_vsync_via_compositor_enabled();
}
bool _OS::has_feature(const String &p_feature) const { bool _OS::has_feature(const String &p_feature) const {
return OS::get_singleton()->has_feature(p_feature); return OS::get_singleton()->has_feature(p_feature);
@ -667,16 +368,6 @@ uint64_t _OS::get_static_memory_peak_usage() const {
return OS::get_singleton()->get_static_memory_peak_usage(); return OS::get_singleton()->get_static_memory_peak_usage();
} }
void _OS::set_native_icon(const String &p_filename) {
OS::get_singleton()->set_native_icon(p_filename);
}
void _OS::set_icon(const Ref<Image> &p_icon) {
OS::get_singleton()->set_icon(p_icon);
}
int _OS::get_exit_code() const { int _OS::get_exit_code() const {
return OS::get_singleton()->get_exit_code(); return OS::get_singleton()->get_exit_code();
@ -924,11 +615,6 @@ bool _OS::can_use_threads() const {
return OS::get_singleton()->can_use_threads(); return OS::get_singleton()->can_use_threads();
} }
bool _OS::can_draw() const {
return OS::get_singleton()->can_draw();
}
bool _OS::is_userfs_persistent() const { bool _OS::is_userfs_persistent() const {
return OS::get_singleton()->is_userfs_persistent(); return OS::get_singleton()->is_userfs_persistent();
@ -1025,22 +711,6 @@ void _OS::print_resources_by_type(const Vector<String> &p_types) {
} }
}; };
bool _OS::has_virtual_keyboard() const {
return OS::get_singleton()->has_virtual_keyboard();
}
void _OS::show_virtual_keyboard(const String &p_existing_text) {
OS::get_singleton()->show_virtual_keyboard(p_existing_text, Rect2());
}
void _OS::hide_virtual_keyboard() {
OS::get_singleton()->hide_virtual_keyboard();
}
int _OS::get_virtual_keyboard_height() {
return OS::get_singleton()->get_virtual_keyboard_height();
}
void _OS::print_all_resources(const String &p_to_file) { void _OS::print_all_resources(const String &p_to_file) {
OS::get_singleton()->print_all_resources(p_to_file); OS::get_singleton()->print_all_resources(p_to_file);
@ -1061,45 +731,6 @@ String _OS::get_user_data_dir() const {
return OS::get_singleton()->get_user_data_dir(); return OS::get_singleton()->get_user_data_dir();
}; };
Error _OS::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
return OS::get_singleton()->native_video_play(p_path, p_volume, p_audio_track, p_subtitle_track);
};
bool _OS::native_video_is_playing() {
return OS::get_singleton()->native_video_is_playing();
};
void _OS::native_video_pause() {
OS::get_singleton()->native_video_pause();
};
void _OS::native_video_unpause() {
OS::get_singleton()->native_video_unpause();
};
void _OS::native_video_stop() {
OS::get_singleton()->native_video_stop();
};
void _OS::request_attention() {
OS::get_singleton()->request_attention();
}
void _OS::center_window() {
OS::get_singleton()->center_window();
}
void _OS::move_window_to_foreground() {
OS::get_singleton()->move_window_to_foreground();
}
bool _OS::is_debug_build() const { bool _OS::is_debug_build() const {
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
@ -1109,26 +740,6 @@ bool _OS::is_debug_build() const {
#endif #endif
} }
void _OS::set_screen_orientation(ScreenOrientation p_orientation) {
OS::get_singleton()->set_screen_orientation(OS::ScreenOrientation(p_orientation));
}
_OS::ScreenOrientation _OS::get_screen_orientation() const {
return ScreenOrientation(OS::get_singleton()->get_screen_orientation());
}
void _OS::set_keep_screen_on(bool p_enabled) {
OS::get_singleton()->set_keep_screen_on(p_enabled);
}
bool _OS::is_keep_screen_on() const {
return OS::get_singleton()->is_keep_screen_on();
}
String _OS::get_system_dir(SystemDir p_dir) const { String _OS::get_system_dir(SystemDir p_dir) const {
return OS::get_singleton()->get_system_dir(OS::SystemDir(p_dir)); return OS::get_singleton()->get_system_dir(OS::SystemDir(p_dir));
@ -1149,11 +760,6 @@ int _OS::find_keycode_from_string(const String &p_code) const {
return find_keycode(p_code); return find_keycode(p_code);
} }
void _OS::alert(const String &p_alert, const String &p_title) {
OS::get_singleton()->alert(p_alert, p_title);
}
bool _OS::request_permission(const String &p_name) { bool _OS::request_permission(const String &p_name) {
return OS::get_singleton()->request_permission(p_name); return OS::get_singleton()->request_permission(p_name);
@ -1169,90 +775,17 @@ Vector<String> _OS::get_granted_permissions() const {
return OS::get_singleton()->get_granted_permissions(); return OS::get_singleton()->get_granted_permissions();
} }
String _OS::get_unique_id() const {
return OS::get_singleton()->get_unique_id();
}
_OS *_OS::singleton = NULL; _OS *_OS::singleton = NULL;
void _OS::_bind_methods() { void _OS::_bind_methods() {
//ClassDB::bind_method(D_METHOD("get_mouse_position"),&_OS::get_mouse_position);
//ClassDB::bind_method(D_METHOD("is_mouse_grab_enabled"),&_OS::is_mouse_grab_enabled);
ClassDB::bind_method(D_METHOD("set_clipboard", "clipboard"), &_OS::set_clipboard);
ClassDB::bind_method(D_METHOD("get_clipboard"), &_OS::get_clipboard);
//will not delete for now, just unexpose
//ClassDB::bind_method(D_METHOD("set_video_mode","size","fullscreen","resizable","screen"),&_OS::set_video_mode,DEFVAL(0));
//ClassDB::bind_method(D_METHOD("get_video_mode_size","screen"),&_OS::get_video_mode,DEFVAL(0));
//ClassDB::bind_method(D_METHOD("is_video_mode_fullscreen","screen"),&_OS::is_video_mode_fullscreen,DEFVAL(0));
//ClassDB::bind_method(D_METHOD("is_video_mode_resizable","screen"),&_OS::is_video_mode_resizable,DEFVAL(0));
//ClassDB::bind_method(D_METHOD("get_fullscreen_mode_list","screen"),&_OS::get_fullscreen_mode_list,DEFVAL(0));
ClassDB::bind_method(D_METHOD("global_menu_add_item", "menu", "label", "id", "meta"), &_OS::global_menu_add_item);
ClassDB::bind_method(D_METHOD("global_menu_add_separator", "menu"), &_OS::global_menu_add_separator);
ClassDB::bind_method(D_METHOD("global_menu_remove_item", "menu", "idx"), &_OS::global_menu_remove_item);
ClassDB::bind_method(D_METHOD("global_menu_clear", "menu"), &_OS::global_menu_clear);
ClassDB::bind_method(D_METHOD("get_video_driver_count"), &_OS::get_video_driver_count);
ClassDB::bind_method(D_METHOD("get_video_driver_name", "driver"), &_OS::get_video_driver_name);
ClassDB::bind_method(D_METHOD("get_current_video_driver"), &_OS::get_current_video_driver);
ClassDB::bind_method(D_METHOD("get_audio_driver_count"), &_OS::get_audio_driver_count);
ClassDB::bind_method(D_METHOD("get_audio_driver_name", "driver"), &_OS::get_audio_driver_name);
ClassDB::bind_method(D_METHOD("get_connected_midi_inputs"), &_OS::get_connected_midi_inputs); ClassDB::bind_method(D_METHOD("get_connected_midi_inputs"), &_OS::get_connected_midi_inputs);
ClassDB::bind_method(D_METHOD("open_midi_inputs"), &_OS::open_midi_inputs); ClassDB::bind_method(D_METHOD("open_midi_inputs"), &_OS::open_midi_inputs);
ClassDB::bind_method(D_METHOD("close_midi_inputs"), &_OS::close_midi_inputs); ClassDB::bind_method(D_METHOD("close_midi_inputs"), &_OS::close_midi_inputs);
ClassDB::bind_method(D_METHOD("get_screen_count"), &_OS::get_screen_count);
ClassDB::bind_method(D_METHOD("get_current_screen"), &_OS::get_current_screen);
ClassDB::bind_method(D_METHOD("set_current_screen", "screen"), &_OS::set_current_screen);
ClassDB::bind_method(D_METHOD("get_screen_position", "screen"), &_OS::get_screen_position, DEFVAL(-1));
ClassDB::bind_method(D_METHOD("get_screen_size", "screen"), &_OS::get_screen_size, DEFVAL(-1));
ClassDB::bind_method(D_METHOD("get_screen_dpi", "screen"), &_OS::get_screen_dpi, DEFVAL(-1));
ClassDB::bind_method(D_METHOD("get_window_position"), &_OS::get_window_position);
ClassDB::bind_method(D_METHOD("set_window_position", "position"), &_OS::set_window_position);
ClassDB::bind_method(D_METHOD("get_window_size"), &_OS::get_window_size);
ClassDB::bind_method(D_METHOD("get_max_window_size"), &_OS::get_max_window_size);
ClassDB::bind_method(D_METHOD("get_min_window_size"), &_OS::get_min_window_size);
ClassDB::bind_method(D_METHOD("set_max_window_size", "size"), &_OS::set_max_window_size);
ClassDB::bind_method(D_METHOD("set_min_window_size", "size"), &_OS::set_min_window_size);
ClassDB::bind_method(D_METHOD("set_window_size", "size"), &_OS::set_window_size);
ClassDB::bind_method(D_METHOD("get_window_safe_area"), &_OS::get_window_safe_area);
ClassDB::bind_method(D_METHOD("set_window_fullscreen", "enabled"), &_OS::set_window_fullscreen);
ClassDB::bind_method(D_METHOD("is_window_fullscreen"), &_OS::is_window_fullscreen);
ClassDB::bind_method(D_METHOD("set_window_resizable", "enabled"), &_OS::set_window_resizable);
ClassDB::bind_method(D_METHOD("is_window_resizable"), &_OS::is_window_resizable);
ClassDB::bind_method(D_METHOD("set_window_minimized", "enabled"), &_OS::set_window_minimized);
ClassDB::bind_method(D_METHOD("is_window_minimized"), &_OS::is_window_minimized);
ClassDB::bind_method(D_METHOD("set_window_maximized", "enabled"), &_OS::set_window_maximized);
ClassDB::bind_method(D_METHOD("is_window_maximized"), &_OS::is_window_maximized);
ClassDB::bind_method(D_METHOD("set_window_always_on_top", "enabled"), &_OS::set_window_always_on_top);
ClassDB::bind_method(D_METHOD("is_window_always_on_top"), &_OS::is_window_always_on_top);
ClassDB::bind_method(D_METHOD("is_window_focused"), &_OS::is_window_focused);
ClassDB::bind_method(D_METHOD("request_attention"), &_OS::request_attention);
ClassDB::bind_method(D_METHOD("get_real_window_size"), &_OS::get_real_window_size);
ClassDB::bind_method(D_METHOD("center_window"), &_OS::center_window);
ClassDB::bind_method(D_METHOD("move_window_to_foreground"), &_OS::move_window_to_foreground);
ClassDB::bind_method(D_METHOD("set_borderless_window", "borderless"), &_OS::set_borderless_window);
ClassDB::bind_method(D_METHOD("get_borderless_window"), &_OS::get_borderless_window);
ClassDB::bind_method(D_METHOD("get_window_per_pixel_transparency_enabled"), &_OS::get_window_per_pixel_transparency_enabled);
ClassDB::bind_method(D_METHOD("set_window_per_pixel_transparency_enabled", "enabled"), &_OS::set_window_per_pixel_transparency_enabled);
ClassDB::bind_method(D_METHOD("set_ime_active", "active"), &_OS::set_ime_active);
ClassDB::bind_method(D_METHOD("set_ime_position", "position"), &_OS::set_ime_position);
ClassDB::bind_method(D_METHOD("get_ime_selection"), &_OS::get_ime_selection);
ClassDB::bind_method(D_METHOD("get_ime_text"), &_OS::get_ime_text);
ClassDB::bind_method(D_METHOD("set_screen_orientation", "orientation"), &_OS::set_screen_orientation);
ClassDB::bind_method(D_METHOD("get_screen_orientation"), &_OS::get_screen_orientation);
ClassDB::bind_method(D_METHOD("set_keep_screen_on", "enabled"), &_OS::set_keep_screen_on);
ClassDB::bind_method(D_METHOD("is_keep_screen_on"), &_OS::is_keep_screen_on);
ClassDB::bind_method(D_METHOD("has_touchscreen_ui_hint"), &_OS::has_touchscreen_ui_hint);
ClassDB::bind_method(D_METHOD("set_window_title", "title"), &_OS::set_window_title);
ClassDB::bind_method(D_METHOD("set_low_processor_usage_mode", "enable"), &_OS::set_low_processor_usage_mode); ClassDB::bind_method(D_METHOD("set_low_processor_usage_mode", "enable"), &_OS::set_low_processor_usage_mode);
ClassDB::bind_method(D_METHOD("is_in_low_processor_usage_mode"), &_OS::is_in_low_processor_usage_mode); ClassDB::bind_method(D_METHOD("is_in_low_processor_usage_mode"), &_OS::is_in_low_processor_usage_mode);
@ -1283,9 +816,6 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_system_time_secs"), &_OS::get_system_time_secs); ClassDB::bind_method(D_METHOD("get_system_time_secs"), &_OS::get_system_time_secs);
ClassDB::bind_method(D_METHOD("get_system_time_msecs"), &_OS::get_system_time_msecs); ClassDB::bind_method(D_METHOD("get_system_time_msecs"), &_OS::get_system_time_msecs);
ClassDB::bind_method(D_METHOD("set_native_icon", "filename"), &_OS::set_native_icon);
ClassDB::bind_method(D_METHOD("set_icon", "icon"), &_OS::set_icon);
ClassDB::bind_method(D_METHOD("get_exit_code"), &_OS::get_exit_code); ClassDB::bind_method(D_METHOD("get_exit_code"), &_OS::get_exit_code);
ClassDB::bind_method(D_METHOD("set_exit_code", "code"), &_OS::set_exit_code); ClassDB::bind_method(D_METHOD("set_exit_code", "code"), &_OS::set_exit_code);
@ -1295,10 +825,8 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_ticks_usec"), &_OS::get_ticks_usec); ClassDB::bind_method(D_METHOD("get_ticks_usec"), &_OS::get_ticks_usec);
ClassDB::bind_method(D_METHOD("get_splash_tick_msec"), &_OS::get_splash_tick_msec); ClassDB::bind_method(D_METHOD("get_splash_tick_msec"), &_OS::get_splash_tick_msec);
ClassDB::bind_method(D_METHOD("get_locale"), &_OS::get_locale); ClassDB::bind_method(D_METHOD("get_locale"), &_OS::get_locale);
ClassDB::bind_method(D_METHOD("get_latin_keyboard_variant"), &_OS::get_latin_keyboard_variant);
ClassDB::bind_method(D_METHOD("get_model_name"), &_OS::get_model_name); ClassDB::bind_method(D_METHOD("get_model_name"), &_OS::get_model_name);
ClassDB::bind_method(D_METHOD("can_draw"), &_OS::can_draw);
ClassDB::bind_method(D_METHOD("is_userfs_persistent"), &_OS::is_userfs_persistent); ClassDB::bind_method(D_METHOD("is_userfs_persistent"), &_OS::is_userfs_persistent);
ClassDB::bind_method(D_METHOD("is_stdout_verbose"), &_OS::is_stdout_verbose); ClassDB::bind_method(D_METHOD("is_stdout_verbose"), &_OS::is_stdout_verbose);
@ -1310,10 +838,6 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("dump_memory_to_file", "file"), &_OS::dump_memory_to_file); ClassDB::bind_method(D_METHOD("dump_memory_to_file", "file"), &_OS::dump_memory_to_file);
ClassDB::bind_method(D_METHOD("dump_resources_to_file", "file"), &_OS::dump_resources_to_file); ClassDB::bind_method(D_METHOD("dump_resources_to_file", "file"), &_OS::dump_resources_to_file);
ClassDB::bind_method(D_METHOD("has_virtual_keyboard"), &_OS::has_virtual_keyboard);
ClassDB::bind_method(D_METHOD("show_virtual_keyboard", "existing_text"), &_OS::show_virtual_keyboard, DEFVAL(""));
ClassDB::bind_method(D_METHOD("hide_virtual_keyboard"), &_OS::hide_virtual_keyboard);
ClassDB::bind_method(D_METHOD("get_virtual_keyboard_height"), &_OS::get_virtual_keyboard_height);
ClassDB::bind_method(D_METHOD("print_resources_in_use", "short"), &_OS::print_resources_in_use, DEFVAL(false)); ClassDB::bind_method(D_METHOD("print_resources_in_use", "short"), &_OS::print_resources_in_use, DEFVAL(false));
ClassDB::bind_method(D_METHOD("print_all_resources", "tofile"), &_OS::print_all_resources, DEFVAL("")); ClassDB::bind_method(D_METHOD("print_all_resources", "tofile"), &_OS::print_all_resources, DEFVAL(""));
@ -1324,81 +848,32 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_system_dir", "dir"), &_OS::get_system_dir); ClassDB::bind_method(D_METHOD("get_system_dir", "dir"), &_OS::get_system_dir);
ClassDB::bind_method(D_METHOD("get_unique_id"), &_OS::get_unique_id); ClassDB::bind_method(D_METHOD("get_unique_id"), &_OS::get_unique_id);
ClassDB::bind_method(D_METHOD("is_ok_left_and_cancel_right"), &_OS::is_ok_left_and_cancel_right);
ClassDB::bind_method(D_METHOD("print_all_textures_by_size"), &_OS::print_all_textures_by_size); ClassDB::bind_method(D_METHOD("print_all_textures_by_size"), &_OS::print_all_textures_by_size);
ClassDB::bind_method(D_METHOD("print_resources_by_type", "types"), &_OS::print_resources_by_type); ClassDB::bind_method(D_METHOD("print_resources_by_type", "types"), &_OS::print_resources_by_type);
ClassDB::bind_method(D_METHOD("native_video_play", "path", "volume", "audio_track", "subtitle_track"), &_OS::native_video_play);
ClassDB::bind_method(D_METHOD("native_video_is_playing"), &_OS::native_video_is_playing);
ClassDB::bind_method(D_METHOD("native_video_stop"), &_OS::native_video_stop);
ClassDB::bind_method(D_METHOD("native_video_pause"), &_OS::native_video_pause);
ClassDB::bind_method(D_METHOD("native_video_unpause"), &_OS::native_video_unpause);
ClassDB::bind_method(D_METHOD("get_keycode_string", "code"), &_OS::get_keycode_string); ClassDB::bind_method(D_METHOD("get_keycode_string", "code"), &_OS::get_keycode_string);
ClassDB::bind_method(D_METHOD("is_keycode_unicode", "code"), &_OS::is_keycode_unicode); ClassDB::bind_method(D_METHOD("is_keycode_unicode", "code"), &_OS::is_keycode_unicode);
ClassDB::bind_method(D_METHOD("find_keycode_from_string", "string"), &_OS::find_keycode_from_string); ClassDB::bind_method(D_METHOD("find_keycode_from_string", "string"), &_OS::find_keycode_from_string);
ClassDB::bind_method(D_METHOD("set_use_file_access_save_and_swap", "enabled"), &_OS::set_use_file_access_save_and_swap); ClassDB::bind_method(D_METHOD("set_use_file_access_save_and_swap", "enabled"), &_OS::set_use_file_access_save_and_swap);
ClassDB::bind_method(D_METHOD("alert", "text", "title"), &_OS::alert, DEFVAL("Alert!"));
ClassDB::bind_method(D_METHOD("set_thread_name", "name"), &_OS::set_thread_name); ClassDB::bind_method(D_METHOD("set_thread_name", "name"), &_OS::set_thread_name);
ClassDB::bind_method(D_METHOD("set_use_vsync", "enable"), &_OS::set_use_vsync);
ClassDB::bind_method(D_METHOD("is_vsync_enabled"), &_OS::is_vsync_enabled);
ClassDB::bind_method(D_METHOD("set_vsync_via_compositor", "enable"), &_OS::set_vsync_via_compositor);
ClassDB::bind_method(D_METHOD("is_vsync_via_compositor_enabled"), &_OS::is_vsync_via_compositor_enabled);
ClassDB::bind_method(D_METHOD("has_feature", "tag_name"), &_OS::has_feature); ClassDB::bind_method(D_METHOD("has_feature", "tag_name"), &_OS::has_feature);
ClassDB::bind_method(D_METHOD("request_permission", "name"), &_OS::request_permission); ClassDB::bind_method(D_METHOD("request_permission", "name"), &_OS::request_permission);
ClassDB::bind_method(D_METHOD("request_permissions"), &_OS::request_permissions); ClassDB::bind_method(D_METHOD("request_permissions"), &_OS::request_permissions);
ClassDB::bind_method(D_METHOD("get_granted_permissions"), &_OS::get_granted_permissions); ClassDB::bind_method(D_METHOD("get_granted_permissions"), &_OS::get_granted_permissions);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "clipboard"), "set_clipboard", "get_clipboard");
ADD_PROPERTY(PropertyInfo(Variant::INT, "current_screen"), "set_current_screen", "get_current_screen");
ADD_PROPERTY(PropertyInfo(Variant::INT, "exit_code"), "set_exit_code", "get_exit_code"); ADD_PROPERTY(PropertyInfo(Variant::INT, "exit_code"), "set_exit_code", "get_exit_code");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "vsync_enabled"), "set_use_vsync", "is_vsync_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "vsync_via_compositor"), "set_vsync_via_compositor", "is_vsync_via_compositor_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "low_processor_usage_mode"), "set_low_processor_usage_mode", "is_in_low_processor_usage_mode"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "low_processor_usage_mode"), "set_low_processor_usage_mode", "is_in_low_processor_usage_mode");
ADD_PROPERTY(PropertyInfo(Variant::INT, "low_processor_usage_mode_sleep_usec"), "set_low_processor_usage_mode_sleep_usec", "get_low_processor_usage_mode_sleep_usec"); ADD_PROPERTY(PropertyInfo(Variant::INT, "low_processor_usage_mode_sleep_usec"), "set_low_processor_usage_mode_sleep_usec", "get_low_processor_usage_mode_sleep_usec");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keep_screen_on"), "set_keep_screen_on", "is_keep_screen_on");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "min_window_size"), "set_min_window_size", "get_min_window_size");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "max_window_size"), "set_max_window_size", "get_max_window_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "screen_orientation", PROPERTY_HINT_ENUM, "Landscape,Portrait,Reverse Landscape,Reverse Portrait,Sensor Landscape,Sensor Portrait,Sensor"), "set_screen_orientation", "get_screen_orientation");
ADD_GROUP("Window", "window_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_borderless"), "set_borderless_window", "get_borderless_window");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_per_pixel_transparency_enabled"), "set_window_per_pixel_transparency_enabled", "get_window_per_pixel_transparency_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_fullscreen"), "set_window_fullscreen", "is_window_fullscreen");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_maximized"), "set_window_maximized", "is_window_maximized");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_minimized"), "set_window_minimized", "is_window_minimized");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "window_resizable"), "set_window_resizable", "is_window_resizable");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "window_position"), "set_window_position", "get_window_position");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "window_size"), "set_window_size", "get_window_size");
// Those default values need to be specified for the docs generator, // Those default values need to be specified for the docs generator,
// to avoid using values from the documentation writer's own OS instance. // to avoid using values from the documentation writer's own OS instance.
ADD_PROPERTY_DEFAULT("clipboard", "");
ADD_PROPERTY_DEFAULT("current_screen", 0);
ADD_PROPERTY_DEFAULT("exit_code", 0); ADD_PROPERTY_DEFAULT("exit_code", 0);
ADD_PROPERTY_DEFAULT("vsync_enabled", true);
ADD_PROPERTY_DEFAULT("vsync_via_compositor", false);
ADD_PROPERTY_DEFAULT("low_processor_usage_mode", false); ADD_PROPERTY_DEFAULT("low_processor_usage_mode", false);
ADD_PROPERTY_DEFAULT("low_processor_usage_mode_sleep_usec", 6900); ADD_PROPERTY_DEFAULT("low_processor_usage_mode_sleep_usec", 6900);
ADD_PROPERTY_DEFAULT("keep_screen_on", true);
ADD_PROPERTY_DEFAULT("min_window_size", Vector2());
ADD_PROPERTY_DEFAULT("max_window_size", Vector2());
ADD_PROPERTY_DEFAULT("screen_orientation", 0);
ADD_PROPERTY_DEFAULT("window_borderless", false);
ADD_PROPERTY_DEFAULT("window_per_pixel_transparency_enabled", false);
ADD_PROPERTY_DEFAULT("window_fullscreen", false);
ADD_PROPERTY_DEFAULT("window_maximized", false);
ADD_PROPERTY_DEFAULT("window_minimized", false);
ADD_PROPERTY_DEFAULT("window_resizable", true);
ADD_PROPERTY_DEFAULT("window_position", Vector2());
ADD_PROPERTY_DEFAULT("window_size", Vector2());
BIND_ENUM_CONSTANT(VIDEO_DRIVER_GLES2); BIND_ENUM_CONSTANT(VIDEO_DRIVER_GLES2);
BIND_ENUM_CONSTANT(VIDEO_DRIVER_VULKAN); BIND_ENUM_CONSTANT(VIDEO_DRIVER_VULKAN);
@ -1424,14 +899,6 @@ void _OS::_bind_methods() {
BIND_ENUM_CONSTANT(MONTH_NOVEMBER); BIND_ENUM_CONSTANT(MONTH_NOVEMBER);
BIND_ENUM_CONSTANT(MONTH_DECEMBER); BIND_ENUM_CONSTANT(MONTH_DECEMBER);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DESKTOP); BIND_ENUM_CONSTANT(SYSTEM_DIR_DESKTOP);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DCIM); BIND_ENUM_CONSTANT(SYSTEM_DIR_DCIM);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DOCUMENTS); BIND_ENUM_CONSTANT(SYSTEM_DIR_DOCUMENTS);

View file

@ -145,83 +145,10 @@ public:
MONTH_DECEMBER MONTH_DECEMBER
}; };
void global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta);
void global_menu_add_separator(const String &p_menu);
void global_menu_remove_item(const String &p_menu, int p_idx);
void global_menu_clear(const String &p_menu);
Point2 get_mouse_position() const;
void set_window_title(const String &p_title);
int get_mouse_button_state() const;
void set_clipboard(const String &p_text);
String get_clipboard() const;
void set_video_mode(const Size2 &p_size, bool p_fullscreen, bool p_resizeable, int p_screen = 0);
Size2 get_video_mode(int p_screen = 0) const;
bool is_video_mode_fullscreen(int p_screen = 0) const;
bool is_video_mode_resizable(int p_screen = 0) const;
Array get_fullscreen_mode_list(int p_screen = 0) const;
virtual int get_video_driver_count() const;
virtual String get_video_driver_name(VideoDriver p_driver) const;
virtual VideoDriver get_current_video_driver() const;
virtual int get_audio_driver_count() const;
virtual String get_audio_driver_name(int p_driver) const;
virtual PackedStringArray get_connected_midi_inputs(); virtual PackedStringArray get_connected_midi_inputs();
virtual void open_midi_inputs(); virtual void open_midi_inputs();
virtual void close_midi_inputs(); virtual void close_midi_inputs();
virtual int get_screen_count() const;
virtual int get_current_screen() const;
virtual void set_current_screen(int p_screen);
virtual Point2 get_screen_position(int p_screen = -1) const;
virtual Size2 get_screen_size(int p_screen = -1) const;
virtual int get_screen_dpi(int p_screen = -1) const;
virtual Point2 get_window_position() const;
virtual void set_window_position(const Point2 &p_position);
virtual Size2 get_max_window_size() const;
virtual Size2 get_min_window_size() const;
virtual Size2 get_window_size() const;
virtual Size2 get_real_window_size() const;
virtual Rect2 get_window_safe_area() const;
virtual void set_max_window_size(const Size2 &p_size);
virtual void set_min_window_size(const Size2 &p_size);
virtual void set_window_size(const Size2 &p_size);
virtual void set_window_fullscreen(bool p_enabled);
virtual bool is_window_fullscreen() const;
virtual void set_window_resizable(bool p_enabled);
virtual bool is_window_resizable() const;
virtual void set_window_minimized(bool p_enabled);
virtual bool is_window_minimized() const;
virtual void set_window_maximized(bool p_enabled);
virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void request_attention();
virtual void center_window();
virtual void move_window_to_foreground();
virtual void set_borderless_window(bool p_borderless);
virtual bool get_borderless_window() const;
virtual bool get_window_per_pixel_transparency_enabled() const;
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled);
virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
virtual Point2 get_ime_selection() const;
virtual String get_ime_text() const;
Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
bool native_video_is_playing();
void native_video_pause();
void native_video_unpause();
void native_video_stop();
void set_low_processor_usage_mode(bool p_enabled); void set_low_processor_usage_mode(bool p_enabled);
bool is_in_low_processor_usage_mode() const; bool is_in_low_processor_usage_mode() const;
@ -243,25 +170,17 @@ public:
Vector<String> get_cmdline_args(); Vector<String> get_cmdline_args();
String get_locale() const; String get_locale() const;
String get_latin_keyboard_variant() const;
String get_model_name() const; String get_model_name() const;
void dump_memory_to_file(const String &p_file); void dump_memory_to_file(const String &p_file);
void dump_resources_to_file(const String &p_file); void dump_resources_to_file(const String &p_file);
bool has_virtual_keyboard() const;
void show_virtual_keyboard(const String &p_existing_text = "");
void hide_virtual_keyboard();
int get_virtual_keyboard_height();
void print_resources_in_use(bool p_short = false); void print_resources_in_use(bool p_short = false);
void print_all_resources(const String &p_to_file); void print_all_resources(const String &p_to_file);
void print_all_textures_by_size(); void print_all_textures_by_size();
void print_resources_by_type(const Vector<String> &p_types); void print_resources_by_type(const Vector<String> &p_types);
bool has_touchscreen_ui_hint() const;
bool is_debug_build() const; bool is_debug_build() const;
String get_unique_id() const; String get_unique_id() const;
@ -272,9 +191,6 @@ public:
void set_use_file_access_save_and_swap(bool p_enable); void set_use_file_access_save_and_swap(bool p_enable);
void set_native_icon(const String &p_filename);
void set_icon(const Ref<Image> &p_icon);
int get_exit_code() const; int get_exit_code() const;
void set_exit_code(int p_code); void set_exit_code(int p_code);
Dictionary get_date(bool utc) const; Dictionary get_date(bool utc) const;
@ -298,8 +214,6 @@ public:
bool can_use_threads() const; bool can_use_threads() const;
bool can_draw() const;
bool is_userfs_persistent() const; bool is_userfs_persistent() const;
bool is_stdout_verbose() const; bool is_stdout_verbose() const;
@ -317,39 +231,12 @@ public:
SYSTEM_DIR_RINGTONES, SYSTEM_DIR_RINGTONES,
}; };
enum ScreenOrientation {
SCREEN_ORIENTATION_LANDSCAPE,
SCREEN_ORIENTATION_PORTRAIT,
SCREEN_ORIENTATION_REVERSE_LANDSCAPE,
SCREEN_ORIENTATION_REVERSE_PORTRAIT,
SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
SCREEN_ORIENTATION_SENSOR_PORTRAIT,
SCREEN_ORIENTATION_SENSOR,
};
String get_system_dir(SystemDir p_dir) const; String get_system_dir(SystemDir p_dir) const;
String get_user_data_dir() const; String get_user_data_dir() const;
void alert(const String &p_alert, const String &p_title = "ALERT!");
void set_screen_orientation(ScreenOrientation p_orientation);
ScreenOrientation get_screen_orientation() const;
void set_keep_screen_on(bool p_enabled);
bool is_keep_screen_on() const;
bool is_ok_left_and_cancel_right() const;
Error set_thread_name(const String &p_name); Error set_thread_name(const String &p_name);
void set_use_vsync(bool p_enable);
bool is_vsync_enabled() const;
void set_vsync_via_compositor(bool p_enable);
bool is_vsync_via_compositor_enabled() const;
bool has_feature(const String &p_feature) const; bool has_feature(const String &p_feature) const;
bool request_permission(const String &p_name); bool request_permission(const String &p_name);
@ -365,7 +252,6 @@ VARIANT_ENUM_CAST(_OS::VideoDriver);
VARIANT_ENUM_CAST(_OS::Weekday); VARIANT_ENUM_CAST(_OS::Weekday);
VARIANT_ENUM_CAST(_OS::Month); VARIANT_ENUM_CAST(_OS::Month);
VARIANT_ENUM_CAST(_OS::SystemDir); VARIANT_ENUM_CAST(_OS::SystemDir);
VARIANT_ENUM_CAST(_OS::ScreenOrientation);
class _Geometry : public Object { class _Geometry : public Object {

View file

@ -38,6 +38,7 @@
#include "core/project_settings.h" #include "core/project_settings.h"
#include "core/script_language.h" #include "core/script_language.h"
#include "scene/main/node.h" #include "scene/main/node.h"
#include "servers/display_server.h"
template <typename T> template <typename T>
void RemoteDebugger::_bind_profiler(const String &p_name, T *p_prof) { void RemoteDebugger::_bind_profiler(const String &p_name, T *p_prof) {
@ -694,7 +695,7 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
} else if (command == "continue") { } else if (command == "continue") {
script_debugger->set_depth(-1); script_debugger->set_depth(-1);
script_debugger->set_lines_left(-1); script_debugger->set_lines_left(-1);
OS::get_singleton()->move_window_to_foreground(); DisplayServer::get_singleton()->window_move_to_foreground();
break; break;
} else if (command == "break") { } else if (command == "break") {

View file

@ -41,6 +41,12 @@
Input *Input::singleton = NULL; Input *Input::singleton = NULL;
void (*Input::set_mouse_mode_func)(Input::MouseMode) = nullptr;
Input::MouseMode (*Input::get_mouse_mode_func)() = nullptr;
void (*Input::warp_mouse_func)(const Vector2 &p_to_pos) = nullptr;
Input::CursorShape (*Input::get_current_cursor_shape_func)() = nullptr;
void (*Input::set_custom_mouse_cursor_func)(const RES &, Input::CursorShape, const Vector2 &) = nullptr;
Input *Input::get_singleton() { Input *Input::get_singleton() {
return singleton; return singleton;
@ -48,12 +54,12 @@ Input *Input::get_singleton() {
void Input::set_mouse_mode(MouseMode p_mode) { void Input::set_mouse_mode(MouseMode p_mode) {
ERR_FAIL_INDEX((int)p_mode, 4); ERR_FAIL_INDEX((int)p_mode, 4);
OS::get_singleton()->set_mouse_mode((OS::MouseMode)p_mode); set_mouse_mode_func(p_mode);
} }
Input::MouseMode Input::get_mouse_mode() const { Input::MouseMode Input::get_mouse_mode() const {
return (MouseMode)OS::get_singleton()->get_mouse_mode(); return get_mouse_mode_func();
} }
void Input::_bind_methods() { void Input::_bind_methods() {
@ -654,10 +660,8 @@ int Input::get_mouse_button_mask() const {
} }
void Input::warp_mouse_position(const Vector2 &p_to) { void Input::warp_mouse_position(const Vector2 &p_to) {
warp_mouse_func(p_to);
OS::get_singleton()->warp_mouse_position(p_to);
} }
Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect) { Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect) {
// The relative distance reported for the next event after a warp is in the boundaries of the // The relative distance reported for the next event after a warp is in the boundaries of the
@ -678,7 +682,7 @@ Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, con
const Point2i pos_local = p_motion->get_global_position() - p_rect.position; const Point2i pos_local = p_motion->get_global_position() - p_rect.position;
const Point2i pos_warped(Math::fposmod(pos_local.x, p_rect.size.x), Math::fposmod(pos_local.y, p_rect.size.y)); const Point2i pos_warped(Math::fposmod(pos_local.x, p_rect.size.x), Math::fposmod(pos_local.y, p_rect.size.y));
if (pos_warped != pos_local) { if (pos_warped != pos_local) {
OS::get_singleton()->warp_mouse_position(pos_warped + p_rect.position); warp_mouse_position(pos_warped + p_rect.position);
} }
return rel_warped; return rel_warped;
@ -774,14 +778,14 @@ void Input::set_default_cursor_shape(CursorShape p_shape) {
Input::CursorShape Input::get_current_cursor_shape() const { Input::CursorShape Input::get_current_cursor_shape() const {
return (Input::CursorShape)OS::get_singleton()->get_cursor_shape(); return get_current_cursor_shape_func();
} }
void Input::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { void Input::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
if (Engine::get_singleton()->is_editor_hint()) if (Engine::get_singleton()->is_editor_hint())
return; return;
OS::get_singleton()->set_custom_mouse_cursor(p_cursor, (OS::CursorShape)p_shape, p_hotspot); set_custom_mouse_cursor_func(p_cursor, p_shape, p_hotspot);
} }
void Input::accumulate_input_event(const Ref<InputEvent> &p_event) { void Input::accumulate_input_event(const Ref<InputEvent> &p_event) {
@ -1171,23 +1175,13 @@ void Input::set_fallback_mapping(String p_guid) {
} }
} }
//Defaults to simple implementation for platforms with a fixed gamepad layout, like consoles.
bool Input::is_joy_known(int p_device) {
return OS::get_singleton()->is_joy_known(p_device);
}
String Input::get_joy_guid(int p_device) const {
return OS::get_singleton()->get_joy_guid(p_device);
}
//platforms that use the remapping system can override and call to these ones //platforms that use the remapping system can override and call to these ones
bool Input::is_joy_mapped(int p_device) { bool Input::is_joy_known(int p_device) {
int mapping = joy_names[p_device].mapping; int mapping = joy_names[p_device].mapping;
return mapping != -1 ? (mapping != fallback_mapping) : false; return mapping != -1 ? (mapping != fallback_mapping) : false;
} }
String Input::get_joy_guid_remapped(int p_device) const { String Input::get_joy_guid(int p_device) const {
ERR_FAIL_COND_V(!joy_names.has(p_device), ""); ERR_FAIL_COND_V(!joy_names.has(p_device), "");
return joy_names[p_device].uid; return joy_names[p_device].uid;
} }

View file

@ -219,6 +219,14 @@ private:
List<Ref<InputEvent>> accumulated_events; List<Ref<InputEvent>> accumulated_events;
bool use_accumulated_input; bool use_accumulated_input;
friend class DisplayServer;
static void (*set_mouse_mode_func)(MouseMode);
static MouseMode (*get_mouse_mode_func)();
static void (*warp_mouse_func)(const Vector2 &p_to_pos);
static CursorShape (*get_current_cursor_shape_func)();
static void (*set_custom_mouse_cursor_func)(const RES &, CursorShape, const Vector2 &);
protected: protected:
static void _bind_methods(); static void _bind_methods();
@ -300,8 +308,6 @@ public:
void add_joy_mapping(String p_mapping, bool p_update_existing = false); void add_joy_mapping(String p_mapping, bool p_update_existing = false);
void remove_joy_mapping(String p_guid); void remove_joy_mapping(String p_guid);
bool is_joy_known(int p_device);
String get_joy_guid(int p_device) const;
String get_joy_button_string(int p_button); String get_joy_button_string(int p_button);
String get_joy_axis_string(int p_axis); String get_joy_axis_string(int p_axis);
@ -310,8 +316,8 @@ public:
int get_unused_joy_id(); int get_unused_joy_id();
bool is_joy_mapped(int p_device); bool is_joy_known(int p_device);
String get_joy_guid_remapped(int p_device) const; String get_joy_guid(int p_device) const;
void set_fallback_mapping(String p_guid); void set_fallback_mapping(String p_guid);
void accumulate_input_event(const Ref<InputEvent> &p_event); void accumulate_input_event(const Ref<InputEvent> &p_event);

View file

@ -139,14 +139,6 @@ void OS::printerr(const char *p_format, ...) {
va_end(argp); va_end(argp);
}; };
void OS::set_keep_screen_on(bool p_enabled) {
_keep_screen_on = p_enabled;
}
bool OS::is_keep_screen_on() const {
return _keep_screen_on;
}
void OS::set_low_processor_usage_mode(bool p_enabled) { void OS::set_low_processor_usage_mode(bool p_enabled) {
low_processor_usage_mode = p_enabled; low_processor_usage_mode = p_enabled;
@ -167,15 +159,6 @@ int OS::get_low_processor_usage_mode_sleep_usec() const {
return low_processor_usage_mode_sleep_usec; return low_processor_usage_mode_sleep_usec;
} }
void OS::set_clipboard(const String &p_text) {
_local_clipboard = p_text;
}
String OS::get_clipboard() const {
return _local_clipboard;
}
String OS::get_executable_path() const { String OS::get_executable_path() const {
return _execpath; return _execpath;
@ -216,31 +199,6 @@ static void _OS_printres(Object *p_obj) {
print_line(str); print_line(str);
} }
bool OS::has_virtual_keyboard() const {
return false;
}
void OS::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_input_length) {
}
void OS::hide_virtual_keyboard() {
}
int OS::get_virtual_keyboard_height() const {
return 0;
}
void OS::set_cursor_shape(CursorShape p_shape) {
}
OS::CursorShape OS::get_cursor_shape() const {
return CURSOR_ARROW;
}
void OS::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
}
void OS::print_all_resources(String p_to_file) { void OS::print_all_resources(String p_to_file) {
ERR_FAIL_COND(p_to_file != "" && _OSPRF); ERR_FAIL_COND(p_to_file != "" && _OSPRF);
@ -372,45 +330,6 @@ Error OS::shell_open(String p_uri) {
}; };
// implement these with the canvas? // implement these with the canvas?
Error OS::dialog_show(String p_title, String p_description, Vector<String> p_buttons, Object *p_obj, String p_callback) {
while (true) {
print("%ls\n--------\n%ls\n", p_title.c_str(), p_description.c_str());
for (int i = 0; i < p_buttons.size(); i++) {
if (i > 0) print(", ");
print("%i=%ls", i + 1, p_buttons[i].c_str());
};
print("\n");
String res = get_stdin_string().strip_edges();
if (!res.is_numeric())
continue;
int n = res.to_int();
if (n < 0 || n >= p_buttons.size())
continue;
if (p_obj && p_callback != "")
p_obj->call_deferred(p_callback, n);
break;
};
return OK;
};
Error OS::dialog_input_text(String p_title, String p_description, String p_partial, Object *p_obj, String p_callback) {
ERR_FAIL_COND_V(!p_obj, FAILED);
ERR_FAIL_COND_V(p_callback == "", FAILED);
print("%ls\n---------\n%ls\n[%ls]:\n", p_title.c_str(), p_description.c_str(), p_partial.c_str());
String res = get_stdin_string().strip_edges();
bool success = true;
if (res == "") {
res = p_partial;
};
p_obj->call_deferred(p_callback, success, res);
return OK;
};
uint64_t OS::get_static_memory_usage() const { uint64_t OS::get_static_memory_usage() const {
@ -427,12 +346,6 @@ Error OS::set_cwd(const String &p_cwd) {
return ERR_CANT_OPEN; return ERR_CANT_OPEN;
} }
bool OS::has_touchscreen_ui_hint() const {
//return false;
return Input::get_singleton() && Input::get_singleton()->is_emulating_touch_from_mouse();
}
uint64_t OS::get_free_static_memory() const { uint64_t OS::get_free_static_memory() const {
return Memory::get_mem_available(); return Memory::get_mem_available();
@ -441,17 +354,7 @@ uint64_t OS::get_free_static_memory() const {
void OS::yield() { void OS::yield() {
} }
void OS::set_screen_orientation(ScreenOrientation p_orientation) { void OS::ensure_user_data_dir() {
_orientation = p_orientation;
}
OS::ScreenOrientation OS::get_screen_orientation() const {
return (OS::ScreenOrientation)_orientation;
}
void OS::_ensure_user_data_dir() {
String dd = get_user_data_dir(); String dd = get_user_data_dir();
DirAccess *da = DirAccess::open(dd); DirAccess *da = DirAccess::open(dd);
@ -467,12 +370,6 @@ void OS::_ensure_user_data_dir() {
memdelete(da); memdelete(da);
} }
void OS::set_native_icon(const String &p_filename) {
}
void OS::set_icon(const Ref<Image> &p_icon) {
}
String OS::get_model_name() const { String OS::get_model_name() const {
return "GenericDevice"; return "GenericDevice";
@ -484,15 +381,6 @@ void OS::set_cmdline(const char *p_execpath, const List<String> &p_args) {
_cmdline = p_args; _cmdline = p_args;
}; };
void OS::release_rendering_thread() {
}
void OS::make_rendering_thread() {
}
void OS::swap_buffers() {
}
String OS::get_unique_id() const { String OS::get_unique_id() const {
ERR_FAIL_V(""); ERR_FAIL_V("");
@ -503,31 +391,6 @@ int OS::get_processor_count() const {
return 1; return 1;
} }
Error OS::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
return FAILED;
};
bool OS::native_video_is_playing() const {
return false;
};
void OS::native_video_pause(){
};
void OS::native_video_unpause(){
};
void OS::native_video_stop(){
};
void OS::set_mouse_mode(MouseMode p_mode) {
}
bool OS::can_use_threads() const { bool OS::can_use_threads() const {
#ifdef NO_THREADS #ifdef NO_THREADS
@ -537,51 +400,6 @@ bool OS::can_use_threads() const {
#endif #endif
} }
OS::MouseMode OS::get_mouse_mode() const {
return MOUSE_MODE_VISIBLE;
}
OS::LatinKeyboardVariant OS::get_latin_keyboard_variant() const {
return LATIN_KEYBOARD_QWERTY;
}
bool OS::is_joy_known(int p_device) {
return true;
}
String OS::get_joy_guid(int p_device) const {
return "Default Joypad";
}
void OS::set_context(int p_context) {
}
OS::SwitchVSyncCallbackInThread OS::switch_vsync_function = NULL;
void OS::set_use_vsync(bool p_enable) {
_use_vsync = p_enable;
if (switch_vsync_function) { //if a function was set, use function
switch_vsync_function(p_enable);
} else { //otherwise just call here
_set_use_vsync(p_enable);
}
}
bool OS::is_vsync_enabled() const {
return _use_vsync;
}
void OS::set_vsync_via_compositor(bool p_enable) {
_vsync_via_compositor = p_enable;
}
bool OS::is_vsync_via_compositor_enabled() const {
return _vsync_via_compositor;
}
void OS::set_has_server_feature_callback(HasServerFeatureCallback p_callback) { void OS::set_has_server_feature_callback(HasServerFeatureCallback p_callback) {
has_server_feature_callback = p_callback; has_server_feature_callback = p_callback;
@ -653,48 +471,6 @@ bool OS::has_feature(const String &p_feature) {
return false; return false;
} }
void OS::center_window() {
if (is_window_fullscreen()) return;
Point2 sp = get_screen_position(get_current_screen());
Size2 scr = get_screen_size(get_current_screen());
Size2 wnd = get_real_window_size();
int x = sp.width + (scr.width - wnd.width) / 2;
int y = sp.height + (scr.height - wnd.height) / 2;
set_window_position(Vector2(x, y));
}
int OS::get_video_driver_count() const {
return 2;
}
const char *OS::get_video_driver_name(int p_driver) const {
switch (p_driver) {
case VIDEO_DRIVER_GLES2:
return "GLES2";
case VIDEO_DRIVER_VULKAN:
default:
return "Vulkan";
}
}
int OS::get_audio_driver_count() const {
return AudioDriverManager::get_driver_count();
}
const char *OS::get_audio_driver_name(int p_driver) const {
AudioDriver *driver = AudioDriverManager::get_driver(p_driver);
ERR_FAIL_COND_V_MSG(!driver, "", "Cannot get audio driver at index '" + itos(p_driver) + "'.");
return AudioDriverManager::get_driver(p_driver)->get_name();
}
void OS::set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments) { void OS::set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments) {
restart_on_exit = p_restart; restart_on_exit = p_restart;
restart_commandline = p_restart_arguments; restart_commandline = p_restart_arguments;
@ -740,7 +516,6 @@ OS::OS() {
_verbose_stdout = false; _verbose_stdout = false;
_no_window = false; _no_window = false;
_exit_code = 0; _exit_code = 0;
_orientation = SCREEN_LANDSCAPE;
_render_thread_mode = RENDER_THREAD_SAFE; _render_thread_mode = RENDER_THREAD_SAFE;

View file

@ -82,31 +82,6 @@ public:
RENDER_THREAD_SAFE, RENDER_THREAD_SAFE,
RENDER_SEPARATE_THREAD RENDER_SEPARATE_THREAD
}; };
struct VideoMode {
int width, height;
bool fullscreen;
bool resizable;
bool borderless_window;
bool maximized;
bool always_on_top;
bool use_vsync;
bool vsync_via_compositor;
bool layered;
float get_aspect() const { return (float)width / (float)height; }
VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false, bool p_always_on_top = false, bool p_use_vsync = false, bool p_vsync_via_compositor = false) {
width = p_width;
height = p_height;
fullscreen = p_fullscreen;
resizable = p_resizable;
borderless_window = p_borderless_window;
maximized = p_maximized;
always_on_top = p_always_on_top;
use_vsync = p_use_vsync;
vsync_via_compositor = p_vsync_via_compositor;
layered = false;
}
};
protected: protected:
friend class Main; friend class Main;
@ -117,8 +92,8 @@ protected:
// functions used by main to initialize/deinitialize the OS // functions used by main to initialize/deinitialize the OS
void add_logger(Logger *p_logger); void add_logger(Logger *p_logger);
virtual void initialize_core() = 0; virtual void initialize() = 0;
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) = 0; virtual void initialize_joypads() = 0;
virtual void set_main_loop(MainLoop *p_main_loop) = 0; virtual void set_main_loop(MainLoop *p_main_loop) = 0;
virtual void delete_main_loop() = 0; virtual void delete_main_loop() = 0;
@ -128,7 +103,6 @@ protected:
virtual void set_cmdline(const char *p_execpath, const List<String> &p_args); virtual void set_cmdline(const char *p_execpath, const List<String> &p_args);
void _ensure_user_data_dir();
virtual bool _check_internal_feature_support(const String &p_feature) = 0; virtual bool _check_internal_feature_support(const String &p_feature) = 0;
public: public:
@ -136,121 +110,20 @@ public:
static OS *get_singleton(); static OS *get_singleton();
virtual void global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta){};
virtual void global_menu_add_separator(const String &p_menu){};
virtual void global_menu_remove_item(const String &p_menu, int p_idx){};
virtual void global_menu_clear(const String &p_menu){};
void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, Logger::ErrorType p_type = Logger::ERR_ERROR); void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, Logger::ErrorType p_type = Logger::ERR_ERROR);
void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
void printerr(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; void printerr(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
virtual void alert(const String &p_alert, const String &p_title = "ALERT!") = 0;
virtual String get_stdin_string(bool p_block = true) = 0; virtual String get_stdin_string(bool p_block = true) = 0;
enum MouseMode {
MOUSE_MODE_VISIBLE,
MOUSE_MODE_HIDDEN,
MOUSE_MODE_CAPTURED,
MOUSE_MODE_CONFINED
};
virtual void set_mouse_mode(MouseMode p_mode);
virtual MouseMode get_mouse_mode() const;
virtual void warp_mouse_position(const Point2 &p_to) {}
virtual Point2 get_mouse_position() const = 0;
virtual int get_mouse_button_state() const = 0;
virtual void set_window_title(const String &p_title) = 0;
virtual void set_clipboard(const String &p_text);
virtual String get_clipboard() const;
virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0) = 0;
virtual VideoMode get_video_mode(int p_screen = 0) const = 0;
virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const = 0;
enum VideoDriver {
VIDEO_DRIVER_VULKAN,
VIDEO_DRIVER_GLES2,
VIDEO_DRIVER_MAX,
};
virtual int get_video_driver_count() const;
virtual const char *get_video_driver_name(int p_driver) const;
virtual int get_current_video_driver() const = 0;
virtual int get_audio_driver_count() const;
virtual const char *get_audio_driver_name(int p_driver) const;
virtual PackedStringArray get_connected_midi_inputs(); virtual PackedStringArray get_connected_midi_inputs();
virtual void open_midi_inputs(); virtual void open_midi_inputs();
virtual void close_midi_inputs(); virtual void close_midi_inputs();
virtual int get_screen_count() const { return 1; }
virtual int get_current_screen() const { return 0; }
virtual void set_current_screen(int p_screen) {}
virtual Point2 get_screen_position(int p_screen = -1) const { return Point2(); }
virtual Size2 get_screen_size(int p_screen = -1) const { return get_window_size(); }
virtual int get_screen_dpi(int p_screen = -1) const { return 72; }
virtual Point2 get_window_position() const { return Vector2(); }
virtual void set_window_position(const Point2 &p_position) {}
virtual Size2 get_max_window_size() const { return Size2(); };
virtual Size2 get_min_window_size() const { return Size2(); };
virtual Size2 get_window_size() const = 0;
virtual Size2 get_real_window_size() const { return get_window_size(); }
virtual void set_min_window_size(const Size2 p_size) {}
virtual void set_max_window_size(const Size2 p_size) {}
virtual void set_window_size(const Size2 p_size) {}
virtual void set_window_fullscreen(bool p_enabled) {}
virtual bool is_window_fullscreen() const { return true; }
virtual void set_window_resizable(bool p_enabled) {}
virtual bool is_window_resizable() const { return false; }
virtual void set_window_minimized(bool p_enabled) {}
virtual bool is_window_minimized() const { return false; }
virtual void set_window_maximized(bool p_enabled) {}
virtual bool is_window_maximized() const { return true; }
virtual void set_window_always_on_top(bool p_enabled) {}
virtual bool is_window_always_on_top() const { return false; }
virtual bool is_window_focused() const { return true; }
virtual void set_console_visible(bool p_enabled) {}
virtual bool is_console_visible() const { return false; }
virtual void request_attention() {}
virtual void center_window();
// Returns window area free of hardware controls and other obstacles.
// The application should use this to determine where to place UI elements.
//
// Keep in mind the area returned is in window coordinates rather than
// viewport coordinates - you should perform the conversion on your own.
//
// The maximum size of the area is Rect2(0, 0, window_size.width, window_size.height).
virtual Rect2 get_window_safe_area() const {
Size2 window_size = get_window_size();
return Rect2(0, 0, window_size.width, window_size.height);
}
virtual void set_borderless_window(bool p_borderless) {}
virtual bool get_borderless_window() { return 0; }
virtual bool get_window_per_pixel_transparency_enabled() const { return false; }
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled) {}
virtual uint8_t *get_layered_buffer_data() { return NULL; }
virtual Size2 get_layered_buffer_size() { return Size2(0, 0); }
virtual void swap_layered_buffer() {}
virtual void set_ime_active(const bool p_active) {}
virtual void set_ime_position(const Point2 &p_pos) {}
virtual Point2 get_ime_selection() const { return Point2(); }
virtual String get_ime_text() const { return String(); }
virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false) { return ERR_UNAVAILABLE; } virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false) { return ERR_UNAVAILABLE; }
virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; } virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; }
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false) { return ERR_UNAVAILABLE; } virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false) { return ERR_UNAVAILABLE; }
virtual void set_keep_screen_on(bool p_enabled);
virtual bool is_keep_screen_on() const;
virtual void set_low_processor_usage_mode(bool p_enabled); virtual void set_low_processor_usage_mode(bool p_enabled);
virtual bool is_in_low_processor_usage_mode() const; virtual bool is_in_low_processor_usage_mode() const;
virtual void set_low_processor_usage_mode_sleep_usec(int p_usec); virtual void set_low_processor_usage_mode_sleep_usec(int p_usec);
@ -273,6 +146,8 @@ public:
virtual List<String> get_cmdline_args() const { return _cmdline; } virtual List<String> get_cmdline_args() const { return _cmdline; }
virtual String get_model_name() const; virtual String get_model_name() const;
void ensure_user_data_dir();
virtual MainLoop *get_main_loop() const = 0; virtual MainLoop *get_main_loop() const = 0;
virtual void yield(); virtual void yield();
@ -338,8 +213,6 @@ public:
uint32_t get_ticks_msec() const; uint32_t get_ticks_msec() const;
uint64_t get_splash_tick_msec() const; uint64_t get_splash_tick_msec() const;
virtual bool can_draw() const = 0;
virtual bool is_userfs_persistent() const { return true; } virtual bool is_userfs_persistent() const { return true; }
bool is_stdout_verbose() const; bool is_stdout_verbose() const;
@ -348,39 +221,6 @@ public:
virtual bool is_disable_crash_handler() const { return false; } virtual bool is_disable_crash_handler() const { return false; }
virtual void initialize_debugging() {} virtual void initialize_debugging() {}
enum CursorShape {
CURSOR_ARROW,
CURSOR_IBEAM,
CURSOR_POINTING_HAND,
CURSOR_CROSS,
CURSOR_WAIT,
CURSOR_BUSY,
CURSOR_DRAG,
CURSOR_CAN_DROP,
CURSOR_FORBIDDEN,
CURSOR_VSIZE,
CURSOR_HSIZE,
CURSOR_BDIAGSIZE,
CURSOR_FDIAGSIZE,
CURSOR_MOVE,
CURSOR_VSPLIT,
CURSOR_HSPLIT,
CURSOR_HELP,
CURSOR_MAX
};
virtual bool has_virtual_keyboard() const;
virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_input_length = -1);
virtual void hide_virtual_keyboard();
// returns height of the currently shown virtual keyboard (0 if keyboard is hidden)
virtual int get_virtual_keyboard_height() const;
virtual void set_cursor_shape(CursorShape p_shape);
virtual CursorShape get_cursor_shape() const;
virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot);
virtual bool get_swap_ok_cancel() { return false; }
virtual void dump_memory_to_file(const char *p_file); virtual void dump_memory_to_file(const char *p_file);
virtual void dump_resources_to_file(const char *p_file); virtual void dump_resources_to_file(const char *p_file);
virtual void print_resources_in_use(bool p_short = false); virtual void print_resources_in_use(bool p_short = false);
@ -423,34 +263,8 @@ public:
virtual void set_no_window_mode(bool p_enable); virtual void set_no_window_mode(bool p_enable);
virtual bool is_no_window_mode_enabled() const; virtual bool is_no_window_mode_enabled() const;
virtual bool has_touchscreen_ui_hint() const;
enum ScreenOrientation {
SCREEN_LANDSCAPE,
SCREEN_PORTRAIT,
SCREEN_REVERSE_LANDSCAPE,
SCREEN_REVERSE_PORTRAIT,
SCREEN_SENSOR_LANDSCAPE,
SCREEN_SENSOR_PORTRAIT,
SCREEN_SENSOR,
};
virtual void set_screen_orientation(ScreenOrientation p_orientation);
ScreenOrientation get_screen_orientation() const;
virtual void enable_for_stealing_focus(ProcessID pid) {}
virtual void move_window_to_foreground() {}
virtual void debug_break(); virtual void debug_break();
virtual void release_rendering_thread();
virtual void make_rendering_thread();
virtual void swap_buffers();
virtual void set_native_icon(const String &p_filename);
virtual void set_icon(const Ref<Image> &p_icon);
virtual int get_exit_code() const; virtual int get_exit_code() const;
virtual void set_exit_code(int p_code); virtual void set_exit_code(int p_code);
@ -458,62 +272,12 @@ public:
virtual String get_unique_id() const; virtual String get_unique_id() const;
virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
virtual bool native_video_is_playing() const;
virtual void native_video_pause();
virtual void native_video_unpause();
virtual void native_video_stop();
virtual bool can_use_threads() const; virtual bool can_use_threads() const;
virtual Error dialog_show(String p_title, String p_description, Vector<String> p_buttons, Object *p_obj, String p_callback);
virtual Error dialog_input_text(String p_title, String p_description, String p_partial, Object *p_obj, String p_callback);
enum LatinKeyboardVariant {
LATIN_KEYBOARD_QWERTY,
LATIN_KEYBOARD_QWERTZ,
LATIN_KEYBOARD_AZERTY,
LATIN_KEYBOARD_QZERTY,
LATIN_KEYBOARD_DVORAK,
LATIN_KEYBOARD_NEO,
LATIN_KEYBOARD_COLEMAK,
};
virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
virtual bool is_joy_known(int p_device);
virtual String get_joy_guid(int p_device) const;
enum EngineContext {
CONTEXT_EDITOR,
CONTEXT_PROJECTMAN,
CONTEXT_ENGINE,
};
virtual void set_context(int p_context);
//amazing hack because OpenGL needs this to be set on a separate thread..
//also core can't access servers, so a callback must be used
typedef void (*SwitchVSyncCallbackInThread)(bool);
static SwitchVSyncCallbackInThread switch_vsync_function;
void set_use_vsync(bool p_enable);
bool is_vsync_enabled() const;
//real, actual overridable function to switch vsync, which needs to be called from graphics thread if needed
virtual void _set_use_vsync(bool p_enable) {}
void set_vsync_via_compositor(bool p_enable);
bool is_vsync_via_compositor_enabled() const;
virtual void force_process_input(){};
bool has_feature(const String &p_feature); bool has_feature(const String &p_feature);
void set_has_server_feature_callback(HasServerFeatureCallback p_callback); void set_has_server_feature_callback(HasServerFeatureCallback p_callback);
bool is_layered_allowed() const { return _allow_layered; }
bool is_hidpi_allowed() const { return _allow_hidpi; }
void set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments); void set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments);
bool is_restart_on_exit_set() const; bool is_restart_on_exit_set() const;
List<String> get_restart_on_exit_arguments() const; List<String> get_restart_on_exit_arguments() const;

View file

@ -2,7 +2,7 @@
Import('env') Import('env')
if (env["platform"] in ["haiku", "osx", "windows", "x11"]): if (env["platform"] in ["haiku", "osx", "windows", "linuxbsd"]):
# Thirdparty source files # Thirdparty source files
thirdparty_dir = "#thirdparty/glad/" thirdparty_dir = "#thirdparty/glad/"
thirdparty_sources = [ thirdparty_sources = [

View file

@ -124,7 +124,7 @@ void RasterizerCanvasGLES2::canvas_begin() {
viewport_width = storage->frame.current_rt->width; viewport_width = storage->frame.current_rt->width;
viewport_height = storage->frame.current_rt->height; viewport_height = storage->frame.current_rt->height;
viewport_x = storage->frame.current_rt->x; viewport_x = storage->frame.current_rt->x;
viewport_y = OS::get_singleton()->get_window_size().height - viewport_height - storage->frame.current_rt->y; viewport_y = DisplayServer::get_singleton()->window_get_size().height - viewport_height - storage->frame.current_rt->y;
glScissor(viewport_x, viewport_y, viewport_width, viewport_height); glScissor(viewport_x, viewport_y, viewport_width, viewport_height);
glViewport(viewport_x, viewport_y, viewport_width, viewport_height); glViewport(viewport_x, viewport_y, viewport_width, viewport_height);
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
@ -168,7 +168,7 @@ void RasterizerCanvasGLES2::canvas_begin() {
canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f); canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f);
canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f)); canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f));
} else { } else {
Vector2 ssize = OS::get_singleton()->get_window_size(); Vector2 ssize = DisplayServer::get_singleton()->window_get_size();
canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f); canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f)); canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f));
} }
@ -194,8 +194,8 @@ void RasterizerCanvasGLES2::canvas_end() {
if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) { if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
//reset viewport to full window size //reset viewport to full window size
int viewport_width = OS::get_singleton()->get_window_size().width; int viewport_width = DisplayServer::get_singleton()->window_get_size().width;
int viewport_height = OS::get_singleton()->get_window_size().height; int viewport_height = DisplayServer::get_singleton()->window_get_size().height;
glViewport(0, 0, viewport_width, viewport_height); glViewport(0, 0, viewport_width, viewport_height);
glScissor(0, 0, viewport_width, viewport_height); glScissor(0, 0, viewport_width, viewport_height);
} }
@ -1995,7 +1995,7 @@ void RasterizerCanvasGLES2::draw_lens_distortion_rect(const Rect2 &p_rect, float
if (storage->frame.current_rt) { if (storage->frame.current_rt) {
half_size = Vector2(storage->frame.current_rt->width, storage->frame.current_rt->height); half_size = Vector2(storage->frame.current_rt->width, storage->frame.current_rt->height);
} else { } else {
half_size = OS::get_singleton()->get_window_size(); half_size = DisplayServer::get_singleton()->window_get_size();
} }
half_size *= 0.5; half_size *= 0.5;
Vector2 offset((p_rect.position.x - half_size.x) / half_size.x, (p_rect.position.y - half_size.y) / half_size.y); Vector2 offset((p_rect.position.x - half_size.x) / half_size.x, (p_rect.position.y - half_size.y) / half_size.y);
@ -2029,7 +2029,7 @@ void RasterizerCanvasGLES2::draw_lens_distortion_rect(const Rect2 &p_rect, float
void RasterizerCanvasGLES2::draw_window_margins(int *black_margin, RID *black_image) { void RasterizerCanvasGLES2::draw_window_margins(int *black_margin, RID *black_image) {
Vector2 window_size = OS::get_singleton()->get_window_size(); Vector2 window_size = DisplayServer::get_singleton()->window_get_size();
int window_h = window_size.height; int window_h = window_size.height;
int window_w = window_size.width; int window_w = window_size.width;

View file

@ -318,7 +318,7 @@ void RasterizerGLES2::set_current_render_target(RID p_render_target) {
} else { } else {
storage->frame.current_rt = NULL; storage->frame.current_rt = NULL;
storage->frame.clear_request = false; storage->frame.clear_request = false;
glViewport(0, 0, OS::get_singleton()->get_window_size().width, OS::get_singleton()->get_window_size().height); glViewport(0, 0, DisplayServer::get_singleton()->window_get_size().width, DisplayServer::get_singleton()->window_get_size().height);
glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES2::system_fbo); glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES2::system_fbo);
} }
} }

View file

@ -3261,7 +3261,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
viewport_x = storage->frame.current_rt->x; viewport_x = storage->frame.current_rt->x;
if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) { if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
viewport_y = OS::get_singleton()->get_window_size().height - viewport_height - storage->frame.current_rt->y; viewport_y = DisplayServer::get_singleton()->window_get_size().height - viewport_height - storage->frame.current_rt->y;
} else { } else {
viewport_y = storage->frame.current_rt->y; viewport_y = storage->frame.current_rt->y;
} }

View file

@ -57,7 +57,7 @@ if env['builtin_vulkan']:
'FALLBACK_DATA_DIRS=\\"%s\\"' % '/usr/local/share:/usr/share', 'FALLBACK_DATA_DIRS=\\"%s\\"' % '/usr/local/share:/usr/share',
'FALLBACK_CONFIG_DIRS=\\"%s\\"' % '/etc/xdg' 'FALLBACK_CONFIG_DIRS=\\"%s\\"' % '/etc/xdg'
]) ])
elif env['platform'] == "x11": elif env['platform'] == "linuxbsd":
env_thirdparty.AppendUnique(CPPDEFINES=[ env_thirdparty.AppendUnique(CPPDEFINES=[
'VK_USE_PLATFORM_XLIB_KHR', 'VK_USE_PLATFORM_XLIB_KHR',
'VULKAN_NON_CMAKE_BUILD', 'VULKAN_NON_CMAKE_BUILD',

View file

@ -33,6 +33,7 @@
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "scene/debugger/scene_debugger.h" #include "scene/debugger/scene_debugger.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
EditorDebuggerTree::EditorDebuggerTree() { EditorDebuggerTree::EditorDebuggerTree() {
set_v_size_flags(SIZE_EXPAND_FILL); set_v_size_flags(SIZE_EXPAND_FILL);
@ -257,7 +258,7 @@ void EditorDebuggerTree::_item_menu_id_pressed(int p_option) {
text = text.substr(slash + 1); text = text.substr(slash + 1);
} }
} }
OS::get_singleton()->set_clipboard(text); DisplayServer::get_singleton()->clipboard_set(text);
} break; } break;
} }
} }

View file

@ -58,6 +58,7 @@
#include "scene/gui/texture_button.h" #include "scene/gui/texture_button.h"
#include "scene/gui/tree.h" #include "scene/gui/tree.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
using CameraOverride = EditorDebuggerNode::CameraOverride; using CameraOverride = EditorDebuggerNode::CameraOverride;
@ -73,7 +74,7 @@ void ScriptEditorDebugger::_put_msg(String p_message, Array p_data) {
void ScriptEditorDebugger::debug_copy() { void ScriptEditorDebugger::debug_copy() {
String msg = reason->get_text(); String msg = reason->get_text();
if (msg == "") return; if (msg == "") return;
OS::get_singleton()->set_clipboard(msg); DisplayServer::get_singleton()->clipboard_set(msg);
} }
void ScriptEditorDebugger::debug_skip_breakpoints() { void ScriptEditorDebugger::debug_skip_breakpoints() {
@ -116,7 +117,7 @@ void ScriptEditorDebugger::debug_continue() {
// Allow focus stealing only if we actually run this client for security. // Allow focus stealing only if we actually run this client for security.
if (remote_pid && EditorNode::get_singleton()->has_child_process(remote_pid)) if (remote_pid && EditorNode::get_singleton()->has_child_process(remote_pid))
OS::get_singleton()->enable_for_stealing_focus(remote_pid); DisplayServer::get_singleton()->enable_for_stealing_focus(remote_pid);
_clear_execution(); _clear_execution();
_put_msg("continue", Array()); _put_msg("continue", Array());
@ -253,7 +254,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
_update_buttons_state(); _update_buttons_state();
_set_reason_text(error, MESSAGE_ERROR); _set_reason_text(error, MESSAGE_ERROR);
emit_signal("breaked", true, can_continue); emit_signal("breaked", true, can_continue);
OS::get_singleton()->move_window_to_foreground(); DisplayServer::get_singleton()->window_move_to_foreground();
if (error != "") { if (error != "") {
tabs->set_current_tab(0); tabs->set_current_tab(0);
} }
@ -1420,7 +1421,7 @@ void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) {
ci = ci->get_next(); ci = ci->get_next();
} }
OS::get_singleton()->set_clipboard(text); DisplayServer::get_singleton()->clipboard_set(text);
} }
void ScriptEditorDebugger::_tab_changed(int p_tab) { void ScriptEditorDebugger::_tab_changed(int p_tab) {

View file

@ -35,6 +35,7 @@
#include "editor/editor_file_system.h" #include "editor/editor_file_system.h"
#include "editor/editor_settings.h" #include "editor/editor_settings.h"
#include "editor_scale.h" #include "editor_scale.h"
#include "servers/display_server.h"
void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) { void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) {
@ -188,7 +189,7 @@ EditorDirDialog::EditorDirDialog() {
tree->connect("item_activated", callable_mp(this, &EditorDirDialog::_item_activated)); tree->connect("item_activated", callable_mp(this, &EditorDirDialog::_item_activated));
makedir = add_button(TTR("Create Folder"), OS::get_singleton()->get_swap_ok_cancel(), "makedir"); makedir = add_button(TTR("Create Folder"), DisplayServer::get_singleton()->get_swap_ok_cancel(), "makedir");
makedir->connect("pressed", callable_mp(this, &EditorDirDialog::_make_dir)); makedir->connect("pressed", callable_mp(this, &EditorDirDialog::_make_dir));
makedialog = memnew(ConfirmationDialog); makedialog = memnew(ConfirmationDialog);

View file

@ -42,6 +42,7 @@
#include "scene/gui/center_container.h" #include "scene/gui/center_container.h"
#include "scene/gui/label.h" #include "scene/gui/label.h"
#include "scene/gui/margin_container.h" #include "scene/gui/margin_container.h"
#include "servers/display_server.h"
EditorFileDialog::GetIconFunc EditorFileDialog::get_icon_func = NULL; EditorFileDialog::GetIconFunc EditorFileDialog::get_icon_func = NULL;
EditorFileDialog::GetIconFunc EditorFileDialog::get_large_icon_func = NULL; EditorFileDialog::GetIconFunc EditorFileDialog::get_large_icon_func = NULL;
@ -631,7 +632,7 @@ void EditorFileDialog::_item_menu_id_pressed(int p_option) {
case ITEM_MENU_COPY_PATH: { case ITEM_MENU_COPY_PATH: {
Dictionary item_meta = item_list->get_item_metadata(item_list->get_current()); Dictionary item_meta = item_list->get_item_metadata(item_list->get_current());
OS::get_singleton()->set_clipboard(item_meta["path"]); DisplayServer::get_singleton()->clipboard_set(item_meta["path"]);
} break; } break;
case ITEM_MENU_DELETE: { case ITEM_MENU_DELETE: {

View file

@ -169,7 +169,7 @@
#include "editor/register_exporters.h" #include "editor/register_exporters.h"
#include "editor/run_settings_dialog.h" #include "editor/run_settings_dialog.h"
#include "editor/settings_config_dialog.h" #include "editor/settings_config_dialog.h"
#include "servers/display_server.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -179,7 +179,9 @@ void EditorNode::_update_scene_tabs() {
bool show_rb = EditorSettings::get_singleton()->get("interface/scene_tabs/show_script_button"); bool show_rb = EditorSettings::get_singleton()->get("interface/scene_tabs/show_script_button");
OS::get_singleton()->global_menu_clear("_dock"); if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
DisplayServer::get_singleton()->global_menu_clear("_dock");
}
scene_tabs->clear_tabs(); scene_tabs->clear_tabs();
Ref<Texture2D> script_icon = gui_base->get_icon("Script", "EditorIcons"); Ref<Texture2D> script_icon = gui_base->get_icon("Script", "EditorIcons");
@ -195,15 +197,19 @@ void EditorNode::_update_scene_tabs() {
bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0; bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0;
scene_tabs->add_tab(editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), icon); scene_tabs->add_tab(editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), icon);
OS::get_singleton()->global_menu_add_item("_dock", editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), GLOBAL_SCENE, i); if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
DisplayServer::get_singleton()->global_menu_add_item("_dock", editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), GLOBAL_SCENE, i);
}
if (show_rb && editor_data.get_scene_root_script(i).is_valid()) { if (show_rb && editor_data.get_scene_root_script(i).is_valid()) {
scene_tabs->set_tab_right_button(i, script_icon); scene_tabs->set_tab_right_button(i, script_icon);
} }
} }
OS::get_singleton()->global_menu_add_separator("_dock"); if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant()); DisplayServer::get_singleton()->global_menu_add_separator("_dock");
DisplayServer::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
}
scene_tabs->set_current_tab(editor_data.get_edited_scene()); scene_tabs->set_current_tab(editor_data.get_edited_scene());
@ -252,7 +258,7 @@ void EditorNode::_update_title() {
if (unsaved_cache) if (unsaved_cache)
title += " (*)"; title += " (*)";
OS::get_singleton()->set_window_title(title); DisplayServer::get_singleton()->window_set_title(title);
} }
void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) { void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) {
@ -2537,7 +2543,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} }
} }
OS::get_singleton()->request_attention(); DisplayServer::get_singleton()->window_request_attention();
break; break;
} }
@ -2585,13 +2591,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break; } break;
case SETTINGS_TOGGLE_FULLSCREEN: { case SETTINGS_TOGGLE_FULLSCREEN: {
OS::get_singleton()->set_window_fullscreen(!OS::get_singleton()->is_window_fullscreen()); DisplayServer::get_singleton()->window_set_mode(DisplayServer::get_singleton()->window_get_mode() == DisplayServer::WINDOW_MODE_FULLSCREEN ? DisplayServer::WINDOW_MODE_WINDOWED : DisplayServer::WINDOW_MODE_FULLSCREEN);
} break; } break;
case SETTINGS_TOGGLE_CONSOLE: { case SETTINGS_TOGGLE_CONSOLE: {
bool was_visible = OS::get_singleton()->is_console_visible(); bool was_visible = DisplayServer::get_singleton()->is_console_visible();
OS::get_singleton()->set_console_visible(!was_visible); DisplayServer::get_singleton()->console_set_visible(!was_visible);
EditorSettings::get_singleton()->set_setting("interface/editor/hide_console_window", was_visible); EditorSettings::get_singleton()->set_setting("interface/editor/hide_console_window", was_visible);
} break; } break;
case EDITOR_SCREENSHOT: { case EDITOR_SCREENSHOT: {
@ -3937,7 +3943,7 @@ void EditorNode::show_warning(const String &p_text, const String &p_title) {
void EditorNode::_copy_warning(const String &p_str) { void EditorNode::_copy_warning(const String &p_str) {
OS::get_singleton()->set_clipboard(warning->get_text()); DisplayServer::get_singleton()->clipboard_set(warning->get_text());
} }
void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) { void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
@ -5286,7 +5292,7 @@ void EditorNode::_video_driver_selected(int p_which) {
String driver = video_driver->get_item_metadata(p_which); String driver = video_driver->get_item_metadata(p_which);
String current = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); String current = ""; //OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
if (driver == current) { if (driver == current) {
return; return;
@ -5485,11 +5491,18 @@ EditorNode::EditorNode() {
if (id) { if (id) {
if (!OS::get_singleton()->has_touchscreen_ui_hint() && Input::get_singleton()) { bool found_touchscreen = false;
for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
if (DisplayServer::get_singleton()->screen_is_touchscreen(i)) {
found_touchscreen = true;
}
}
if (!found_touchscreen && Input::get_singleton()) {
//only if no touchscreen ui hint, set emulation //only if no touchscreen ui hint, set emulation
id->set_emulate_touch_from_mouse(false); //just disable just in case id->set_emulate_touch_from_mouse(false); //just disable just in case
} }
id->set_custom_mouse_cursor(RES()); DisplayServer::get_singleton()->cursor_set_custom_image(RES());
} }
singleton = this; singleton = this;
@ -5518,8 +5531,8 @@ EditorNode::EditorNode() {
switch (display_scale) { switch (display_scale) {
case 0: { case 0: {
// Try applying a suitable display scale automatically // Try applying a suitable display scale automatically
const int screen = OS::get_singleton()->get_current_screen(); const int screen = DisplayServer::get_singleton()->window_get_current_screen();
editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0); editor_set_scale(DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).x > 2000 ? 2.0 : 1.0);
} break; } break;
case 1: { case 1: {
@ -5553,7 +5566,7 @@ EditorNode::EditorNode() {
} }
// Define a minimum window size to prevent UI elements from overlapping or being cut off // Define a minimum window size to prevent UI elements from overlapping or being cut off
OS::get_singleton()->set_min_window_size(Size2(1024, 600) * EDSCALE); DisplayServer::get_singleton()->window_set_min_size(Size2(1024, 600) * EDSCALE);
ResourceLoader::set_abort_on_missing_resources(false); ResourceLoader::set_abort_on_missing_resources(false);
FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files")); FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
@ -6257,6 +6270,10 @@ EditorNode::EditorNode() {
video_driver->set_disabled(true); video_driver->set_disabled(true);
right_menu_hb->add_child(video_driver); right_menu_hb->add_child(video_driver);
#ifndef _MSC_VER
#warning neeeds to be reimplemented
#endif
#if 0
String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string; String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string;
String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
video_driver_current = 0; video_driver_current = 0;
@ -6272,7 +6289,7 @@ EditorNode::EditorNode() {
} }
_update_video_driver_color(); _update_video_driver_color();
#endif
video_restart_dialog = memnew(ConfirmationDialog); video_restart_dialog = memnew(ConfirmationDialog);
video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor.")); video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor."));
video_restart_dialog->get_ok()->set_text(TTR("Save & Restart")); video_restart_dialog->get_ok()->set_text(TTR("Save & Restart"));
@ -6413,7 +6430,7 @@ EditorNode::EditorNode() {
confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current)); confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
save_confirmation = memnew(ConfirmationDialog); save_confirmation = memnew(ConfirmationDialog);
save_confirmation->add_button(TTR("Don't Save"), OS::get_singleton()->get_swap_ok_cancel(), "discard"); save_confirmation->add_button(TTR("Don't Save"), DisplayServer::get_singleton()->get_swap_ok_cancel(), "discard");
gui_base->add_child(save_confirmation); gui_base->add_child(save_confirmation);
save_confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current)); save_confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
save_confirmation->connect("custom_action", callable_mp(this, &EditorNode::_discard_changes)); save_confirmation->connect("custom_action", callable_mp(this, &EditorNode::_discard_changes));
@ -6624,7 +6641,7 @@ EditorNode::EditorNode() {
open_imported = memnew(ConfirmationDialog); open_imported = memnew(ConfirmationDialog);
open_imported->get_ok()->set_text(TTR("Open Anyway")); open_imported->get_ok()->set_text(TTR("Open Anyway"));
new_inherited_button = open_imported->add_button(TTR("New Inherited"), !OS::get_singleton()->get_swap_ok_cancel(), "inherit"); new_inherited_button = open_imported->add_button(TTR("New Inherited"), !DisplayServer::get_singleton()->get_swap_ok_cancel(), "inherit");
open_imported->connect("confirmed", callable_mp(this, &EditorNode::_open_imported)); open_imported->connect("confirmed", callable_mp(this, &EditorNode::_open_imported));
open_imported->connect("custom_action", callable_mp(this, &EditorNode::_inherit_imported)); open_imported->connect("custom_action", callable_mp(this, &EditorNode::_inherit_imported));
gui_base->add_child(open_imported); gui_base->add_child(open_imported);

View file

@ -32,6 +32,7 @@
#include "core/project_settings.h" #include "core/project_settings.h"
#include "editor_settings.h" #include "editor_settings.h"
#include "servers/display_server.h"
EditorRun::Status EditorRun::get_status() const { EditorRun::Status EditorRun::get_status() const {
@ -70,19 +71,19 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
int screen = EditorSettings::get_singleton()->get("run/window_placement/screen"); int screen = EditorSettings::get_singleton()->get("run/window_placement/screen");
if (screen == 0) { if (screen == 0) {
// Same as editor // Same as editor
screen = OS::get_singleton()->get_current_screen(); screen = DisplayServer::get_singleton()->window_get_current_screen();
} else if (screen == 1) { } else if (screen == 1) {
// Previous monitor (wrap to the other end if needed) // Previous monitor (wrap to the other end if needed)
screen = Math::wrapi( screen = Math::wrapi(
OS::get_singleton()->get_current_screen() - 1, DisplayServer::get_singleton()->window_get_current_screen() - 1,
0, 0,
OS::get_singleton()->get_screen_count()); DisplayServer::get_singleton()->get_screen_count());
} else if (screen == 2) { } else if (screen == 2) {
// Next monitor (wrap to the other end if needed) // Next monitor (wrap to the other end if needed)
screen = Math::wrapi( screen = Math::wrapi(
OS::get_singleton()->get_current_screen() + 1, DisplayServer::get_singleton()->window_get_current_screen() + 1,
0, 0,
OS::get_singleton()->get_screen_count()); DisplayServer::get_singleton()->get_screen_count());
} else { } else {
// Fixed monitor ID // Fixed monitor ID
// There are 3 special options, so decrement the option ID by 3 to get the monitor ID // There are 3 special options, so decrement the option ID by 3 to get the monitor ID
@ -94,8 +95,8 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
} }
Rect2 screen_rect; Rect2 screen_rect;
screen_rect.position = OS::get_singleton()->get_screen_position(screen); screen_rect.position = DisplayServer::get_singleton()->screen_get_position(screen);
screen_rect.size = OS::get_singleton()->get_screen_size(screen); screen_rect.size = DisplayServer::get_singleton()->screen_get_size(screen);
Size2 desired_size; Size2 desired_size;
desired_size.x = ProjectSettings::get_singleton()->get("display/window/size/width"); desired_size.x = ProjectSettings::get_singleton()->get("display/window/size/width");

View file

@ -599,7 +599,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/window_placement/rect", 1); _initial_set("run/window_placement/rect", 1);
hints["run/window_placement/rect"] = PropertyInfo(Variant::INT, "run/window_placement/rect", PROPERTY_HINT_ENUM, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen"); hints["run/window_placement/rect"] = PropertyInfo(Variant::INT, "run/window_placement/rect", PROPERTY_HINT_ENUM, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen");
String screen_hints = "Same as Editor,Previous Monitor,Next Monitor"; String screen_hints = "Same as Editor,Previous Monitor,Next Monitor";
for (int i = 0; i < OS::get_singleton()->get_screen_count(); i++) { for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
screen_hints += ",Monitor " + itos(i + 1); screen_hints += ",Monitor " + itos(i + 1);
} }
_initial_set("run/window_placement/rect_custom_position", Vector2()); _initial_set("run/window_placement/rect_custom_position", Vector2());

View file

@ -44,6 +44,7 @@
#include "import_dock.h" #include "import_dock.h"
#include "scene/main/viewport.h" #include "scene/main/viewport.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
Ref<Texture2D> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) { Ref<Texture2D> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) {
Ref<Texture2D> file_icon; Ref<Texture2D> file_icon;
@ -1765,7 +1766,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
case FILE_COPY_PATH: { case FILE_COPY_PATH: {
if (!p_selected.empty()) { if (!p_selected.empty()) {
String fpath = p_selected[0]; String fpath = p_selected[0];
OS::get_singleton()->set_clipboard(fpath); DisplayServer::get_singleton()->clipboard_set(fpath);
} }
} break; } break;

View file

@ -48,6 +48,7 @@
#include "scene/main/viewport.h" #include "scene/main/viewport.h"
#include "scene/scene_string_names.h" #include "scene/scene_string_names.h"
#include "script_text_editor.h" #include "script_text_editor.h"
#include "servers/display_server.h"
#include "text_editor.h" #include "text_editor.h"
/*** SCRIPT EDITOR ****/ /*** SCRIPT EDITOR ****/
@ -651,7 +652,7 @@ void ScriptEditor::_close_docs_tab() {
void ScriptEditor::_copy_script_path() { void ScriptEditor::_copy_script_path() {
ScriptEditorBase *se = _get_current_editor(); ScriptEditorBase *se = _get_current_editor();
RES script = se->get_edited_resource(); RES script = se->get_edited_resource();
OS::get_singleton()->set_clipboard(script->get_path()); DisplayServer::get_singleton()->clipboard_set(script->get_path());
} }
void ScriptEditor::_close_other_tabs() { void ScriptEditor::_close_other_tabs() {
@ -3291,7 +3292,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
erase_tab_confirm = memnew(ConfirmationDialog); erase_tab_confirm = memnew(ConfirmationDialog);
erase_tab_confirm->get_ok()->set_text(TTR("Save")); erase_tab_confirm->get_ok()->set_text(TTR("Save"));
erase_tab_confirm->add_button(TTR("Discard"), OS::get_singleton()->get_swap_ok_cancel(), "discard"); erase_tab_confirm->add_button(TTR("Discard"), DisplayServer::get_singleton()->get_swap_ok_cancel(), "discard");
erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab)); erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab));
erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab)); erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab));
add_child(erase_tab_confirm); add_child(erase_tab_confirm);
@ -3325,7 +3326,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
disk_changed->connect("confirmed", callable_mp(this, &ScriptEditor::_reload_scripts)); disk_changed->connect("confirmed", callable_mp(this, &ScriptEditor::_reload_scripts));
disk_changed->get_ok()->set_text(TTR("Reload")); disk_changed->get_ok()->set_text(TTR("Reload"));
disk_changed->add_button(TTR("Resave"), !OS::get_singleton()->get_swap_ok_cancel(), "resave"); disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_ok_cancel(), "resave");
disk_changed->connect("custom_action", callable_mp(this, &ScriptEditor::_resave_scripts)); disk_changed->connect("custom_action", callable_mp(this, &ScriptEditor::_resave_scripts));
} }

View file

@ -38,6 +38,7 @@
#include "editor/editor_scale.h" #include "editor/editor_scale.h"
#include "editor/editor_settings.h" #include "editor/editor_settings.h"
#include "editor/property_editor.h" #include "editor/property_editor.h"
#include "servers/display_server.h"
#include "servers/visual/shader_types.h" #include "servers/visual/shader_types.h"
/*** SHADER SCRIPT EDITOR ****/ /*** SHADER SCRIPT EDITOR ****/
@ -699,7 +700,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
disk_changed->connect("confirmed", callable_mp(this, &ShaderEditor::_reload_shader_from_disk)); disk_changed->connect("confirmed", callable_mp(this, &ShaderEditor::_reload_shader_from_disk));
disk_changed->get_ok()->set_text(TTR("Reload")); disk_changed->get_ok()->set_text(TTR("Reload"));
disk_changed->add_button(TTR("Resave"), !OS::get_singleton()->get_swap_ok_cancel(), "resave"); disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_ok_cancel(), "resave");
disk_changed->connect("custom_action", callable_mp(this, &ShaderEditor::save_external_data)); disk_changed->connect("custom_action", callable_mp(this, &ShaderEditor::save_external_data));
add_child(disk_changed); add_child(disk_changed);

View file

@ -51,6 +51,7 @@
#include "scene/gui/viewport_container.h" #include "scene/gui/viewport_container.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "scene/resources/surface_tool.h" #include "scene/resources/surface_tool.h"
#include "servers/display_server.h"
#define DISTANCE_DEFAULT 4 #define DISTANCE_DEFAULT 4
@ -2213,14 +2214,14 @@ void SpatialEditorViewport::set_freelook_active(bool active_now) {
} }
// Hide mouse like in an FPS (warping doesn't work) // Hide mouse like in an FPS (warping doesn't work)
OS::get_singleton()->set_mouse_mode(OS::MOUSE_MODE_CAPTURED); DisplayServer::get_singleton()->mouse_set_mode(DisplayServer::MOUSE_MODE_CAPTURED);
} else if (freelook_active && !active_now) { } else if (freelook_active && !active_now) {
// Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
cursor = camera_cursor; cursor = camera_cursor;
// Restore mouse // Restore mouse
OS::get_singleton()->set_mouse_mode(OS::MOUSE_MODE_VISIBLE); DisplayServer::get_singleton()->mouse_set_mode(DisplayServer::MOUSE_MODE_VISIBLE);
} }
freelook_active = active_now; freelook_active = active_now;
@ -3926,8 +3927,11 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed
view_menu->get_popup()->connect("id_pressed", callable_mp(this, &SpatialEditorViewport::_menu_option)); view_menu->get_popup()->connect("id_pressed", callable_mp(this, &SpatialEditorViewport::_menu_option));
display_submenu->connect("id_pressed", callable_mp(this, &SpatialEditorViewport::_menu_option)); display_submenu->connect("id_pressed", callable_mp(this, &SpatialEditorViewport::_menu_option));
view_menu->set_disable_shortcuts(true); view_menu->set_disable_shortcuts(true);
#ifndef _MSC_VER
if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) { #warning this needs to be fixed
#endif
//if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) {
if (false) {
// Alternate display modes only work when using the Vulkan renderer; make this explicit. // Alternate display modes only work when using the Vulkan renderer; make this explicit.
const int normal_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL); const int normal_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL);
const int wireframe_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME); const int wireframe_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME);

View file

@ -44,6 +44,7 @@
#include "scene/gui/panel.h" #include "scene/gui/panel.h"
#include "scene/main/viewport.h" #include "scene/main/viewport.h"
#include "scene/resources/visual_shader_nodes.h" #include "scene/resources/visual_shader_nodes.h"
#include "servers/display_server.h"
#include "servers/visual/shader_types.h" #include "servers/visual/shader_types.h"
Control *VisualShaderNodePlugin::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) { Control *VisualShaderNodePlugin::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) {
@ -1646,7 +1647,7 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
} }
// keep dialog within window bounds // keep dialog within window bounds
Size2 window_size = OS::get_singleton()->get_window_size(); Size2 window_size = DisplayServer::get_singleton()->window_get_size();
Rect2 dialog_rect = members_dialog->get_global_rect(); Rect2 dialog_rect = members_dialog->get_global_rect();
if (dialog_rect.position.y + dialog_rect.size.y > window_size.y) { if (dialog_rect.position.y + dialog_rect.size.y > window_size.y) {
int difference = dialog_rect.position.y + dialog_rect.size.y - window_size.y; int difference = dialog_rect.position.y + dialog_rect.size.y - window_size.y;

View file

@ -34,6 +34,7 @@
#include "core/os/os.h" #include "core/os/os.h"
#include "editor_scale.h" #include "editor_scale.h"
#include "main/main.h" #include "main/main.h"
#include "servers/display_server.h"
void BackgroundProgress::_add_task(const String &p_task, const String &p_label, int p_steps) { void BackgroundProgress::_add_task(const String &p_task, const String &p_label, int p_steps) {
@ -219,7 +220,7 @@ bool ProgressDialog::task_step(const String &p_task, const String &p_state, int
t.state->set_text(p_state); t.state->set_text(p_state);
last_progress_tick = OS::get_singleton()->get_ticks_usec(); last_progress_tick = OS::get_singleton()->get_ticks_usec();
if (cancel_hb->is_visible()) { if (cancel_hb->is_visible()) {
OS::get_singleton()->force_process_input(); DisplayServer::get_singleton()->process_events();
} }
Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor

View file

@ -46,6 +46,7 @@
#include "scene/gui/margin_container.h" #include "scene/gui/margin_container.h"
#include "scene/gui/scroll_container.h" #include "scene/gui/scroll_container.h"
#include "scene/gui/tab_container.h" #include "scene/gui/tab_container.h"
#include "servers/display_server.h"
void ProjectExportDialog::_notification(int p_what) { void ProjectExportDialog::_notification(int p_what) {
@ -1250,7 +1251,7 @@ ProjectExportDialog::ProjectExportDialog() {
get_cancel()->set_text(TTR("Close")); get_cancel()->set_text(TTR("Close"));
get_ok()->set_text(TTR("Export PCK/Zip")); get_ok()->set_text(TTR("Export PCK/Zip"));
export_button = add_button(TTR("Export Project"), !OS::get_singleton()->get_swap_ok_cancel(), "export"); export_button = add_button(TTR("Export Project"), !DisplayServer::get_singleton()->get_swap_ok_cancel(), "export");
export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project)); export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project));
// Disable initially before we select a valid preset // Disable initially before we select a valid preset
export_button->set_disabled(true); export_button->set_disabled(true);
@ -1265,7 +1266,7 @@ ProjectExportDialog::ProjectExportDialog() {
export_all_dialog->add_button(TTR("Release"), true, "release"); export_all_dialog->add_button(TTR("Release"), true, "release");
export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action)); export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action));
export_all_button = add_button(TTR("Export All"), !OS::get_singleton()->get_swap_ok_cancel(), "export"); export_all_button = add_button(TTR("Export All"), !DisplayServer::get_singleton()->get_swap_ok_cancel(), "export");
export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog)); export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog));
export_all_button->set_disabled(true); export_all_button->set_disabled(true);

View file

@ -51,6 +51,7 @@
#include "scene/gui/separator.h" #include "scene/gui/separator.h"
#include "scene/gui/texture_rect.h" #include "scene/gui/texture_rect.h"
#include "scene/gui/tool_button.h" #include "scene/gui/tool_button.h"
#include "servers/display_server.h"
static inline String get_project_key_from_path(const String &dir) { static inline String get_project_key_from_path(const String &dir) {
return dir.replace("/", "::"); return dir.replace("/", "::");
@ -1284,7 +1285,11 @@ void ProjectList::load_projects() {
} }
void ProjectList::update_dock_menu() { void ProjectList::update_dock_menu() {
OS::get_singleton()->global_menu_clear("_dock");
if (!DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
return;
}
DisplayServer::get_singleton()->global_menu_clear("_dock");
int favs_added = 0; int favs_added = 0;
int total_added = 0; int total_added = 0;
@ -1294,18 +1299,18 @@ void ProjectList::update_dock_menu() {
favs_added++; favs_added++;
} else { } else {
if (favs_added != 0) { if (favs_added != 0) {
OS::get_singleton()->global_menu_add_separator("_dock"); DisplayServer::get_singleton()->global_menu_add_separator("_dock");
} }
favs_added = 0; favs_added = 0;
} }
OS::get_singleton()->global_menu_add_item("_dock", _projects[i].project_name + " ( " + _projects[i].path + " )", GLOBAL_OPEN_PROJECT, Variant(_projects[i].path.plus_file("project.godot"))); DisplayServer::get_singleton()->global_menu_add_item("_dock", _projects[i].project_name + " ( " + _projects[i].path + " )", GLOBAL_OPEN_PROJECT, Variant(_projects[i].path.plus_file("project.godot")));
total_added++; total_added++;
} }
} }
if (total_added != 0) { if (total_added != 0) {
OS::get_singleton()->global_menu_add_separator("_dock"); DisplayServer::get_singleton()->global_menu_add_separator("_dock");
} }
OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant()); DisplayServer::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
} }
void ProjectList::create_project_item_control(int p_index) { void ProjectList::create_project_item_control(int p_index) {
@ -2413,8 +2418,8 @@ ProjectManager::ProjectManager() {
switch (display_scale) { switch (display_scale) {
case 0: { case 0: {
// Try applying a suitable display scale automatically // Try applying a suitable display scale automatically
const int screen = OS::get_singleton()->get_current_screen(); const int screen = DisplayServer::get_singleton()->window_get_current_screen();
editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0); editor_set_scale(DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).x > 2000 ? 2.0 : 1.0);
} break; } break;
case 1: editor_set_scale(0.75); break; case 1: editor_set_scale(0.75); break;
@ -2430,12 +2435,12 @@ ProjectManager::ProjectManager() {
} }
// Define a minimum window size to prevent UI elements from overlapping or being cut off // Define a minimum window size to prevent UI elements from overlapping or being cut off
OS::get_singleton()->set_min_window_size(Size2(750, 420) * EDSCALE); DisplayServer::get_singleton()->window_set_min_size(Size2(750, 420) * EDSCALE);
#ifndef OSX_ENABLED #ifndef OSX_ENABLED
// The macOS platform implementation uses its own hiDPI window resizing code // The macOS platform implementation uses its own hiDPI window resizing code
// TODO: Resize windows on hiDPI displays on Windows and Linux and remove the line below // TODO: Resize windows on hiDPI displays on Windows and Linux and remove the line below
OS::get_singleton()->set_window_size(OS::get_singleton()->get_window_size() * MAX(1, EDSCALE)); DisplayServer::get_singleton()->window_set_size(DisplayServer::get_singleton()->window_get_size() * MAX(1, EDSCALE));
#endif #endif
} }
@ -2459,7 +2464,7 @@ ProjectManager::ProjectManager() {
String cp; String cp;
cp += 0xA9; cp += 0xA9;
OS::get_singleton()->set_window_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors"); DisplayServer::get_singleton()->window_set_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors");
Control *center_box = memnew(Control); Control *center_box = memnew(Control);
center_box->set_v_size_flags(SIZE_EXPAND_FILL); center_box->set_v_size_flags(SIZE_EXPAND_FILL);

View file

@ -46,6 +46,8 @@
#include "editor/plugins/spatial_editor_plugin.h" #include "editor/plugins/spatial_editor_plugin.h"
#include "scene/main/viewport.h" #include "scene/main/viewport.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
#include "servers/visual_server.h"
void SceneTreeDock::_nodes_drag_begin() { void SceneTreeDock::_nodes_drag_begin() {
@ -822,7 +824,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (node) { if (node) {
Node *root = EditorNode::get_singleton()->get_edited_scene(); Node *root = EditorNode::get_singleton()->get_edited_scene();
NodePath path = root->get_path().rel_path_to(node->get_path()); NodePath path = root->get_path().rel_path_to(node->get_path());
OS::get_singleton()->set_clipboard(path); DisplayServer::get_singleton()->clipboard_set(path);
} }
} }
} break; } break;

View file

@ -64,11 +64,14 @@
#include "servers/arvr_server.h" #include "servers/arvr_server.h"
#include "servers/audio_server.h" #include "servers/audio_server.h"
#include "servers/camera_server.h" #include "servers/camera_server.h"
#include "servers/display_server.h"
#include "servers/navigation_2d_server.h" #include "servers/navigation_2d_server.h"
#include "servers/navigation_server.h" #include "servers/navigation_server.h"
#include "servers/physics_2d_server.h" #include "servers/physics_2d_server.h"
#include "servers/physics_server.h" #include "servers/physics_server.h"
#include "servers/register_server_types.h" #include "servers/register_server_types.h"
#include "servers/visual/visual_server_raster.h"
#include "servers/visual/visual_server_wrap_mt.h"
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
#include "editor/doc_data.h" #include "editor/doc_data.h"
@ -86,6 +89,7 @@
// Initialized in setup() // Initialized in setup()
static Engine *engine = NULL; static Engine *engine = NULL;
static ProjectSettings *globals = NULL; static ProjectSettings *globals = NULL;
static Input *input = NULL;
static InputMap *input_map = NULL; static InputMap *input_map = NULL;
static TranslationServer *translation_server = NULL; static TranslationServer *translation_server = NULL;
static Performance *performance = NULL; static Performance *performance = NULL;
@ -98,6 +102,8 @@ static MessageQueue *message_queue = NULL;
// Initialized in setup2() // Initialized in setup2()
static AudioServer *audio_server = NULL; static AudioServer *audio_server = NULL;
static DisplayServer *display_server = NULL;
static VisualServer *visual_server = NULL;
static CameraServer *camera_server = NULL; static CameraServer *camera_server = NULL;
static ARVRServer *arvr_server = NULL; static ARVRServer *arvr_server = NULL;
static PhysicsServer *physics_server = NULL; static PhysicsServer *physics_server = NULL;
@ -109,7 +115,7 @@ static bool _start_success = false;
// Drivers // Drivers
static int video_driver_idx = -1; static int display_driver_idx = -1;
static int audio_driver_idx = -1; static int audio_driver_idx = -1;
// Engine config/tools // Engine config/tools
@ -126,7 +132,12 @@ static bool auto_build_solutions = false;
// Display // Display
static OS::VideoMode video_mode; static DisplayServer::WindowMode window_mode = DisplayServer::WINDOW_MODE_WINDOWED;
static DisplayServer::ScreenOrientation window_orientation = DisplayServer::SCREEN_LANDSCAPE;
static uint32_t window_flags = 0;
static Size2i window_size = Size2i(1024, 600);
static bool window_vsync_via_compositor = false;
static int init_screen = -1; static int init_screen = -1;
static bool init_fullscreen = false; static bool init_fullscreen = false;
static bool init_maximized = false; static bool init_maximized = false;
@ -191,6 +202,7 @@ void initialize_physics() {
} }
void finalize_physics() { void finalize_physics() {
physics_server->finish(); physics_server->finish();
memdelete(physics_server); memdelete(physics_server);
@ -198,6 +210,14 @@ void finalize_physics() {
memdelete(physics_2d_server); memdelete(physics_2d_server);
} }
void finalize_display() {
visual_server->finish();
memdelete(visual_server);
memdelete(display_server);
}
void initialize_navigation_server() { void initialize_navigation_server() {
ERR_FAIL_COND(navigation_server != NULL); ERR_FAIL_COND(navigation_server != NULL);
@ -251,20 +271,25 @@ void Main::print_help(const char *p_binary) {
OS::get_singleton()->print(" --remote-fs <address> Remote filesystem (<host/IP>[:<port>] address).\n"); OS::get_singleton()->print(" --remote-fs <address> Remote filesystem (<host/IP>[:<port>] address).\n");
OS::get_singleton()->print(" --remote-fs-password <password> Password for remote filesystem.\n"); OS::get_singleton()->print(" --remote-fs-password <password> Password for remote filesystem.\n");
OS::get_singleton()->print(" --audio-driver <driver> Audio driver ("); OS::get_singleton()->print(" --audio-driver <driver> Audio driver (");
for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) { for (int i = 0; i < AudioDriverManager::get_driver_count(); i++) {
if (i != 0) if (i != 0)
OS::get_singleton()->print(", "); OS::get_singleton()->print(", ");
OS::get_singleton()->print("'%s'", OS::get_singleton()->get_audio_driver_name(i)); OS::get_singleton()->print("'%s'", AudioDriverManager::get_driver(i)->get_name());
} }
OS::get_singleton()->print(").\n"); OS::get_singleton()->print(").\n");
OS::get_singleton()->print(" --video-driver <driver> Video driver ("); OS::get_singleton()->print(" --display-driver <driver> Display driver (and rendering driver):\n");
for (int i = 0; i < OS::get_singleton()->get_video_driver_count(); i++) { for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
if (i != 0) OS::get_singleton()->print("\t\t'%s' (", DisplayServer::get_create_function_name(i));
Vector<String> rd = DisplayServer::get_create_function_rendering_drivers(i);
for (int j = 0; j < rd.size(); j++) {
if (j > 0) {
OS::get_singleton()->print(", "); OS::get_singleton()->print(", ");
OS::get_singleton()->print("'%s'", OS::get_singleton()->get_video_driver_name(i));
} }
OS::get_singleton()->print(").\n"); OS::get_singleton()->print("'%s'", rd[j].utf8().get_data());
OS::get_singleton()->print("\n"); }
OS::get_singleton()->print(")\n");
}
OS::get_singleton()->print(" --rendering-driver <driver> Rendering driver (depends on display driver).\n");
#ifndef SERVER_ENABLED #ifndef SERVER_ENABLED
OS::get_singleton()->print("Display options:\n"); OS::get_singleton()->print("Display options:\n");
@ -353,7 +378,7 @@ void Main::print_help(const char *p_binary) {
Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_phase) { Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_phase) {
OS::get_singleton()->initialize_core(); OS::get_singleton()->initialize();
engine = memnew(Engine); engine = memnew(Engine);
@ -403,7 +428,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
I = args.front(); I = args.front();
String video_driver = ""; String display_driver = "";
String audio_driver = ""; String audio_driver = "";
String project_path = "."; String project_path = ".";
bool upwards = false; bool upwards = false;
@ -423,6 +448,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
bool found_project = false; bool found_project = false;
#endif #endif
bool use_vsync = false;
packed_data = PackedData::get_singleton(); packed_data = PackedData::get_singleton();
if (!packed_data) if (!packed_data)
@ -469,8 +495,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
audio_driver = I->next()->get(); audio_driver = I->next()->get();
bool found = false; bool found = false;
for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) { for (int i = 0; i < AudioDriverManager::get_driver_count(); i++) {
if (audio_driver == OS::get_singleton()->get_audio_driver_name(i)) { if (audio_driver == AudioDriverManager::get_driver(i)->get_name()) {
found = true; found = true;
} }
} }
@ -478,14 +504,14 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
if (!found) { if (!found) {
OS::get_singleton()->print("Unknown audio driver '%s', aborting.\nValid options are ", audio_driver.utf8().get_data()); OS::get_singleton()->print("Unknown audio driver '%s', aborting.\nValid options are ", audio_driver.utf8().get_data());
for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) { for (int i = 0; i < AudioDriverManager::get_driver_count(); i++) {
if (i == OS::get_singleton()->get_audio_driver_count() - 1) { if (i == AudioDriverManager::get_driver_count() - 1) {
OS::get_singleton()->print(" and "); OS::get_singleton()->print(" and ");
} else if (i != 0) { } else if (i != 0) {
OS::get_singleton()->print(", "); OS::get_singleton()->print(", ");
} }
OS::get_singleton()->print("'%s'", OS::get_singleton()->get_audio_driver_name(i)); OS::get_singleton()->print("'%s'", AudioDriverManager::get_driver(i)->get_name());
} }
OS::get_singleton()->print(".\n"); OS::get_singleton()->print(".\n");
@ -499,30 +525,30 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
goto error; goto error;
} }
} else if (I->get() == "--video-driver") { // force video driver } else if (I->get() == "--display-driver") { // force video driver
if (I->next()) { if (I->next()) {
video_driver = I->next()->get(); display_driver = I->next()->get();
bool found = false; bool found = false;
for (int i = 0; i < OS::get_singleton()->get_video_driver_count(); i++) { for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
if (video_driver == OS::get_singleton()->get_video_driver_name(i)) { if (display_driver == DisplayServer::get_create_function_name(i)) {
found = true; found = true;
} }
} }
if (!found) { if (!found) {
OS::get_singleton()->print("Unknown video driver '%s', aborting.\nValid options are ", video_driver.utf8().get_data()); OS::get_singleton()->print("Unknown display driver '%s', aborting.\nValid options are ", display_driver.utf8().get_data());
for (int i = 0; i < OS::get_singleton()->get_video_driver_count(); i++) { for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
if (i == OS::get_singleton()->get_video_driver_count() - 1) { if (i == DisplayServer::get_create_function_count() - 1) {
OS::get_singleton()->print(" and "); OS::get_singleton()->print(" and ");
} else if (i != 0) { } else if (i != 0) {
OS::get_singleton()->print(", "); OS::get_singleton()->print(", ");
} }
OS::get_singleton()->print("'%s'", OS::get_singleton()->get_video_driver_name(i)); OS::get_singleton()->print("'%s'", DisplayServer::get_create_function_name(i));
} }
OS::get_singleton()->print(".\n"); OS::get_singleton()->print(".\n");
@ -542,7 +568,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
} else if (I->get() == "-m" || I->get() == "--maximized") { // force maximized window } else if (I->get() == "-m" || I->get() == "--maximized") { // force maximized window
init_maximized = true; init_maximized = true;
video_mode.maximized = true; window_mode = DisplayServer::WINDOW_MODE_MAXIMIZED;
} else if (I->get() == "-w" || I->get() == "--windowed") { // force windowed window } else if (I->get() == "-w" || I->get() == "--windowed") { // force windowed window
@ -574,8 +600,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
goto error; goto error;
} }
video_mode.width = w; window_size.width = w;
video_mode.height = h; window_size.height = h;
force_res = true; force_res = true;
N = I->next()->next(); N = I->next()->next();
@ -616,11 +642,11 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->set_no_window_mode(true); OS::get_singleton()->set_no_window_mode(true);
} else if (I->get() == "--enable-vsync-via-compositor") { } else if (I->get() == "--enable-vsync-via-compositor") {
video_mode.vsync_via_compositor = true; window_vsync_via_compositor = true;
saw_vsync_via_compositor_override = true; saw_vsync_via_compositor_override = true;
} else if (I->get() == "--disable-vsync-via-compositor") { } else if (I->get() == "--disable-vsync-via-compositor") {
video_mode.vsync_via_compositor = false; window_vsync_via_compositor = false;
saw_vsync_via_compositor_override = true; saw_vsync_via_compositor_override = true;
#endif #endif
} else if (I->get() == "--profiling") { // enable profiling } else if (I->get() == "--profiling") { // enable profiling
@ -917,7 +943,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
main_args.push_back("--editor"); main_args.push_back("--editor");
if (!init_windowed) { if (!init_windowed) {
init_maximized = true; init_maximized = true;
video_mode.maximized = true; window_mode = DisplayServer::WINDOW_MODE_MAXIMIZED;
} }
} }
@ -960,8 +986,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
GLOBAL_DEF("rendering/quality/driver/driver_name", "Vulkan"); GLOBAL_DEF("rendering/quality/driver/driver_name", "Vulkan");
ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/driver/driver_name", PropertyInfo(Variant::STRING, "rendering/quality/driver/driver_name", PROPERTY_HINT_ENUM, "Vulkan,GLES2")); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/driver/driver_name", PropertyInfo(Variant::STRING, "rendering/quality/driver/driver_name", PROPERTY_HINT_ENUM, "Vulkan,GLES2"));
if (video_driver == "") { if (display_driver == "") {
video_driver = GLOBAL_GET("rendering/quality/driver/driver_name"); display_driver = GLOBAL_GET("rendering/quality/driver/driver_name");
} }
// Assigning here even though it's GLES2-specific, to be sure that it appears in docs // Assigning here even though it's GLES2-specific, to be sure that it appears in docs
@ -983,48 +1009,58 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
if (use_custom_res) { if (use_custom_res) {
if (!force_res) { if (!force_res) {
video_mode.width = GLOBAL_GET("display/window/size/width"); window_size.width = GLOBAL_GET("display/window/size/width");
video_mode.height = GLOBAL_GET("display/window/size/height"); window_size.height = GLOBAL_GET("display/window/size/height");
if (globals->has_setting("display/window/size/test_width") && globals->has_setting("display/window/size/test_height")) { if (globals->has_setting("display/window/size/test_width") && globals->has_setting("display/window/size/test_height")) {
int tw = globals->get("display/window/size/test_width"); int tw = globals->get("display/window/size/test_width");
if (tw > 0) { if (tw > 0) {
video_mode.width = tw; window_size.width = tw;
} }
int th = globals->get("display/window/size/test_height"); int th = globals->get("display/window/size/test_height");
if (th > 0) { if (th > 0) {
video_mode.height = th; window_size.height = th;
} }
} }
} }
video_mode.resizable = GLOBAL_GET("display/window/size/resizable"); if (!bool(GLOBAL_GET("display/window/size/resizable"))) {
video_mode.borderless_window = GLOBAL_GET("display/window/size/borderless"); window_flags |= DisplayServer::WINDOW_FLAG_RESIZE_DISABLED_BIT;
video_mode.fullscreen = GLOBAL_GET("display/window/size/fullscreen"); }
video_mode.always_on_top = GLOBAL_GET("display/window/size/always_on_top"); if (bool(GLOBAL_GET("display/window/size/borderless"))) {
window_flags |= DisplayServer::WINDOW_FLAG_BORDERLESS_BIT;
}
if (bool(GLOBAL_GET("display/window/size/fullscreen"))) {
window_mode = DisplayServer::WINDOW_MODE_FULLSCREEN;
}
if (bool(GLOBAL_GET("display/window/size/always_on_top"))) {
window_flags |= DisplayServer::WINDOW_FLAG_ALWAYS_ON_TOP;
}
} }
if (!force_lowdpi) { if (!force_lowdpi) {
OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false); OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false);
} }
video_mode.use_vsync = GLOBAL_DEF_RST("display/window/vsync/use_vsync", true); use_vsync = GLOBAL_DEF_RST("display/window/vsync/use_vsync", true);
OS::get_singleton()->_use_vsync = video_mode.use_vsync; OS::get_singleton()->_use_vsync = use_vsync;
if (!saw_vsync_via_compositor_override) { if (!saw_vsync_via_compositor_override) {
// If one of the command line options to enable/disable vsync via the // If one of the command line options to enable/disable vsync via the
// window compositor ("--enable-vsync-via-compositor" or // window compositor ("--enable-vsync-via-compositor" or
// "--disable-vsync-via-compositor") was present then it overrides the // "--disable-vsync-via-compositor") was present then it overrides the
// project setting. // project setting.
video_mode.vsync_via_compositor = GLOBAL_DEF("display/window/vsync/vsync_via_compositor", false); window_vsync_via_compositor = GLOBAL_DEF("display/window/vsync/vsync_via_compositor", false);
} }
OS::get_singleton()->_vsync_via_compositor = video_mode.vsync_via_compositor; OS::get_singleton()->_vsync_via_compositor = window_vsync_via_compositor;
/* todo restore
OS::get_singleton()->_allow_layered = GLOBAL_DEF("display/window/per_pixel_transparency/allowed", false); OS::get_singleton()->_allow_layered = GLOBAL_DEF("display/window/per_pixel_transparency/allowed", false);
video_mode.layered = GLOBAL_DEF("display/window/per_pixel_transparency/enabled", false); video_mode.layered = GLOBAL_DEF("display/window/per_pixel_transparency/enabled", false);
*/
GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation", 2); GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation", 2);
GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation.mobile", 3); GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation.mobile", 3);
@ -1049,26 +1085,26 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
/* Determine audio and video drivers */ /* Determine audio and video drivers */
for (int i = 0; i < OS::get_singleton()->get_video_driver_count(); i++) { for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
if (video_driver == OS::get_singleton()->get_video_driver_name(i)) { if (display_driver == DisplayServer::get_create_function_name(i)) {
video_driver_idx = i; display_driver_idx = i;
break; break;
} }
} }
if (video_driver_idx < 0) { if (display_driver_idx < 0) {
video_driver_idx = 0; display_driver_idx = 0;
} }
if (audio_driver == "") { // specified in project.godot if (audio_driver == "") { // specified in project.godot
audio_driver = GLOBAL_DEF_RST("audio/driver", OS::get_singleton()->get_audio_driver_name(0)); audio_driver = GLOBAL_DEF_RST("audio/driver", AudioDriverManager::get_driver(0)->get_name());
} }
for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) { for (int i = 0; i < AudioDriverManager::get_driver_count(); i++) {
if (audio_driver == OS::get_singleton()->get_audio_driver_name(i)) { if (audio_driver == AudioDriverManager::get_driver(i)->get_name()) {
audio_driver_idx = i; audio_driver_idx = i;
break; break;
@ -1083,19 +1119,19 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
String orientation = GLOBAL_DEF("display/window/handheld/orientation", "landscape"); String orientation = GLOBAL_DEF("display/window/handheld/orientation", "landscape");
if (orientation == "portrait") if (orientation == "portrait")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_PORTRAIT); window_orientation = DisplayServer::SCREEN_PORTRAIT;
else if (orientation == "reverse_landscape") else if (orientation == "reverse_landscape")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_REVERSE_LANDSCAPE); window_orientation = DisplayServer::SCREEN_REVERSE_LANDSCAPE;
else if (orientation == "reverse_portrait") else if (orientation == "reverse_portrait")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_REVERSE_PORTRAIT); window_orientation = DisplayServer::SCREEN_REVERSE_PORTRAIT;
else if (orientation == "sensor_landscape") else if (orientation == "sensor_landscape")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_SENSOR_LANDSCAPE); window_orientation = DisplayServer::SCREEN_SENSOR_LANDSCAPE;
else if (orientation == "sensor_portrait") else if (orientation == "sensor_portrait")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_SENSOR_PORTRAIT); window_orientation = DisplayServer::SCREEN_SENSOR_PORTRAIT;
else if (orientation == "sensor") else if (orientation == "sensor")
OS::get_singleton()->set_screen_orientation(OS::SCREEN_SENSOR); window_orientation = DisplayServer::SCREEN_SENSOR;
else else
OS::get_singleton()->set_screen_orientation(OS::SCREEN_LANDSCAPE); window_orientation = DisplayServer::SCREEN_LANDSCAPE;
} }
Engine::get_singleton()->set_iterations_per_second(GLOBAL_DEF("physics/common/physics_fps", 60)); Engine::get_singleton()->set_iterations_per_second(GLOBAL_DEF("physics/common/physics_fps", 60));
@ -1131,7 +1167,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
error: error:
video_driver = ""; display_driver = "";
audio_driver = ""; audio_driver = "";
project_path = ""; project_path = "";
@ -1183,15 +1219,64 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
Thread::_main_thread_id = p_main_tid_override; Thread::_main_thread_id = p_main_tid_override;
} }
Error err = OS::get_singleton()->initialize(video_mode, video_driver_idx, audio_driver_idx); /* Initialize user data dir */
OS::get_singleton()->ensure_user_data_dir();
/* Initialize Input */
input = memnew(Input);
/* Iniitalize Display Server */
{
String rendering_driver; // temp broken
Error err;
display_server = DisplayServer::create(display_driver_idx, rendering_driver, window_mode, window_flags, window_size, err);
if (err != OK) { if (err != OK) {
//ok i guess we can't use this display server, try other ones
for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
if (i == display_driver_idx) {
continue; //don't try the same twice
}
display_server = DisplayServer::create(display_driver_idx, rendering_driver, window_mode, window_flags, window_size, err);
if (err == OK) {
break;
}
}
}
if (!display_server) {
ERR_PRINT("Unable to create DisplayServer, all display drivers failed.");
return err; return err;
} }
}
if (display_server->has_feature(DisplayServer::FEATURE_ORIENTATION)) {
display_server->screen_set_orientation(window_orientation);
}
/* Initialize Visual Server */
visual_server = memnew(VisualServerRaster);
if (OS::get_singleton()->get_render_thread_mode() != OS::RENDER_THREAD_UNSAFE) {
visual_server = memnew(VisualServerWrapMT(visual_server, OS::get_singleton()->get_render_thread_mode() == OS::RENDER_SEPARATE_THREAD));
}
visual_server->init();
OS::get_singleton()->initialize_joypads();
/* Initialize Audio Driver */
AudioDriverManager::initialize(audio_driver_idx);
print_line(" "); //add a blank line for readability print_line(" "); //add a blank line for readability
if (init_use_custom_pos) { if (init_use_custom_pos) {
OS::get_singleton()->set_window_position(init_custom_pos); display_server->window_set_position(init_custom_pos);
} }
// right moment to create and initialize the audio server // right moment to create and initialize the audio server
@ -1213,21 +1298,21 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
#endif #endif
if (init_screen != -1) { if (init_screen != -1) {
OS::get_singleton()->set_current_screen(init_screen); DisplayServer::get_singleton()->window_set_current_screen(init_screen);
} }
if (init_windowed) { if (init_windowed) {
//do none.. //do none..
} else if (init_maximized) { } else if (init_maximized) {
OS::get_singleton()->set_window_maximized(true); DisplayServer::get_singleton()->window_set_mode(DisplayServer::WINDOW_MODE_MAXIMIZED);
} else if (init_fullscreen) { } else if (init_fullscreen) {
OS::get_singleton()->set_window_fullscreen(true); DisplayServer::get_singleton()->window_set_mode(DisplayServer::WINDOW_MODE_FULLSCREEN);
} }
if (init_always_on_top) { if (init_always_on_top) {
OS::get_singleton()->set_window_always_on_top(true); DisplayServer::get_singleton()->window_set_flag(DisplayServer::WINDOW_FLAG_ALWAYS_ON_TOP, true);
} }
if (allow_focus_steal_pid) { if (allow_focus_steal_pid) {
OS::get_singleton()->enable_for_stealing_focus(allow_focus_steal_pid); DisplayServer::get_singleton()->enable_for_stealing_focus(allow_focus_steal_pid);
} }
register_server_types(); register_server_types();
@ -1277,7 +1362,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
Ref<Image> icon = memnew(Image(app_icon_png)); Ref<Image> icon = memnew(Image(app_icon_png));
OS::get_singleton()->set_icon(icon); DisplayServer::get_singleton()->set_icon(icon);
#endif #endif
} }
@ -1297,7 +1382,14 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
Input *id = Input::get_singleton(); Input *id = Input::get_singleton();
if (id) { if (id) {
if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) && !(editor || project_manager)) { if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) && !(editor || project_manager)) {
if (!OS::get_singleton()->has_touchscreen_ui_hint()) {
bool found_touchscreen = false;
for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
if (DisplayServer::get_singleton()->screen_is_touchscreen(i)) {
found_touchscreen = true;
}
}
if (!found_touchscreen) {
//only if no touchscreen ui hint, set emulation //only if no touchscreen ui hint, set emulation
id->set_emulate_touch_from_mouse(true); id->set_emulate_touch_from_mouse(true);
} }
@ -1589,7 +1681,7 @@ bool Main::start() {
if (!main_loop) { if (!main_loop) {
if (!ClassDB::class_exists(main_loop_type)) { if (!ClassDB::class_exists(main_loop_type)) {
OS::get_singleton()->alert("Error: MainLoop type doesn't exist: " + main_loop_type); DisplayServer::get_singleton()->alert("Error: MainLoop type doesn't exist: " + main_loop_type);
return false; return false;
} else { } else {
@ -1751,7 +1843,7 @@ bool Main::start() {
sml->set_quit_on_go_back(GLOBAL_DEF("application/config/quit_on_go_back", true)); sml->set_quit_on_go_back(GLOBAL_DEF("application/config/quit_on_go_back", true));
String appname = ProjectSettings::get_singleton()->get("application/config/name"); String appname = ProjectSettings::get_singleton()->get("application/config/name");
appname = TranslationServer::get_singleton()->translate(appname); appname = TranslationServer::get_singleton()->translate(appname);
OS::get_singleton()->set_window_title(appname); DisplayServer::get_singleton()->window_set_title(appname);
int shadow_atlas_size = GLOBAL_GET("rendering/quality/shadow_atlas/size"); int shadow_atlas_size = GLOBAL_GET("rendering/quality/shadow_atlas/size");
int shadow_atlas_q0_subdiv = GLOBAL_GET("rendering/quality/shadow_atlas/quadrant_0_subdiv"); int shadow_atlas_q0_subdiv = GLOBAL_GET("rendering/quality/shadow_atlas/quadrant_0_subdiv");
@ -1838,11 +1930,11 @@ bool Main::start() {
if (serr != OK) if (serr != OK)
ERR_PRINT("Failed to load scene"); ERR_PRINT("Failed to load scene");
} }
OS::get_singleton()->set_context(OS::CONTEXT_EDITOR); DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_EDITOR);
} }
#endif #endif
if (!editor) { if (!editor) {
OS::get_singleton()->set_context(OS::CONTEXT_ENGINE); DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_ENGINE);
} }
} }
@ -1881,7 +1973,7 @@ bool Main::start() {
Ref<Image> icon; Ref<Image> icon;
icon.instance(); icon.instance();
if (ImageLoader::load_image(iconpath, icon) == OK) { if (ImageLoader::load_image(iconpath, icon) == OK) {
OS::get_singleton()->set_icon(icon); DisplayServer::get_singleton()->set_icon(icon);
hasicon = true; hasicon = true;
} }
} }
@ -1896,14 +1988,14 @@ bool Main::start() {
ProgressDialog *progress_dialog = memnew(ProgressDialog); ProgressDialog *progress_dialog = memnew(ProgressDialog);
pmanager->add_child(progress_dialog); pmanager->add_child(progress_dialog);
sml->get_root()->add_child(pmanager); sml->get_root()->add_child(pmanager);
OS::get_singleton()->set_context(OS::CONTEXT_PROJECTMAN); DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_PROJECTMAN);
project_manager = true; project_manager = true;
} }
if (project_manager || editor) { if (project_manager || editor) {
// Hide console window if requested (Windows-only). // Hide console window if requested (Windows-only).
bool hide_console = EditorSettings::get_singleton()->get_setting("interface/editor/hide_console_window"); bool hide_console = EditorSettings::get_singleton()->get_setting("interface/editor/hide_console_window");
OS::get_singleton()->set_console_visible(!hide_console); DisplayServer::get_singleton()->console_set_visible(!hide_console);
// Load SSL Certificates from Editor Settings (or builtin) // Load SSL Certificates from Editor Settings (or builtin)
Crypto::load_default_certificates(EditorSettings::get_singleton()->get_setting("network/ssl/editor_ssl_certificates").operator String()); Crypto::load_default_certificates(EditorSettings::get_singleton()->get_setting("network/ssl/editor_ssl_certificates").operator String());
@ -1913,9 +2005,10 @@ bool Main::start() {
if (!hasicon) { if (!hasicon) {
Ref<Image> icon = memnew(Image(app_icon_png)); Ref<Image> icon = memnew(Image(app_icon_png));
OS::get_singleton()->set_icon(icon); DisplayServer::get_singleton()->set_icon(icon);
} }
Input::get_singleton()->set_main_loop(main_loop);
OS::get_singleton()->set_main_loop(main_loop); OS::get_singleton()->set_main_loop(main_loop);
return true; return true;
@ -2030,7 +2123,7 @@ bool Main::iteration() {
VisualServer::get_singleton()->sync(); //sync if still drawing from previous frames. VisualServer::get_singleton()->sync(); //sync if still drawing from previous frames.
if (OS::get_singleton()->can_draw() && !disable_render_loop) { if (DisplayServer::get_singleton()->can_any_window_draw() && !disable_render_loop) {
if ((!force_redraw_requested) && OS::get_singleton()->is_in_low_processor_usage_mode()) { if ((!force_redraw_requested) && OS::get_singleton()->is_in_low_processor_usage_mode()) {
if (VisualServer::get_singleton()->has_changed()) { if (VisualServer::get_singleton()->has_changed()) {
@ -2085,7 +2178,7 @@ bool Main::iteration() {
if (fixed_fps != -1) if (fixed_fps != -1)
return exit; return exit;
if (OS::get_singleton()->is_in_low_processor_usage_mode() || !OS::get_singleton()->can_draw()) if (OS::get_singleton()->is_in_low_processor_usage_mode() || !DisplayServer::get_singleton()->can_any_window_draw())
OS::get_singleton()->delay_usec(OS::get_singleton()->get_low_processor_usage_mode_sleep_usec()); //apply some delay to force idle time OS::get_singleton()->delay_usec(OS::get_singleton()->get_low_processor_usage_mode_sleep_usec()); //apply some delay to force idle time
else { else {
uint32_t frame_delay = Engine::get_singleton()->get_frame_delay(); uint32_t frame_delay = Engine::get_singleton()->get_frame_delay();
@ -2182,8 +2275,14 @@ void Main::cleanup() {
} }
OS::get_singleton()->finalize(); OS::get_singleton()->finalize();
finalize_physics(); finalize_physics();
finalize_navigation_server(); finalize_navigation_server();
finalize_display();
if (input) {
memdelete(input);
}
if (packed_data) if (packed_data)
memdelete(packed_data); memdelete(packed_data);

View file

@ -36,6 +36,7 @@
#include "core/os/main_loop.h" #include "core/os/main_loop.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/print_string.h" #include "core/print_string.h"
#include "servers/display_server.h"
#include "servers/physics_server.h" #include "servers/physics_server.h"
#include "servers/visual_server.h" #include "servers/visual_server.h"
@ -313,7 +314,7 @@ public:
camera = vs->camera_create(); camera = vs->camera_create();
RID viewport = vs->viewport_create(); RID viewport = vs->viewport_create();
Size2i screen_size = OS::get_singleton()->get_window_size(); Size2i screen_size = DisplayServer::get_singleton()->window_get_size();
vs->viewport_set_size(viewport, screen_size.x, screen_size.y); vs->viewport_set_size(viewport, screen_size.x, screen_size.y);
vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size)); vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size));
vs->viewport_set_active(viewport, true); vs->viewport_set_active(viewport, true);

View file

@ -35,6 +35,7 @@
#include "core/os/os.h" #include "core/os/os.h"
#include "core/print_string.h" #include "core/print_string.h"
#include "scene/resources/texture.h" #include "scene/resources/texture.h"
#include "servers/display_server.h"
#include "servers/physics_2d_server.h" #include "servers/physics_2d_server.h"
#include "servers/visual_server.h" #include "servers/visual_server.h"
@ -354,7 +355,7 @@ public:
RID vp = vs->viewport_create(); RID vp = vs->viewport_create();
canvas = vs->canvas_create(); canvas = vs->canvas_create();
Size2i screen_size = OS::get_singleton()->get_window_size(); Size2i screen_size = DisplayServer::get_singleton()->window_get_size();
vs->viewport_attach_canvas(vp, canvas); vs->viewport_attach_canvas(vp, canvas);
vs->viewport_set_size(vp, screen_size.x, screen_size.y); vs->viewport_set_size(vp, screen_size.x, screen_size.y);
vs->viewport_attach_to_screen(vp, Rect2(Vector2(), screen_size)); vs->viewport_attach_to_screen(vp, Rect2(Vector2(), screen_size));

View file

@ -36,6 +36,7 @@
#include "core/os/main_loop.h" #include "core/os/main_loop.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/print_string.h" #include "core/print_string.h"
#include "servers/display_server.h"
#include "servers/visual_server.h" #include "servers/visual_server.h"
#define OBJECT_COUNT 50 #define OBJECT_COUNT 50
@ -163,7 +164,7 @@ public:
// vs->camera_set_perspective( camera, 60.0,0.1, 100.0 ); // vs->camera_set_perspective( camera, 60.0,0.1, 100.0 );
viewport = vs->viewport_create(); viewport = vs->viewport_create();
Size2i screen_size = OS::get_singleton()->get_window_size(); Size2i screen_size = DisplayServer::get_singleton()->window_get_size();
vs->viewport_set_size(viewport, screen_size.x, screen_size.y); vs->viewport_set_size(viewport, screen_size.x, screen_size.y);
vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size)); vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size));
vs->viewport_set_active(viewport, true); vs->viewport_set_active(viewport, true);

View file

@ -5,5 +5,5 @@ Import('env_gdnative')
env_gdnative.add_source_files(env.modules_sources, '*.cpp') env_gdnative.add_source_files(env.modules_sources, '*.cpp')
if "platform" in env and env["platform"] in ["x11", "iphone"]: if "platform" in env and env["platform"] in ["linuxbsd", "iphone"]:
env.Append(LINKFLAGS=["-rdynamic"]) env.Append(LINKFLAGS=["-rdynamic"])

View file

@ -35,6 +35,7 @@
#include "editor/plugins/script_text_editor.h" #include "editor/plugins/script_text_editor.h"
#include "gdscript_extend_parser.h" #include "gdscript_extend_parser.h"
#include "gdscript_language_protocol.h" #include "gdscript_language_protocol.h"
#include "servers/display_server.h"
void GDScriptTextDocument::_bind_methods() { void GDScriptTextDocument::_bind_methods() {
ClassDB::bind_method(D_METHOD("didOpen"), &GDScriptTextDocument::didOpen); ClassDB::bind_method(D_METHOD("didOpen"), &GDScriptTextDocument::didOpen);
@ -419,7 +420,8 @@ void GDScriptTextDocument::sync_script_content(const String &p_path, const Strin
void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) { void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) {
ScriptEditor::get_singleton()->call_deferred("_help_class_goto", p_symbol_id); ScriptEditor::get_singleton()->call_deferred("_help_class_goto", p_symbol_id);
OS::get_singleton()->move_window_to_foreground();
DisplayServer::get_singleton()->window_move_to_foreground();
} }
Array GDScriptTextDocument::find_symbols(const lsp::TextDocumentPositionParams &p_location, List<const lsp::DocumentSymbol *> &r_list) { Array GDScriptTextDocument::find_symbols(const lsp::TextDocumentPositionParams &p_location, List<const lsp::DocumentSymbol *> &r_list) {

View file

@ -31,6 +31,7 @@
#include "mobile_vr_interface.h" #include "mobile_vr_interface.h"
#include "core/input/input.h" #include "core/input/input.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "servers/display_server.h"
#include "servers/visual/visual_server_globals.h" #include "servers/visual/visual_server_globals.h"
StringName MobileVRInterface::get_name() const { StringName MobileVRInterface::get_name() const {
@ -339,7 +340,7 @@ Size2 MobileVRInterface::get_render_targetsize() {
_THREAD_SAFE_METHOD_ _THREAD_SAFE_METHOD_
// we use half our window size // we use half our window size
Size2 target_size = OS::get_singleton()->get_window_size(); Size2 target_size = DisplayServer::get_singleton()->window_get_size();
target_size.x *= 0.5 * oversample; target_size.x *= 0.5 * oversample;
target_size.y *= oversample; target_size.y *= oversample;

View file

@ -3,20 +3,21 @@
Import('env') Import('env')
from platform_methods import run_in_subprocess from platform_methods import run_in_subprocess
import platform_x11_builders import platform_linuxbsd_builders
common_x11 = [ common_x11 = [
"context_gl_x11.cpp", "crash_handler_linuxbsd.cpp",
"vulkan_context_x11.cpp", "os_linuxbsd.cpp",
"crash_handler_x11.cpp",
"os_x11.cpp",
"key_mapping_x11.cpp",
"display_server_x11.cpp",
"joypad_linux.cpp", "joypad_linux.cpp",
"detect_prime.cpp" "context_gl_x11.cpp",
"detect_prime_x11.cpp",
"display_server_x11.cpp",
"vulkan_context_x11.cpp",
"key_mapping_x11.cpp",
] ]
prog = env.add_program('#bin/godot', ['godot_x11.cpp'] + common_x11) prog = env.add_program('#bin/godot', ['godot_linuxbsd.cpp'] + common_x11)
if (env["debug_symbols"] == "full" or env["debug_symbols"] == "yes") and env["separate_debug_symbols"]: if (env["debug_symbols"] == "full" or env["debug_symbols"] == "yes") and env["separate_debug_symbols"]:
env.AddPostAction(prog, run_in_subprocess(platform_x11_builders.make_debug_x11)) env.AddPostAction(prog, run_in_subprocess(platform_linuxbsd_builders.make_debug_linuxbsd))

View file

@ -1,5 +1,5 @@
/*************************************************************************/ /*************************************************************************/
/* crash_handler_x11.cpp */ /* crash_handler_linuxbsd.cpp */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */
@ -28,7 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/ /*************************************************************************/
#include "crash_handler_x11.h" #include "crash_handler_linuxbsd.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/project_settings.h" #include "core/project_settings.h"

View file

@ -1,5 +1,5 @@
/*************************************************************************/ /*************************************************************************/
/* crash_handler_x11.h */ /* crash_handler_linuxbsd.h */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */

View file

@ -8,7 +8,7 @@ def is_active():
def get_name(): def get_name():
return "X11" return "LinuxBSD"
def can_build(): def can_build():
@ -317,7 +317,7 @@ def configure(env):
if not env['builtin_zlib']: if not env['builtin_zlib']:
env.ParseConfig('pkg-config zlib --cflags --libs') env.ParseConfig('pkg-config zlib --cflags --libs')
env.Prepend(CPPPATH=['#platform/x11']) env.Prepend(CPPPATH=['#platform/linuxbsd'])
env.Append(CPPDEFINES=['X11_ENABLED', 'UNIX_ENABLED']) env.Append(CPPDEFINES=['X11_ENABLED', 'UNIX_ENABLED'])
env.Append(CPPDEFINES=['VULKAN_ENABLED']) env.Append(CPPDEFINES=['VULKAN_ENABLED'])
@ -350,9 +350,9 @@ def configure(env):
print("Warning: Creating template binaries enabled for PCK embedding is currently only supported with GNU ld") print("Warning: Creating template binaries enabled for PCK embedding is currently only supported with GNU ld")
else: else:
if float(gnu_ld_version.group(1)) >= 2.30: if float(gnu_ld_version.group(1)) >= 2.30:
env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.ld']) env.Append(LINKFLAGS=['-T', 'platform/linuxbsd/pck_embed.ld'])
else: else:
env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.legacy.ld']) env.Append(LINKFLAGS=['-T', 'platform/linuxbsd/pck_embed.legacy.ld'])
## Cross-compilation ## Cross-compilation

View file

@ -1,5 +1,5 @@
/*************************************************************************/ /*************************************************************************/
/* detect_prime.cpp */ /* detect_prime_x11.cpp */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */

View file

@ -1,5 +1,5 @@
/*************************************************************************/ /*************************************************************************/
/* detect_prime.h */ /* detect_prime_x11.h */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */

View file

@ -32,7 +32,7 @@
#ifdef X11_ENABLED #ifdef X11_ENABLED
#include "detect_prime.h" #include "detect_prime_x11.h"
#include "core/os/dir_access.h" #include "core/os/dir_access.h"
#include "core/print_string.h" #include "core/print_string.h"
@ -608,7 +608,8 @@ bool DisplayServerX11::screen_is_touchscreen(int p_screen) const {
#ifndef _MSC_VER #ifndef _MSC_VER
#warning Need to get from proper window #warning Need to get from proper window
#endif #endif
return false; //?
return DisplayServer::screen_is_touchscreen(p_screen);
} }
Vector<DisplayServer::WindowID> DisplayServerX11::get_window_list() const { Vector<DisplayServer::WindowID> DisplayServerX11::get_window_list() const {
@ -638,6 +639,11 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
WindowData &wd = windows[p_id]; WindowData &wd = windows[p_id];
#ifdef VULKAN_ENABLED
if (rendering_driver == "vulkan") {
context_vulkan->window_destroy(wd.vulkan_window);
}
#endif
XUnmapWindow(x11_display, wd.x11_window); XUnmapWindow(x11_display, wd.x11_window);
XDestroyWindow(x11_display, wd.x11_window); XDestroyWindow(x11_display, wd.x11_window);
if (wd.xic) { if (wd.xic) {
@ -649,7 +655,7 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
void DisplayServerX11::window_set_title(const String &p_title, WindowID p_window) { void DisplayServerX11::window_set_title(const String &p_title, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
XStoreName(x11_display, wd.x11_window, p_title.utf8().get_data()); XStoreName(x11_display, wd.x11_window, p_title.utf8().get_data());
@ -660,7 +666,7 @@ void DisplayServerX11::window_set_title(const String &p_title, WindowID p_window
} }
int DisplayServerX11::window_get_current_screen(WindowID p_window) const { int DisplayServerX11::window_get_current_screen(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), -1); ERR_FAIL_COND_V(!windows.has(p_window), -1);
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
int x, y; int x, y;
@ -677,7 +683,7 @@ int DisplayServerX11::window_get_current_screen(WindowID p_window) const {
return 0; return 0;
} }
void DisplayServerX11::window_set_current_screen(int p_screen, WindowID p_window) { void DisplayServerX11::window_set_current_screen(int p_screen, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
int count = get_screen_count(); int count = get_screen_count();
@ -697,7 +703,7 @@ void DisplayServerX11::window_set_current_screen(int p_screen, WindowID p_window
} }
Point2i DisplayServerX11::window_get_position(WindowID p_window) const { Point2i DisplayServerX11::window_get_position(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), Point2i()); ERR_FAIL_COND_V(!windows.has(p_window), Point2i());
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
int x, y; int x, y;
Window child; Window child;
@ -705,7 +711,7 @@ Point2i DisplayServerX11::window_get_position(WindowID p_window) const {
return Point2i(x, y); return Point2i(x, y);
} }
void DisplayServerX11::window_set_position(const Point2i &p_position, WindowID p_window) { void DisplayServerX11::window_set_position(const Point2i &p_position, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
int x = 0; int x = 0;
@ -735,7 +741,7 @@ void DisplayServerX11::window_set_position(const Point2i &p_position, WindowID p
} }
void DisplayServerX11::window_set_max_size(const Size2i p_size, WindowID p_window) { void DisplayServerX11::window_set_max_size(const Size2i p_size, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
if ((p_size != Size2i()) && ((p_size.x < wd.min_size.x) || (p_size.y < wd.min_size.y))) { if ((p_size != Size2i()) && ((p_size.x < wd.min_size.x) || (p_size.y < wd.min_size.y))) {
@ -765,14 +771,14 @@ void DisplayServerX11::window_set_max_size(const Size2i p_size, WindowID p_windo
} }
} }
Size2i DisplayServerX11::window_get_max_size(WindowID p_window) const { Size2i DisplayServerX11::window_get_max_size(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), Size2i()); ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
return wd.max_size; return wd.max_size;
} }
void DisplayServerX11::window_set_min_size(const Size2i p_size, WindowID p_window) { void DisplayServerX11::window_set_min_size(const Size2i p_size, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
if ((p_size != Size2i()) && (wd.max_size != Size2i()) && ((p_size.x > wd.max_size.x) || (p_size.y > wd.max_size.y))) { if ((p_size != Size2i()) && (wd.max_size != Size2i()) && ((p_size.x > wd.max_size.x) || (p_size.y > wd.max_size.y))) {
@ -802,14 +808,14 @@ void DisplayServerX11::window_set_min_size(const Size2i p_size, WindowID p_windo
} }
} }
Size2i DisplayServerX11::window_get_min_size(WindowID p_window) const { Size2i DisplayServerX11::window_get_min_size(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), Size2i()); ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
return wd.min_size; return wd.min_size;
} }
void DisplayServerX11::window_set_size(const Size2i p_size, WindowID p_window) { void DisplayServerX11::window_set_size(const Size2i p_size, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
if (wd.size.width == p_size.width && wd.size.height == p_size.height) if (wd.size.width == p_size.width && wd.size.height == p_size.height)
@ -863,12 +869,12 @@ void DisplayServerX11::window_set_size(const Size2i p_size, WindowID p_window) {
} }
} }
Size2i DisplayServerX11::window_get_size(WindowID p_window) const { Size2i DisplayServerX11::window_get_size(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), Size2i()); ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
return wd.size; return wd.size;
} }
Size2i DisplayServerX11::window_get_real_size(WindowID p_window) const { Size2i DisplayServerX11::window_get_real_size(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), Size2i()); ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
XWindowAttributes xwa; XWindowAttributes xwa;
@ -897,7 +903,7 @@ Size2i DisplayServerX11::window_get_real_size(WindowID p_window) const {
bool DisplayServerX11::window_is_maximize_allowed(WindowID p_window) const { bool DisplayServerX11::window_is_maximize_allowed(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), false); ERR_FAIL_COND_V(!windows.has(p_window), false);
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
Atom property = XInternAtom(x11_display, "_NET_WM_ALLOWED_ACTIONS", False); Atom property = XInternAtom(x11_display, "_NET_WM_ALLOWED_ACTIONS", False);
@ -944,7 +950,7 @@ bool DisplayServerX11::window_is_maximize_allowed(WindowID p_window) const {
} }
void DisplayServerX11::_set_wm_maximized(WindowID p_window, bool p_enabled) { void DisplayServerX11::_set_wm_maximized(WindowID p_window, bool p_enabled) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
// Using EWMH -- Extended Window Manager Hints // Using EWMH -- Extended Window Manager Hints
@ -976,7 +982,7 @@ void DisplayServerX11::_set_wm_maximized(WindowID p_window, bool p_enabled) {
void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) { void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
if (p_enabled && !window_get_flag(WINDOW_FLAG_BORDERLESS, p_window)) { if (p_enabled && !window_get_flag(WINDOW_FLAG_BORDERLESS, p_window)) {
@ -1060,7 +1066,7 @@ void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) {
} }
void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) { void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
WindowMode old_mode = window_get_mode(p_window); WindowMode old_mode = window_get_mode(p_window);
@ -1171,7 +1177,7 @@ void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) {
} }
DisplayServer::WindowMode DisplayServerX11::window_get_mode(WindowID p_window) const { DisplayServer::WindowMode DisplayServerX11::window_get_mode(WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), WINDOW_MODE_WINDOWED); ERR_FAIL_COND_V(!windows.has(p_window), WINDOW_MODE_WINDOWED);
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
if (wd.fullscreen) { //if fullscreen, it's not in another mode if (wd.fullscreen) { //if fullscreen, it's not in another mode
@ -1263,7 +1269,7 @@ DisplayServer::WindowMode DisplayServerX11::window_get_mode(WindowID p_window) c
} }
void DisplayServerX11::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) { void DisplayServerX11::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
switch (p_flag) { switch (p_flag) {
@ -1348,7 +1354,7 @@ void DisplayServerX11::window_set_flag(WindowFlags p_flag, bool p_enabled, Windo
} }
} }
bool DisplayServerX11::window_get_flag(WindowFlags p_flag, WindowID p_window) const { bool DisplayServerX11::window_get_flag(WindowFlags p_flag, WindowID p_window) const {
ERR_FAIL_COND_V(windows.has(p_window), false); ERR_FAIL_COND_V(!windows.has(p_window), false);
const WindowData &wd = windows[p_window]; const WindowData &wd = windows[p_window];
switch (p_flag) { switch (p_flag) {
@ -1391,7 +1397,7 @@ bool DisplayServerX11::window_get_flag(WindowFlags p_flag, WindowID p_window) co
} }
void DisplayServerX11::window_request_attention(WindowID p_window) { void DisplayServerX11::window_request_attention(WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
// Using EWMH -- Extended Window Manager Hints // Using EWMH -- Extended Window Manager Hints
// //
@ -1415,7 +1421,7 @@ void DisplayServerX11::window_request_attention(WindowID p_window) {
} }
void DisplayServerX11::window_move_to_foreground(WindowID p_window) { void DisplayServerX11::window_move_to_foreground(WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
XEvent xev; XEvent xev;
@ -1437,9 +1443,19 @@ bool DisplayServerX11::window_can_draw(WindowID p_window) const {
//this seems to be all that is provided by X11 //this seems to be all that is provided by X11
return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED; return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED;
} }
bool DisplayServerX11::can_any_window_draw() const {
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
if (window_get_mode(E->key()) != WINDOW_MODE_MINIMIZED) {
return true;
}
}
return false;
}
void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_window) { void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
wd.im_active = p_active; wd.im_active = p_active;
@ -1455,7 +1471,7 @@ void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_win
} }
} }
void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_window) { void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_window) {
ERR_FAIL_COND(windows.has(p_window)); ERR_FAIL_COND(!windows.has(p_window));
WindowData &wd = windows[p_window]; WindowData &wd = windows[p_window];
wd.im_position = p_pos; wd.im_position = p_pos;
@ -2003,7 +2019,7 @@ void DisplayServerX11::_window_changed(XEvent *event) {
wd.size.height = event->xconfigure.height; wd.size.height = event->xconfigure.height;
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
if (video_driver == "vulkan") { if (rendering_driver == "vulkan") {
context_vulkan->window_resize(wd.vulkan_window, wd.size.width, wd.size.height); context_vulkan->window_resize(wd.vulkan_window, wd.size.width, wd.size.height);
} }
#endif #endif
@ -2634,15 +2650,59 @@ void DisplayServerX11::process_events() {
} }
void DisplayServerX11::release_rendering_thread() { void DisplayServerX11::release_rendering_thread() {
WARN_PRINT("Rendering thread not supported by this display server.");
}
void DisplayServerX11::make_rendering_thread() {
WARN_PRINT("Rendering thread not supported by this display server.");
}
void DisplayServerX11::swap_buffers() {
WARN_PRINT("Swap buffers not supported by this display server.");
} }
void DisplayServerX11::make_rendering_thread() {
}
void DisplayServerX11::swap_buffers() {
}
void DisplayServerX11::_update_context(WindowData &wd) {
XClassHint *classHint = XAllocClassHint();
if (classHint) {
CharString name_str;
switch (context) {
case CONTEXT_EDITOR:
name_str = "Godot_Editor";
break;
case CONTEXT_PROJECTMAN:
name_str = "Godot_ProjectList";
break;
case CONTEXT_ENGINE:
name_str = "Godot_Engine";
break;
}
CharString class_str;
if (context == CONTEXT_ENGINE) {
String config_name = GLOBAL_GET("application/config/name");
if (config_name.length() == 0) {
class_str = "Godot_Engine";
} else {
class_str = config_name.utf8();
}
} else {
class_str = "Godot";
}
classHint->res_class = class_str.ptrw();
classHint->res_name = name_str.ptrw();
XSetClassHint(x11_display, wd.x11_window, classHint);
XFree(classHint);
}
}
void DisplayServerX11::set_context(Context p_context) {
context = p_context;
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
_update_context(E->get());
}
}
void DisplayServerX11::set_native_icon(const String &p_filename) { void DisplayServerX11::set_native_icon(const String &p_filename) {
WARN_PRINT("Native icon not supported by this display server."); WARN_PRINT("Native icon not supported by this display server.");
} }
@ -2650,9 +2710,22 @@ void DisplayServerX11::set_icon(const Ref<Image> &p_icon) {
WARN_PRINT("Icon not supported by this display server."); WARN_PRINT("Icon not supported by this display server.");
} }
DisplayServer *DisplayServerX11::create_func(const String &p_video_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { Vector<String> DisplayServerX11::get_rendering_drivers_func() {
Vector<String> drivers;
return memnew(DisplayServerX11(p_video_driver, p_mode, p_flags, p_resolution, r_error)); #ifdef VULKAN_ENABLED
drivers.push_back("vulkan");
#endif
#ifdef OPENGL_ENABLED
drivers.push_back("opengl");
#endif
return drivers;
}
DisplayServer *DisplayServerX11::create_func(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {
return memnew(DisplayServerX11(p_rendering_driver, p_mode, p_flags, p_resolution, r_error));
} }
DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, const Vector2i &p_resolution) { DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, const Vector2i &p_resolution) {
@ -2678,7 +2751,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, c
WindowID id; WindowID id;
{ {
WindowData wd; WindowData wd;
wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo->screen), 0, 0, OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height, 0, visualInfo->depth, InputOutput, visualInfo->visual, valuemask, &windowAttributes); wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo->screen), 0, 0, p_resolution.width, p_resolution.height, 0, visualInfo->depth, InputOutput, visualInfo->visual, valuemask, &windowAttributes);
//set_class_hint(x11_display, wd.x11_window); //set_class_hint(x11_display, wd.x11_window);
XMapWindow(x11_display, wd.x11_window); XMapWindow(x11_display, wd.x11_window);
@ -2771,6 +2844,8 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, c
WARN_PRINT("XCreateIC couldn't create wd.xic"); WARN_PRINT("XCreateIC couldn't create wd.xic");
} }
_update_context(wd);
id = window_id_counter++; id = window_id_counter++;
windows[id] = wd; windows[id] = wd;
@ -2788,7 +2863,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, c
return id; return id;
} }
DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {
r_error = OK; r_error = OK;
@ -2870,7 +2945,7 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
} }
if (!_refresh_device_info()) { if (!_refresh_device_info()) {
OS::get_singleton()->alert("Your system does not support XInput 2.\n" alert("Your system does not support XInput 2.\n"
"Please upgrade your distribution.", "Please upgrade your distribution.",
"Unable to initialize XInput"); "Unable to initialize XInput");
r_error = ERR_UNAVAILABLE; r_error = ERR_UNAVAILABLE;
@ -2930,15 +3005,15 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
//!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!
//TODO - do Vulkan and GLES2 support checks, driver selection and fallback //TODO - do Vulkan and GLES2 support checks, driver selection and fallback
video_driver = p_video_driver; rendering_driver = p_rendering_driver;
#ifndef _MSC_VER #ifndef _MSC_VER
#warning Forcing vulkan video driver because OpenGL not implemented yet #warning Forcing vulkan rendering driver because OpenGL not implemented yet
#endif #endif
video_driver = "vulkan"; rendering_driver = "vulkan";
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
if (video_driver == "vulkan") { if (rendering_driver == "vulkan") {
context_vulkan = memnew(VulkanContextX11); context_vulkan = memnew(VulkanContextX11);
if (context_vulkan->initialize() != OK) { if (context_vulkan->initialize() != OK) {
@ -2947,17 +3022,11 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
r_error = ERR_CANT_CREATE; r_error = ERR_CANT_CREATE;
ERR_FAIL_MSG("Could not initialize Vulkan"); ERR_FAIL_MSG("Could not initialize Vulkan");
} }
//temporary
rendering_device_vulkan = memnew(RenderingDeviceVulkan);
rendering_device_vulkan->initialize(context_vulkan);
RasterizerRD::make_current();
} }
#endif #endif
// Init context and rendering device // Init context and rendering device
#if defined(OPENGL_ENABLED) #if defined(OPENGL_ENABLED)
if (video_driver == "opengl_es") { if (rendering_driver == "opengl_es") {
if (getenv("DRI_PRIME") == NULL) { if (getenv("DRI_PRIME") == NULL) {
int use_prime = -1; int use_prime = -1;
@ -3028,6 +3097,18 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
} }
} }
//create RenderingDevice if used
#if defined(VULKAN_ENABLED)
if (rendering_driver == "vulkan") {
//temporary
rendering_device_vulkan = memnew(RenderingDeviceVulkan);
rendering_device_vulkan->initialize(context_vulkan);
RasterizerRD::make_current();
}
#endif
/* /*
visual_server = memnew(VisualServerRaster); visual_server = memnew(VisualServerRaster);
if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
@ -3190,8 +3271,6 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
requested = None; requested = None;
visual_server->init();
window_has_focus = true; // Set focus to true at init window_has_focus = true; // Set focus to true at init
/*if (p_desired.layered) { /*if (p_desired.layered) {
@ -3211,6 +3290,58 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
r_error = OK; r_error = OK;
} }
DisplayServerX11::~DisplayServerX11() { DisplayServerX11::~DisplayServerX11() {
//destroy all windows
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
#ifdef VULKAN_ENABLED
if (rendering_driver == "vulkan") {
context_vulkan->window_destroy(E->get().vulkan_window);
}
#endif
if (E->get().xic) {
XDestroyIC(E->get().xic);
}
XUnmapWindow(x11_display, E->get().x11_window);
XDestroyWindow(x11_display, E->get().x11_window);
}
//destroy drivers
#if defined(VULKAN_ENABLED)
if (rendering_driver == "vulkan") {
if (rendering_device_vulkan) {
rendering_device_vulkan->finalize();
memdelete(rendering_device_vulkan);
}
if (context_vulkan)
memdelete(context_vulkan);
}
#endif
if (xrandr_handle)
dlclose(xrandr_handle);
for (int i = 0; i < CURSOR_MAX; i++) {
if (cursors[i] != None)
XFreeCursor(x11_display, cursors[i]);
if (img[i] != NULL)
XcursorImageDestroy(img[i]);
};
if (xim) {
XCloseIM(xim);
}
XCloseDisplay(x11_display);
if (xmbstring)
memfree(xmbstring);
}
void DisplayServerX11::register_x11_driver() {
register_create_function("x11", create_func, get_rendering_drivers_func);
} }
#endif // X11 enabled #endif // X11 enabled

View file

@ -36,7 +36,7 @@
#include "servers/display_server.h" #include "servers/display_server.h"
#include "core/input/input.h" #include "core/input/input.h"
#include "crash_handler_x11.h"
#include "drivers/alsa/audio_driver_alsa.h" #include "drivers/alsa/audio_driver_alsa.h"
#include "drivers/alsamidi/midi_driver_alsamidi.h" #include "drivers/alsamidi/midi_driver_alsamidi.h"
#include "drivers/pulseaudio/audio_driver_pulseaudio.h" #include "drivers/pulseaudio/audio_driver_pulseaudio.h"
@ -52,7 +52,7 @@
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
#include "drivers/vulkan/rendering_device_vulkan.h" #include "drivers/vulkan/rendering_device_vulkan.h"
#include "platform/x11/vulkan_context_x11.h" #include "platform/linuxbsd/vulkan_context_x11.h"
#endif #endif
#include <X11/Xcursor/Xcursor.h> #include <X11/Xcursor/Xcursor.h>
@ -110,9 +110,6 @@ class DisplayServerX11 : public DisplayServer {
RenderingDeviceVulkan *rendering_device_vulkan; RenderingDeviceVulkan *rendering_device_vulkan;
#endif #endif
//Rasterizer *rasterizer;
VisualServer *visual_server;
struct WindowData { struct WindowData {
Window x11_window; Window x11_window;
::XIC xic; ::XIC xic;
@ -200,7 +197,7 @@ class DisplayServerX11 : public DisplayServer {
bool layered_window; bool layered_window;
String video_driver; String rendering_driver;
bool window_focused; bool window_focused;
//void set_wm_border(bool p_enabled); //void set_wm_border(bool p_enabled);
void set_wm_fullscreen(bool p_enabled); void set_wm_fullscreen(bool p_enabled);
@ -224,6 +221,10 @@ class DisplayServerX11 : public DisplayServer {
void _set_wm_fullscreen(WindowID p_window, bool p_enabled); void _set_wm_fullscreen(WindowID p_window, bool p_enabled);
void _set_wm_maximized(WindowID p_window, bool p_enabled); void _set_wm_maximized(WindowID p_window, bool p_enabled);
void _update_context(WindowData &wd);
Context context = CONTEXT_ENGINE;
protected: protected:
void _window_changed(XEvent *event); void _window_changed(XEvent *event);
@ -286,6 +287,8 @@ public:
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const;
virtual bool can_any_window_draw() const;
virtual void window_set_ime_active(const bool p_active, WindowID p_window = MAIN_WINDOW_ID); virtual void window_set_ime_active(const bool p_active, WindowID p_window = MAIN_WINDOW_ID);
virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID); virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID);
@ -301,12 +304,17 @@ public:
virtual void make_rendering_thread(); virtual void make_rendering_thread();
virtual void swap_buffers(); virtual void swap_buffers();
virtual void set_context(Context p_context);
virtual void set_native_icon(const String &p_filename); virtual void set_native_icon(const String &p_filename);
virtual void set_icon(const Ref<Image> &p_icon); virtual void set_icon(const Ref<Image> &p_icon);
static DisplayServer *create_func(const String &p_video_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);
static Vector<String> get_rendering_drivers_func();
DisplayServerX11(const String &p_video_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); static void register_x11_driver();
DisplayServerX11(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);
~DisplayServerX11(); ~DisplayServerX11();
}; };

View file

@ -32,17 +32,17 @@
#include "core/os/file_access.h" #include "core/os/file_access.h"
#include "editor/editor_export.h" #include "editor/editor_export.h"
#include "platform/x11/logo.gen.h" #include "platform/linuxbsd/logo.gen.h"
#include "scene/resources/texture.h" #include "scene/resources/texture.h"
static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size); static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size);
void register_x11_exporter() { void register_linuxbsd_exporter() {
Ref<EditorExportPlatformPC> platform; Ref<EditorExportPlatformPC> platform;
platform.instance(); platform.instance();
Ref<Image> img = memnew(Image(_x11_logo)); Ref<Image> img = memnew(Image(_linuxbsd_logo));
Ref<ImageTexture> logo; Ref<ImageTexture> logo;
logo.instance(); logo.instance();
logo->create_from_image(img); logo->create_from_image(img);

View file

@ -28,9 +28,9 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/ /*************************************************************************/
#ifndef X11_EXPORT_H #ifndef LINUXBSD_EXPORT_H
#define X11_EXPORT_H #define LINUXBSD_EXPORT_H
void register_x11_exporter(); void register_linuxbsd_exporter();
#endif // X11_EXPORT_H #endif // LINUXBSD_EXPORT_H

View file

@ -1,5 +1,5 @@
/*************************************************************************/ /*************************************************************************/
/* godot_x11.cpp */ /* godot_linuxbsd.cpp */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */
@ -34,11 +34,11 @@
#include <unistd.h> #include <unistd.h>
#include "main/main.h" #include "main/main.h"
#include "os_x11.h" #include "os_linuxbsd.h"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
OS_X11 os; OS_LinuxBSD os;
setlocale(LC_CTYPE, ""); setlocale(LC_CTYPE, "");

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,381 @@
/*************************************************************************/
/* os_linuxbsd.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* 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. */
/*************************************************************************/
#include "os_linuxbsd.h"
#include "core/os/dir_access.h"
#include "core/print_string.h"
#include "errno.h"
#ifdef HAVE_MNTENT
#include <mntent.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "main/main.h"
#ifdef X11_ENABLED
#include "display_server_x11.h"
#endif
void OS_LinuxBSD::initialize() {
crash_handler.initialize();
OS_Unix::initialize_core();
}
void OS_LinuxBSD::initialize_joypads() {
#ifdef JOYDEV_ENABLED
joypad = memnew(JoypadLinux(Input::get_singleton()));
#endif
}
String OS_LinuxBSD::get_unique_id() const {
static String machine_id;
if (machine_id.empty()) {
if (FileAccess *f = FileAccess::open("/etc/machine-id", FileAccess::READ)) {
while (machine_id.empty() && !f->eof_reached()) {
machine_id = f->get_line().strip_edges();
}
f->close();
memdelete(f);
}
}
return machine_id;
}
void OS_LinuxBSD::finalize() {
if (main_loop)
memdelete(main_loop);
main_loop = NULL;
#ifdef ALSAMIDI_ENABLED
driver_alsamidi.close();
#endif
#ifdef JOYDEV_ENABLED
memdelete(joypad);
#endif
}
MainLoop *OS_LinuxBSD::get_main_loop() const {
return main_loop;
}
void OS_LinuxBSD::delete_main_loop() {
if (main_loop)
memdelete(main_loop);
main_loop = NULL;
}
void OS_LinuxBSD::set_main_loop(MainLoop *p_main_loop) {
main_loop = p_main_loop;
}
String OS_LinuxBSD::get_name() const {
#ifdef __linux__
return "Linux";
#elif defined(__FreeBSD__)
return "FreeBSD";
#elif defined(__NetBSD__)
return "NetBSD";
#else
return "BSD";
#endif
}
Error OS_LinuxBSD::shell_open(String p_uri) {
Error ok;
List<String> args;
args.push_back(p_uri);
ok = execute("xdg-open", args, false);
if (ok == OK)
return OK;
ok = execute("gnome-open", args, false);
if (ok == OK)
return OK;
ok = execute("kde-open", args, false);
return ok;
}
bool OS_LinuxBSD::_check_internal_feature_support(const String &p_feature) {
return p_feature == "pc";
}
String OS_LinuxBSD::get_config_path() const {
if (has_environment("XDG_CONFIG_HOME")) {
return get_environment("XDG_CONFIG_HOME");
} else if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".config");
} else {
return ".";
}
}
String OS_LinuxBSD::get_data_path() const {
if (has_environment("XDG_DATA_HOME")) {
return get_environment("XDG_DATA_HOME");
} else if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".local/share");
} else {
return get_config_path();
}
}
String OS_LinuxBSD::get_cache_path() const {
if (has_environment("XDG_CACHE_HOME")) {
return get_environment("XDG_CACHE_HOME");
} else if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".cache");
} else {
return get_config_path();
}
}
String OS_LinuxBSD::get_system_dir(SystemDir p_dir) const {
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_LinuxBSD *>(this)->execute("xdg-user-dir", arg, true, NULL, &pipe);
if (err != OK)
return ".";
return pipe.strip_edges();
}
void OS_LinuxBSD::run() {
force_quit = false;
if (!main_loop)
return;
main_loop->init();
//uint64_t last_ticks=get_ticks_usec();
//int frames=0;
//uint64_t frame=0;
while (!force_quit) {
DisplayServer::get_singleton()->process_events(); // get rid of pending events
#ifdef JOYDEV_ENABLED
joypad->process_joypads();
#endif
if (Main::iteration())
break;
};
main_loop->finish();
}
void OS_LinuxBSD::disable_crash_handler() {
crash_handler.disable();
}
bool OS_LinuxBSD::is_disable_crash_handler() const {
return crash_handler.is_disabled();
}
static String get_mountpoint(const String &p_path) {
struct stat s;
if (stat(p_path.utf8().get_data(), &s)) {
return "";
}
#ifdef HAVE_MNTENT
dev_t dev = s.st_dev;
FILE *fd = setmntent("/proc/mounts", "r");
if (!fd) {
return "";
}
struct mntent mnt;
char buf[1024];
size_t buflen = 1024;
while (getmntent_r(fd, &mnt, buf, buflen)) {
if (!stat(mnt.mnt_dir, &s) && s.st_dev == dev) {
endmntent(fd);
return String(mnt.mnt_dir);
}
}
endmntent(fd);
#endif
return "";
}
Error OS_LinuxBSD::move_to_trash(const String &p_path) {
String trash_can = "";
String mnt = get_mountpoint(p_path);
// If there is a directory "[Mountpoint]/.Trash-[UID]/files", use it as the trash can.
if (mnt != "") {
String path(mnt + "/.Trash-" + itos(getuid()) + "/files");
struct stat s;
if (!stat(path.utf8().get_data(), &s)) {
trash_can = path;
}
}
// Otherwise, if ${XDG_DATA_HOME} is defined, use "${XDG_DATA_HOME}/Trash/files" as the trash can.
if (trash_can == "") {
char *dhome = getenv("XDG_DATA_HOME");
if (dhome) {
trash_can = String(dhome) + "/Trash/files";
}
}
// Otherwise, if ${HOME} is defined, use "${HOME}/.local/share/Trash/files" as the trash can.
if (trash_can == "") {
char *home = getenv("HOME");
if (home) {
trash_can = String(home) + "/.local/share/Trash/files";
}
}
// Issue an error if none of the previous locations is appropriate for the trash can.
if (trash_can == "") {
ERR_PRINT("move_to_trash: Could not determine the trash can location");
return FAILED;
}
// Create needed directories for decided trash can location.
DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
Error err = dir_access->make_dir_recursive(trash_can);
memdelete(dir_access);
// Issue an error if trash can is not created proprely.
if (err != OK) {
ERR_PRINT("move_to_trash: Could not create the trash can \"" + trash_can + "\"");
return err;
}
// The trash can is successfully created, now move the given resource to it.
// Do not use DirAccess:rename() because it can't move files across multiple mountpoints.
List<String> mv_args;
mv_args.push_back(p_path);
mv_args.push_back(trash_can);
int retval;
err = execute("mv", mv_args, true, NULL, NULL, &retval);
// Issue an error if "mv" failed to move the given resource to the trash can.
if (err != OK || retval != 0) {
ERR_PRINT("move_to_trash: Could not move the resource \"" + p_path + "\" to the trash can \"" + trash_can + "\"");
return FAILED;
}
return OK;
}
OS_LinuxBSD::OS_LinuxBSD() {
main_loop = NULL;
force_quit = false;
#ifdef PULSEAUDIO_ENABLED
AudioDriverManager::add_driver(&driver_pulseaudio);
#endif
#ifdef ALSA_ENABLED
AudioDriverManager::add_driver(&driver_alsa);
#endif
#ifdef X11_ENABLED
DisplayServerX11::register_x11_driver();
#endif
}

View file

@ -0,0 +1,106 @@
/*************************************************************************/
/* os_linuxbsd.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* 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. */
/*************************************************************************/
#ifndef OS_LINUXBSD_H
#define OS_LINUXBSD_H
#include "core/input/input.h"
#include "crash_handler_linuxbsd.h"
#include "drivers/alsa/audio_driver_alsa.h"
#include "drivers/alsamidi/midi_driver_alsamidi.h"
#include "drivers/pulseaudio/audio_driver_pulseaudio.h"
#include "drivers/unix/os_unix.h"
#include "joypad_linux.h"
#include "servers/audio_server.h"
#include "servers/visual/rasterizer.h"
#include "servers/visual_server.h"
class OS_LinuxBSD : public OS_Unix {
virtual void delete_main_loop();
bool force_quit;
#ifdef JOYDEV_ENABLED
JoypadLinux *joypad;
#endif
#ifdef ALSA_ENABLED
AudioDriverALSA driver_alsa;
#endif
#ifdef ALSAMIDI_ENABLED
MIDIDriverALSAMidi driver_alsamidi;
#endif
#ifdef PULSEAUDIO_ENABLED
AudioDriverPulseAudio driver_pulseaudio;
#endif
CrashHandler crash_handler;
MainLoop *main_loop;
protected:
virtual void initialize();
virtual void finalize();
virtual void initialize_joypads();
virtual void set_main_loop(MainLoop *p_main_loop);
public:
virtual String get_name() const;
virtual MainLoop *get_main_loop() const;
virtual String get_config_path() const;
virtual String get_data_path() const;
virtual String get_cache_path() const;
virtual String get_system_dir(SystemDir p_dir) const;
virtual Error shell_open(String p_uri);
virtual String get_unique_id() const;
virtual bool _check_internal_feature_support(const String &p_feature);
void run();
void disable_crash_handler();
bool is_disable_crash_handler() const;
virtual Error move_to_trash(const String &p_path);
OS_LinuxBSD();
};
#endif

View file

@ -7,7 +7,7 @@ import os
from platform_methods import subprocess_main from platform_methods import subprocess_main
def make_debug_x11(target, source, env): def make_debug_linuxbsd(target, source, env):
os.system('objcopy --only-keep-debug {0} {0}.debugsymbols'.format(target[0])) os.system('objcopy --only-keep-debug {0} {0}.debugsymbols'.format(target[0]))
os.system('strip --strip-debug --strip-unneeded {0}'.format(target[0])) os.system('strip --strip-debug --strip-unneeded {0}'.format(target[0]))
os.system('objcopy --add-gnu-debuglink={0}.debugsymbols {0}'.format(target[0])) os.system('objcopy --add-gnu-debuglink={0}.debugsymbols {0}'.format(target[0]))

View file

@ -38,7 +38,7 @@
#include "platform/osx/crash_handler_osx.h" #include "platform/osx/crash_handler_osx.h"
#include "platform/osx/semaphore_osx.h" #include "platform/osx/semaphore_osx.h"
#else #else
#include "platform/x11/crash_handler_x11.h" #include "platform/x11/crash_handler_linuxbsd.h"
#endif #endif
#include "servers/audio_server.h" #include "servers/audio_server.h"
#include "servers/visual/rasterizer.h" #include "servers/visual/rasterizer.h"

File diff suppressed because it is too large Load diff

View file

@ -1,338 +0,0 @@
/*************************************************************************/
/* os_x11.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* 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. */
/*************************************************************************/
#ifndef OS_X11_H
#define OS_X11_H
#include "core/input/input.h"
#include "crash_handler_x11.h"
#include "drivers/alsa/audio_driver_alsa.h"
#include "drivers/alsamidi/midi_driver_alsamidi.h"
#include "drivers/pulseaudio/audio_driver_pulseaudio.h"
#include "drivers/unix/os_unix.h"
#include "joypad_linux.h"
#include "servers/audio_server.h"
#include "servers/visual/rasterizer.h"
#include "servers/visual_server.h"
#if defined(OPENGL_ENABLED)
#include "context_gl_x11.h"
#endif
#if defined(VULKAN_ENABLED)
#include "drivers/vulkan/rendering_device_vulkan.h"
#include "platform/x11/vulkan_context_x11.h"
#endif
#include <X11/Xcursor/Xcursor.h>
#include <X11/Xlib.h>
#include <X11/extensions/XInput2.h>
#include <X11/extensions/Xrandr.h>
#include <X11/keysym.h>
// Hints for X11 fullscreen
typedef struct {
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long inputMode;
unsigned long status;
} Hints;
typedef struct _xrr_monitor_info {
Atom name;
Bool primary;
Bool automatic;
int noutput;
int x;
int y;
int width;
int height;
int mwidth;
int mheight;
RROutput *outputs;
} xrr_monitor_info;
#undef CursorShape
class OS_X11 : public OS_Unix {
Atom wm_delete;
Atom xdnd_enter;
Atom xdnd_position;
Atom xdnd_status;
Atom xdnd_action_copy;
Atom xdnd_drop;
Atom xdnd_finished;
Atom xdnd_selection;
Atom requested;
int xdnd_version;
#if defined(OPENGL_ENABLED)
ContextGL_X11 *context_gles2;
#endif
#if defined(VULKAN_ENABLED)
VulkanContextX11 *context_vulkan;
RenderingDeviceVulkan *rendering_device_vulkan;
#endif
//Rasterizer *rasterizer;
VisualServer *visual_server;
VideoMode current_videomode;
List<String> args;
Window x11_window;
Window xdnd_source_window;
MainLoop *main_loop;
::Display *x11_display;
char *xmbstring;
int xmblen;
unsigned long last_timestamp;
::Time last_keyrelease_time;
::XIC xic;
::XIM xim;
::XIMStyle xim_style;
static void xim_destroy_callback(::XIM im, ::XPointer client_data,
::XPointer call_data);
// IME
bool im_active;
Vector2 im_position;
Vector2 last_position_before_fs;
Size2 min_size;
Size2 max_size;
Point2 last_mouse_pos;
bool last_mouse_pos_valid;
Point2i last_click_pos;
uint64_t last_click_ms;
int last_click_button_index;
uint32_t last_button_state;
struct {
int opcode;
Vector<int> touch_devices;
Map<int, Vector2> absolute_devices;
Map<int, Vector3> pen_devices;
XIEventMask all_event_mask;
XIEventMask all_master_event_mask;
Map<int, Vector2> state;
double pressure;
Vector2 tilt;
Vector2 mouse_pos_to_filter;
Vector2 relative_motion;
Vector2 raw_pos;
Vector2 old_raw_pos;
::Time last_relative_time;
} xi;
bool refresh_device_info();
unsigned int get_mouse_button_state(unsigned int p_x11_button, int p_x11_type);
void get_key_modifier_state(unsigned int p_x11_state, Ref<InputEventWithModifiers> state);
void flush_mouse_motion();
MouseMode mouse_mode;
Point2i center;
void handle_key_event(XKeyEvent *p_event, bool p_echo = false);
void process_xevents();
virtual void delete_main_loop();
bool force_quit;
bool minimized;
bool window_has_focus;
bool do_mouse_warp;
const char *cursor_theme;
int cursor_size;
XcursorImage *img[CURSOR_MAX];
Cursor cursors[CURSOR_MAX];
Cursor null_cursor;
CursorShape current_cursor;
Map<CursorShape, Vector<Variant>> cursors_cache;
Input *input;
#ifdef JOYDEV_ENABLED
JoypadLinux *joypad;
#endif
#ifdef ALSA_ENABLED
AudioDriverALSA driver_alsa;
#endif
#ifdef ALSAMIDI_ENABLED
MIDIDriverALSAMidi driver_alsamidi;
#endif
#ifdef PULSEAUDIO_ENABLED
AudioDriverPulseAudio driver_pulseaudio;
#endif
bool layered_window;
CrashHandler crash_handler;
int video_driver_index;
bool maximized;
bool window_focused;
//void set_wm_border(bool p_enabled);
void set_wm_fullscreen(bool p_enabled);
void set_wm_above(bool p_enabled);
typedef xrr_monitor_info *(*xrr_get_monitors_t)(Display *dpy, Window window, Bool get_active, int *nmonitors);
typedef void (*xrr_free_monitors_t)(xrr_monitor_info *monitors);
xrr_get_monitors_t xrr_get_monitors;
xrr_free_monitors_t xrr_free_monitors;
void *xrandr_handle;
Bool xrandr_ext_ok;
protected:
virtual int get_current_video_driver() const;
virtual void initialize_core();
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
virtual void finalize();
virtual void set_main_loop(MainLoop *p_main_loop);
void _window_changed(XEvent *event);
bool is_window_maximize_allowed();
public:
virtual String get_name() const;
virtual void set_cursor_shape(CursorShape p_shape);
virtual CursorShape get_cursor_shape() const;
virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot);
void set_mouse_mode(MouseMode p_mode);
MouseMode get_mouse_mode() const;
virtual void warp_mouse_position(const Point2 &p_to);
virtual Point2 get_mouse_position() const;
virtual int get_mouse_button_state() const;
virtual void set_window_title(const String &p_title);
virtual void set_icon(const Ref<Image> &p_icon);
virtual MainLoop *get_main_loop() const;
virtual bool can_draw() const;
virtual void set_clipboard(const String &p_text);
virtual String get_clipboard() const;
virtual void release_rendering_thread();
virtual void make_rendering_thread();
virtual void swap_buffers();
virtual String get_config_path() const;
virtual String get_data_path() const;
virtual String get_cache_path() const;
virtual String get_system_dir(SystemDir p_dir) const;
virtual Error shell_open(String p_uri);
virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0);
virtual VideoMode get_video_mode(int p_screen = 0) const;
virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const;
virtual int get_screen_count() const;
virtual int get_current_screen() const;
virtual void set_current_screen(int p_screen);
virtual Point2 get_screen_position(int p_screen = -1) const;
virtual Size2 get_screen_size(int p_screen = -1) const;
virtual int get_screen_dpi(int p_screen = -1) const;
virtual Point2 get_window_position() const;
virtual void set_window_position(const Point2 &p_position);
virtual Size2 get_window_size() const;
virtual Size2 get_real_window_size() const;
virtual Size2 get_max_window_size() const;
virtual Size2 get_min_window_size() const;
virtual void set_min_window_size(const Size2 p_size);
virtual void set_max_window_size(const Size2 p_size);
virtual void set_window_size(const Size2 p_size);
virtual void set_window_fullscreen(bool p_enabled);
virtual bool is_window_fullscreen() const;
virtual void set_window_resizable(bool p_enabled);
virtual bool is_window_resizable() const;
virtual void set_window_minimized(bool p_enabled);
virtual bool is_window_minimized() const;
virtual void set_window_maximized(bool p_enabled);
virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void request_attention();
virtual void set_borderless_window(bool p_borderless);
virtual bool get_borderless_window();
virtual bool get_window_per_pixel_transparency_enabled() const;
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled);
virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
virtual String get_unique_id() const;
virtual void move_window_to_foreground();
virtual void alert(const String &p_alert, const String &p_title = "ALERT!");
virtual bool is_joy_known(int p_device);
virtual String get_joy_guid(int p_device) const;
virtual void set_context(int p_context);
virtual void _set_use_vsync(bool p_enable);
//virtual bool is_vsync_enabled() const;
virtual bool _check_internal_feature_support(const String &p_feature);
virtual void force_process_input();
void run();
void disable_crash_handler();
bool is_disable_crash_handler() const;
virtual Error move_to_trash(const String &p_path);
virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
void update_real_mouse_position();
OS_X11();
};
#endif

View file

@ -228,7 +228,7 @@ bool Particles2D::get_fractional_delta() const {
String Particles2D::get_configuration_warning() const { String Particles2D::get_configuration_warning() const {
if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) { if (VisualServer::get_singleton()->is_low_end()) {
return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles2D node instead. You can use the \"Convert to CPUParticles\" option for this purpose."); return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles2D node instead. You can use the \"Convert to CPUParticles\" option for this purpose.");
} }

View file

@ -33,6 +33,7 @@
#include "core/input/input.h" #include "core/input/input.h"
#include "core/input/input_map.h" #include "core/input/input_map.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "scene/main/viewport.h"
void TouchScreenButton::set_texture(const Ref<Texture2D> &p_texture) { void TouchScreenButton::set_texture(const Ref<Texture2D> &p_texture) {
@ -114,7 +115,7 @@ void TouchScreenButton::_notification(int p_what) {
if (!is_inside_tree()) if (!is_inside_tree())
return; return;
if (!Engine::get_singleton()->is_editor_hint() && !OS::get_singleton()->has_touchscreen_ui_hint() && visibility == VISIBILITY_TOUCHSCREEN_ONLY) if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY)
return; return;
if (finger_pressed != -1) { if (finger_pressed != -1) {
@ -145,7 +146,7 @@ void TouchScreenButton::_notification(int p_what) {
} break; } break;
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
if (!Engine::get_singleton()->is_editor_hint() && !OS::get_singleton()->has_touchscreen_ui_hint() && visibility == VISIBILITY_TOUCHSCREEN_ONLY) if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY)
return; return;
update(); update();

View file

@ -526,7 +526,7 @@ Vector<Face3> GIProbe::get_faces(uint32_t p_usage_flags) const {
String GIProbe::get_configuration_warning() const { String GIProbe::get_configuration_warning() const {
if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) { if (VisualServer::get_singleton()->is_low_end()) {
return TTR("GIProbes are not supported by the GLES2 video driver.\nUse a BakedLightmap instead."); return TTR("GIProbes are not supported by the GLES2 video driver.\nUse a BakedLightmap instead.");
} }
return String(); return String();

View file

@ -240,7 +240,7 @@ bool Particles::get_fractional_delta() const {
String Particles::get_configuration_warning() const { String Particles::get_configuration_warning() const {
if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) { if (VisualServer::get_singleton()->is_low_end()) {
return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles node instead. You can use the \"Convert to CPUParticles\" option for this purpose."); return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles node instead. You can use the \"Convert to CPUParticles\" option for this purpose.");
} }

View file

@ -36,12 +36,12 @@
#include "core/print_string.h" #include "core/print_string.h"
#include "core/translation.h" #include "core/translation.h"
#include "label.h" #include "label.h"
#include "servers/display_server.h"
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
#include "editor/editor_scale.h" #include "editor/editor_scale.h"
#include "editor/editor_settings.h" #include "editor/editor_settings.h"
#endif #endif
#include "scene/main/viewport.h"
static bool _is_text_char(CharType c) { static bool _is_text_char(CharType c) {
return !is_symbol(c); return !is_symbol(c);
@ -127,8 +127,8 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
selection.creating = false; selection.creating = false;
selection.doubleclick = false; selection.doubleclick = false;
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->show_virtual_keyboard(text, get_global_rect(), max_length); DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), max_length);
} }
update(); update();
@ -304,8 +304,8 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
case KEY_ENTER: { case KEY_ENTER: {
emit_signal("text_entered", text); emit_signal("text_entered", text);
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->hide_virtual_keyboard(); DisplayServer::get_singleton()->virtual_keyboard_hide();
} break; } break;
@ -914,8 +914,8 @@ void LineEdit::_notification(int p_what) {
if (has_focus()) { if (has_focus()) {
OS::get_singleton()->set_ime_active(true); DisplayServer::get_singleton()->window_set_ime_active(true, get_viewport()->get_window_id());
OS::get_singleton()->set_ime_position(get_global_position() + Point2(using_placeholder ? 0 : x_ofs, y_ofs + caret_height)); DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + Point2(using_placeholder ? 0 : x_ofs, y_ofs + caret_height), get_viewport()->get_window_id());
} }
} break; } break;
case NOTIFICATION_FOCUS_ENTER: { case NOTIFICATION_FOCUS_ENTER: {
@ -926,12 +926,12 @@ void LineEdit::_notification(int p_what) {
draw_caret = true; draw_caret = true;
} }
OS::get_singleton()->set_ime_active(true); DisplayServer::get_singleton()->window_set_ime_active(true, get_viewport()->get_window_id());
Point2 cursor_pos = Point2(get_cursor_position(), 1) * get_minimum_size().height; Point2 cursor_pos = Point2(get_cursor_position(), 1) * get_minimum_size().height;
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos); DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + cursor_pos, get_viewport()->get_window_id());
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->show_virtual_keyboard(text, get_global_rect(), max_length); DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), max_length);
} break; } break;
case NOTIFICATION_FOCUS_EXIT: { case NOTIFICATION_FOCUS_EXIT: {
@ -940,20 +940,20 @@ void LineEdit::_notification(int p_what) {
caret_blink_timer->stop(); caret_blink_timer->stop();
} }
OS::get_singleton()->set_ime_position(Point2()); DisplayServer::get_singleton()->window_set_ime_position(Point2(), get_viewport()->get_window_id());
OS::get_singleton()->set_ime_active(false); DisplayServer::get_singleton()->window_set_ime_active(false, get_viewport()->get_window_id());
ime_text = ""; ime_text = "";
ime_selection = Point2(); ime_selection = Point2();
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->hide_virtual_keyboard(); DisplayServer::get_singleton()->virtual_keyboard_hide();
} break; } break;
case MainLoop::NOTIFICATION_OS_IME_UPDATE: { case MainLoop::NOTIFICATION_OS_IME_UPDATE: {
if (has_focus()) { if (has_focus()) {
ime_text = OS::get_singleton()->get_ime_text(); ime_text = DisplayServer::get_singleton()->ime_get_text();
ime_selection = OS::get_singleton()->get_ime_selection(); ime_selection = DisplayServer::get_singleton()->ime_get_selection();
update(); update();
} }
} break; } break;
@ -963,14 +963,14 @@ void LineEdit::_notification(int p_what) {
void LineEdit::copy_text() { void LineEdit::copy_text() {
if (selection.enabled && !pass) { if (selection.enabled && !pass) {
OS::get_singleton()->set_clipboard(text.substr(selection.begin, selection.end - selection.begin)); DisplayServer::get_singleton()->clipboard_set(text.substr(selection.begin, selection.end - selection.begin));
} }
} }
void LineEdit::cut_text() { void LineEdit::cut_text() {
if (selection.enabled && !pass) { if (selection.enabled && !pass) {
OS::get_singleton()->set_clipboard(text.substr(selection.begin, selection.end - selection.begin)); DisplayServer::get_singleton()->clipboard_set(text.substr(selection.begin, selection.end - selection.begin));
selection_delete(); selection_delete();
} }
} }
@ -978,7 +978,7 @@ void LineEdit::cut_text() {
void LineEdit::paste_text() { void LineEdit::paste_text() {
// Strip escape characters like \n and \t as they can't be displayed on LineEdit. // Strip escape characters like \n and \t as they can't be displayed on LineEdit.
String paste_buffer = OS::get_singleton()->get_clipboard().strip_escapes(); String paste_buffer = DisplayServer::get_singleton()->clipboard_get().strip_escapes();
if (paste_buffer != "") { if (paste_buffer != "") {

View file

@ -34,6 +34,7 @@
#include "core/os/keyboard.h" #include "core/os/keyboard.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "scene/scene_string_names.h" #include "scene/scene_string_names.h"
#include "servers/display_server.h"
#include "modules/modules_enabled.gen.h" #include "modules/modules_enabled.gen.h"
#ifdef MODULE_REGEX_ENABLED #ifdef MODULE_REGEX_ENABLED
@ -2584,7 +2585,7 @@ void RichTextLabel::selection_copy() {
} }
if (text != "") { if (text != "") {
OS::get_singleton()->set_clipboard(text); DisplayServer::get_singleton()->clipboard_set(text);
} }
} }

View file

@ -33,6 +33,7 @@
#include "core/os/keyboard.h" #include "core/os/keyboard.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/print_string.h" #include "core/print_string.h"
#include "scene/main/viewport.h"
bool ScrollBar::focus_by_default = false; bool ScrollBar::focus_by_default = false;
@ -559,8 +560,7 @@ void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) {
drag_node_accum = Vector2(); drag_node_accum = Vector2();
last_drag_node_accum = Vector2(); last_drag_node_accum = Vector2();
drag_node_from = Vector2(orientation == HORIZONTAL ? get_value() : 0, orientation == VERTICAL ? get_value() : 0); drag_node_from = Vector2(orientation == HORIZONTAL ? get_value() : 0, orientation == VERTICAL ? get_value() : 0);
drag_node_touching = !DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id()));
drag_node_touching = OS::get_singleton()->has_touchscreen_ui_hint();
drag_node_touching_deaccel = false; drag_node_touching_deaccel = false;
time_since_motion = 0; time_since_motion = 0;

View file

@ -129,7 +129,7 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) {
if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll)
accept_event(); //accept event if scroll changed accept_event(); //accept event if scroll changed
if (!OS::get_singleton()->has_touchscreen_ui_hint()) if (!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())))
return; return;
if (mb->get_button_index() != BUTTON_LEFT) if (mb->get_button_index() != BUTTON_LEFT)
@ -145,7 +145,7 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) {
drag_accum = Vector2(); drag_accum = Vector2();
last_drag_accum = Vector2(); last_drag_accum = Vector2();
drag_from = Vector2(h_scroll->get_value(), v_scroll->get_value()); drag_from = Vector2(h_scroll->get_value(), v_scroll->get_value());
drag_touching = OS::get_singleton()->has_touchscreen_ui_hint(); drag_touching = !DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id()));
drag_touching_deaccel = false; drag_touching_deaccel = false;
beyond_deadzone = false; beyond_deadzone = false;
time_since_motion = 0; time_since_motion = 0;

View file

@ -1754,8 +1754,8 @@ void TextEdit::_notification(int p_what) {
} }
if (has_focus()) { if (has_focus()) {
OS::get_singleton()->set_ime_active(true); DisplayServer::get_singleton()->window_set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height())); DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));
} }
} break; } break;
case NOTIFICATION_FOCUS_ENTER: { case NOTIFICATION_FOCUS_ENTER: {
@ -1766,12 +1766,12 @@ void TextEdit::_notification(int p_what) {
draw_caret = true; draw_caret = true;
} }
OS::get_singleton()->set_ime_active(true); DisplayServer::get_singleton()->window_set_ime_active(true);
Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height(); Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height();
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos); DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + cursor_pos);
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->show_virtual_keyboard(get_text(), get_global_rect()); DisplayServer::get_singleton()->virtual_keyboard_show(get_text(), get_global_rect());
} break; } break;
case NOTIFICATION_FOCUS_EXIT: { case NOTIFICATION_FOCUS_EXIT: {
@ -1779,19 +1779,19 @@ void TextEdit::_notification(int p_what) {
caret_blink_timer->stop(); caret_blink_timer->stop();
} }
OS::get_singleton()->set_ime_position(Point2()); DisplayServer::get_singleton()->window_set_ime_position(Point2());
OS::get_singleton()->set_ime_active(false); DisplayServer::get_singleton()->window_set_ime_active(false);
ime_text = ""; ime_text = "";
ime_selection = Point2(); ime_selection = Point2();
if (OS::get_singleton()->has_virtual_keyboard()) if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD))
OS::get_singleton()->hide_virtual_keyboard(); DisplayServer::get_singleton()->virtual_keyboard_hide();
} break; } break;
case MainLoop::NOTIFICATION_OS_IME_UPDATE: { case MainLoop::NOTIFICATION_OS_IME_UPDATE: {
if (has_focus()) { if (has_focus()) {
ime_text = OS::get_singleton()->get_ime_text(); ime_text = DisplayServer::get_singleton()->ime_get_text();
ime_selection = OS::get_singleton()->get_ime_selection(); ime_selection = DisplayServer::get_singleton()->ime_get_selection();
update(); update();
} }
} break; } break;
@ -5226,7 +5226,7 @@ void TextEdit::cut() {
if (!selection.active) { if (!selection.active) {
String clipboard = text[cursor.line]; String clipboard = text[cursor.line];
OS::get_singleton()->set_clipboard(clipboard); DisplayServer::get_singleton()->clipboard_set(clipboard);
cursor_set_line(cursor.line); cursor_set_line(cursor.line);
cursor_set_column(0); cursor_set_column(0);
@ -5244,7 +5244,7 @@ void TextEdit::cut() {
} else { } else {
String clipboard = _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); String clipboard = _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column);
OS::get_singleton()->set_clipboard(clipboard); DisplayServer::get_singleton()->clipboard_set(clipboard);
_remove_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); _remove_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column);
cursor_set_line(selection.from_line); // Set afterwards else it causes the view to be offset. cursor_set_line(selection.from_line); // Set afterwards else it causes the view to be offset.
@ -5264,19 +5264,19 @@ void TextEdit::copy() {
if (text[cursor.line].length() != 0) { if (text[cursor.line].length() != 0) {
String clipboard = _base_get_text(cursor.line, 0, cursor.line, text[cursor.line].length()); String clipboard = _base_get_text(cursor.line, 0, cursor.line, text[cursor.line].length());
OS::get_singleton()->set_clipboard(clipboard); DisplayServer::get_singleton()->clipboard_set(clipboard);
cut_copy_line = clipboard; cut_copy_line = clipboard;
} }
} else { } else {
String clipboard = _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); String clipboard = _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column);
OS::get_singleton()->set_clipboard(clipboard); DisplayServer::get_singleton()->clipboard_set(clipboard);
cut_copy_line = ""; cut_copy_line = "";
} }
} }
void TextEdit::paste() { void TextEdit::paste() {
String clipboard = OS::get_singleton()->get_clipboard(); String clipboard = DisplayServer::get_singleton()->clipboard_get();
begin_complex_operation(); begin_complex_operation();
if (selection.active) { if (selection.active) {

View file

@ -2703,7 +2703,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
drag_accum = 0; drag_accum = 0;
//last_drag_accum=0; //last_drag_accum=0;
drag_from = v_scroll->get_value(); drag_from = v_scroll->get_value();
drag_touching = OS::get_singleton()->has_touchscreen_ui_hint(); drag_touching = !DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id()));
drag_touching_deaccel = false; drag_touching_deaccel = false;
if (drag_touching) { if (drag_touching) {
set_physics_process_internal(true); set_physics_process_internal(true);

View file

@ -47,6 +47,7 @@
#include "scene/resources/mesh.h" #include "scene/resources/mesh.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "scene/scene_string_names.h" #include "scene/scene_string_names.h"
#include "servers/display_server.h"
#include "servers/navigation_server.h" #include "servers/navigation_server.h"
#include "servers/physics_2d_server.h" #include "servers/physics_2d_server.h"
#include "servers/physics_server.h" #include "servers/physics_server.h"
@ -526,7 +527,7 @@ bool SceneTree::idle(float p_time) {
_notify_group_pause("idle_process_internal", Node::NOTIFICATION_INTERNAL_PROCESS); _notify_group_pause("idle_process_internal", Node::NOTIFICATION_INTERNAL_PROCESS);
_notify_group_pause("idle_process", Node::NOTIFICATION_PROCESS); _notify_group_pause("idle_process", Node::NOTIFICATION_PROCESS);
Size2 win_size = Size2(OS::get_singleton()->get_window_size().width, OS::get_singleton()->get_window_size().height); Size2 win_size = Size2(DisplayServer::get_singleton()->window_get_size().width, DisplayServer::get_singleton()->window_get_size().height);
if (win_size != last_screen_size) { if (win_size != last_screen_size) {
@ -1143,7 +1144,7 @@ void SceneTree::_update_root_rect() {
} }
//actual screen video mode //actual screen video mode
Size2 video_mode = Size2(OS::get_singleton()->get_window_size().width, OS::get_singleton()->get_window_size().height); Size2 video_mode = Size2(DisplayServer::get_singleton()->window_get_size().width, DisplayServer::get_singleton()->window_get_size().height);
Size2 desired_res = stretch_min; Size2 desired_res = stretch_min;
Size2 viewport_size; Size2 viewport_size;
@ -1734,7 +1735,7 @@ SceneTree::SceneTree() {
stretch_aspect = STRETCH_ASPECT_IGNORE; stretch_aspect = STRETCH_ASPECT_IGNORE;
stretch_shrink = 1; stretch_shrink = 1;
last_screen_size = Size2(OS::get_singleton()->get_window_size().width, OS::get_singleton()->get_window_size().height); last_screen_size = Size2(DisplayServer::get_singleton()->window_get_size().width, DisplayServer::get_singleton()->window_get_size().height);
_update_root_rect(); _update_root_rect();
root->set_physics_object_picking(GLOBAL_DEF("physics/common/enable_object_picking", true)); root->set_physics_object_picking(GLOBAL_DEF("physics/common/enable_object_picking", true));

View file

@ -51,6 +51,7 @@
#include "scene/main/timer.h" #include "scene/main/timer.h"
#include "scene/resources/mesh.h" #include "scene/resources/mesh.h"
#include "scene/scene_string_names.h" #include "scene/scene_string_names.h"
#include "servers/display_server.h"
#include "servers/physics_2d_server.h" #include "servers/physics_2d_server.h"
void ViewportTexture::setup_local_to_scene() { void ViewportTexture::setup_local_to_scene() {
@ -732,7 +733,7 @@ Rect2 Viewport::get_visible_rect() const {
Rect2 r; Rect2 r;
if (size == Size2()) { if (size == Size2()) {
r = Rect2(Point2(), OS::get_singleton()->get_window_size()); r = Rect2(Point2(), DisplayServer::get_singleton()->window_get_size());
} else { } else {
r = Rect2(Point2(), size); r = Rect2(Point2(), size);
} }
@ -2172,7 +2173,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
} }
if (!over) { if (!over) {
OS::get_singleton()->set_cursor_shape((OS::CursorShape)Input::get_singleton()->get_default_cursor_shape()); DisplayServer::get_singleton()->cursor_set_shape((DisplayServer::CursorShape)Input::get_singleton()->get_default_cursor_shape());
return; return;
} }
@ -2245,7 +2246,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
} }
} }
OS::get_singleton()->set_cursor_shape((OS::CursorShape)cursor_shape); DisplayServer::get_singleton()->cursor_set_shape((DisplayServer::CursorShape)cursor_shape);
if (over && over->can_process()) { if (over && over->can_process()) {
_gui_call_input(over, mm); _gui_call_input(over, mm);
@ -2258,9 +2259,9 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
bool can_drop = _gui_drop(over, pos, true); bool can_drop = _gui_drop(over, pos, true);
if (!can_drop) { if (!can_drop) {
OS::get_singleton()->set_cursor_shape(OS::CURSOR_FORBIDDEN); DisplayServer::get_singleton()->cursor_set_shape(DisplayServer::CURSOR_FORBIDDEN);
} else { } else {
OS::get_singleton()->set_cursor_shape(OS::CURSOR_CAN_DROP); DisplayServer::get_singleton()->cursor_set_shape(DisplayServer::CURSOR_CAN_DROP);
} }
//change mouse accordingly i guess //change mouse accordingly i guess
} }
@ -3086,6 +3087,10 @@ void Viewport::_propagate_update_default_repeat(Node *p_node) {
} }
} }
DisplayServer::WindowID Viewport::get_window_id() const {
return DisplayServer::MAIN_WINDOW_ID;
}
void Viewport::_bind_methods() { void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_use_arvr", "use"), &Viewport::set_use_arvr); ClassDB::bind_method(D_METHOD("set_use_arvr", "use"), &Viewport::set_use_arvr);

View file

@ -35,6 +35,7 @@
#include "scene/main/node.h" #include "scene/main/node.h"
#include "scene/resources/texture.h" #include "scene/resources/texture.h"
#include "scene/resources/world_2d.h" #include "scene/resources/world_2d.h"
#include "servers/display_server.h"
#include "servers/visual_server.h" #include "servers/visual_server.h"
class Camera; class Camera;
@ -560,6 +561,8 @@ public:
void set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRepeat p_repeat); void set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRepeat p_repeat);
DefaultCanvasItemTextureRepeat get_default_canvas_item_texture_repeat() const; DefaultCanvasItemTextureRepeat get_default_canvas_item_texture_repeat() const;
DisplayServer::WindowID get_window_id() const;
Viewport(); Viewport();
~Viewport(); ~Viewport();
}; };

View file

@ -480,7 +480,7 @@ void register_scene_types() {
#endif #endif
ClassDB::register_class<NavigationMesh>(); ClassDB::register_class<NavigationMesh>();
AcceptDialog::set_swap_ok_cancel(GLOBAL_DEF("gui/common/swap_ok_cancel", bool(OS::get_singleton()->get_swap_ok_cancel()))); AcceptDialog::set_swap_ok_cancel(GLOBAL_DEF("gui/common/swap_ok_cancel", bool(DisplayServer::get_singleton()->get_swap_ok_cancel())));
ClassDB::register_class<Shader>(); ClassDB::register_class<Shader>();
ClassDB::register_class<VisualShader>(); ClassDB::register_class<VisualShader>();

View file

@ -29,8 +29,13 @@
/*************************************************************************/ /*************************************************************************/
#include "display_server.h" #include "display_server.h"
#include "core/input/input.h"
DisplayServer *DisplayServer::singleton = nullptr; DisplayServer *DisplayServer::singleton = nullptr;
DisplayServer::SwitchVSyncCallbackInThread DisplayServer::switch_vsync_function = nullptr;
DisplayServer::DisplayServerCreate DisplayServer::server_create_functions[DisplayServer::MAX_SERVERS];
int DisplayServer::server_create_count = 0;
void DisplayServer::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) { void DisplayServer::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) {
WARN_PRINT("Global menus not supported by this display server."); WARN_PRINT("Global menus not supported by this display server.");
@ -76,6 +81,18 @@ DisplayServer::ScreenOrientation DisplayServer::screen_get_orientation(int p_scr
return SCREEN_LANDSCAPE; return SCREEN_LANDSCAPE;
} }
bool DisplayServer::screen_is_touchscreen(int p_screen) const {
//return false;
return Input::get_singleton() && Input::get_singleton()->is_emulating_touch_from_mouse();
}
void DisplayServer::screen_set_keep_on(bool p_enable) {
WARN_PRINT("Keeping screen on not supported by this display server.");
}
bool DisplayServer::screen_is_kept_on() const {
return false;
}
DisplayServer::WindowID DisplayServer::create_sub_window(WindowMode p_mode, uint32_t p_flags, const Rect2i) { DisplayServer::WindowID DisplayServer::create_sub_window(WindowMode p_mode, uint32_t p_flags, const Rect2i) {
ERR_FAIL_V_MSG(INVALID_WINDOW_ID, "Sub-windows not supported by this display server."); ERR_FAIL_V_MSG(INVALID_WINDOW_ID, "Sub-windows not supported by this display server.");
} }
@ -104,7 +121,7 @@ bool DisplayServer::is_console_visible() const {
return false; return false;
} }
void DisplayServer::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect) { void DisplayServer::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_legth) {
WARN_PRINT("Virtual keyboard not supported by this display server."); WARN_PRINT("Virtual keyboard not supported by this display server.");
} }
void DisplayServer::virtual_keyboard_hide() { void DisplayServer::virtual_keyboard_hide() {
@ -180,7 +197,32 @@ void DisplayServer::set_native_icon(const String &p_filename) {
WARN_PRINT("Native icon not supported by this display server."); WARN_PRINT("Native icon not supported by this display server.");
} }
void DisplayServer::set_icon(const Ref<Image> &p_icon) { void DisplayServer::set_icon(const Ref<Image> &p_icon) {
WARN_PRINT("Iconnot supported by this display server."); WARN_PRINT("Icon not supported by this display server.");
}
void DisplayServer::_set_use_vsync(bool p_enable) {
WARN_PRINT("VSync not supported by this display server.");
}
void DisplayServer::vsync_set_enabled(bool p_enable) {
vsync_enabled = p_enable;
if (switch_vsync_function) { //if a function was set, use function
switch_vsync_function(p_enable);
} else { //otherwise just call here
_set_use_vsync(p_enable);
}
}
bool DisplayServer::vsync_is_enabled() const {
return vsync_enabled;
}
void DisplayServer::vsync_set_use_via_compositor(bool p_enable) {
WARN_PRINT("VSync via compositor not supported by this display server.");
}
bool DisplayServer::vsync_is_using_via_compositor() const {
return false;
}
void DisplayServer::set_context(Context p_context) {
} }
void DisplayServer::_bind_methods() { void DisplayServer::_bind_methods() {
@ -214,6 +256,9 @@ void DisplayServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("screen_set_orientation", "orientation", "screen"), &DisplayServer::screen_set_orientation, DEFVAL(SCREEN_OF_MAIN_WINDOW)); ClassDB::bind_method(D_METHOD("screen_set_orientation", "orientation", "screen"), &DisplayServer::screen_set_orientation, DEFVAL(SCREEN_OF_MAIN_WINDOW));
ClassDB::bind_method(D_METHOD("screen_get_orientation", "screen"), &DisplayServer::screen_get_orientation, DEFVAL(SCREEN_OF_MAIN_WINDOW)); ClassDB::bind_method(D_METHOD("screen_get_orientation", "screen"), &DisplayServer::screen_get_orientation, DEFVAL(SCREEN_OF_MAIN_WINDOW));
ClassDB::bind_method(D_METHOD("screen_set_keep_on", "enable"), &DisplayServer::screen_set_keep_on);
ClassDB::bind_method(D_METHOD("screen_is_kept_on"), &DisplayServer::screen_is_kept_on);
ClassDB::bind_method(D_METHOD("get_window_list"), &DisplayServer::get_window_list); ClassDB::bind_method(D_METHOD("get_window_list"), &DisplayServer::get_window_list);
ClassDB::bind_method(D_METHOD("create_sub_window", "mode", "rect"), &DisplayServer::create_sub_window, DEFVAL(Rect2i())); ClassDB::bind_method(D_METHOD("create_sub_window", "mode", "rect"), &DisplayServer::create_sub_window, DEFVAL(Rect2i()));
@ -258,14 +303,14 @@ void DisplayServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("console_set_visible", "console_visible"), &DisplayServer::console_set_visible); ClassDB::bind_method(D_METHOD("console_set_visible", "console_visible"), &DisplayServer::console_set_visible);
ClassDB::bind_method(D_METHOD("is_console_visible"), &DisplayServer::is_console_visible); ClassDB::bind_method(D_METHOD("is_console_visible"), &DisplayServer::is_console_visible);
ClassDB::bind_method(D_METHOD("virtual_keyboard_show", "existing_text", "position"), &DisplayServer::virtual_keyboard_show, DEFVAL(Rect2i())); ClassDB::bind_method(D_METHOD("virtual_keyboard_show", "existing_text", "position", "max_length"), &DisplayServer::virtual_keyboard_show, DEFVAL(Rect2i()), DEFVAL(-1));
ClassDB::bind_method(D_METHOD("virtual_keyboard_hide"), &DisplayServer::virtual_keyboard_hide); ClassDB::bind_method(D_METHOD("virtual_keyboard_hide"), &DisplayServer::virtual_keyboard_hide);
ClassDB::bind_method(D_METHOD("virtual_keyboard_get_height"), &DisplayServer::virtual_keyboard_get_height); ClassDB::bind_method(D_METHOD("virtual_keyboard_get_height"), &DisplayServer::virtual_keyboard_get_height);
ClassDB::bind_method(D_METHOD("cursor_set_shape", "shape"), &DisplayServer::cursor_set_shape); ClassDB::bind_method(D_METHOD("cursor_set_shape", "shape"), &DisplayServer::cursor_set_shape);
ClassDB::bind_method(D_METHOD("cursor_get_shape"), &DisplayServer::cursor_get_shape); ClassDB::bind_method(D_METHOD("cursor_get_shape"), &DisplayServer::cursor_get_shape);
ClassDB::bind_method(D_METHOD("cursor_set_custom_image", "cursor", "shape", "hotspot"), &DisplayServer::cursor_set_custom_image); ClassDB::bind_method(D_METHOD("cursor_set_custom_image", "cursor", "shape", "hotspot"), &DisplayServer::cursor_set_custom_image, DEFVAL(CURSOR_ARROW), DEFVAL(Vector2()));
ClassDB::bind_method(D_METHOD("get_swap_ok_cancel"), &DisplayServer::get_swap_ok_cancel); ClassDB::bind_method(D_METHOD("get_swap_ok_cancel"), &DisplayServer::get_swap_ok_cancel);
@ -285,6 +330,12 @@ void DisplayServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("process_events"), &DisplayServer::process_events); ClassDB::bind_method(D_METHOD("process_events"), &DisplayServer::process_events);
ClassDB::bind_method(D_METHOD("force_process_and_drop_events"), &DisplayServer::force_process_and_drop_events); ClassDB::bind_method(D_METHOD("force_process_and_drop_events"), &DisplayServer::force_process_and_drop_events);
ClassDB::bind_method(D_METHOD("vsync_set_enabled", "enabled"), &DisplayServer::vsync_set_enabled);
ClassDB::bind_method(D_METHOD("vsync_is_enabled"), &DisplayServer::vsync_is_enabled);
ClassDB::bind_method(D_METHOD("vsync_set_use_via_compositor", "enabled"), &DisplayServer::vsync_set_use_via_compositor);
ClassDB::bind_method(D_METHOD("vsync_is_using_via_compositor"), &DisplayServer::vsync_is_using_via_compositor);
ClassDB::bind_method(D_METHOD("set_native_icon", "filename"), &DisplayServer::set_native_icon); ClassDB::bind_method(D_METHOD("set_native_icon", "filename"), &DisplayServer::set_native_icon);
ClassDB::bind_method(D_METHOD("set_icon", "image"), &DisplayServer::set_icon); ClassDB::bind_method(D_METHOD("set_icon", "image"), &DisplayServer::set_icon);
@ -367,8 +418,56 @@ void DisplayServer::_bind_methods() {
BIND_ENUM_CONSTANT(LATIN_KEYBOARD_NEO); BIND_ENUM_CONSTANT(LATIN_KEYBOARD_NEO);
BIND_ENUM_CONSTANT(LATIN_KEYBOARD_COLEMAK); BIND_ENUM_CONSTANT(LATIN_KEYBOARD_COLEMAK);
} }
void DisplayServer::register_create_function(const char *p_name, CreateFunction p_function, GetVideoDriversFunction p_get_drivers) {
ERR_FAIL_COND(server_create_count == MAX_SERVERS);
server_create_functions[server_create_count].create_function = p_function;
server_create_functions[server_create_count].name = p_name;
server_create_count++;
}
int DisplayServer::get_create_function_count() {
return server_create_count;
}
const char *DisplayServer::get_create_function_name(int p_index) {
ERR_FAIL_INDEX_V(p_index, server_create_count, nullptr);
return server_create_functions[p_index].name;
}
Vector<String> DisplayServer::get_create_function_rendering_drivers(int p_index) {
ERR_FAIL_INDEX_V(p_index, server_create_count, Vector<String>());
return server_create_functions[p_index].get_rendering_drivers_function();
}
DisplayServer *DisplayServer::create(int p_index, const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {
ERR_FAIL_INDEX_V(p_index, server_create_count, nullptr);
return server_create_functions[p_index].create_function(p_rendering_driver, p_mode, p_flags, p_resolution, r_error);
}
void DisplayServer::_input_set_mouse_mode(Input::MouseMode p_mode) {
singleton->mouse_set_mode(MouseMode(p_mode));
}
Input::MouseMode DisplayServer::_input_get_mouse_mode() {
return Input::MouseMode(singleton->mouse_get_mode());
}
void DisplayServer::_input_warp(const Vector2 &p_to_pos) {
singleton->mouse_warp_to_position(p_to_pos);
}
Input::CursorShape DisplayServer::_input_get_current_cursor_shape() {
return (Input::CursorShape)singleton->cursor_get_shape();
}
void DisplayServer::_input_set_custom_mouse_cursor_func(const RES &p_image, Input::CursorShape p_shape, const Vector2 &p_hostspot) {
singleton->cursor_set_custom_image(p_image, (CursorShape)p_shape, p_hostspot);
}
DisplayServer::DisplayServer() { DisplayServer::DisplayServer() {
singleton = this; singleton = this;
Input::set_mouse_mode_func = _input_set_mouse_mode;
Input::get_mouse_mode_func = _input_get_mouse_mode;
Input::warp_mouse_func = _input_warp;
Input::get_current_cursor_shape_func = _input_get_current_cursor_shape;
Input::set_custom_mouse_cursor_func = _input_set_custom_mouse_cursor_func;
} }
DisplayServer::~DisplayServer() { DisplayServer::~DisplayServer() {
} }

View file

@ -31,6 +31,7 @@
#ifndef DISPLAY_SERVER_H #ifndef DISPLAY_SERVER_H
#define DISPLAY_SERVER_H #define DISPLAY_SERVER_H
#include "core/input/input.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/resource.h" #include "core/resource.h"
@ -38,9 +39,45 @@ class DisplayServer : public Object {
GDCLASS(DisplayServer, Object) GDCLASS(DisplayServer, Object)
static DisplayServer *singleton; static DisplayServer *singleton;
bool vsync_enabled = true;
public:
_FORCE_INLINE_ static DisplayServer *get_singleton() {
return singleton;
}
enum WindowMode {
WINDOW_MODE_WINDOWED,
WINDOW_MODE_MINIMIZED,
WINDOW_MODE_MAXIMIZED,
WINDOW_MODE_FULLSCREEN
};
typedef DisplayServer *(*CreateFunction)(const String &, WindowMode, uint32_t, const Size2i &, Error &r_error); //video driver, window mode, resolution
typedef Vector<String> (*GetVideoDriversFunction)(); //video driver, window mode, resolution
private:
static void _input_set_mouse_mode(Input::MouseMode p_mode);
static Input::MouseMode _input_get_mouse_mode();
static void _input_warp(const Vector2 &p_to_pos);
static Input::CursorShape _input_get_current_cursor_shape();
static void _input_set_custom_mouse_cursor_func(const RES &, Input::CursorShape, const Vector2 &p_hostspot);
protected: protected:
static void _bind_methods(); static void _bind_methods();
enum {
MAX_SERVERS = 64
};
struct DisplayServerCreate {
const char *name;
GetVideoDriversFunction get_rendering_drivers_function;
CreateFunction create_function;
};
static DisplayServerCreate server_create_functions[MAX_SERVERS];
static int server_create_count;
friend class VisualServerRaster;
virtual void _set_use_vsync(bool p_enable);
public: public:
enum Feature { enum Feature {
@ -62,7 +99,8 @@ public:
FEATURE_ICON, FEATURE_ICON,
FEATURE_NATIVE_ICON, FEATURE_NATIVE_ICON,
FEATURE_ORIENTATION, FEATURE_ORIENTATION,
FEATURE_SWAP_BUFFERS FEATURE_SWAP_BUFFERS,
FEATURE_KEEP_SCREEN_ON,
}; };
@ -101,8 +139,7 @@ public:
virtual Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0; virtual Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0;
virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0; virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0;
virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0; virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0;
virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0; virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const;
enum ScreenOrientation { enum ScreenOrientation {
SCREEN_LANDSCAPE, SCREEN_LANDSCAPE,
@ -117,6 +154,8 @@ public:
virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW); virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW);
ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const; ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const;
virtual void screen_set_keep_on(bool p_enable); //disable screensaver
virtual bool screen_is_kept_on() const;
enum { enum {
MAIN_WINDOW_ID = 0, MAIN_WINDOW_ID = 0,
INVALID_WINDOW_ID = -1 INVALID_WINDOW_ID = -1
@ -126,13 +165,6 @@ public:
virtual Vector<int> get_window_list() const = 0; virtual Vector<int> get_window_list() const = 0;
enum WindowMode {
WINDOW_MODE_WINDOWED,
WINDOW_MODE_MINIMIZED,
WINDOW_MODE_MAXIMIZED,
WINDOW_MODE_FULLSCREEN
};
enum WindowFlags { enum WindowFlags {
WINDOW_FLAG_RESIZE_DISABLED, WINDOW_FLAG_RESIZE_DISABLED,
WINDOW_FLAG_BORDERLESS, WINDOW_FLAG_BORDERLESS,
@ -179,6 +211,8 @@ public:
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const = 0; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const = 0;
virtual bool can_any_window_draw() const = 0;
virtual void window_set_ime_active(const bool p_active, WindowID p_window = MAIN_WINDOW_ID); virtual void window_set_ime_active(const bool p_active, WindowID p_window = MAIN_WINDOW_ID);
virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID); virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID);
@ -188,7 +222,7 @@ public:
virtual void console_set_visible(bool p_enabled); virtual void console_set_visible(bool p_enabled);
virtual bool is_console_visible() const; virtual bool is_console_visible() const;
virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2()); virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_legth = -1);
virtual void virtual_keyboard_hide(); virtual void virtual_keyboard_hide();
// returns height of the currently shown virtual keyboard (0 if keyboard is hidden) // returns height of the currently shown virtual keyboard (0 if keyboard is hidden)
@ -216,7 +250,7 @@ public:
}; };
virtual void cursor_set_shape(CursorShape p_shape); virtual void cursor_set_shape(CursorShape p_shape);
virtual CursorShape cursor_get_shape() const; virtual CursorShape cursor_get_shape() const;
virtual void cursor_set_custom_image(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot); virtual void cursor_set_custom_image(const RES &p_cursor, CursorShape p_shape = CURSOR_ARROW, const Vector2 &p_hotspot = Vector2());
virtual bool get_swap_ok_cancel(); virtual bool get_swap_ok_cancel();
@ -255,8 +289,31 @@ public:
virtual void set_native_icon(const String &p_filename); virtual void set_native_icon(const String &p_filename);
virtual void set_icon(const Ref<Image> &p_icon); virtual void set_icon(const Ref<Image> &p_icon);
typedef Vector<String> *(*GetSupportedVideoDriversFunction)(); typedef void (*SwitchVSyncCallbackInThread)(bool);
typedef DisplayServer *(*CreateFunction)(const String &, WindowMode, uint32_t, const Size2i &, Error &r_error); //video driver, window mode, resolution
static SwitchVSyncCallbackInThread switch_vsync_function;
void vsync_set_enabled(bool p_enable);
bool vsync_is_enabled() const;
virtual void vsync_set_use_via_compositor(bool p_enable);
virtual bool vsync_is_using_via_compositor() const;
//real, actual overridable function to switch vsync, which needs to be called from graphics thread if needed
enum Context {
CONTEXT_EDITOR,
CONTEXT_PROJECTMAN,
CONTEXT_ENGINE,
};
virtual void set_context(Context p_context);
static void register_create_function(const char *p_name, CreateFunction p_function, GetVideoDriversFunction p_get_drivers);
static int get_create_function_count();
static const char *get_create_function_name(int p_index);
static Vector<String> get_create_function_rendering_drivers(int p_index);
static DisplayServer *create(int p_index, const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);
DisplayServer(); DisplayServer();
~DisplayServer(); ~DisplayServer();

View file

@ -234,7 +234,7 @@ void VisualServerRaster::set_debug_generate_wireframes(bool p_generate) {
} }
void VisualServerRaster::call_set_use_vsync(bool p_enable) { void VisualServerRaster::call_set_use_vsync(bool p_enable) {
OS::get_singleton()->_set_use_vsync(p_enable); DisplayServer::get_singleton()->_set_use_vsync(p_enable);
} }
bool VisualServerRaster::is_low_end() const { bool VisualServerRaster::is_low_end() const {

View file

@ -31,6 +31,7 @@
#include "visual_server_wrap_mt.h" #include "visual_server_wrap_mt.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/project_settings.h" #include "core/project_settings.h"
#include "servers/display_server.h"
void VisualServerWrapMT::thread_exit() { void VisualServerWrapMT::thread_exit() {
@ -61,7 +62,7 @@ void VisualServerWrapMT::thread_loop() {
server_thread = Thread::get_caller_id(); server_thread = Thread::get_caller_id();
OS::get_singleton()->make_rendering_thread(); DisplayServer::get_singleton()->make_rendering_thread();
visual_server->init(); visual_server->init();
@ -108,7 +109,7 @@ void VisualServerWrapMT::init() {
if (create_thread) { if (create_thread) {
print_verbose("VisualServerWrapMT: Creating render thread"); print_verbose("VisualServerWrapMT: Creating render thread");
OS::get_singleton()->release_rendering_thread(); DisplayServer::get_singleton()->release_rendering_thread();
if (create_thread) { if (create_thread) {
thread = Thread::create(_thread_callback, this); thread = Thread::create(_thread_callback, this);
print_verbose("VisualServerWrapMT: Starting render thread"); print_verbose("VisualServerWrapMT: Starting render thread");
@ -173,7 +174,7 @@ VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_
command_queue(p_create_thread) { command_queue(p_create_thread) {
singleton_mt = this; singleton_mt = this;
OS::switch_vsync_function = set_use_vsync_callback; //as this goes to another thread, make sure it goes properly DisplayServer::switch_vsync_function = set_use_vsync_callback; //as this goes to another thread, make sure it goes properly
visual_server = p_contained; visual_server = p_contained;
create_thread = p_create_thread; create_thread = p_create_thread;