diff options
Diffstat (limited to 'platform/linuxbsd')
23 files changed, 541 insertions, 466 deletions
diff --git a/platform/linuxbsd/crash_handler_linuxbsd.cpp b/platform/linuxbsd/crash_handler_linuxbsd.cpp index 0e98af71fa..b4ec7924f6 100644 --- a/platform/linuxbsd/crash_handler_linuxbsd.cpp +++ b/platform/linuxbsd/crash_handler_linuxbsd.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -33,7 +33,6 @@  #include "core/config/project_settings.h"  #include "core/os/os.h"  #include "core/version.h" -#include "core/version_hash.gen.h"  #include "main/main.h"  #ifdef DEBUG_ENABLED @@ -71,10 +70,10 @@ static void handle_crash(int sig) {  	}  	// Print the engine version just before, so that people are reminded to include the version in backtrace reports. -	if (String(VERSION_HASH).length() != 0) { -		fprintf(stderr, "Engine version: " VERSION_FULL_NAME " (" VERSION_HASH ")\n"); +	if (String(VERSION_HASH).is_empty()) { +		fprintf(stderr, "Engine version: %s\n", VERSION_FULL_NAME);  	} else { -		fprintf(stderr, "Engine version: " VERSION_FULL_NAME "\n"); +		fprintf(stderr, "Engine version: %s (%s)\n", VERSION_FULL_NAME, VERSION_HASH);  	}  	fprintf(stderr, "Dumping the backtrace. %s\n", msg.utf8().get_data());  	char **strings = backtrace_symbols(bt_buffer, size); @@ -115,7 +114,7 @@ static void handle_crash(int sig) {  			int ret;  			Error err = OS::get_singleton()->execute(String("addr2line"), args, &output, &ret);  			if (err == OK) { -				output.erase(output.length() - 1, 1); +				output = output.substr(0, output.length() - 1);  			}  			fprintf(stderr, "[%ld] %s (%s)\n", (long int)i, fname, output.utf8().get_data()); diff --git a/platform/linuxbsd/crash_handler_linuxbsd.h b/platform/linuxbsd/crash_handler_linuxbsd.h index a3dae0cc22..2e44476c3f 100644 --- a/platform/linuxbsd/crash_handler_linuxbsd.h +++ b/platform/linuxbsd/crash_handler_linuxbsd.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 07e16a982b..ab643b254a 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -161,7 +161,7 @@ def configure(env):          env.Append(LINKFLAGS=["-ftest-coverage", "-fprofile-arcs"])      if env["use_ubsan"] or env["use_asan"] or env["use_lsan"] or env["use_tsan"] or env["use_msan"]: -        env.extra_suffix += "s" +        env.extra_suffix += ".san"          if env["use_ubsan"]:              env.Append( diff --git a/platform/linuxbsd/detect_prime_x11.cpp b/platform/linuxbsd/detect_prime_x11.cpp index c775546f15..63531d33fa 100644 --- a/platform/linuxbsd/detect_prime_x11.cpp +++ b/platform/linuxbsd/detect_prime_x11.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -91,7 +91,7 @@ void create_context() {  	};  	int fbcount; -	GLXFBConfig fbconfig = 0; +	GLXFBConfig fbconfig = nullptr;  	XVisualInfo *vi = nullptr;  	XSetWindowAttributes swa; @@ -100,8 +100,9 @@ void create_context() {  	unsigned long valuemask = CWBorderPixel | CWColormap | CWEventMask;  	GLXFBConfig *fbc = glXChooseFBConfig(x11_display, DefaultScreen(x11_display), visual_attribs, &fbcount); -	if (!fbc) +	if (!fbc) {  		exit(1); +	}  	vi = glXGetVisualFromFBConfig(x11_display, fbc[0]); @@ -120,8 +121,9 @@ void create_context() {  	swa.colormap = XCreateColormap(x11_display, RootWindow(x11_display, vi->screen), vi->visual, AllocNone);  	x11_window = XCreateWindow(x11_display, RootWindow(x11_display, vi->screen), 0, 0, 10, 10, 0, vi->depth, InputOutput, vi->visual, valuemask, &swa); -	if (!x11_window) +	if (!x11_window) {  		exit(1); +	}  	glXMakeCurrent(x11_display, x11_window, glx_context);  	XFree(vi); @@ -179,8 +181,9 @@ int detect_prime() {  			close(fdset[0]); -			if (i) +			if (i) {  				setenv("DRI_PRIME", "1", 1); +			}  			create_context();  			const char *vendor = (const char *)glGetString(GL_VENDOR); diff --git a/platform/linuxbsd/detect_prime_x11.h b/platform/linuxbsd/detect_prime_x11.h index 88d00b3acd..e60f9ebfdf 100644 --- a/platform/linuxbsd/detect_prime_x11.h +++ b/platform/linuxbsd/detect_prime_x11.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index c4e828bdb2..86c3534fc9 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -33,6 +33,7 @@  #ifdef X11_ENABLED  #include "core/config/project_settings.h" +#include "core/math/math_funcs.h"  #include "core/string/print_string.h"  #include "core/string/ustring.h"  #include "detect_prime_x11.h" @@ -64,7 +65,6 @@  // EWMH  #define _NET_WM_STATE_REMOVE 0L // remove/unset property  #define _NET_WM_STATE_ADD 1L // add/set property -#define _NET_WM_STATE_TOGGLE 2L // toggle property  #include <dlfcn.h>  #include <fcntl.h> @@ -225,7 +225,7 @@ bool DisplayServerX11::_refresh_device_info() {  				if (class_info->number == VALUATOR_ABSX && class_info->mode == XIModeAbsolute) {  					resolution_x = class_info->resolution;  					abs_x_min = class_info->min; -					abs_y_max = class_info->max; +					abs_x_max = class_info->max;  					absolute_mode = true;  				} else if (class_info->number == VALUATOR_ABSY && class_info->mode == XIModeAbsolute) {  					resolution_y = class_info->resolution; @@ -239,8 +239,8 @@ bool DisplayServerX11::_refresh_device_info() {  					tilt_x_min = class_info->min;  					tilt_x_max = class_info->max;  				} else if (class_info->number == VALUATOR_TILTY && class_info->mode == XIModeAbsolute) { -					tilt_x_min = class_info->min; -					tilt_x_max = class_info->max; +					tilt_y_min = class_info->min; +					tilt_y_max = class_info->max;  				}  			}  		} @@ -286,7 +286,7 @@ void DisplayServerX11::_flush_mouse_motion() {  			XIDeviceEvent *event_data = (XIDeviceEvent *)event.xcookie.data;  			if (event_data->evtype == XI_RawMotion) {  				XFreeEventData(x11_display, &event.xcookie); -				polled_events.remove(event_index--); +				polled_events.remove_at(event_index--);  				continue;  			}  			XFreeEventData(x11_display, &event.xcookie); @@ -324,20 +324,21 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) {  	if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {  		//flush pending motion events  		_flush_mouse_motion(); -		WindowData &main_window = windows[MAIN_WINDOW_ID]; +		WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; +		WindowData &window = windows[window_id];  		if (XGrabPointer( -					x11_display, main_window.x11_window, True, +					x11_display, window.x11_window, True,  					ButtonPressMask | ButtonReleaseMask | PointerMotionMask, -					GrabModeAsync, GrabModeAsync, windows[MAIN_WINDOW_ID].x11_window, None, CurrentTime) != GrabSuccess) { +					GrabModeAsync, GrabModeAsync, window.x11_window, None, CurrentTime) != GrabSuccess) {  			ERR_PRINT("NO GRAB");  		}  		if (mouse_mode == MOUSE_MODE_CAPTURED) { -			center.x = main_window.size.width / 2; -			center.y = main_window.size.height / 2; +			center.x = window.size.width / 2; +			center.y = window.size.height / 2; -			XWarpPointer(x11_display, None, main_window.x11_window, +			XWarpPointer(x11_display, None, window.x11_window,  					0, 0, 0, 0, (int)center.x, (int)center.y);  			Input::get_singleton()->set_mouse_position(center); @@ -359,27 +360,13 @@ void DisplayServerX11::mouse_warp_to_position(const Point2i &p_to) {  	if (mouse_mode == MOUSE_MODE_CAPTURED) {  		last_mouse_pos = p_to;  	} else { -		XWarpPointer(x11_display, None, windows[MAIN_WINDOW_ID].x11_window, +		WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; +		XWarpPointer(x11_display, None, windows[window_id].x11_window,  				0, 0, 0, 0, (int)p_to.x, (int)p_to.y);  	}  }  Point2i DisplayServerX11::mouse_get_position() const { -	int root_x, root_y; -	int win_x, win_y; -	unsigned int mask_return; -	Window window_returned; - -	Bool result = XQueryPointer(x11_display, RootWindow(x11_display, DefaultScreen(x11_display)), &window_returned, -			&window_returned, &root_x, &root_y, &win_x, &win_y, -			&mask_return); -	if (result == True) { -		return Point2i(root_x, root_y); -	} -	return Point2i(); -} - -Point2i DisplayServerX11::mouse_get_absolute_position() const {  	int number_of_screens = XScreenCount(x11_display);  	for (int i = 0; i < number_of_screens; i++) {  		Window root, child; @@ -1068,6 +1055,67 @@ int DisplayServerX11::screen_get_dpi(int p_screen) const {  	return 96;  } +float DisplayServerX11::screen_get_refresh_rate(int p_screen) const { +	_THREAD_SAFE_METHOD_ + +	if (p_screen == SCREEN_OF_MAIN_WINDOW) { +		p_screen = window_get_current_screen(); +	} + +	//invalid screen? +	ERR_FAIL_INDEX_V(p_screen, get_screen_count(), SCREEN_REFRESH_RATE_FALLBACK); + +	//Use xrandr to get screen refresh rate. +	if (xrandr_ext_ok) { +		XRRScreenResources *screen_info = XRRGetScreenResources(x11_display, windows[MAIN_WINDOW_ID].x11_window); +		if (screen_info) { +			RRMode current_mode = 0; +			xrr_monitor_info *monitors = nullptr; + +			if (xrr_get_monitors) { +				int count = 0; +				monitors = xrr_get_monitors(x11_display, windows[MAIN_WINDOW_ID].x11_window, true, &count); +				ERR_FAIL_INDEX_V(p_screen, count, SCREEN_REFRESH_RATE_FALLBACK); +			} else { +				ERR_PRINT("An error occurred while trying to get the screen refresh rate."); +				return SCREEN_REFRESH_RATE_FALLBACK; +			} + +			bool found_active_mode = false; +			for (int crtc = 0; crtc < screen_info->ncrtc; crtc++) { // Loop through outputs to find which one is currently outputting. +				XRRCrtcInfo *monitor_info = XRRGetCrtcInfo(x11_display, screen_info, screen_info->crtcs[crtc]); +				if (monitor_info->x != monitors[p_screen].x || monitor_info->y != monitors[p_screen].y) { // If X and Y aren't the same as the monitor we're looking for, this isn't the right monitor. Continue. +					continue; +				} + +				if (monitor_info->mode != None) { +					current_mode = monitor_info->mode; +					found_active_mode = true; +					break; +				} +			} + +			if (found_active_mode) { +				for (int mode = 0; mode < screen_info->nmode; mode++) { +					XRRModeInfo m_info = screen_info->modes[mode]; +					if (m_info.id == current_mode) { +						// Snap to nearest 0.01 to stay consistent with other platforms. +						return Math::snapped((float)m_info.dotClock / ((float)m_info.hTotal * (float)m_info.vTotal), 0.01); +					} +				} +			} + +			ERR_PRINT("An error occurred while trying to get the screen refresh rate."); // We should have returned the refresh rate by now. An error must have occurred. +			return SCREEN_REFRESH_RATE_FALLBACK; +		} else { +			ERR_PRINT("An error occurred while trying to get the screen refresh rate."); +			return SCREEN_REFRESH_RATE_FALLBACK; +		} +	} +	ERR_PRINT("An error occurred while trying to get the screen refresh rate."); +	return SCREEN_REFRESH_RATE_FALLBACK; +} +  bool DisplayServerX11::screen_is_touchscreen(int p_screen) const {  	_THREAD_SAFE_METHOD_ @@ -1150,7 +1198,7 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {  	}  #ifdef VULKAN_ENABLED -	if (rendering_driver == "vulkan") { +	if (context_vulkan) {  		context_vulkan->window_destroy(p_id);  	}  #endif @@ -1170,6 +1218,24 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {  	windows.erase(p_id);  } +int64_t DisplayServerX11::window_get_native_handle(HandleType p_handle_type, WindowID p_window) const { +	ERR_FAIL_COND_V(!windows.has(p_window), 0); +	switch (p_handle_type) { +		case DISPLAY_HANDLE: { +			return (int64_t)x11_display; +		} +		case WINDOW_HANDLE: { +			return (int64_t)windows[p_window].x11_window; +		} +		case WINDOW_VIEW: { +			return 0; // Not supported. +		} +		default: { +			return 0; +		} +	} +} +  void DisplayServerX11::window_attach_instance_id(ObjectID p_instance, WindowID p_window) {  	ERR_FAIL_COND(!windows.has(p_window));  	WindowData &wd = windows[p_window]; @@ -1330,8 +1396,9 @@ int DisplayServerX11::window_get_current_screen(WindowID p_window) const {  void DisplayServerX11::gl_window_make_current(DisplayServer::WindowID p_window_id) {  #if defined(GLES3_ENABLED) -	if (gl_manager) +	if (gl_manager) {  		gl_manager->window_make_current(p_window_id); +	}  #endif  } @@ -1768,7 +1835,7 @@ void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) {  		Hints hints;  		Atom property;  		hints.flags = 2; -		hints.decorations = window_get_flag(WINDOW_FLAG_BORDERLESS, p_window) ? 0 : 1; +		hints.decorations = wd.borderless ? 0 : 1;  		property = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True);  		if (property != None) {  			XChangeProperty(x11_display, wd.x11_window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5); @@ -1820,6 +1887,7 @@ void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) {  			XSendEvent(x11_display, DefaultRootWindow(x11_display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);  		} break; +		case WINDOW_MODE_EXCLUSIVE_FULLSCREEN:  		case WINDOW_MODE_FULLSCREEN: {  			//Remove full-screen  			wd.fullscreen = false; @@ -1872,6 +1940,7 @@ void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) {  			XSendEvent(x11_display, DefaultRootWindow(x11_display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);  		} break; +		case WINDOW_MODE_EXCLUSIVE_FULLSCREEN:  		case WINDOW_MODE_FULLSCREEN: {  			wd.last_position_before_fs = wd.position; @@ -2408,18 +2477,18 @@ String DisplayServerX11::keyboard_get_layout_name(int p_index) const {  }  Key DisplayServerX11::keyboard_get_keycode_from_physical(Key p_keycode) const { -	unsigned int modifiers = p_keycode & KEY_MODIFIER_MASK; -	unsigned int keycode_no_mod = p_keycode & KEY_CODE_MASK; -	unsigned int xkeycode = KeyMappingX11::get_xlibcode((Key)keycode_no_mod); +	Key modifiers = p_keycode & KeyModifierMask::MODIFIER_MASK; +	Key keycode_no_mod = p_keycode & KeyModifierMask::CODE_MASK; +	unsigned int xkeycode = KeyMappingX11::get_xlibcode(keycode_no_mod);  	KeySym xkeysym = XkbKeycodeToKeysym(x11_display, xkeycode, 0, 0); -	if (xkeysym >= 'a' && xkeysym <= 'z') { +	if (is_ascii_lower_case(xkeysym)) {  		xkeysym -= ('a' - 'A');  	}  	Key key = KeyMappingX11::get_keycode(xkeysym);  	// If not found, fallback to QWERTY.  	// This should match the behavior of the event pump -	if (key == KEY_NONE) { +	if (key == Key::NONE) {  		return p_keycode;  	}  	return (Key)(key | modifiers); @@ -2493,12 +2562,12 @@ void DisplayServerX11::_get_key_modifier_state(unsigned int p_x11_state, Ref<Inp  }  MouseButton DisplayServerX11::_get_mouse_button_state(MouseButton p_x11_button, int p_x11_type) { -	MouseButton mask = MouseButton(1 << (p_x11_button - 1)); +	MouseButton mask = mouse_button_to_mask(p_x11_button);  	if (p_x11_type == ButtonPress) {  		last_button_state |= mask;  	} else { -		last_button_state &= MouseButton(~mask); +		last_button_state &= ~mask;  	}  	return last_button_state; @@ -2565,9 +2634,9 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  		if (status == XLookupChars) {  			bool keypress = xkeyevent->type == KeyPress;  			Key keycode = KeyMappingX11::get_keycode(keysym_keycode); -			unsigned int physical_keycode = KeyMappingX11::get_scancode(xkeyevent->keycode); +			Key physical_keycode = KeyMappingX11::get_scancode(xkeyevent->keycode); -			if (keycode >= 'a' && keycode <= 'z') { +			if (keycode >= Key::A + 32 && keycode <= Key::Z + 32) {  				keycode -= 'a' - 'A';  			} @@ -2576,11 +2645,11 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  			for (int i = 0; i < tmp.length(); i++) {  				Ref<InputEventKey> k;  				k.instantiate(); -				if (physical_keycode == 0 && keycode == 0 && tmp[i] == 0) { +				if (physical_keycode == Key::NONE && keycode == Key::NONE && tmp[i] == 0) {  					continue;  				} -				if (keycode == 0) { +				if (keycode == Key::NONE) {  					keycode = (Key)physical_keycode;  				} @@ -2597,10 +2666,10 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  				k->set_echo(false); -				if (k->get_keycode() == KEY_BACKTAB) { +				if (k->get_keycode() == Key::BACKTAB) {  					//make it consistent across platforms. -					k->set_keycode(KEY_TAB); -					k->set_physical_keycode(KEY_TAB); +					k->set_keycode(Key::TAB); +					k->set_physical_keycode(Key::TAB);  					k->set_shift_pressed(true);  				} @@ -2629,7 +2698,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  	// keysym, so it works in all platforms the same.  	Key keycode = KeyMappingX11::get_keycode(keysym_keycode); -	unsigned int physical_keycode = KeyMappingX11::get_scancode(xkeyevent->keycode); +	Key physical_keycode = KeyMappingX11::get_scancode(xkeyevent->keycode);  	/* Phase 3, obtain a unicode character from the keysym */ @@ -2649,11 +2718,11 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  	bool keypress = xkeyevent->type == KeyPress; -	if (physical_keycode == 0 && keycode == KEY_NONE && unicode == 0) { +	if (physical_keycode == Key::NONE && keycode == Key::NONE && unicode == 0) {  		return;  	} -	if (keycode == KEY_NONE) { +	if (keycode == Key::NONE) {  		keycode = (Key)physical_keycode;  	} @@ -2716,7 +2785,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  	k->set_pressed(keypress); -	if (keycode >= 'a' && keycode <= 'z') { +	if (keycode >= Key::A + 32 && keycode <= Key::Z + 32) {  		keycode -= int('a' - 'A');  	} @@ -2725,23 +2794,23 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  	k->set_unicode(unicode);  	k->set_echo(p_echo); -	if (k->get_keycode() == KEY_BACKTAB) { +	if (k->get_keycode() == Key::BACKTAB) {  		//make it consistent across platforms. -		k->set_keycode(KEY_TAB); -		k->set_physical_keycode(KEY_TAB); +		k->set_keycode(Key::TAB); +		k->set_physical_keycode(Key::TAB);  		k->set_shift_pressed(true);  	}  	//don't set mod state if modifier keys are released by themselves  	//else event.is_action() will not work correctly here  	if (!k->is_pressed()) { -		if (k->get_keycode() == KEY_SHIFT) { +		if (k->get_keycode() == Key::SHIFT) {  			k->set_shift_pressed(false); -		} else if (k->get_keycode() == KEY_CTRL) { +		} else if (k->get_keycode() == Key::CTRL) {  			k->set_ctrl_pressed(false); -		} else if (k->get_keycode() == KEY_ALT) { +		} else if (k->get_keycode() == Key::ALT) {  			k->set_alt_pressed(false); -		} else if (k->get_keycode() == KEY_META) { +		} else if (k->get_keycode() == Key::META) {  			k->set_meta_pressed(false);  		}  	} @@ -2927,7 +2996,7 @@ void DisplayServerX11::_window_changed(XEvent *event) {  	wd.size = new_rect.size;  #if defined(VULKAN_ENABLED) -	if (rendering_driver == "vulkan") { +	if (context_vulkan) {  		context_vulkan->window_resize(window_id, wd.size.width, wd.size.height);  	}  #endif @@ -3189,8 +3258,10 @@ void DisplayServerX11::process_events() {  							Map<int, Vector2>::Element *pen_tilt_x = xi.pen_tilt_x_range.find(device_id);  							if (pen_tilt_x) {  								Vector2 pen_tilt_x_range = pen_tilt_x->value(); -								if (pen_tilt_x_range != Vector2()) { -									xi.tilt.x = ((*values - pen_tilt_x_range[0]) / (pen_tilt_x_range[1] - pen_tilt_x_range[0])) * 2 - 1; +								if (pen_tilt_x_range[0] != 0 && *values < 0) { +									xi.tilt.x = *values / -pen_tilt_x_range[0]; +								} else if (pen_tilt_x_range[1] != 0) { +									xi.tilt.x = *values / pen_tilt_x_range[1];  								}  							} @@ -3201,8 +3272,10 @@ void DisplayServerX11::process_events() {  							Map<int, Vector2>::Element *pen_tilt_y = xi.pen_tilt_y_range.find(device_id);  							if (pen_tilt_y) {  								Vector2 pen_tilt_y_range = pen_tilt_y->value(); -								if (pen_tilt_y_range != Vector2()) { -									xi.tilt.y = ((*values - pen_tilt_y_range[0]) / (pen_tilt_y_range[1] - pen_tilt_y_range[0])) * 2 - 1; +								if (pen_tilt_y_range[0] != 0 && *values < 0) { +									xi.tilt.y = *values / -pen_tilt_y_range[0]; +								} else if (pen_tilt_y_range[1] != 0) { +									xi.tilt.y = *values / pen_tilt_y_range[1];  								}  							} @@ -3346,7 +3419,7 @@ void DisplayServerX11::process_events() {  				DEBUG_LOG_X11("[%u] FocusIn window=%lu (%u), mode='%u' \n", frame, event.xfocus.window, window_id, event.xfocus.mode);  				WindowData &wd = windows[window_id]; - +				last_focused_window = window_id;  				wd.focused = true;  				if (wd.xic) { @@ -3412,7 +3485,7 @@ void DisplayServerX11::process_events() {  				if (mouse_mode_grab) {  					for (const KeyValue<WindowID, WindowData> &E : windows) { -						//dear X11, I try, I really try, but you never work, you do whathever you want. +						//dear X11, I try, I really try, but you never work, you do whatever you want.  						if (mouse_mode == MOUSE_MODE_CAPTURED) {  							// Show the cursor if we're in captured mode so it doesn't look weird.  							XUndefineCursor(x11_display, E.value.x11_window); @@ -3469,10 +3542,10 @@ void DisplayServerX11::process_events() {  				mb->set_window_id(window_id);  				_get_key_modifier_state(event.xbutton.state, mb);  				mb->set_button_index((MouseButton)event.xbutton.button); -				if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { -					mb->set_button_index(MOUSE_BUTTON_MIDDLE); -				} else if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { -					mb->set_button_index(MOUSE_BUTTON_RIGHT); +				if (mb->get_button_index() == MouseButton::RIGHT) { +					mb->set_button_index(MouseButton::MIDDLE); +				} else if (mb->get_button_index() == MouseButton::MIDDLE) { +					mb->set_button_index(MouseButton::RIGHT);  				}  				mb->set_button_mask(_get_mouse_button_state(mb->get_button_index(), event.xbutton.type));  				mb->set_position(Vector2(event.xbutton.x, event.xbutton.y)); @@ -3498,11 +3571,11 @@ void DisplayServerX11::process_events() {  						if (diff < 400 && Vector2(last_click_pos).distance_to(Vector2(event.xbutton.x, event.xbutton.y)) < 5) {  							last_click_ms = 0;  							last_click_pos = Point2i(-100, -100); -							last_click_button_index = -1; +							last_click_button_index = MouseButton::NONE;  							mb->set_double_click(true);  						} -					} else if (mb->get_button_index() < 4 || mb->get_button_index() > 7) { +					} else if (mb->get_button_index() < MouseButton::WHEEL_UP || mb->get_button_index() > MouseButton::WHEEL_RIGHT) {  						last_click_button_index = mb->get_button_index();  					} @@ -3546,9 +3619,9 @@ void DisplayServerX11::process_events() {  				// The X11 API requires filtering one-by-one through the motion  				// notify events, in order to figure out which event is the one  				// generated by warping the mouse pointer. - +				WindowID focused_window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID;  				while (true) { -					if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[MAIN_WINDOW_ID].size.width / 2 && event.xmotion.y == windows[MAIN_WINDOW_ID].size.height / 2) { +					if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[focused_window_id].size.width / 2 && event.xmotion.y == windows[focused_window_id].size.height / 2) {  						//this is likely the warp event since it was warped here  						center = Vector2(event.xmotion.x, event.xmotion.y);  						break; @@ -3623,9 +3696,8 @@ void DisplayServerX11::process_events() {  				// Reset to prevent lingering motion  				xi.relative_motion.x = 0;  				xi.relative_motion.y = 0; -  				if (mouse_mode == MOUSE_MODE_CAPTURED) { -					pos = Point2i(windows[MAIN_WINDOW_ID].size.width / 2, windows[MAIN_WINDOW_ID].size.height / 2); +					pos = Point2i(windows[focused_window_id].size.width / 2, windows[focused_window_id].size.height / 2);  				}  				Ref<InputEventMouseMotion> mm; @@ -3635,16 +3707,15 @@ void DisplayServerX11::process_events() {  				if (xi.pressure_supported) {  					mm->set_pressure(xi.pressure);  				} else { -					mm->set_pressure((mouse_get_button_state() & MOUSE_BUTTON_MASK_LEFT) ? 1.0f : 0.0f); +					mm->set_pressure(bool(mouse_get_button_state() & MouseButton::MASK_LEFT) ? 1.0f : 0.0f);  				}  				mm->set_tilt(xi.tilt);  				_get_key_modifier_state(event.xmotion.state, mm); -				mm->set_button_mask(mouse_get_button_state()); +				mm->set_button_mask((MouseButton)mouse_get_button_state());  				mm->set_position(pos);  				mm->set_global_position(pos); -				Input::get_singleton()->set_mouse_position(pos); -				mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); +				mm->set_velocity(Input::get_singleton()->get_last_mouse_velocity());  				mm->set_relative(rel); @@ -3674,7 +3745,7 @@ void DisplayServerX11::process_events() {  							mm->set_window_id(E.key);  							mm->set_position(pos_focused);  							mm->set_global_position(pos_focused); -							mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); +							mm->set_velocity(Input::get_singleton()->get_last_mouse_velocity());  							Input::get_singleton()->parse_input_event(mm);  							break; @@ -3685,11 +3756,18 @@ void DisplayServerX11::process_events() {  			} break;  			case KeyPress:  			case KeyRelease: { +#ifdef DISPLAY_SERVER_X11_DEBUG_LOGS_ENABLED +				if (event.type == KeyPress) { +					DEBUG_LOG_X11("[%u] KeyPress window=%lu (%u), keycode=%u, time=%lu \n", frame, event.xkey.window, window_id, event.xkey.keycode, event.xkey.time); +				} else { +					DEBUG_LOG_X11("[%u] KeyRelease window=%lu (%u), keycode=%u, time=%lu \n", frame, event.xkey.window, window_id, event.xkey.keycode, event.xkey.time); +				} +#endif  				last_timestamp = event.xkey.time;  				// key event is a little complex, so  				// it will be handled in its own function. -				_handle_key_event(window_id, (XKeyEvent *)&event, events, event_index); +				_handle_key_event(window_id, &event.xkey, events, event_index);  			} break;  			case SelectionNotify: @@ -4244,7 +4322,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode  	xmbstring = nullptr;  	last_click_ms = 0; -	last_click_button_index = -1; +	last_click_button_index = MouseButton::NONE;  	last_click_pos = Point2i(-100, -100);  	last_timestamp = 0; @@ -4665,12 +4743,12 @@ DisplayServerX11::~DisplayServerX11() {  	//destroy all windows  	for (KeyValue<WindowID, WindowData> &E : windows) {  #ifdef VULKAN_ENABLED -		if (rendering_driver == "vulkan") { +		if (context_vulkan) {  			context_vulkan->window_destroy(E.key);  		}  #endif  #ifdef GLES3_ENABLED -		if (rendering_driver == "opengl3") { +		if (gl_manager) {  			gl_manager->window_destroy(E.key);  		}  #endif @@ -4686,15 +4764,15 @@ DisplayServerX11::~DisplayServerX11() {  	//destroy drivers  #if defined(VULKAN_ENABLED) -	if (rendering_driver == "vulkan") { -		if (rendering_device_vulkan) { -			rendering_device_vulkan->finalize(); -			memdelete(rendering_device_vulkan); -		} +	if (rendering_device_vulkan) { +		rendering_device_vulkan->finalize(); +		memdelete(rendering_device_vulkan); +		rendering_device_vulkan = nullptr; +	} -		if (context_vulkan) { -			memdelete(context_vulkan); -		} +	if (context_vulkan) { +		memdelete(context_vulkan); +		context_vulkan = nullptr;  	}  #endif diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 869ff386c5..2d07361deb 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -31,8 +31,6 @@  #ifndef DISPLAY_SERVER_X11_H  #define DISPLAY_SERVER_X11_H -#include "drivers/gles3/rasterizer_platforms.h" -  #ifdef X11_ENABLED  #include "servers/display_server.h" @@ -145,7 +143,7 @@ class DisplayServerX11 : public DisplayServer {  		bool borderless = false;  		bool resize_disabled = false;  		Vector2i last_position_before_fs; -		bool focused = false; +		bool focused = true;  		bool minimized = false;  		unsigned int focus_order = 0; @@ -153,6 +151,8 @@ class DisplayServerX11 : public DisplayServer {  	Map<WindowID, WindowData> windows; +	WindowID last_focused_window = INVALID_WINDOW_ID; +  	WindowID window_id_counter = MAIN_WINDOW_ID;  	WindowID _create_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect); @@ -173,8 +173,8 @@ class DisplayServerX11 : public DisplayServer {  	bool last_mouse_pos_valid;  	Point2i last_click_pos;  	uint64_t last_click_ms; -	int last_click_button_index; -	MouseButton last_button_state = MOUSE_BUTTON_NONE; +	MouseButton last_click_button_index = MouseButton::NONE; +	MouseButton last_button_state = MouseButton::NONE;  	bool app_focused = false;  	uint64_t time_since_no_focus = 0; @@ -291,7 +291,6 @@ public:  	virtual void mouse_warp_to_position(const Point2i &p_to) override;  	virtual Point2i mouse_get_position() const override; -	virtual Point2i mouse_get_absolute_position() const override;  	virtual MouseButton mouse_get_button_state() const override;  	virtual void clipboard_set(const String &p_text) override; @@ -304,6 +303,7 @@ public:  	virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;  	virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;  	virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; +	virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;  	virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;  #if defined(DBUS_ENABLED) @@ -319,6 +319,8 @@ public:  	virtual WindowID get_window_at_screen_position(const Point2i &p_position) const override; +	virtual int64_t window_get_native_handle(HandleType p_handle_type, WindowID p_window = MAIN_WINDOW_ID) const override; +  	virtual void window_attach_instance_id(ObjectID p_instance, WindowID p_window = MAIN_WINDOW_ID) override;  	virtual ObjectID window_get_attached_instance_id(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/linuxbsd/export/export.cpp b/platform/linuxbsd/export/export.cpp index 965a38ef4e..f05d2faa11 100644 --- a/platform/linuxbsd/export/export.cpp +++ b/platform/linuxbsd/export/export.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/export/export.h b/platform/linuxbsd/export/export.h index 61e96aa2f6..f06d781da6 100644 --- a/platform/linuxbsd/export/export.h +++ b/platform/linuxbsd/export/export.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/freedesktop_screensaver.cpp b/platform/linuxbsd/freedesktop_screensaver.cpp index 3973d43d49..1e93334e40 100644 --- a/platform/linuxbsd/freedesktop_screensaver.cpp +++ b/platform/linuxbsd/freedesktop_screensaver.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/freedesktop_screensaver.h b/platform/linuxbsd/freedesktop_screensaver.h index f27e60fce4..b2303791bd 100644 --- a/platform/linuxbsd/freedesktop_screensaver.h +++ b/platform/linuxbsd/freedesktop_screensaver.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/gl_manager_x11.cpp b/platform/linuxbsd/gl_manager_x11.cpp index e069e92ee6..d3fb1d6705 100644 --- a/platform/linuxbsd/gl_manager_x11.cpp +++ b/platform/linuxbsd/gl_manager_x11.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -68,8 +68,9 @@ static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {  int GLManager_X11::_find_or_create_display(Display *p_x11_display) {  	for (unsigned int n = 0; n < _displays.size(); n++) {  		const GLDisplay &d = _displays[n]; -		if (d.x11_display == p_x11_display) +		if (d.x11_display == p_x11_display) {  			return n; +		}  	}  	// create @@ -82,8 +83,7 @@ int GLManager_X11::_find_or_create_display(Display *p_x11_display) {  	GLDisplay &d = _displays[new_display_id];  	d.context = memnew(GLManager_X11_Private); -	; -	d.context->glx_context = 0; +	d.context->glx_context = nullptr;  	//Error err = _create_context(d);  	_create_context(d); @@ -124,7 +124,7 @@ Error GLManager_X11::_create_context(GLDisplay &gl_display) {  	};  	int fbcount; -	GLXFBConfig fbconfig = 0; +	GLXFBConfig fbconfig = nullptr;  	XVisualInfo *vi = nullptr;  	gl_display.x_swa.event_mask = StructureNotifyMask; @@ -137,8 +137,9 @@ Error GLManager_X11::_create_context(GLDisplay &gl_display) {  		for (int i = 0; i < fbcount; i++) {  			vi = (XVisualInfo *)glXGetVisualFromFBConfig(x11_display, fbc[i]); -			if (!vi) +			if (!vi) {  				continue; +			}  			XRenderPictFormat *pict_format = XRenderFindVisualFormat(x11_display, vi->visual);  			if (!pict_format) { @@ -262,22 +263,26 @@ void GLManager_X11::window_destroy(DisplayServer::WindowID p_window_id) {  }  void GLManager_X11::release_current() { -	if (!_current_window) +	if (!_current_window) {  		return; +	}  	glXMakeCurrent(_x_windisp.x11_display, None, nullptr);  }  void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) { -	if (p_window_id == -1) +	if (p_window_id == -1) {  		return; +	}  	GLWindow &win = _windows[p_window_id]; -	if (!win.in_use) +	if (!win.in_use) {  		return; +	}  	// noop -	if (&win == _current_window) +	if (&win == _current_window) {  		return; +	}  	const GLDisplay &disp = get_display(win.gldisplay_id); @@ -287,8 +292,9 @@ void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) {  }  void GLManager_X11::make_current() { -	if (!_current_window) +	if (!_current_window) {  		return; +	}  	if (!_current_window->in_use) {  		WARN_PRINT("current window not in use!");  		return; @@ -301,8 +307,9 @@ void GLManager_X11::swap_buffers() {  	// NO NEED TO CALL SWAP BUFFERS for each window...  	// see https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXSwapBuffers.xml -	if (!_current_window) +	if (!_current_window) {  		return; +	}  	if (!_current_window->in_use) {  		WARN_PRINT("current window not in use!");  		return; @@ -335,19 +342,23 @@ void GLManager_X11::set_use_vsync(bool p_use) {  	}  	// we need an active window to get a display to set the vsync -	if (!_current_window) +	if (!_current_window) {  		return; +	}  	const GLDisplay &disp = get_current_display();  	if (!setup) {  		setup = true;  		String extensions = glXQueryExtensionsString(disp.x11_display, DefaultScreen(disp.x11_display)); -		if (extensions.find("GLX_EXT_swap_control") != -1) +		if (extensions.find("GLX_EXT_swap_control") != -1) {  			glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddressARB((const GLubyte *)"glXSwapIntervalEXT"); -		if (extensions.find("GLX_MESA_swap_control") != -1) +		} +		if (extensions.find("GLX_MESA_swap_control") != -1) {  			glXSwapIntervalMESA = (PFNGLXSWAPINTERVALSGIPROC)glXGetProcAddressARB((const GLubyte *)"glXSwapIntervalMESA"); -		if (extensions.find("GLX_SGI_swap_control") != -1) +		} +		if (extensions.find("GLX_SGI_swap_control") != -1) {  			glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glXGetProcAddressARB((const GLubyte *)"glXSwapIntervalSGI"); +		}  	}  	int val = p_use ? 1 : 0;  	if (glXSwapIntervalMESA) { @@ -357,8 +368,9 @@ void GLManager_X11::set_use_vsync(bool p_use) {  	} else if (glXSwapIntervalEXT) {  		GLXDrawable drawable = glXGetCurrentDrawable();  		glXSwapIntervalEXT(disp.x11_display, drawable, val); -	} else +	} else {  		return; +	}  	use_vsync = p_use;  } diff --git a/platform/linuxbsd/gl_manager_x11.h b/platform/linuxbsd/gl_manager_x11.h index fa2c8a9c84..0bb0a446ab 100644 --- a/platform/linuxbsd/gl_manager_x11.h +++ b/platform/linuxbsd/gl_manager_x11.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -33,8 +33,6 @@  #ifdef X11_ENABLED -#include "drivers/gles3/rasterizer_platforms.h" -  #ifdef GLES3_ENABLED  #include "core/os/os.h" diff --git a/platform/linuxbsd/godot_linuxbsd.cpp b/platform/linuxbsd/godot_linuxbsd.cpp index 6f5c46b59c..7c9f81bd3f 100644 --- a/platform/linuxbsd/godot_linuxbsd.cpp +++ b/platform/linuxbsd/godot_linuxbsd.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 8b6dbc4c20..8e963238e3 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -59,15 +59,11 @@ JoypadLinux::Joypad::~Joypad() {  }  void JoypadLinux::Joypad::reset() { -	dpad = 0; +	dpad = HatMask::CENTER;  	fd = -1; - -	Input::JoyAxisValue jx; -	jx.min = -1; -	jx.value = 0.0f;  	for (int i = 0; i < MAX_ABS; i++) {  		abs_map[i] = -1; -		curr_axis[i] = jx; +		curr_axis[i] = 0;  	}  } @@ -253,7 +249,7 @@ void JoypadLinux::close_joypad(int p_id) {  	if (joy.fd != -1) {  		close(joy.fd);  		joy.fd = -1; -		attached_devices.remove(attached_devices.find(joy.devpath)); +		attached_devices.remove_at(attached_devices.find(joy.devpath));  		input->joy_connection_changed(p_id, false, "");  	};  } @@ -337,8 +333,9 @@ void JoypadLinux::open_joypad(const char *p_path) {  		}  		// Check if the device supports basic gamepad events -		if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) && -					test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit))) { +		bool has_abs_left = (test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit)); +		bool has_abs_right = (test_bit(ABS_RX, absbit) && test_bit(ABS_RY, absbit)); +		if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) && (has_abs_left || has_abs_right))) {  			close(fd);  			return;  		} @@ -429,23 +426,11 @@ void JoypadLinux::joypad_vibration_stop(int p_id, uint64_t p_timestamp) {  	joy.ff_effect_timestamp = p_timestamp;  } -Input::JoyAxisValue JoypadLinux::axis_correct(const input_absinfo *p_abs, int p_value) const { +float JoypadLinux::axis_correct(const input_absinfo *p_abs, int p_value) const {  	int min = p_abs->minimum;  	int max = p_abs->maximum; -	Input::JoyAxisValue jx; - -	if (min < 0) { -		jx.min = -1; -		if (p_value < 0) { -			jx.value = (float)-p_value / min; -		} else { -			jx.value = (float)p_value / max; -		} -	} else if (min == 0) { -		jx.min = 0; -		jx.value = 0.0f + (float)p_value / max; -	} -	return jx; +	// Convert to a value between -1.0f and 1.0f. +	return 2.0f * (p_value - min) / (max - min) - 1.0f;  }  void JoypadLinux::process_joypads() { @@ -484,12 +469,12 @@ void JoypadLinux::process_joypads() {  							case ABS_HAT0X:  								if (ev.value != 0) {  									if (ev.value < 0) { -										joy->dpad = (HatMask)((joy->dpad | HatMask::HAT_MASK_LEFT) & ~HatMask::HAT_MASK_RIGHT); +										joy->dpad = (HatMask)((joy->dpad | HatMask::LEFT) & ~HatMask::RIGHT);  									} else { -										joy->dpad = (HatMask)((joy->dpad | HatMask::HAT_MASK_RIGHT) & ~HatMask::HAT_MASK_LEFT); +										joy->dpad = (HatMask)((joy->dpad | HatMask::RIGHT) & ~HatMask::LEFT);  									}  								} else { -									joy->dpad &= ~(HatMask::HAT_MASK_LEFT | HatMask::HAT_MASK_RIGHT); +									joy->dpad &= ~(HatMask::LEFT | HatMask::RIGHT);  								}  								input->joy_hat(i, (HatMask)joy->dpad); @@ -498,12 +483,12 @@ void JoypadLinux::process_joypads() {  							case ABS_HAT0Y:  								if (ev.value != 0) {  									if (ev.value < 0) { -										joy->dpad = (HatMask)((joy->dpad | HatMask::HAT_MASK_UP) & ~HatMask::HAT_MASK_DOWN); +										joy->dpad = (HatMask)((joy->dpad | HatMask::UP) & ~HatMask::DOWN);  									} else { -										joy->dpad = (HatMask)((joy->dpad | HatMask::HAT_MASK_DOWN) & ~HatMask::HAT_MASK_UP); +										joy->dpad = (HatMask)((joy->dpad | HatMask::DOWN) & ~HatMask::UP);  									}  								} else { -									joy->dpad &= ~(HatMask::HAT_MASK_UP | HatMask::HAT_MASK_DOWN); +									joy->dpad &= ~(HatMask::UP | HatMask::DOWN);  								}  								input->joy_hat(i, (HatMask)joy->dpad); @@ -514,7 +499,7 @@ void JoypadLinux::process_joypads() {  									return;  								}  								if (joy->abs_map[ev.code] != -1 && joy->abs_info[ev.code]) { -									Input::JoyAxisValue value = axis_correct(joy->abs_info[ev.code], ev.value); +									float value = axis_correct(joy->abs_info[ev.code], ev.value);  									joy->curr_axis[joy->abs_map[ev.code]] = value;  								}  								break; diff --git a/platform/linuxbsd/joypad_linux.h b/platform/linuxbsd/joypad_linux.h index 177d7a51ce..9177465547 100644 --- a/platform/linuxbsd/joypad_linux.h +++ b/platform/linuxbsd/joypad_linux.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -28,7 +28,6 @@  /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */  /*************************************************************************/ -//author: Andreas Haas <hondres,  liugam3@gmail.com>  #ifndef JOYPAD_LINUX_H  #define JOYPAD_LINUX_H @@ -53,10 +52,10 @@ private:  	};  	struct Joypad { -		Input::JoyAxisValue curr_axis[MAX_ABS]; +		float curr_axis[MAX_ABS];  		int key_map[MAX_KEY];  		int abs_map[MAX_ABS]; -		int dpad = 0; +		HatMask dpad = HatMask::CENTER;  		int fd = -1;  		String devpath; @@ -97,8 +96,9 @@ private:  	void joypad_vibration_start(int p_id, float p_weak_magnitude, float p_strong_magnitude, float p_duration, uint64_t p_timestamp);  	void joypad_vibration_stop(int p_id, uint64_t p_timestamp); -	Input::JoyAxisValue axis_correct(const input_absinfo *p_abs, int p_value) const; +	float axis_correct(const input_absinfo *p_abs, int p_value) const;  }; -#endif +#endif // JOYDEV_ENABLED +  #endif // JOYPAD_LINUX_H diff --git a/platform/linuxbsd/key_mapping_x11.cpp b/platform/linuxbsd/key_mapping_x11.cpp index 829feda40a..afe965e038 100644 --- a/platform/linuxbsd/key_mapping_x11.cpp +++ b/platform/linuxbsd/key_mapping_x11.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -40,266 +40,266 @@ struct _XTranslatePair {  static _XTranslatePair _xkeysym_to_keycode[] = {  	// misc keys -	{ XK_Escape, KEY_ESCAPE }, -	{ XK_Tab, KEY_TAB }, -	{ XK_ISO_Left_Tab, KEY_BACKTAB }, -	{ XK_BackSpace, KEY_BACKSPACE }, -	{ XK_Return, KEY_ENTER }, -	{ XK_Insert, KEY_INSERT }, -	{ XK_Delete, KEY_DELETE }, -	{ XK_Clear, KEY_DELETE }, -	{ XK_Pause, KEY_PAUSE }, -	{ XK_Print, KEY_PRINT }, -	{ XK_Home, KEY_HOME }, -	{ XK_End, KEY_END }, -	{ XK_Left, KEY_LEFT }, -	{ XK_Up, KEY_UP }, -	{ XK_Right, KEY_RIGHT }, -	{ XK_Down, KEY_DOWN }, -	{ XK_Prior, KEY_PAGEUP }, -	{ XK_Next, KEY_PAGEDOWN }, -	{ XK_Shift_L, KEY_SHIFT }, -	{ XK_Shift_R, KEY_SHIFT }, -	{ XK_Shift_Lock, KEY_SHIFT }, -	{ XK_Control_L, KEY_CTRL }, -	{ XK_Control_R, KEY_CTRL }, -	{ XK_Meta_L, KEY_META }, -	{ XK_Meta_R, KEY_META }, -	{ XK_Alt_L, KEY_ALT }, -	{ XK_Alt_R, KEY_ALT }, -	{ XK_Caps_Lock, KEY_CAPSLOCK }, -	{ XK_Num_Lock, KEY_NUMLOCK }, -	{ XK_Scroll_Lock, KEY_SCROLLLOCK }, -	{ XK_Super_L, KEY_SUPER_L }, -	{ XK_Super_R, KEY_SUPER_R }, -	{ XK_Menu, KEY_MENU }, -	{ XK_Hyper_L, KEY_HYPER_L }, -	{ XK_Hyper_R, KEY_HYPER_R }, -	{ XK_Help, KEY_HELP }, -	{ XK_KP_Space, KEY_SPACE }, -	{ XK_KP_Tab, KEY_TAB }, -	{ XK_KP_Enter, KEY_KP_ENTER }, -	{ XK_Home, KEY_HOME }, -	{ XK_Left, KEY_LEFT }, -	{ XK_Up, KEY_UP }, -	{ XK_Right, KEY_RIGHT }, -	{ XK_Down, KEY_DOWN }, -	{ XK_Prior, KEY_PAGEUP }, -	{ XK_Next, KEY_PAGEDOWN }, -	{ XK_End, KEY_END }, -	{ XK_Begin, KEY_CLEAR }, -	{ XK_Insert, KEY_INSERT }, -	{ XK_Delete, KEY_DELETE }, -	//{ XK_KP_Equal,                KEY_EQUAL   }, -	//{ XK_KP_Separator,            KEY_COMMA   }, -	{ XK_KP_Decimal, KEY_KP_PERIOD }, -	{ XK_KP_Delete, KEY_KP_PERIOD }, -	{ XK_KP_Multiply, KEY_KP_MULTIPLY }, -	{ XK_KP_Divide, KEY_KP_DIVIDE }, -	{ XK_KP_Subtract, KEY_KP_SUBTRACT }, -	{ XK_KP_Add, KEY_KP_ADD }, -	{ XK_KP_0, KEY_KP_0 }, -	{ XK_KP_1, KEY_KP_1 }, -	{ XK_KP_2, KEY_KP_2 }, -	{ XK_KP_3, KEY_KP_3 }, -	{ XK_KP_4, KEY_KP_4 }, -	{ XK_KP_5, KEY_KP_5 }, -	{ XK_KP_6, KEY_KP_6 }, -	{ XK_KP_7, KEY_KP_7 }, -	{ XK_KP_8, KEY_KP_8 }, -	{ XK_KP_9, KEY_KP_9 }, +	{ XK_Escape, Key::ESCAPE }, +	{ XK_Tab, Key::TAB }, +	{ XK_ISO_Left_Tab, Key::BACKTAB }, +	{ XK_BackSpace, Key::BACKSPACE }, +	{ XK_Return, Key::ENTER }, +	{ XK_Insert, Key::INSERT }, +	{ XK_Delete, Key::KEY_DELETE }, +	{ XK_Clear, Key::KEY_DELETE }, +	{ XK_Pause, Key::PAUSE }, +	{ XK_Print, Key::PRINT }, +	{ XK_Home, Key::HOME }, +	{ XK_End, Key::END }, +	{ XK_Left, Key::LEFT }, +	{ XK_Up, Key::UP }, +	{ XK_Right, Key::RIGHT }, +	{ XK_Down, Key::DOWN }, +	{ XK_Prior, Key::PAGEUP }, +	{ XK_Next, Key::PAGEDOWN }, +	{ XK_Shift_L, Key::SHIFT }, +	{ XK_Shift_R, Key::SHIFT }, +	{ XK_Shift_Lock, Key::SHIFT }, +	{ XK_Control_L, Key::CTRL }, +	{ XK_Control_R, Key::CTRL }, +	{ XK_Meta_L, Key::META }, +	{ XK_Meta_R, Key::META }, +	{ XK_Alt_L, Key::ALT }, +	{ XK_Alt_R, Key::ALT }, +	{ XK_Caps_Lock, Key::CAPSLOCK }, +	{ XK_Num_Lock, Key::NUMLOCK }, +	{ XK_Scroll_Lock, Key::SCROLLLOCK }, +	{ XK_Super_L, Key::SUPER_L }, +	{ XK_Super_R, Key::SUPER_R }, +	{ XK_Menu, Key::MENU }, +	{ XK_Hyper_L, Key::HYPER_L }, +	{ XK_Hyper_R, Key::HYPER_R }, +	{ XK_Help, Key::HELP }, +	{ XK_KP_Space, Key::SPACE }, +	{ XK_KP_Tab, Key::TAB }, +	{ XK_KP_Enter, Key::KP_ENTER }, +	{ XK_Home, Key::HOME }, +	{ XK_Left, Key::LEFT }, +	{ XK_Up, Key::UP }, +	{ XK_Right, Key::RIGHT }, +	{ XK_Down, Key::DOWN }, +	{ XK_Prior, Key::PAGEUP }, +	{ XK_Next, Key::PAGEDOWN }, +	{ XK_End, Key::END }, +	{ XK_Begin, Key::CLEAR }, +	{ XK_Insert, Key::INSERT }, +	{ XK_Delete, Key::KEY_DELETE }, +	//{ XK_KP_Equal,                Key::EQUAL   }, +	//{ XK_KP_Separator,            Key::COMMA   }, +	{ XK_KP_Decimal, Key::KP_PERIOD }, +	{ XK_KP_Delete, Key::KP_PERIOD }, +	{ XK_KP_Multiply, Key::KP_MULTIPLY }, +	{ XK_KP_Divide, Key::KP_DIVIDE }, +	{ XK_KP_Subtract, Key::KP_SUBTRACT }, +	{ XK_KP_Add, Key::KP_ADD }, +	{ XK_KP_0, Key::KP_0 }, +	{ XK_KP_1, Key::KP_1 }, +	{ XK_KP_2, Key::KP_2 }, +	{ XK_KP_3, Key::KP_3 }, +	{ XK_KP_4, Key::KP_4 }, +	{ XK_KP_5, Key::KP_5 }, +	{ XK_KP_6, Key::KP_6 }, +	{ XK_KP_7, Key::KP_7 }, +	{ XK_KP_8, Key::KP_8 }, +	{ XK_KP_9, Key::KP_9 },  	// same but with numlock -	{ XK_KP_Insert, KEY_KP_0 }, -	{ XK_KP_End, KEY_KP_1 }, -	{ XK_KP_Down, KEY_KP_2 }, -	{ XK_KP_Page_Down, KEY_KP_3 }, -	{ XK_KP_Left, KEY_KP_4 }, -	{ XK_KP_Begin, KEY_KP_5 }, -	{ XK_KP_Right, KEY_KP_6 }, -	{ XK_KP_Home, KEY_KP_7 }, -	{ XK_KP_Up, KEY_KP_8 }, -	{ XK_KP_Page_Up, KEY_KP_9 }, -	{ XK_F1, KEY_F1 }, -	{ XK_F2, KEY_F2 }, -	{ XK_F3, KEY_F3 }, -	{ XK_F4, KEY_F4 }, -	{ XK_F5, KEY_F5 }, -	{ XK_F6, KEY_F6 }, -	{ XK_F7, KEY_F7 }, -	{ XK_F8, KEY_F8 }, -	{ XK_F9, KEY_F9 }, -	{ XK_F10, KEY_F10 }, -	{ XK_F11, KEY_F11 }, -	{ XK_F12, KEY_F12 }, -	{ XK_F13, KEY_F13 }, -	{ XK_F14, KEY_F14 }, -	{ XK_F15, KEY_F15 }, -	{ XK_F16, KEY_F16 }, +	{ XK_KP_Insert, Key::KP_0 }, +	{ XK_KP_End, Key::KP_1 }, +	{ XK_KP_Down, Key::KP_2 }, +	{ XK_KP_Page_Down, Key::KP_3 }, +	{ XK_KP_Left, Key::KP_4 }, +	{ XK_KP_Begin, Key::KP_5 }, +	{ XK_KP_Right, Key::KP_6 }, +	{ XK_KP_Home, Key::KP_7 }, +	{ XK_KP_Up, Key::KP_8 }, +	{ XK_KP_Page_Up, Key::KP_9 }, +	{ XK_F1, Key::F1 }, +	{ XK_F2, Key::F2 }, +	{ XK_F3, Key::F3 }, +	{ XK_F4, Key::F4 }, +	{ XK_F5, Key::F5 }, +	{ XK_F6, Key::F6 }, +	{ XK_F7, Key::F7 }, +	{ XK_F8, Key::F8 }, +	{ XK_F9, Key::F9 }, +	{ XK_F10, Key::F10 }, +	{ XK_F11, Key::F11 }, +	{ XK_F12, Key::F12 }, +	{ XK_F13, Key::F13 }, +	{ XK_F14, Key::F14 }, +	{ XK_F15, Key::F15 }, +	{ XK_F16, Key::F16 },  	// media keys -	{ XF86XK_Back, KEY_BACK }, -	{ XF86XK_Forward, KEY_FORWARD }, -	{ XF86XK_Stop, KEY_STOP }, -	{ XF86XK_Refresh, KEY_REFRESH }, -	{ XF86XK_Favorites, KEY_FAVORITES }, -	{ XF86XK_AudioMedia, KEY_LAUNCHMEDIA }, -	{ XF86XK_OpenURL, KEY_OPENURL }, -	{ XF86XK_HomePage, KEY_HOMEPAGE }, -	{ XF86XK_Search, KEY_SEARCH }, -	{ XF86XK_AudioLowerVolume, KEY_VOLUMEDOWN }, -	{ XF86XK_AudioMute, KEY_VOLUMEMUTE }, -	{ XF86XK_AudioRaiseVolume, KEY_VOLUMEUP }, -	{ XF86XK_AudioPlay, KEY_MEDIAPLAY }, -	{ XF86XK_AudioStop, KEY_MEDIASTOP }, -	{ XF86XK_AudioPrev, KEY_MEDIAPREVIOUS }, -	{ XF86XK_AudioNext, KEY_MEDIANEXT }, -	{ XF86XK_AudioRecord, KEY_MEDIARECORD }, +	{ XF86XK_Back, Key::BACK }, +	{ XF86XK_Forward, Key::FORWARD }, +	{ XF86XK_Stop, Key::STOP }, +	{ XF86XK_Refresh, Key::REFRESH }, +	{ XF86XK_Favorites, Key::FAVORITES }, +	{ XF86XK_AudioMedia, Key::LAUNCHMEDIA }, +	{ XF86XK_OpenURL, Key::OPENURL }, +	{ XF86XK_HomePage, Key::HOMEPAGE }, +	{ XF86XK_Search, Key::SEARCH }, +	{ XF86XK_AudioLowerVolume, Key::VOLUMEDOWN }, +	{ XF86XK_AudioMute, Key::VOLUMEMUTE }, +	{ XF86XK_AudioRaiseVolume, Key::VOLUMEUP }, +	{ XF86XK_AudioPlay, Key::MEDIAPLAY }, +	{ XF86XK_AudioStop, Key::MEDIASTOP }, +	{ XF86XK_AudioPrev, Key::MEDIAPREVIOUS }, +	{ XF86XK_AudioNext, Key::MEDIANEXT }, +	{ XF86XK_AudioRecord, Key::MEDIARECORD },  	// launch keys -	{ XF86XK_Mail, KEY_LAUNCHMAIL }, -	{ XF86XK_MyComputer, KEY_LAUNCH0 }, -	{ XF86XK_Calculator, KEY_LAUNCH1 }, -	{ XF86XK_Standby, KEY_STANDBY }, +	{ XF86XK_Mail, Key::LAUNCHMAIL }, +	{ XF86XK_MyComputer, Key::LAUNCH0 }, +	{ XF86XK_Calculator, Key::LAUNCH1 }, +	{ XF86XK_Standby, Key::STANDBY }, -	{ XF86XK_Launch0, KEY_LAUNCH2 }, -	{ XF86XK_Launch1, KEY_LAUNCH3 }, -	{ XF86XK_Launch2, KEY_LAUNCH4 }, -	{ XF86XK_Launch3, KEY_LAUNCH5 }, -	{ XF86XK_Launch4, KEY_LAUNCH6 }, -	{ XF86XK_Launch5, KEY_LAUNCH7 }, -	{ XF86XK_Launch6, KEY_LAUNCH8 }, -	{ XF86XK_Launch7, KEY_LAUNCH9 }, -	{ XF86XK_Launch8, KEY_LAUNCHA }, -	{ XF86XK_Launch9, KEY_LAUNCHB }, -	{ XF86XK_LaunchA, KEY_LAUNCHC }, -	{ XF86XK_LaunchB, KEY_LAUNCHD }, -	{ XF86XK_LaunchC, KEY_LAUNCHE }, -	{ XF86XK_LaunchD, KEY_LAUNCHF }, +	{ XF86XK_Launch0, Key::LAUNCH2 }, +	{ XF86XK_Launch1, Key::LAUNCH3 }, +	{ XF86XK_Launch2, Key::LAUNCH4 }, +	{ XF86XK_Launch3, Key::LAUNCH5 }, +	{ XF86XK_Launch4, Key::LAUNCH6 }, +	{ XF86XK_Launch5, Key::LAUNCH7 }, +	{ XF86XK_Launch6, Key::LAUNCH8 }, +	{ XF86XK_Launch7, Key::LAUNCH9 }, +	{ XF86XK_Launch8, Key::LAUNCHA }, +	{ XF86XK_Launch9, Key::LAUNCHB }, +	{ XF86XK_LaunchA, Key::LAUNCHC }, +	{ XF86XK_LaunchB, Key::LAUNCHD }, +	{ XF86XK_LaunchC, Key::LAUNCHE }, +	{ XF86XK_LaunchD, Key::LAUNCHF }, -	{ 0, KEY_NONE } +	{ 0, Key::NONE }  };  struct _TranslatePair { -	unsigned int keysym; +	Key keysym;  	unsigned int keycode;  };  static _TranslatePair _scancode_to_keycode[] = { -	{ KEY_ESCAPE, 0x09 }, -	{ KEY_1, 0x0A }, -	{ KEY_2, 0x0B }, -	{ KEY_3, 0x0C }, -	{ KEY_4, 0x0D }, -	{ KEY_5, 0x0E }, -	{ KEY_6, 0x0F }, -	{ KEY_7, 0x10 }, -	{ KEY_8, 0x11 }, -	{ KEY_9, 0x12 }, -	{ KEY_0, 0x13 }, -	{ KEY_MINUS, 0x14 }, -	{ KEY_EQUAL, 0x15 }, -	{ KEY_BACKSPACE, 0x16 }, -	{ KEY_TAB, 0x17 }, -	{ KEY_Q, 0x18 }, -	{ KEY_W, 0x19 }, -	{ KEY_E, 0x1A }, -	{ KEY_R, 0x1B }, -	{ KEY_T, 0x1C }, -	{ KEY_Y, 0x1D }, -	{ KEY_U, 0x1E }, -	{ KEY_I, 0x1F }, -	{ KEY_O, 0x20 }, -	{ KEY_P, 0x21 }, -	{ KEY_BRACELEFT, 0x22 }, -	{ KEY_BRACERIGHT, 0x23 }, -	{ KEY_ENTER, 0x24 }, -	{ KEY_CTRL, 0x25 }, -	{ KEY_A, 0x26 }, -	{ KEY_S, 0x27 }, -	{ KEY_D, 0x28 }, -	{ KEY_F, 0x29 }, -	{ KEY_G, 0x2A }, -	{ KEY_H, 0x2B }, -	{ KEY_J, 0x2C }, -	{ KEY_K, 0x2D }, -	{ KEY_L, 0x2E }, -	{ KEY_SEMICOLON, 0x2F }, -	{ KEY_APOSTROPHE, 0x30 }, -	{ KEY_QUOTELEFT, 0x31 }, -	{ KEY_SHIFT, 0x32 }, -	{ KEY_BACKSLASH, 0x33 }, -	{ KEY_Z, 0x34 }, -	{ KEY_X, 0x35 }, -	{ KEY_C, 0x36 }, -	{ KEY_V, 0x37 }, -	{ KEY_B, 0x38 }, -	{ KEY_N, 0x39 }, -	{ KEY_M, 0x3A }, -	{ KEY_COMMA, 0x3B }, -	{ KEY_PERIOD, 0x3C }, -	{ KEY_SLASH, 0x3D }, -	{ KEY_SHIFT, 0x3E }, -	{ KEY_KP_MULTIPLY, 0x3F }, -	{ KEY_ALT, 0x40 }, -	{ KEY_SPACE, 0x41 }, -	{ KEY_CAPSLOCK, 0x42 }, -	{ KEY_F1, 0x43 }, -	{ KEY_F2, 0x44 }, -	{ KEY_F3, 0x45 }, -	{ KEY_F4, 0x46 }, -	{ KEY_F5, 0x47 }, -	{ KEY_F6, 0x48 }, -	{ KEY_F7, 0x49 }, -	{ KEY_F8, 0x4A }, -	{ KEY_F9, 0x4B }, -	{ KEY_F10, 0x4C }, -	{ KEY_NUMLOCK, 0x4D }, -	{ KEY_SCROLLLOCK, 0x4E }, -	{ KEY_KP_7, 0x4F }, -	{ KEY_KP_8, 0x50 }, -	{ KEY_KP_9, 0x51 }, -	{ KEY_KP_SUBTRACT, 0x52 }, -	{ KEY_KP_4, 0x53 }, -	{ KEY_KP_5, 0x54 }, -	{ KEY_KP_6, 0x55 }, -	{ KEY_KP_ADD, 0x56 }, -	{ KEY_KP_1, 0x57 }, -	{ KEY_KP_2, 0x58 }, -	{ KEY_KP_3, 0x59 }, -	{ KEY_KP_0, 0x5A }, -	{ KEY_KP_PERIOD, 0x5B }, -	//{ KEY_???, 0x5E }, //NON US BACKSLASH -	{ KEY_F11, 0x5F }, -	{ KEY_F12, 0x60 }, -	{ KEY_KP_ENTER, 0x68 }, -	{ KEY_CTRL, 0x69 }, -	{ KEY_KP_DIVIDE, 0x6A }, -	{ KEY_PRINT, 0x6B }, -	{ KEY_ALT, 0x6C }, -	{ KEY_ENTER, 0x6D }, -	{ KEY_HOME, 0x6E }, -	{ KEY_UP, 0x6F }, -	{ KEY_PAGEUP, 0x70 }, -	{ KEY_LEFT, 0x71 }, -	{ KEY_RIGHT, 0x72 }, -	{ KEY_END, 0x73 }, -	{ KEY_DOWN, 0x74 }, -	{ KEY_PAGEDOWN, 0x75 }, -	{ KEY_INSERT, 0x76 }, -	{ KEY_DELETE, 0x77 }, -	{ KEY_VOLUMEMUTE, 0x79 }, -	{ KEY_VOLUMEDOWN, 0x7A }, -	{ KEY_VOLUMEUP, 0x7B }, -	{ KEY_PAUSE, 0x7F }, -	{ KEY_SUPER_L, 0x85 }, -	{ KEY_SUPER_R, 0x86 }, -	{ KEY_MENU, 0x87 }, -	{ KEY_UNKNOWN, 0 } +	{ Key::ESCAPE, 0x09 }, +	{ Key::KEY_1, 0x0A }, +	{ Key::KEY_2, 0x0B }, +	{ Key::KEY_3, 0x0C }, +	{ Key::KEY_4, 0x0D }, +	{ Key::KEY_5, 0x0E }, +	{ Key::KEY_6, 0x0F }, +	{ Key::KEY_7, 0x10 }, +	{ Key::KEY_8, 0x11 }, +	{ Key::KEY_9, 0x12 }, +	{ Key::KEY_0, 0x13 }, +	{ Key::MINUS, 0x14 }, +	{ Key::EQUAL, 0x15 }, +	{ Key::BACKSPACE, 0x16 }, +	{ Key::TAB, 0x17 }, +	{ Key::Q, 0x18 }, +	{ Key::W, 0x19 }, +	{ Key::E, 0x1A }, +	{ Key::R, 0x1B }, +	{ Key::T, 0x1C }, +	{ Key::Y, 0x1D }, +	{ Key::U, 0x1E }, +	{ Key::I, 0x1F }, +	{ Key::O, 0x20 }, +	{ Key::P, 0x21 }, +	{ Key::BRACELEFT, 0x22 }, +	{ Key::BRACERIGHT, 0x23 }, +	{ Key::ENTER, 0x24 }, +	{ Key::CTRL, 0x25 }, +	{ Key::A, 0x26 }, +	{ Key::S, 0x27 }, +	{ Key::D, 0x28 }, +	{ Key::F, 0x29 }, +	{ Key::G, 0x2A }, +	{ Key::H, 0x2B }, +	{ Key::J, 0x2C }, +	{ Key::K, 0x2D }, +	{ Key::L, 0x2E }, +	{ Key::SEMICOLON, 0x2F }, +	{ Key::APOSTROPHE, 0x30 }, +	{ Key::QUOTELEFT, 0x31 }, +	{ Key::SHIFT, 0x32 }, +	{ Key::BACKSLASH, 0x33 }, +	{ Key::Z, 0x34 }, +	{ Key::X, 0x35 }, +	{ Key::C, 0x36 }, +	{ Key::V, 0x37 }, +	{ Key::B, 0x38 }, +	{ Key::N, 0x39 }, +	{ Key::M, 0x3A }, +	{ Key::COMMA, 0x3B }, +	{ Key::PERIOD, 0x3C }, +	{ Key::SLASH, 0x3D }, +	{ Key::SHIFT, 0x3E }, +	{ Key::KP_MULTIPLY, 0x3F }, +	{ Key::ALT, 0x40 }, +	{ Key::SPACE, 0x41 }, +	{ Key::CAPSLOCK, 0x42 }, +	{ Key::F1, 0x43 }, +	{ Key::F2, 0x44 }, +	{ Key::F3, 0x45 }, +	{ Key::F4, 0x46 }, +	{ Key::F5, 0x47 }, +	{ Key::F6, 0x48 }, +	{ Key::F7, 0x49 }, +	{ Key::F8, 0x4A }, +	{ Key::F9, 0x4B }, +	{ Key::F10, 0x4C }, +	{ Key::NUMLOCK, 0x4D }, +	{ Key::SCROLLLOCK, 0x4E }, +	{ Key::KP_7, 0x4F }, +	{ Key::KP_8, 0x50 }, +	{ Key::KP_9, 0x51 }, +	{ Key::KP_SUBTRACT, 0x52 }, +	{ Key::KP_4, 0x53 }, +	{ Key::KP_5, 0x54 }, +	{ Key::KP_6, 0x55 }, +	{ Key::KP_ADD, 0x56 }, +	{ Key::KP_1, 0x57 }, +	{ Key::KP_2, 0x58 }, +	{ Key::KP_3, 0x59 }, +	{ Key::KP_0, 0x5A }, +	{ Key::KP_PERIOD, 0x5B }, +	//{ Key::???, 0x5E }, //NON US BACKSLASH +	{ Key::F11, 0x5F }, +	{ Key::F12, 0x60 }, +	{ Key::KP_ENTER, 0x68 }, +	{ Key::CTRL, 0x69 }, +	{ Key::KP_DIVIDE, 0x6A }, +	{ Key::PRINT, 0x6B }, +	{ Key::ALT, 0x6C }, +	{ Key::ENTER, 0x6D }, +	{ Key::HOME, 0x6E }, +	{ Key::UP, 0x6F }, +	{ Key::PAGEUP, 0x70 }, +	{ Key::LEFT, 0x71 }, +	{ Key::RIGHT, 0x72 }, +	{ Key::END, 0x73 }, +	{ Key::DOWN, 0x74 }, +	{ Key::PAGEDOWN, 0x75 }, +	{ Key::INSERT, 0x76 }, +	{ Key::KEY_DELETE, 0x77 }, +	{ Key::VOLUMEMUTE, 0x79 }, +	{ Key::VOLUMEDOWN, 0x7A }, +	{ Key::VOLUMEUP, 0x7B }, +	{ Key::PAUSE, 0x7F }, +	{ Key::SUPER_L, 0x85 }, +	{ Key::SUPER_R, 0x86 }, +	{ Key::MENU, 0x87 }, +	{ Key::UNKNOWN, 0 }  }; -unsigned int KeyMappingX11::get_scancode(unsigned int p_code) { -	unsigned int keycode = KEY_UNKNOWN; -	for (int i = 0; _scancode_to_keycode[i].keysym != KEY_UNKNOWN; i++) { +Key KeyMappingX11::get_scancode(unsigned int p_code) { +	Key keycode = Key::UNKNOWN; +	for (int i = 0; _scancode_to_keycode[i].keysym != Key::UNKNOWN; i++) {  		if (_scancode_to_keycode[i].keycode == p_code) {  			keycode = _scancode_to_keycode[i].keysym;  			break; @@ -309,9 +309,9 @@ unsigned int KeyMappingX11::get_scancode(unsigned int p_code) {  	return keycode;  } -unsigned int KeyMappingX11::get_xlibcode(unsigned int p_keysym) { +unsigned int KeyMappingX11::get_xlibcode(Key p_keysym) {  	unsigned int code = 0; -	for (int i = 0; _scancode_to_keycode[i].keysym != KEY_UNKNOWN; i++) { +	for (int i = 0; _scancode_to_keycode[i].keysym != Key::UNKNOWN; i++) {  		if (_scancode_to_keycode[i].keysym == p_keysym) {  			code = _scancode_to_keycode[i].keycode;  			break; @@ -335,13 +335,13 @@ Key KeyMappingX11::get_keycode(KeySym p_keysym) {  		}  	} -	return KEY_NONE; +	return Key::NONE;  }  KeySym KeyMappingX11::get_keysym(Key p_code) {  	// kinda bruteforce.. could optimize. -	if (p_code < 0x100) { // Latin 1, maps 1-1 +	if (p_code < Key::END_LATIN1) { // Latin 1, maps 1-1  		return (KeySym)p_code;  	} @@ -352,7 +352,7 @@ KeySym KeyMappingX11::get_keysym(Key p_code) {  		}  	} -	return (KeySym)KEY_NONE; +	return (KeySym)Key::NONE;  }  /***** UNICODE CONVERSION ******/ diff --git a/platform/linuxbsd/key_mapping_x11.h b/platform/linuxbsd/key_mapping_x11.h index d4f1554671..b7b8a3b787 100644 --- a/platform/linuxbsd/key_mapping_x11.h +++ b/platform/linuxbsd/key_mapping_x11.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -45,11 +45,11 @@ class KeyMappingX11 {  public:  	static Key get_keycode(KeySym p_keysym); -	static unsigned int get_xlibcode(unsigned int p_keysym); -	static unsigned int get_scancode(unsigned int p_code); +	static unsigned int get_xlibcode(Key p_keysym); +	static Key get_scancode(unsigned int p_code);  	static KeySym get_keysym(Key p_code);  	static unsigned int get_unicode_from_keysym(KeySym p_keysym);  	static KeySym get_keysym_from_unicode(unsigned int p_unicode);  }; -#endif +#endif // KEY_MAPPING_X11_H diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 69474c6dec..e95a865636 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ @@ -419,7 +419,7 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) {  	String mnt = get_mountpoint(p_path);  	// If there is a directory "[Mountpoint]/.Trash-[UID], use it as the trash can. -	if (mnt != "") { +	if (!mnt.is_empty()) {  		String path(mnt + "/.Trash-" + itos(getuid()));  		struct stat s;  		if (!stat(path.utf8().get_data(), &s)) { @@ -428,27 +428,27 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) {  	}  	// Otherwise, if ${XDG_DATA_HOME} is defined, use "${XDG_DATA_HOME}/Trash" as the trash can. -	if (trash_path == "") { +	if (trash_path.is_empty()) {  		char *dhome = getenv("XDG_DATA_HOME");  		if (dhome) { -			trash_path = String(dhome) + "/Trash"; +			trash_path = String::utf8(dhome) + "/Trash";  		}  	}  	// Otherwise, if ${HOME} is defined, use "${HOME}/.local/share/Trash" as the trash can. -	if (trash_path == "") { +	if (trash_path.is_empty()) {  		char *home = getenv("HOME");  		if (home) { -			trash_path = String(home) + "/.local/share/Trash"; +			trash_path = String::utf8(home) + "/.local/share/Trash";  		}  	}  	// Issue an error if none of the previous locations is appropriate for the trash can. -	ERR_FAIL_COND_V_MSG(trash_path == "", FAILED, "Could not determine the trash can location"); +	ERR_FAIL_COND_V_MSG(trash_path.is_empty(), FAILED, "Could not determine the trash can location");  	// Create needed directories for decided trash can location.  	{ -		DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); +		DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);  		Error err = dir_access->make_dir_recursive(trash_path);  		// Issue an error if trash can is not created properly. @@ -457,7 +457,6 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) {  		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/files");  		err = dir_access->make_dir_recursive(trash_path + "/info");  		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/info"); -		memdelete(dir_access);  	}  	// The trash can is successfully created, now we check that we don't exceed our file name length limit. @@ -497,16 +496,15 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) {  	String trash_info = "[Trash Info]\nPath=" + p_path.uri_encode() + "\nDeletionDate=" + timestamp + "\n";  	{  		Error err; -		FileAccess *file = FileAccess::open(trash_path + "/info/" + file_name + ".trashinfo", FileAccess::WRITE, &err); +		FileAccessRef file = FileAccess::open(trash_path + "/info/" + file_name + ".trashinfo", FileAccess::WRITE, &err);  		ERR_FAIL_COND_V_MSG(err != OK, err, "Can't create trashinfo file:" + trash_path + "/info/" + file_name + ".trashinfo");  		file->store_string(trash_info);  		file->close();  		// Rename our resource before moving it to the trash can. -		DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); +		DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);  		err = dir_access->rename(p_path, p_path.get_base_dir() + "/" + file_name);  		ERR_FAIL_COND_V_MSG(err != OK, err, "Can't rename file \"" + p_path + "\""); -		memdelete(dir_access);  	}  	// Move the given resource to the trash can. diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index 35c80e3f9b..ad6e4cd168 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/platform_config.h b/platform/linuxbsd/platform_config.h index aa78b48bb0..3c05c67444 100644 --- a/platform/linuxbsd/platform_config.h +++ b/platform/linuxbsd/platform_config.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/vulkan_context_x11.cpp b/platform/linuxbsd/vulkan_context_x11.cpp index 4d58e4999b..e2fd8c76d2 100644 --- a/platform/linuxbsd/vulkan_context_x11.cpp +++ b/platform/linuxbsd/vulkan_context_x11.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */ diff --git a/platform/linuxbsd/vulkan_context_x11.h b/platform/linuxbsd/vulkan_context_x11.h index de4a9c7b90..a89afa2eff 100644 --- a/platform/linuxbsd/vulkan_context_x11.h +++ b/platform/linuxbsd/vulkan_context_x11.h @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2022 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       */  |