From 1fbc6945d2006bfc07a9a66eb64a134c855d8d61 Mon Sep 17 00:00:00 2001 From: Richard Gráčik Date: Sat, 2 Mar 2024 10:02:35 +0100 Subject: macOS theme switching (#276) * abaddon.cpp: add support for macOS theme changing Based on AppleInterfaceThemeChangedNotification for now. * CMakeLists: last changes for macOS specific libs --------- Co-authored-by: ouwou <26526779+ouwou@users.noreply.github.com> --- CMakeLists.txt | 20 +++++++------------- src/abaddon.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e450cf..24074d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ file(GLOB_RECURSE ABADDON_SOURCES "src/*.h" "src/*.hpp" "src/*.cpp" - ) +) list(FILTER ABADDON_SOURCES EXCLUDE REGEX ".*notifier_gio\\.cpp$") list(FILTER ABADDON_SOURCES EXCLUDE REGEX ".*notifier_fallback\\.cpp$") @@ -148,6 +148,12 @@ endif () set(USE_MINIAUDIO FALSE) +if (APPLE) + target_link_libraries(abaddon "-framework CoreFoundation") + target_link_libraries(abaddon "-framework CoreAudio") + target_link_libraries(abaddon "-framework AudioToolbox") +endif () + if (ENABLE_VOICE) target_compile_definitions(abaddon PRIVATE WITH_VOICE) @@ -194,12 +200,6 @@ if (ENABLE_VOICE) target_link_libraries(abaddon rnnoise::rnnoise) endif () endif () - - if (APPLE) - target_link_libraries(abaddon "-framework CoreFoundation") - target_link_libraries(abaddon "-framework CoreAudio") - target_link_libraries(abaddon "-framework AudioToolbox") - endif () endif () if (${ENABLE_NOTIFICATION_SOUNDS}) @@ -214,12 +214,6 @@ if (USE_MINIAUDIO) PATH_SUFFIXES miniaudio REQUIRED) - if (APPLE) - target_link_libraries(abaddon "-framework CoreFoundation") - target_link_libraries(abaddon "-framework CoreAudio") - target_link_libraries(abaddon "-framework AudioToolbox") - endif () - target_include_directories(abaddon PUBLIC ${MINIAUDIO_INCLUDE_DIR}) target_compile_definitions(abaddon PRIVATE WITH_MINIAUDIO) endif () diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 443fa4e..456749a 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -25,6 +25,23 @@ #include "remoteauth/remoteauthdialog.hpp" #include "util.hpp" +#if defined(__APPLE__) +#include + +void macOSThemeChanged() { + CFPropertyListRef appearanceName = CFPreferencesCopyAppValue(CFSTR("AppleInterfaceStyle"), kCFPreferencesAnyApplication); + if (appearanceName != NULL && CFGetTypeID(appearanceName) == CFStringGetTypeID() && CFStringCompare((CFStringRef)appearanceName, CFSTR("Dark"), 0) == kCFCompareEqualTo) { + Gtk::Settings::get_default()->set_property("gtk-application-prefer-dark-theme", true); + } else { + Gtk::Settings::get_default()->set_property("gtk-application-prefer-dark-theme", false); + } +} + +void macOSThemeChangedCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { + macOSThemeChanged(); +} +#endif + #ifdef WITH_LIBHANDY #include #endif @@ -331,6 +348,17 @@ int Abaddon::StartGTK() { m_gtk_app->hold(); m_main_window->show(); +#if defined(__APPLE__) + CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(), + NULL, + macOSThemeChangedCallback, + CFSTR("AppleInterfaceThemeChangedNotification"), + NULL, + CFNotificationSuspensionBehaviorCoalesce); + + macOSThemeChanged(); +#endif + RunFirstTimeDiscordStartup(); return m_gtk_app->run(*m_main_window); -- cgit v1.2.3 From e8bc60d9263e5b0dd213bcc85f9655ebebcedf49 Mon Sep 17 00:00:00 2001 From: Ryze <50497128+ryze312@users.noreply.github.com> Date: Sun, 3 Mar 2024 08:55:12 +0000 Subject: Add CMake option for additional compiler definitions (#275) originally intended for miniaudio options --------- Co-authored-by: ouwou <26526779+ouwou@users.noreply.github.com> --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24074d7..d1b56fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,3 +217,8 @@ if (USE_MINIAUDIO) target_include_directories(abaddon PUBLIC ${MINIAUDIO_INCLUDE_DIR}) target_compile_definitions(abaddon PRIVATE WITH_MINIAUDIO) endif () + +set(ABADDON_COMPILER_DEFS "" CACHE STRING "Additional compiler definitions") +foreach (COMPILER_DEF IN LISTS ABADDON_COMPILER_DEFS) + target_compile_definitions(abaddon PRIVATE "${COMPILER_DEF}") +endforeach () -- cgit v1.2.3 From 223181e74562a2322650d4c5fa2257a70ad6b3a3 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 6 Mar 2024 00:54:53 -0500 Subject: clang-format AllowShortIfStatementsOnASingleLine --- .clang-format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index 6bd8ca0..6e9ec33 100644 --- a/.clang-format +++ b/.clang-format @@ -10,7 +10,7 @@ AllowAllParametersOfDeclarationOnNextLine: 'false' AllowShortBlocksOnASingleLine: 'true' AllowShortCaseLabelsOnASingleLine: 'true' AllowShortFunctionsOnASingleLine: Inline -AllowShortIfStatementsOnASingleLine: Always +AllowShortIfStatementsOnASingleLine: AllIfsAndElse AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: 'true' AlwaysBreakAfterDefinitionReturnType: None -- cgit v1.2.3 From 3ace5d26e91c6158f99398c7d7dc8b7cd219eb4f Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 6 Mar 2024 00:55:37 -0500 Subject: add runtime option for selecting audio backend priority (voice only) --- src/abaddon.cpp | 3 ++- src/audio/manager.cpp | 38 ++++++++++++++++++++++++++++++++++++-- src/audio/manager.hpp | 4 +++- src/settings.cpp | 1 + src/settings.hpp | 1 + 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 443fa4e..26e33f3 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -36,7 +36,8 @@ Abaddon::Abaddon() : m_settings(Platform::FindConfigFile()) , m_discord(GetSettings().UseMemoryDB) // stupid but easy - , m_emojis(GetResPath("/emojis.bin")) { + , m_emojis(GetResPath("/emojis.bin")) + , m_audio(GetSettings().Backends) { LoadFromSettings(); // todo: set user agent for non-client(?) diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 8f2a5a3..eaac3bf 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -85,7 +85,7 @@ void mgr_log_callback(void *pUserData, ma_uint32 level, const char *pMessage) { g_free(msg); } -AudioManager::AudioManager() +AudioManager::AudioManager(const Glib::ustring &backends_string) : m_log(spdlog::stdout_color_mt("miniaudio")) { m_ok = true; @@ -107,7 +107,19 @@ AudioManager::AudioManager() auto ctx_cfg = ma_context_config_init(); ctx_cfg.pLog = &m_ma_log; - if (ma_context_init(nullptr, 0, &ctx_cfg, &m_context) != MA_SUCCESS) { + + ma_backend *pBackends = nullptr; + ma_uint32 backendCount = 0; + + std::vector backends_vec; + if (!backends_string.empty()) { + spdlog::get("audio")->debug("Using backends list: {}", std::string(backends_string)); + backends_vec = ParseBackendsList(backends_string); + pBackends = backends_vec.data(); + backendCount = static_cast(backends_vec.size()); + } + + if (ma_context_init(pBackends, backendCount, &ctx_cfg, &m_context) != MA_SUCCESS) { spdlog::get("audio")->error("failed to initialize context"); m_ok = false; return; @@ -647,6 +659,28 @@ AudioManager::VADMethod AudioManager::GetVADMethod() const { return m_vad_method; } +std::vector AudioManager::ParseBackendsList(const Glib::ustring &list) { + auto regex = Glib::Regex::create(";"); + const std::vector split = regex->split(list); + + std::vector backends; + for (const auto &s : split) { + if (s == "wasapi") backends.push_back(ma_backend_wasapi); + else if (s == "dsound") backends.push_back(ma_backend_dsound); + else if (s == "winmm") backends.push_back(ma_backend_winmm); + else if (s == "coreaudio") backends.push_back(ma_backend_coreaudio); + else if (s == "sndio") backends.push_back(ma_backend_sndio); + else if (s == "audio4") backends.push_back(ma_backend_audio4); + else if (s == "oss") backends.push_back(ma_backend_oss); + else if (s == "pulseaudio") backends.push_back(ma_backend_pulseaudio); + else if (s == "alsa") backends.push_back(ma_backend_alsa); + else if (s == "jack") backends.push_back(ma_backend_jack); + } + backends.push_back(ma_backend_null); + + return backends; +} + #ifdef WITH_RNNOISE float AudioManager::GetCurrentVADProbability() const { return m_vad_prob; diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp index f5b433f..5716fc5 100644 --- a/src/audio/manager.hpp +++ b/src/audio/manager.hpp @@ -25,7 +25,7 @@ class AudioManager { public: - AudioManager(); + AudioManager(const Glib::ustring &backends_string); ~AudioManager(); void AddSSRC(uint32_t ssrc); @@ -80,6 +80,8 @@ public: void SetVADMethod(VADMethod method); VADMethod GetVADMethod() const; + static std::vector ParseBackendsList(const Glib::ustring &list); + #ifdef WITH_RNNOISE float GetCurrentVADProbability() const; double GetRNNProbThreshold() const; diff --git a/src/settings.cpp b/src/settings.cpp index 0a08c8b..7821364 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -126,6 +126,7 @@ void SettingsManager::DefineSettings() { #else AddSetting("voice", "vad", "gate"s, &Settings::VAD); #endif + AddSetting("voice", "backends", ""s, &Settings::Backends); } void SettingsManager::ReadSettings() { diff --git a/src/settings.hpp b/src/settings.hpp index d69d165..72b2682 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -48,6 +48,7 @@ public: // [voice] std::string VAD; + std::string Backends; // [windows] bool HideConsole; -- cgit v1.2.3