Skip to content

Commit 88547a1

Browse files
authored
Merge pull request #109857 from bruvzg/dbus_init
[Linux/BSD] Initialize DBus only once.
2 parents 8e458d1 + 0edb6bd commit 88547a1

File tree

5 files changed

+117
-97
lines changed

5 files changed

+117
-97
lines changed

platform/linuxbsd/freedesktop_at_spi_monitor.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -160,31 +160,6 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
160160
}
161161

162162
FreeDesktopAtSPIMonitor::FreeDesktopAtSPIMonitor() {
163-
#ifdef SOWRAP_ENABLED
164-
#ifdef DEBUG_ENABLED
165-
int dylibloader_verbose = 1;
166-
#else
167-
int dylibloader_verbose = 0;
168-
#endif
169-
if (initialize_dbus(dylibloader_verbose) != 0) {
170-
print_verbose("AT-SPI2: Failed to load DBus library!");
171-
supported.clear();
172-
return;
173-
}
174-
#endif
175-
bool ver_ok = false;
176-
int version_major = 0;
177-
int version_minor = 0;
178-
int version_rev = 0;
179-
dbus_get_version(&version_major, &version_minor, &version_rev);
180-
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
181-
print_verbose(vformat("AT-SPI2: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
182-
if (!ver_ok) {
183-
print_verbose("AT-SPI2: Unsupported DBus library version!");
184-
supported.clear();
185-
return;
186-
}
187-
188163
supported.set();
189164
sr_enabled.clear();
190165
exit_thread.clear();

platform/linuxbsd/freedesktop_portal_desktop.cpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -965,33 +965,6 @@ void FreeDesktopPortalDesktop::_system_theme_changed_callback() {
965965
}
966966

967967
FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() {
968-
#ifdef SOWRAP_ENABLED
969-
#ifdef DEBUG_ENABLED
970-
int dylibloader_verbose = 1;
971-
#else
972-
int dylibloader_verbose = 0;
973-
#endif
974-
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
975-
#else
976-
unsupported = false;
977-
#endif
978-
979-
if (unsupported) {
980-
return;
981-
}
982-
983-
bool ver_ok = false;
984-
int version_major = 0;
985-
int version_minor = 0;
986-
int version_rev = 0;
987-
dbus_get_version(&version_major, &version_minor, &version_rev);
988-
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
989-
print_verbose(vformat("PortalDesktop: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
990-
if (!ver_ok) {
991-
print_verbose("PortalDesktop: Unsupported DBus library version!");
992-
unsupported = true;
993-
}
994-
995968
DBusError err;
996969
dbus_error_init(&err);
997970
monitor_connection = dbus_bus_get(DBUS_BUS_SESSION, &err);

platform/linuxbsd/freedesktop_screensaver.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -131,32 +131,6 @@ void FreeDesktopScreenSaver::uninhibit() {
131131
}
132132

133133
FreeDesktopScreenSaver::FreeDesktopScreenSaver() {
134-
#ifdef SOWRAP_ENABLED
135-
#ifdef DEBUG_ENABLED
136-
int dylibloader_verbose = 1;
137-
#else
138-
int dylibloader_verbose = 0;
139-
#endif
140-
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
141-
#else
142-
unsupported = false;
143-
#endif
144-
145-
if (unsupported) {
146-
return;
147-
}
148-
149-
bool ver_ok = false;
150-
int version_major = 0;
151-
int version_minor = 0;
152-
int version_rev = 0;
153-
dbus_get_version(&version_major, &version_minor, &version_rev);
154-
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
155-
print_verbose(vformat("ScreenSaver: DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
156-
if (!ver_ok) {
157-
print_verbose("ScreenSaver:: Unsupported DBus library version!");
158-
unsupported = true;
159-
}
160134
}
161135

162136
#endif // DBUS_ENABLED

platform/linuxbsd/wayland/display_server_wayland.cpp

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@
5656
#include "drivers/accesskit/accessibility_driver_accesskit.h"
5757
#endif
5858

59+
#ifdef DBUS_ENABLED
60+
#ifdef SOWRAP_ENABLED
61+
#include "dbus-so_wrap.h"
62+
#else
63+
#include <dbus/dbus.h>
64+
#endif
65+
#endif
66+
5967
#define WAYLAND_MAX_FRAME_TIME_US (1'000'000)
6068

6169
String DisplayServerWayland::_get_app_id_from_context(Context p_context) {
@@ -311,14 +319,19 @@ bool DisplayServerWayland::is_dark_mode() const {
311319
}
312320

313321
Color DisplayServerWayland::get_accent_color() const {
322+
if (!portal_desktop) {
323+
return Color();
324+
}
314325
return portal_desktop->get_appearance_accent_color();
315326
}
316327

317328
void DisplayServerWayland::set_system_theme_change_callback(const Callable &p_callable) {
329+
ERR_FAIL_COND(!portal_desktop);
318330
portal_desktop->set_system_theme_change_callback(p_callable);
319331
}
320332

321333
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) {
334+
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
322335
MutexLock mutex_lock(wayland_thread.mutex);
323336

324337
WindowID window_id = p_window_id;
@@ -333,6 +346,7 @@ Error DisplayServerWayland::file_dialog_show(const String &p_title, const String
333346
}
334347

335348
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) {
349+
ERR_FAIL_COND_V(!portal_desktop, ERR_UNAVAILABLE);
336350
MutexLock mutex_lock(wayland_thread.mutex);
337351

338352
WindowID window_id = p_window_id;
@@ -1321,14 +1335,17 @@ void DisplayServerWayland::window_set_ime_position(const Point2i &p_pos, Display
13211335

13221336
int DisplayServerWayland::accessibility_should_increase_contrast() const {
13231337
#ifdef DBUS_ENABLED
1338+
if (!portal_desktop) {
1339+
return -1;
1340+
}
13241341
return portal_desktop->get_high_contrast();
13251342
#endif
13261343
return -1;
13271344
}
13281345

13291346
int DisplayServerWayland::accessibility_screen_reader_active() const {
13301347
#ifdef DBUS_ENABLED
1331-
if (atspi_monitor->is_supported()) {
1348+
if (atspi_monitor && atspi_monitor->is_supported()) {
13321349
return atspi_monitor->is_active();
13331350
}
13341351
#endif
@@ -1544,6 +1561,10 @@ Key DisplayServerWayland::keyboard_get_keycode_from_physical(Key p_keycode) cons
15441561

15451562
bool DisplayServerWayland::color_picker(const Callable &p_callback) {
15461563
#ifdef DBUS_ENABLED
1564+
if (!portal_desktop) {
1565+
return false;
1566+
}
1567+
MutexLock mutex_lock(wayland_thread.mutex);
15471568
WindowID window_id = MAIN_WINDOW_ID;
15481569
// TODO: Use window IDs for multiwindow support.
15491570
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
21122133
#endif // RD_ENABLED
21132134

21142135
#ifdef DBUS_ENABLED
2115-
portal_desktop = memnew(FreeDesktopPortalDesktop);
2116-
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
2117-
screensaver = memnew(FreeDesktopScreenSaver);
2136+
bool dbus_ok = true;
2137+
#ifdef SOWRAP_ENABLED
2138+
if (initialize_dbus(dylibloader_verbose) != 0) {
2139+
print_verbose("Failed to load DBus library!");
2140+
dbus_ok = false;
2141+
}
2142+
#endif
2143+
if (dbus_ok) {
2144+
bool ver_ok = false;
2145+
int version_major = 0;
2146+
int version_minor = 0;
2147+
int version_rev = 0;
2148+
dbus_get_version(&version_major, &version_minor, &version_rev);
2149+
ver_ok = (version_major == 1 && version_minor >= 10) || (version_major > 1); // 1.10.0
2150+
print_verbose(vformat("DBus %d.%d.%d detected.", version_major, version_minor, version_rev));
2151+
if (!ver_ok) {
2152+
print_verbose("Unsupported DBus library version!");
2153+
dbus_ok = false;
2154+
}
2155+
}
2156+
if (dbus_ok) {
2157+
screensaver = memnew(FreeDesktopScreenSaver);
2158+
portal_desktop = memnew(FreeDesktopPortalDesktop);
2159+
atspi_monitor = memnew(FreeDesktopAtSPIMonitor);
2160+
}
21182161
#endif // DBUS_ENABLED
21192162

21202163
screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
@@ -2178,9 +2221,13 @@ DisplayServerWayland::~DisplayServerWayland() {
21782221
#ifdef DBUS_ENABLED
21792222
if (portal_desktop) {
21802223
memdelete(portal_desktop);
2181-
memdelete(atspi_monitor);
2224+
}
2225+
if (screensaver) {
21822226
memdelete(screensaver);
21832227
}
2228+
if (atspi_monitor) {
2229+
memdelete(atspi_monitor);
2230+
}
21842231
#endif
21852232
}
21862233

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@
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

440448
Color DisplayServerX11::get_accent_color() const {
449+
if (!portal_desktop) {
450+
return Color();
451+
}
441452
return portal_desktop->get_appearance_accent_color();
442453
}
443454

444455
void 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

448460
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) {
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

459472
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) {
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

18571873
bool DisplayServerX11::screen_is_kept_on() const {
@@ -3420,14 +3436,17 @@ void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_
34203436

34213437
int 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

34283447
int 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

36933712
bool 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

Comments
 (0)