5757#include " drivers/accesskit/accessibility_driver_accesskit.h"
5858#endif
5959
60+ #ifdef DBUS_ENABLED
61+ #ifdef SOWRAP_ENABLED
62+ #include " dbus-so_wrap.h"
63+ #else
64+ #include < dbus/dbus.h>
65+ #endif
66+ #endif
67+
6068#include < dlfcn.h>
6169#include < sys/stat.h>
6270#include < sys/types.h>
@@ -438,14 +446,19 @@ bool DisplayServerX11::is_dark_mode() const {
438446}
439447
440448Color DisplayServerX11::get_accent_color () const {
449+ if (!portal_desktop) {
450+ return Color ();
451+ }
441452 return portal_desktop->get_appearance_accent_color ();
442453}
443454
444455void DisplayServerX11::set_system_theme_change_callback (const Callable &p_callable) {
456+ ERR_FAIL_COND (!portal_desktop);
445457 portal_desktop->set_system_theme_change_callback (p_callable);
446458}
447459
448460Error 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) {
461+ ERR_FAIL_COND_V (!portal_desktop, ERR_UNAVAILABLE);
449462 WindowID window_id = p_window_id;
450463
451464 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_
457470}
458471
459472Error 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) {
473+ ERR_FAIL_COND_V (!portal_desktop, ERR_UNAVAILABLE);
460474 WindowID window_id = p_window_id;
461475
462476 if (!windows.has (window_id) || windows[window_id].is_popup ) {
@@ -1845,13 +1859,15 @@ void DisplayServerX11::screen_set_keep_on(bool p_enable) {
18451859 return ;
18461860 }
18471861
1848- if (p_enable) {
1849- screensaver->inhibit ();
1850- } else {
1851- screensaver->uninhibit ();
1852- }
1862+ if (screensaver) {
1863+ if (p_enable) {
1864+ screensaver->inhibit ();
1865+ } else {
1866+ screensaver->uninhibit ();
1867+ }
18531868
1854- keep_screen_on = p_enable;
1869+ keep_screen_on = p_enable;
1870+ }
18551871}
18561872
18571873bool DisplayServerX11::screen_is_kept_on () const {
@@ -3420,14 +3436,17 @@ void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_
34203436
34213437int DisplayServerX11::accessibility_should_increase_contrast () const {
34223438#ifdef DBUS_ENABLED
3439+ if (!portal_desktop) {
3440+ return -1 ;
3441+ }
34233442 return portal_desktop->get_high_contrast ();
34243443#endif
34253444 return -1 ;
34263445}
34273446
34283447int DisplayServerX11::accessibility_screen_reader_active () const {
34293448#ifdef DBUS_ENABLED
3430- if (atspi_monitor->is_supported ()) {
3449+ if (atspi_monitor && atspi_monitor ->is_supported ()) {
34313450 return atspi_monitor->is_active ();
34323451 }
34333452#endif
@@ -3692,6 +3711,9 @@ Key DisplayServerX11::keyboard_get_label_from_physical(Key p_keycode) const {
36923711
36933712bool DisplayServerX11::color_picker (const Callable &p_callback) {
36943713#ifdef DBUS_ENABLED
3714+ if (!portal_desktop) {
3715+ return false ;
3716+ }
36953717 WindowID window_id = last_focused_window;
36963718
36973719 if (!windows.has (window_id)) {
@@ -7347,12 +7369,35 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
73477369 _update_real_mouse_position (windows[MAIN_WINDOW_ID]);
73487370
73497371#ifdef DBUS_ENABLED
7350- screensaver = memnew (FreeDesktopScreenSaver);
7372+ bool dbus_ok = true ;
7373+ #ifdef SOWRAP_ENABLED
7374+ if (initialize_dbus (dylibloader_verbose) != 0 ) {
7375+ print_verbose (" Failed to load DBus library!" );
7376+ dbus_ok = false ;
7377+ }
7378+ #endif
7379+ if (dbus_ok) {
7380+ bool ver_ok = false ;
7381+ int version_major = 0 ;
7382+ int version_minor = 0 ;
7383+ int version_rev = 0 ;
7384+ dbus_get_version (&version_major, &version_minor, &version_rev);
7385+ ver_ok = (version_major == 1 && version_minor >= 10 ) || (version_major > 1 ); // 1.10.0
7386+ print_verbose (vformat (" DBus %d.%d.%d detected." , version_major, version_minor, version_rev));
7387+ if (!ver_ok) {
7388+ print_verbose (" Unsupported DBus library version!" );
7389+ dbus_ok = false ;
7390+ }
7391+ }
7392+ if (dbus_ok) {
7393+ screensaver = memnew (FreeDesktopScreenSaver);
7394+ portal_desktop = memnew (FreeDesktopPortalDesktop);
7395+ atspi_monitor = memnew (FreeDesktopAtSPIMonitor);
7396+ }
7397+ #endif // DBUS_ENABLED
7398+
73517399 screen_set_keep_on (GLOBAL_GET (" display/window/energy_saving/keep_screen_on" ));
73527400
7353- portal_desktop = memnew (FreeDesktopPortalDesktop);
7354- atspi_monitor = memnew (FreeDesktopAtSPIMonitor);
7355- #endif // DBUS_ENABLED
73567401 XSetErrorHandler (&default_window_error_handler);
73577402
73587403 r_error = OK;
@@ -7484,9 +7529,15 @@ DisplayServerX11::~DisplayServerX11() {
74847529#endif
74857530
74867531#ifdef DBUS_ENABLED
7487- memdelete (screensaver);
7488- memdelete (portal_desktop);
7489- memdelete (atspi_monitor);
7532+ if (screensaver) {
7533+ memdelete (screensaver);
7534+ }
7535+ if (portal_desktop) {
7536+ memdelete (portal_desktop);
7537+ }
7538+ if (atspi_monitor) {
7539+ memdelete (atspi_monitor);
7540+ }
74907541#endif
74917542}
74927543
0 commit comments