Effective DisplayServer separation, rename X11 -> LinuxBSD
This commit is contained in:
parent
4396e98834
commit
f8a79a97c7
83 changed files with 1304 additions and 5378 deletions
|
|
@ -3,20 +3,21 @@
|
|||
Import('env')
|
||||
|
||||
from platform_methods import run_in_subprocess
|
||||
import platform_x11_builders
|
||||
import platform_linuxbsd_builders
|
||||
|
||||
common_x11 = [
|
||||
"context_gl_x11.cpp",
|
||||
"vulkan_context_x11.cpp",
|
||||
"crash_handler_x11.cpp",
|
||||
"os_x11.cpp",
|
||||
"key_mapping_x11.cpp",
|
||||
"display_server_x11.cpp",
|
||||
"crash_handler_linuxbsd.cpp",
|
||||
"os_linuxbsd.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"]:
|
||||
env.AddPostAction(prog, run_in_subprocess(platform_x11_builders.make_debug_x11))
|
||||
env.AddPostAction(prog, run_in_subprocess(platform_linuxbsd_builders.make_debug_linuxbsd))
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* crash_handler_x11.cpp */
|
||||
/* crash_handler_linuxbsd.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
/* 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/project_settings.h"
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* crash_handler_x11.h */
|
||||
/* crash_handler_linuxbsd.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -8,7 +8,7 @@ def is_active():
|
|||
|
||||
|
||||
def get_name():
|
||||
return "X11"
|
||||
return "LinuxBSD"
|
||||
|
||||
|
||||
def can_build():
|
||||
|
|
@ -317,7 +317,7 @@ def configure(env):
|
|||
if not env['builtin_zlib']:
|
||||
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=['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")
|
||||
else:
|
||||
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:
|
||||
env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.legacy.ld'])
|
||||
env.Append(LINKFLAGS=['-T', 'platform/linuxbsd/pck_embed.legacy.ld'])
|
||||
|
||||
## Cross-compilation
|
||||
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* detect_prime.cpp */
|
||||
/* detect_prime_x11.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* detect_prime.h */
|
||||
/* detect_prime_x11.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#ifdef X11_ENABLED
|
||||
|
||||
#include "detect_prime.h"
|
||||
#include "detect_prime_x11.h"
|
||||
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/print_string.h"
|
||||
|
|
@ -608,7 +608,8 @@ bool DisplayServerX11::screen_is_touchscreen(int p_screen) const {
|
|||
#ifndef _MSC_VER
|
||||
#warning Need to get from proper window
|
||||
#endif
|
||||
return false; //?
|
||||
|
||||
return DisplayServer::screen_is_touchscreen(p_screen);
|
||||
}
|
||||
|
||||
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];
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
if (rendering_driver == "vulkan") {
|
||||
context_vulkan->window_destroy(wd.vulkan_window);
|
||||
}
|
||||
#endif
|
||||
XUnmapWindow(x11_display, wd.x11_window);
|
||||
XDestroyWindow(x11_display, wd.x11_window);
|
||||
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) {
|
||||
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), -1);
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), -1);
|
||||
const WindowData &wd = windows[p_window];
|
||||
|
||||
int x, y;
|
||||
|
|
@ -677,7 +683,7 @@ int DisplayServerX11::window_get_current_screen(WindowID p_window) const {
|
|||
return 0;
|
||||
}
|
||||
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];
|
||||
|
||||
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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), Point2i());
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), Point2i());
|
||||
const WindowData &wd = windows[p_window];
|
||||
int x, y;
|
||||
Window child;
|
||||
|
|
@ -705,7 +711,7 @@ Point2i DisplayServerX11::window_get_position(WindowID p_window) const {
|
|||
return Point2i(x, y);
|
||||
}
|
||||
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];
|
||||
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(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))) {
|
||||
|
|
@ -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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), Size2i());
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
|
||||
const WindowData &wd = windows[p_window];
|
||||
|
||||
return wd.max_size;
|
||||
}
|
||||
|
||||
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];
|
||||
|
||||
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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), Size2i());
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
|
||||
const WindowData &wd = windows[p_window];
|
||||
|
||||
return wd.min_size;
|
||||
}
|
||||
|
||||
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];
|
||||
|
||||
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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), Size2i());
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), Size2i());
|
||||
const WindowData &wd = windows[p_window];
|
||||
return wd.size;
|
||||
}
|
||||
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];
|
||||
|
||||
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 {
|
||||
|
||||
ERR_FAIL_COND_V(windows.has(p_window), false);
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), false);
|
||||
const WindowData &wd = windows[p_window];
|
||||
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
// 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) {
|
||||
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[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 {
|
||||
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];
|
||||
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
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 {
|
||||
ERR_FAIL_COND_V(windows.has(p_window), false);
|
||||
ERR_FAIL_COND_V(!windows.has(p_window), false);
|
||||
const WindowData &wd = windows[p_window];
|
||||
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
// 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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
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
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
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) {
|
||||
ERR_FAIL_COND(windows.has(p_window));
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
wd.im_position = p_pos;
|
||||
|
|
@ -2003,7 +2019,7 @@ void DisplayServerX11::_window_changed(XEvent *event) {
|
|||
wd.size.height = event->xconfigure.height;
|
||||
|
||||
#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);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -2634,15 +2650,59 @@ void DisplayServerX11::process_events() {
|
|||
}
|
||||
|
||||
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) {
|
||||
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.");
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
@ -2678,7 +2751,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, c
|
|||
WindowID id;
|
||||
{
|
||||
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);
|
||||
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");
|
||||
}
|
||||
|
||||
_update_context(wd);
|
||||
|
||||
id = window_id_counter++;
|
||||
|
||||
windows[id] = wd;
|
||||
|
|
@ -2788,7 +2863,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, c
|
|||
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;
|
||||
|
||||
|
|
@ -2870,8 +2945,8 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
|
|||
}
|
||||
|
||||
if (!_refresh_device_info()) {
|
||||
OS::get_singleton()->alert("Your system does not support XInput 2.\n"
|
||||
"Please upgrade your distribution.",
|
||||
alert("Your system does not support XInput 2.\n"
|
||||
"Please upgrade your distribution.",
|
||||
"Unable to initialize XInput");
|
||||
r_error = ERR_UNAVAILABLE;
|
||||
return;
|
||||
|
|
@ -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
|
||||
video_driver = p_video_driver;
|
||||
rendering_driver = p_rendering_driver;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#warning Forcing vulkan video driver because OpenGL not implemented yet
|
||||
#warning Forcing vulkan rendering driver because OpenGL not implemented yet
|
||||
#endif
|
||||
video_driver = "vulkan";
|
||||
rendering_driver = "vulkan";
|
||||
|
||||
#if defined(VULKAN_ENABLED)
|
||||
if (video_driver == "vulkan") {
|
||||
if (rendering_driver == "vulkan") {
|
||||
|
||||
context_vulkan = memnew(VulkanContextX11);
|
||||
if (context_vulkan->initialize() != OK) {
|
||||
|
|
@ -2947,17 +3022,11 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
|
|||
r_error = ERR_CANT_CREATE;
|
||||
ERR_FAIL_MSG("Could not initialize Vulkan");
|
||||
}
|
||||
|
||||
//temporary
|
||||
rendering_device_vulkan = memnew(RenderingDeviceVulkan);
|
||||
rendering_device_vulkan->initialize(context_vulkan);
|
||||
|
||||
RasterizerRD::make_current();
|
||||
}
|
||||
#endif
|
||||
// Init context and rendering device
|
||||
#if defined(OPENGL_ENABLED)
|
||||
if (video_driver == "opengl_es") {
|
||||
if (rendering_driver == "opengl_es") {
|
||||
if (getenv("DRI_PRIME") == NULL) {
|
||||
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);
|
||||
if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
|
||||
|
|
@ -3190,8 +3271,6 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
|
|||
|
||||
requested = None;
|
||||
|
||||
visual_server->init();
|
||||
|
||||
window_has_focus = true; // Set focus to true at init
|
||||
|
||||
/*if (p_desired.layered) {
|
||||
|
|
@ -3211,6 +3290,58 @@ DisplayServerX11::DisplayServerX11(const String &p_video_driver, WindowMode p_mo
|
|||
r_error = OK;
|
||||
}
|
||||
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
|
||||
|
|
@ -36,7 +36,7 @@
|
|||
#include "servers/display_server.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"
|
||||
|
|
@ -52,7 +52,7 @@
|
|||
|
||||
#if defined(VULKAN_ENABLED)
|
||||
#include "drivers/vulkan/rendering_device_vulkan.h"
|
||||
#include "platform/x11/vulkan_context_x11.h"
|
||||
#include "platform/linuxbsd/vulkan_context_x11.h"
|
||||
#endif
|
||||
|
||||
#include <X11/Xcursor/Xcursor.h>
|
||||
|
|
@ -110,9 +110,6 @@ class DisplayServerX11 : public DisplayServer {
|
|||
RenderingDeviceVulkan *rendering_device_vulkan;
|
||||
#endif
|
||||
|
||||
//Rasterizer *rasterizer;
|
||||
VisualServer *visual_server;
|
||||
|
||||
struct WindowData {
|
||||
Window x11_window;
|
||||
::XIC xic;
|
||||
|
|
@ -200,7 +197,7 @@ class DisplayServerX11 : public DisplayServer {
|
|||
|
||||
bool layered_window;
|
||||
|
||||
String video_driver;
|
||||
String rendering_driver;
|
||||
bool window_focused;
|
||||
//void set_wm_border(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_maximized(WindowID p_window, bool p_enabled);
|
||||
|
||||
void _update_context(WindowData &wd);
|
||||
|
||||
Context context = CONTEXT_ENGINE;
|
||||
|
||||
protected:
|
||||
void _window_changed(XEvent *event);
|
||||
|
||||
|
|
@ -286,6 +287,8 @@ public:
|
|||
|
||||
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_position(const Point2i &p_pos, WindowID p_window = MAIN_WINDOW_ID);
|
||||
|
||||
|
|
@ -301,12 +304,17 @@ public:
|
|||
virtual void make_rendering_thread();
|
||||
virtual void swap_buffers();
|
||||
|
||||
virtual void set_context(Context p_context);
|
||||
|
||||
virtual void set_native_icon(const String &p_filename);
|
||||
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();
|
||||
};
|
||||
|
||||
|
|
@ -32,17 +32,17 @@
|
|||
|
||||
#include "core/os/file_access.h"
|
||||
#include "editor/editor_export.h"
|
||||
#include "platform/x11/logo.gen.h"
|
||||
#include "platform/linuxbsd/logo.gen.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);
|
||||
|
||||
void register_x11_exporter() {
|
||||
void register_linuxbsd_exporter() {
|
||||
|
||||
Ref<EditorExportPlatformPC> platform;
|
||||
platform.instance();
|
||||
|
||||
Ref<Image> img = memnew(Image(_x11_logo));
|
||||
Ref<Image> img = memnew(Image(_linuxbsd_logo));
|
||||
Ref<ImageTexture> logo;
|
||||
logo.instance();
|
||||
logo->create_from_image(img);
|
||||
|
|
@ -28,9 +28,9 @@
|
|||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef X11_EXPORT_H
|
||||
#define X11_EXPORT_H
|
||||
#ifndef LINUXBSD_EXPORT_H
|
||||
#define LINUXBSD_EXPORT_H
|
||||
|
||||
void register_x11_exporter();
|
||||
void register_linuxbsd_exporter();
|
||||
|
||||
#endif // X11_EXPORT_H
|
||||
#endif // LINUXBSD_EXPORT_H
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* godot_x11.cpp */
|
||||
/* godot_linuxbsd.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -34,11 +34,11 @@
|
|||
#include <unistd.h>
|
||||
|
||||
#include "main/main.h"
|
||||
#include "os_x11.h"
|
||||
#include "os_linuxbsd.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
OS_X11 os;
|
||||
OS_LinuxBSD os;
|
||||
|
||||
setlocale(LC_CTYPE, "");
|
||||
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
381
platform/linuxbsd/os_linuxbsd.cpp
Normal file
381
platform/linuxbsd/os_linuxbsd.cpp
Normal 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
|
||||
}
|
||||
106
platform/linuxbsd/os_linuxbsd.h
Normal file
106
platform/linuxbsd/os_linuxbsd.h
Normal 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
|
||||
|
|
@ -7,7 +7,7 @@ import os
|
|||
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('strip --strip-debug --strip-unneeded {0}'.format(target[0]))
|
||||
os.system('objcopy --add-gnu-debuglink={0}.debugsymbols {0}'.format(target[0]))
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
#include "platform/osx/crash_handler_osx.h"
|
||||
#include "platform/osx/semaphore_osx.h"
|
||||
#else
|
||||
#include "platform/x11/crash_handler_x11.h"
|
||||
#include "platform/x11/crash_handler_linuxbsd.h"
|
||||
#endif
|
||||
#include "servers/audio_server.h"
|
||||
#include "servers/visual/rasterizer.h"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue