diff options
Diffstat (limited to 'platform/linuxbsd')
| -rw-r--r-- | platform/linuxbsd/display_server_x11.cpp | 84 | ||||
| -rw-r--r-- | platform/linuxbsd/display_server_x11.h | 2 | ||||
| -rw-r--r-- | platform/linuxbsd/os_linuxbsd.cpp | 66 | ||||
| -rw-r--r-- | platform/linuxbsd/os_linuxbsd.h | 2 | 
4 files changed, 79 insertions, 75 deletions
diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 8f0742041c..4a32dd9646 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -136,70 +136,6 @@ String DisplayServerX11::get_name() const {  	return "X11";  } -void DisplayServerX11::alert(const String &p_alert, const String &p_title) { -	const char *message_programs[] = { "zenity", "kdialog", "Xdialog", "xmessage" }; - -	String path = OS::get_singleton()->get_environment("PATH"); -	Vector<String> path_elems = path.split(":", false); -	String program; - -	for (int i = 0; i < path_elems.size(); i++) { -		for (uint64_t k = 0; k < sizeof(message_programs) / sizeof(char *); k++) { -			String tested_path = path_elems[i].plus_file(message_programs[k]); - -			if (FileAccess::exists(tested_path)) { -				program = tested_path; -				break; -			} -		} - -		if (program.length()) { -			break; -		} -	} - -	List<String> args; - -	if (program.ends_with("zenity")) { -		args.push_back("--error"); -		args.push_back("--width"); -		args.push_back("500"); -		args.push_back("--title"); -		args.push_back(p_title); -		args.push_back("--text"); -		args.push_back(p_alert); -	} - -	if (program.ends_with("kdialog")) { -		args.push_back("--error"); -		args.push_back(p_alert); -		args.push_back("--title"); -		args.push_back(p_title); -	} - -	if (program.ends_with("Xdialog")) { -		args.push_back("--title"); -		args.push_back(p_title); -		args.push_back("--msgbox"); -		args.push_back(p_alert); -		args.push_back("0"); -		args.push_back("0"); -	} - -	if (program.ends_with("xmessage")) { -		args.push_back("-center"); -		args.push_back("-title"); -		args.push_back(p_title); -		args.push_back(p_alert); -	} - -	if (program.length()) { -		OS::get_singleton()->execute(program, args); -	} else { -		print_line(p_alert); -	} -} -  void DisplayServerX11::_update_real_mouse_position(const WindowData &wd) {  	Window root_return, child_return;  	int root_x, root_y, win_x, win_y; @@ -871,7 +807,9 @@ DisplayServer::WindowID DisplayServerX11::create_sub_window(WindowMode p_mode, V  void DisplayServerX11::show_window(WindowID p_id) {  	_THREAD_SAFE_METHOD_ -	WindowData &wd = windows[p_id]; +	const WindowData &wd = windows[p_id]; + +	DEBUG_LOG_X11("show_window: %lu (%u) \n", wd.x11_window, p_id);  	XMapWindow(x11_display, wd.x11_window);  } @@ -1095,6 +1033,8 @@ void DisplayServerX11::window_set_transient(WindowID p_window, WindowID p_parent  	WindowID prev_parent = wd_window.transient_parent;  	ERR_FAIL_COND(prev_parent == p_parent); +	DEBUG_LOG_X11("window_set_transient: %lu (%u), prev_parent=%u, parent=%u\n", wd_window.x11_window, p_window, prev_parent, p_parent); +  	ERR_FAIL_COND_MSG(wd_window.on_top, "Windows with the 'on top' can't become transient.");  	if (p_parent == INVALID_WINDOW_ID) {  		//remove transient @@ -1109,10 +1049,10 @@ void DisplayServerX11::window_set_transient(WindowID p_window, WindowID p_parent  		XSetTransientForHint(x11_display, wd_window.x11_window, None); -		// Set focus to parent sub window to avoid losing all focus with nested menus. +		// Set focus to parent sub window to avoid losing all focus when closing a nested sub-menu.  		// RevertToPointerRoot is used to make sure we don't lose all focus in case  		// a subwindow and its parent are both destroyed. -		if (wd_window.menu_type && !wd_window.no_focus) { +		if (wd_window.menu_type && !wd_window.no_focus && wd_window.focused) {  			if (!wd_parent.no_focus) {  				XSetInputFocus(x11_display, wd_parent.x11_window, RevertToPointerRoot, CurrentTime);  			} @@ -2227,7 +2167,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,  	// still works in half the cases. (won't handle deadkeys)  	// For more complex input methods (deadkeys and more advanced)  	// you have to use XmbLookupString (??). -	// So.. then you have to chosse which of both results +	// So then you have to choose which of both results  	// you want to keep.  	// This is a real bizarreness and cpu waster. @@ -3673,8 +3613,8 @@ Vector<String> DisplayServerX11::get_rendering_drivers_func() {  DisplayServer *DisplayServerX11::create_func(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {  	DisplayServer *ds = memnew(DisplayServerX11(p_rendering_driver, p_mode, p_vsync_mode, p_flags, p_resolution, r_error));  	if (r_error != OK) { -		ds->alert("Your video card driver does not support any of the supported Vulkan versions.\n" -				  "Please update your drivers or if you have a very old or integrated GPU upgrade it.", +		OS::get_singleton()->alert("Your video card driver does not support any of the supported Vulkan versions.\n" +								   "Please update your drivers or if you have a very old or integrated GPU upgrade it.",  				"Unable to initialize Video driver");  	}  	return ds; @@ -3972,8 +3912,8 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode  	}  	if (!_refresh_device_info()) { -		alert("Your system does not support XInput 2.\n" -			  "Please upgrade your distribution.", +		OS::get_singleton()->alert("Your system does not support XInput 2.\n" +								   "Please upgrade your distribution.",  				"Unable to initialize XInput");  		r_error = ERR_UNAVAILABLE;  		return; diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 29c15ca2ba..052c6d6b7b 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -280,8 +280,6 @@ public:  	virtual bool has_feature(Feature p_feature) const override;  	virtual String get_name() const override; -	virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override; -  	virtual void mouse_set_mode(MouseMode p_mode) override;  	virtual MouseMode mouse_get_mode() const override; diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 8cd6ec43c6..08630be8b0 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -51,6 +51,70 @@  #include <sys/types.h>  #include <unistd.h> +void OS_LinuxBSD::alert(const String &p_alert, const String &p_title) { +	const char *message_programs[] = { "zenity", "kdialog", "Xdialog", "xmessage" }; + +	String path = get_environment("PATH"); +	Vector<String> path_elems = path.split(":", false); +	String program; + +	for (int i = 0; i < path_elems.size(); i++) { +		for (uint64_t k = 0; k < sizeof(message_programs) / sizeof(char *); k++) { +			String tested_path = path_elems[i].plus_file(message_programs[k]); + +			if (FileAccess::exists(tested_path)) { +				program = tested_path; +				break; +			} +		} + +		if (program.length()) { +			break; +		} +	} + +	List<String> args; + +	if (program.ends_with("zenity")) { +		args.push_back("--error"); +		args.push_back("--width"); +		args.push_back("500"); +		args.push_back("--title"); +		args.push_back(p_title); +		args.push_back("--text"); +		args.push_back(p_alert); +	} + +	if (program.ends_with("kdialog")) { +		args.push_back("--error"); +		args.push_back(p_alert); +		args.push_back("--title"); +		args.push_back(p_title); +	} + +	if (program.ends_with("Xdialog")) { +		args.push_back("--title"); +		args.push_back(p_title); +		args.push_back("--msgbox"); +		args.push_back(p_alert); +		args.push_back("0"); +		args.push_back("0"); +	} + +	if (program.ends_with("xmessage")) { +		args.push_back("-center"); +		args.push_back("-title"); +		args.push_back(p_title); +		args.push_back(p_alert); +	} + +	if (program.length()) { +		execute(program, args); +	} else { +		print_line(p_alert); +	} +} +  void OS_LinuxBSD::initialize() {  	crash_handler.initialize(); @@ -387,7 +451,7 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) {  		DirAccess *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 proprely. +		// Issue an error if trash can is not created properly.  		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"");  		err = dir_access->make_dir_recursive(trash_path + "/files");  		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/files"); diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index b6cf93c551..1e06587322 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -90,6 +90,8 @@ public:  	virtual String get_unique_id() const override; +	virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override; +  	virtual bool _check_internal_feature_support(const String &p_feature) override;  	void run();  |