diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2024-01-19 20:46:26 +0200 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2024-02-13 18:38:53 +0200 |
commit | ee53ae28dff4ca227ba970c733bf89d53f432141 (patch) | |
tree | e06843f4904ae6aafeeb99b1beaade6a96dff74e /platform/linuxbsd/freedesktop_portal_desktop.cpp | |
parent | e92d55bbf417aa9f4592a863cb5b2c7ba0740e21 (diff) | |
download | redot-engine-ee53ae28dff4ca227ba970c733bf89d53f432141.tar.gz |
Add method to get "base" system UI color (macOS/Windows) and system theme change callback.
Diffstat (limited to 'platform/linuxbsd/freedesktop_portal_desktop.cpp')
-rw-r--r-- | platform/linuxbsd/freedesktop_portal_desktop.cpp | 72 |
1 files changed, 65 insertions, 7 deletions
diff --git a/platform/linuxbsd/freedesktop_portal_desktop.cpp b/platform/linuxbsd/freedesktop_portal_desktop.cpp index a3633e72b7..cdebed58b2 100644 --- a/platform/linuxbsd/freedesktop_portal_desktop.cpp +++ b/platform/linuxbsd/freedesktop_portal_desktop.cpp @@ -528,10 +528,10 @@ void FreeDesktopPortalDesktop::_file_dialog_callback(const Callable &p_callable, } } -void FreeDesktopPortalDesktop::_thread_file_dialog_monitor(void *p_ud) { +void FreeDesktopPortalDesktop::_thread_monitor(void *p_ud) { FreeDesktopPortalDesktop *portal = (FreeDesktopPortalDesktop *)p_ud; - while (!portal->file_dialog_thread_abort.is_set()) { + while (!portal->monitor_thread_abort.is_set()) { { MutexLock lock(portal->file_dialog_mutex); for (int i = portal->file_dialogs.size() - 1; i >= 0; i--) { @@ -579,10 +579,44 @@ void FreeDesktopPortalDesktop::_thread_file_dialog_monitor(void *p_ud) { } } } + + if (portal->theme_connection) { + while (true) { + DBusMessage *msg = dbus_connection_pop_message(portal->theme_connection); + if (!msg) { + break; + } else if (dbus_message_is_signal(msg, "org.freedesktop.portal.Settings", "SettingChanged")) { + DBusMessageIter iter; + if (dbus_message_iter_init(msg, &iter)) { + const char *value; + dbus_message_iter_get_basic(&iter, &value); + String name_space = String::utf8(value); + dbus_message_iter_next(&iter); + dbus_message_iter_get_basic(&iter, &value); + String key = String::utf8(value); + + if (name_space == "org.freedesktop.appearance" && key == "color-scheme") { + callable_mp(portal, &FreeDesktopPortalDesktop::_system_theme_changed_callback).call_deferred(); + } + } + dbus_message_unref(msg); + break; + } + dbus_message_unref(msg); + } + dbus_connection_read_write(portal->theme_connection, 0); + } + usleep(50000); } } +void FreeDesktopPortalDesktop::_system_theme_changed_callback() { + if (system_theme_changed.is_valid()) { + system_theme_changed.call(); + } +} + FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() { #ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED @@ -611,17 +645,34 @@ FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() { unsupported = true; } + DBusError err; + dbus_error_init(&err); + theme_connection = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) { + dbus_error_free(&err); + } else { + theme_path = "type='signal',sender='org.freedesktop.portal.Desktop',interface='org.freedesktop.portal.Settings',member='SettingChanged'"; + dbus_bus_add_match(theme_connection, theme_path.utf8().get_data(), &err); + if (dbus_error_is_set(&err)) { + dbus_error_free(&err); + dbus_connection_unref(theme_connection); + theme_connection = nullptr; + } + dbus_connection_read_write(theme_connection, 0); + } + if (!unsupported) { - file_dialog_thread_abort.clear(); - file_dialog_thread.start(FreeDesktopPortalDesktop::_thread_file_dialog_monitor, this); + monitor_thread_abort.clear(); + monitor_thread.start(FreeDesktopPortalDesktop::_thread_monitor, this); } } FreeDesktopPortalDesktop::~FreeDesktopPortalDesktop() { - file_dialog_thread_abort.set(); - if (file_dialog_thread.is_started()) { - file_dialog_thread.wait_to_finish(); + monitor_thread_abort.set(); + if (monitor_thread.is_started()) { + monitor_thread.wait_to_finish(); } + for (FreeDesktopPortalDesktop::FileDialogData &fd : file_dialogs) { if (fd.connection) { DBusError err; @@ -631,6 +682,13 @@ FreeDesktopPortalDesktop::~FreeDesktopPortalDesktop() { dbus_connection_unref(fd.connection); } } + if (theme_connection) { + DBusError err; + dbus_error_init(&err); + dbus_bus_remove_match(theme_connection, theme_path.utf8().get_data(), &err); + dbus_error_free(&err); + dbus_connection_unref(theme_connection); + } } #endif // DBUS_ENABLED |