1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

[Linux/BSD] Initialize DBus only once.

This commit is contained in:
Pāvels Nadtočajevs
2025-08-22 08:53:19 +03:00
parent b432e108d5
commit 0edb6bd4a0
5 changed files with 117 additions and 97 deletions

View File

@@ -160,31 +160,6 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
}
FreeDesktopAtSPIMonitor::FreeDesktopAtSPIMonitor() {
#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
if (initialize_dbus(dylibloader_verbose) != 0) {
print_verbose("AT-SPI2: Failed to load DBus library!");
supported.clear();
return;
}
#endif
bool ver_ok = false;
int version_major = 0;
int version_minor = 0;
int version_rev = 0;
dbus_get_version(&version_major, &version_minor, &version_rev);
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
print_verbose(vformat("AT-SPI2: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
if (!ver_ok) {
print_verbose("AT-SPI2: Unsupported DBus library version!");
supported.clear();
return;
}
supported.set();
sr_enabled.clear();
exit_thread.clear();

View File

@@ -965,33 +965,6 @@ void FreeDesktopPortalDesktop::_system_theme_changed_callback() {
}
FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() {
#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
#else
unsupported = false;
#endif
if (unsupported) {
return;
}
bool ver_ok = false;
int version_major = 0;
int version_minor = 0;
int version_rev = 0;
dbus_get_version(&version_major, &version_minor, &version_rev);
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
print_verbose(vformat("PortalDesktop: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
if (!ver_ok) {
print_verbose("PortalDesktop: Unsupported DBus library version!");
unsupported = true;
}
DBusError err;
dbus_error_init(&err);
monitor_connection = dbus_bus_get(DBUS_BUS_SESSION, &err);

View File

@@ -131,32 +131,6 @@ void FreeDesktopScreenSaver::uninhibit() {
}
FreeDesktopScreenSaver::FreeDesktopScreenSaver() {
#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
#else
unsupported = false;
#endif
if (unsupported) {
return;
}
bool ver_ok = false;
int version_major = 0;
int version_minor = 0;
int version_rev = 0;
dbus_get_version(&version_major, &version_minor, &version_rev);
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
print_verbose(vformat("ScreenSaver: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
if (!ver_ok) {
print_verbose("ScreenSaver:: Unsupported DBus library version!");
unsupported = true;
}
}
#endif // DBUS_ENABLED

View File

@@ -56,6 +56,14 @@
#include "drivers/accesskit/accessibility_driver_accesskit.h"
#endif
#ifdef DBUS_ENABLED
#ifdef SOWRAP_ENABLED
#include "dbus-so_wrap.h"
#else
#include <dbus/dbus.h>
#endif
#endif
#define WAYLAND_MAX_FRAME_TIME_US (1'000'000)
String DisplayServerWayland::_get_app_id_from_context(Context p_context) {
@@ -311,14 +319,19 @@ bool DisplayServerWayland::is_dark_mode() const {
}
Color DisplayServerWayland::get_accent_color() const {
if (!portal_desktop) {
return Color();
}
return portal_desktop->get_appearance_accent_color();
}
void DisplayServerWayland::set_system_theme_change_callback(const Callable &p_callable) {
ERR_FAIL_COND(!portal_desktop);
portal_desktop->set_system_theme_change_callback(p_callable);
}
Error DisplayServerWayland::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) {
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
MutexLock mutex_lock(wayland_thread.mutex);
WindowID window_id = p_window_id;
@@ -333,6 +346,7 @@ Error DisplayServerWayland::file_dialog_show(const String &p_title, const String
}
Error DisplayServerWayland::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) {
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
MutexLock mutex_lock(wayland_thread.mutex);
WindowID window_id = p_window_id;
@@ -1321,6 +1335,9 @@ void DisplayServerWayland::window_set_ime_position(const Point2i &p_pos, Display
int DisplayServerWayland::accessibility_should_increase_contrast() const {
#ifdef DBUS_ENABLED
if (!portal_desktop) {
return -1;
}
return portal_desktop->get_high_contrast();
#endif
return -1;
@@ -1328,7 +1345,7 @@ int DisplayServerWayland::accessibility_should_increase_contrast() const {
int DisplayServerWayland::accessibility_screen_reader_active() const {
#ifdef DBUS_ENABLED
if (atspi_monitor->is_supported()) {
if (atspi_monitor && atspi_monitor->is_supported()) {
return atspi_monitor->is_active();
}
#endif
@@ -1544,6 +1561,10 @@ Key DisplayServerWayland::keyboard_get_keycode_from_physical(Key p_keycode) cons
bool DisplayServerWayland::color_picker(const Callable &p_callback) {
#ifdef DBUS_ENABLED
if (!portal_desktop) {
return false;
}
MutexLock mutex_lock(wayland_thread.mutex);
WindowID window_id = MAIN_WINDOW_ID;
// TODO: Use window IDs for multiwindow support.
WaylandThread::WindowState *ws = wayland_thread.wl_surface_get_window_state(wayland_thread.window_get_wl_surface(window_id));
@@ -2112,9 +2133,31 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
#endif // RD_ENABLED
#ifdef DBUS_ENABLED
portal_desktop = memnew(FreeDesktopPortalDesktop);
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
screensaver = memnew(FreeDesktopScreenSaver);
bool dbus_ok = true;
#ifdef SOWRAP_ENABLED
if (initialize_dbus(dylibloader_verbose) != 0) {
print_verbose("Failed to load DBus library!");
dbus_ok = false;
}
#endif
if (dbus_ok) {
bool ver_ok = false;
int version_major = 0;
int version_minor = 0;
int version_rev = 0;
dbus_get_version(&version_major, &version_minor, &version_rev);
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
print_verbose(vformat("DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
if (!ver_ok) {
print_verbose("Unsupported DBus library version!");
dbus_ok = false;
}
}
if (dbus_ok) {
screensaver = memnew(FreeDesktopScreenSaver);
portal_desktop = memnew(FreeDesktopPortalDesktop);
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
}
#endif // DBUS_ENABLED
screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
@@ -2178,9 +2221,13 @@ DisplayServerWayland::~DisplayServerWayland() {
#ifdef DBUS_ENABLED
if (portal_desktop) {
memdelete(portal_desktop);
memdelete(atspi_monitor);
}
if (screensaver) {
memdelete(screensaver);
}
if (atspi_monitor) {
memdelete(atspi_monitor);
}
#endif
}

View File

@@ -57,6 +57,14 @@
#include "drivers/accesskit/accessibility_driver_accesskit.h"
#endif
#ifdef DBUS_ENABLED
#ifdef SOWRAP_ENABLED
#include "dbus-so_wrap.h"
#else
#include <dbus/dbus.h>
#endif
#endif
#include <dlfcn.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -438,14 +446,19 @@ bool DisplayServerX11::is_dark_mode() const {
}
Color DisplayServerX11::get_accent_color() const {
if (!portal_desktop) {
return Color();
}
return portal_desktop->get_appearance_accent_color();
}
void DisplayServerX11::set_system_theme_change_callback(const Callable &p_callable) {
ERR_FAIL_COND(!portal_desktop);
portal_desktop->set_system_theme_change_callback(p_callable);
}
Error DisplayServerX11::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) {
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
WindowID window_id = p_window_id;
if (!windows.has(window_id) || windows[window_id].is_popup) {
@@ -457,6 +470,7 @@ Error DisplayServerX11::file_dialog_show(const String &p_title, const String &p_
}
Error DisplayServerX11::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) {
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
WindowID window_id = p_window_id;
if (!windows.has(window_id) || windows[window_id].is_popup) {
@@ -1845,13 +1859,15 @@ void DisplayServerX11::screen_set_keep_on(bool p_enable) {
return;
}
if (p_enable) {
screensaver->inhibit();
} else {
screensaver->uninhibit();
}
if (screensaver) {
if (p_enable) {
screensaver->inhibit();
} else {
screensaver->uninhibit();
}
keep_screen_on = p_enable;
keep_screen_on = p_enable;
}
}
bool DisplayServerX11::screen_is_kept_on() const {
@@ -3420,6 +3436,9 @@ void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_
int DisplayServerX11::accessibility_should_increase_contrast() const {
#ifdef DBUS_ENABLED
if (!portal_desktop) {
return -1;
}
return portal_desktop->get_high_contrast();
#endif
return -1;
@@ -3427,7 +3446,7 @@ int DisplayServerX11::accessibility_should_increase_contrast() const {
int DisplayServerX11::accessibility_screen_reader_active() const {
#ifdef DBUS_ENABLED
if (atspi_monitor->is_supported()) {
if (atspi_monitor && atspi_monitor->is_supported()) {
return atspi_monitor->is_active();
}
#endif
@@ -3692,6 +3711,9 @@ Key DisplayServerX11::keyboard_get_label_from_physical(Key p_keycode) const {
bool DisplayServerX11::color_picker(const Callable &p_callback) {
#ifdef DBUS_ENABLED
if (!portal_desktop) {
return false;
}
WindowID window_id = last_focused_window;
if (!windows.has(window_id)) {
@@ -7347,12 +7369,35 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
_update_real_mouse_position(windows[MAIN_WINDOW_ID]);
#ifdef DBUS_ENABLED
screensaver = memnew(FreeDesktopScreenSaver);
bool dbus_ok = true;
#ifdef SOWRAP_ENABLED
if (initialize_dbus(dylibloader_verbose) != 0) {
print_verbose("Failed to load DBus library!");
dbus_ok = false;
}
#endif
if (dbus_ok) {
bool ver_ok = false;
int version_major = 0;
int version_minor = 0;
int version_rev = 0;
dbus_get_version(&version_major, &version_minor, &version_rev);
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
print_verbose(vformat("DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
if (!ver_ok) {
print_verbose("Unsupported DBus library version!");
dbus_ok = false;
}
}
if (dbus_ok) {
screensaver = memnew(FreeDesktopScreenSaver);
portal_desktop = memnew(FreeDesktopPortalDesktop);
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
}
#endif // DBUS_ENABLED
screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
portal_desktop = memnew(FreeDesktopPortalDesktop);
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
#endif // DBUS_ENABLED
XSetErrorHandler(&default_window_error_handler);
r_error = OK;
@@ -7484,9 +7529,15 @@ DisplayServerX11::~DisplayServerX11() {
#endif
#ifdef DBUS_ENABLED
memdelete(screensaver);
memdelete(portal_desktop);
memdelete(atspi_monitor);
if (screensaver) {
memdelete(screensaver);
}
if (portal_desktop) {
memdelete(portal_desktop);
}
if (atspi_monitor) {
memdelete(atspi_monitor);
}
#endif
}