From 0edb6bd4a0834f2ae33457d4289c527edf86e04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Fri, 22 Aug 2025 08:53:19 +0300 Subject: [PATCH] [Linux/BSD] Initialize DBus only once. --- .../linuxbsd/freedesktop_at_spi_monitor.cpp | 25 ------ .../linuxbsd/freedesktop_portal_desktop.cpp | 27 ------- platform/linuxbsd/freedesktop_screensaver.cpp | 26 ------ .../wayland/display_server_wayland.cpp | 57 +++++++++++-- platform/linuxbsd/x11/display_server_x11.cpp | 79 +++++++++++++++---- 5 files changed, 117 insertions(+), 97 deletions(-) diff --git a/platform/linuxbsd/freedesktop_at_spi_monitor.cpp b/platform/linuxbsd/freedesktop_at_spi_monitor.cpp index 59a7d68b7d..8f7e8bf69a 100644 --- a/platform/linuxbsd/freedesktop_at_spi_monitor.cpp +++ b/platform/linuxbsd/freedesktop_at_spi_monitor.cpp @@ -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(); diff --git a/platform/linuxbsd/freedesktop_portal_desktop.cpp b/platform/linuxbsd/freedesktop_portal_desktop.cpp index b4c6f652f4..53799a624b 100644 --- a/platform/linuxbsd/freedesktop_portal_desktop.cpp +++ b/platform/linuxbsd/freedesktop_portal_desktop.cpp @@ -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); diff --git a/platform/linuxbsd/freedesktop_screensaver.cpp b/platform/linuxbsd/freedesktop_screensaver.cpp index 2d1fd07452..d5da5d246a 100644 --- a/platform/linuxbsd/freedesktop_screensaver.cpp +++ b/platform/linuxbsd/freedesktop_screensaver.cpp @@ -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 diff --git a/platform/linuxbsd/wayland/display_server_wayland.cpp b/platform/linuxbsd/wayland/display_server_wayland.cpp index 39f87e020e..8731996229 100644 --- a/platform/linuxbsd/wayland/display_server_wayland.cpp +++ b/platform/linuxbsd/wayland/display_server_wayland.cpp @@ -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 +#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 &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 &p_filters, const TypedArray &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 } diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 59e6964c46..5cbe9d5e9b 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -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 +#endif +#endif + #include #include #include @@ -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 &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 &p_filters, const TypedArray &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 }