From d8b9159125d89942eade59da8b70bb1535578f25 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sat, 12 Jul 2025 22:49:14 -0500 Subject: [PATCH] Rework handling of NetworkClient callbacks to route them through ResourceManager and move connection of saved clients to after autoconnection of local client in InitCoroutine --- ResourceManager.cpp | 110 ++++++++++++------ ResourceManager.h | 8 ++ ResourceManagerInterface.h | 1 + .../OpenRGBClientInfoPage.cpp | 7 +- 4 files changed, 84 insertions(+), 42 deletions(-) diff --git a/ResourceManager.cpp b/ResourceManager.cpp index c0304eda..f5102669 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -183,42 +183,6 @@ ResourceManager::ResourceManager() server->SetLegacyWorkaroundEnable(true); } - /*-----------------------------------------------------*\ - | Initialize Saved Client Connections | - \*-----------------------------------------------------*/ - json client_settings = settings_manager->GetSettings("Client"); - - if(client_settings.contains("clients")) - { - for(unsigned int client_idx = 0; client_idx < client_settings["clients"].size(); client_idx++) - { - NetworkClient * client = new NetworkClient(rgb_controllers); - - std::string titleString = "OpenRGB "; - titleString.append(VERSION_STRING); - - std::string client_ip = client_settings["clients"][client_idx]["ip"]; - unsigned short client_port = client_settings["clients"][client_idx]["port"]; - - client->SetIP(client_ip.c_str()); - client->SetName(titleString.c_str()); - client->SetPort(client_port); - - client->StartClient(); - - for(int timeout = 0; timeout < 100; timeout++) - { - if(client->GetConnected()) - { - break; - } - std::this_thread::sleep_for(10ms); - } - - clients.push_back(client); - } - } - /*-----------------------------------------------------*\ | Load sizes list from file | \*-----------------------------------------------------*/ @@ -434,6 +398,28 @@ void ResourceManager::RegisterPreDetectionHook(PreDetectionHookFunction hook) pre_detection_hooks.push_back(hook); } +void ResourceManager::RegisterClientInfoChangeCallback(ClientInfoChangeCallback new_callback, void * new_callback_arg) +{ + ClientInfoChangeCallbacks.push_back(new_callback); + ClientInfoChangeCallbackArgs.push_back(new_callback_arg); + + LOG_TRACE("[ResourceManager] Registered client info change callback. Total callbacks registered: %d", ClientInfoChangeCallbacks.size()); +} + +void ResourceManager::UnregisterClientInfoChangeCallback(ClientInfoChangeCallback callback, void * callback_arg) +{ + for(size_t idx = 0; idx < ClientInfoChangeCallbacks.size(); idx++) + { + if(ClientInfoChangeCallbacks[idx] == callback && ClientInfoChangeCallbackArgs[idx] == callback_arg) + { + ClientInfoChangeCallbacks.erase(ClientInfoChangeCallbacks.begin() + idx); + ClientInfoChangeCallbackArgs.erase(ClientInfoChangeCallbackArgs.begin() + idx); + } + } + + LOG_TRACE("[ResourceManager] Unregistered client info change callback. Total callbacks registered: %d", ClientInfoChangeCallbacks.size()); +} + void ResourceManager::RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg) { DeviceListChangeCallbacks.push_back(new_callback); @@ -587,6 +573,19 @@ void ResourceManager::UpdateDeviceList() DeviceListChangeMutex.unlock(); } +void ResourceManager::ClientInfoChanged() +{ + /*-----------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-----------------------------------------------------*/ + LOG_TRACE("[ResourceManager] Calling client info change callbacks."); + + for(std::size_t callback_idx = 0; callback_idx < ClientInfoChangeCallbacks.size(); callback_idx++) + { + ResourceManager::ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]); + } +} + void ResourceManager::DeviceListChanged() { /*-----------------------------------------------------*\ @@ -594,7 +593,7 @@ void ResourceManager::DeviceListChanged() \*-----------------------------------------------------*/ LOG_TRACE("[ResourceManager] Calling device list change callbacks."); - for(std::size_t callback_idx = 0; callback_idx < (unsigned int)DeviceListChangeCallbacks.size(); callback_idx++) + for(std::size_t callback_idx = 0; callback_idx < DeviceListChangeCallbacks.size(); callback_idx++) { ResourceManager::DeviceListChangeCallbacks[callback_idx](DeviceListChangeCallbackArgs[callback_idx]); } @@ -703,6 +702,7 @@ static void NetworkClientInfoChangeCallback(void* this_ptr) { ResourceManager* this_obj = (ResourceManager*)this_ptr; + this_obj->ClientInfoChanged(); this_obj->DeviceListChanged(); } @@ -1744,6 +1744,42 @@ void ResourceManager::InitCoroutine() tryAutoConnect = false; } + /*-----------------------------------------------------*\ + | Initialize Saved Client Connections | + \*-----------------------------------------------------*/ + json client_settings = settings_manager->GetSettings("Client"); + + if(client_settings.contains("clients")) + { + for(unsigned int client_idx = 0; client_idx < client_settings["clients"].size(); client_idx++) + { + NetworkClient * client = new NetworkClient(rgb_controllers); + + std::string titleString = "OpenRGB "; + titleString.append(VERSION_STRING); + + std::string client_ip = client_settings["clients"][client_idx]["ip"]; + unsigned short client_port = client_settings["clients"][client_idx]["port"]; + + client->SetIP(client_ip.c_str()); + client->SetName(titleString.c_str()); + client->SetPort(client_port); + + client->StartClient(); + + for(int timeout = 0; timeout < 100; timeout++) + { + if(client->GetConnected()) + { + break; + } + std::this_thread::sleep_for(10ms); + } + + RegisterNetworkClient(client); + } + } + /*-----------------------------------------------------*\ | Perform actual detection if enabled | | Done in the same thread (InitThread), as we need to | diff --git a/ResourceManager.h b/ResourceManager.h index 8b50649d..528432cc 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -141,12 +141,14 @@ public: void RegisterDynamicDetector (std::string name, DynamicDetectorFunction detector); void RegisterPreDetectionHook (PreDetectionHookFunction hook); + void RegisterClientInfoChangeCallback(ClientInfoChangeCallback new_callback, void * new_callback_arg); void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg); void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg); void RegisterDetectionStartCallback(DetectionStartCallback new_callback, void * new_callback_arg); void RegisterDetectionEndCallback(DetectionEndCallback new_callback, void * new_callback_arg); void RegisterI2CBusListChangeCallback(I2CBusListChangeCallback new_callback, void * new_callback_arg); + void UnregisterClientInfoChangeCallback(ClientInfoChangeCallback new_callback, void * new_callback_arg); void UnregisterDeviceListChangeCallback(DeviceListChangeCallback callback, void * callback_arg); void UnregisterDetectionProgressCallback(DetectionProgressCallback callback, void *callback_arg); void UnregisterDetectionStartCallback(DetectionStartCallback callback, void *callback_arg); @@ -173,6 +175,7 @@ public: void ProcessPreDetectionHooks(); // Consider making private void ProcessDynamicDetectors(); // Consider making private void UpdateDeviceList(); + void ClientInfoChanged(); void DeviceListChanged(); void DetectionProgressChanged(); void I2CBusListChanged(); @@ -315,6 +318,11 @@ private: std::vector detection_size_entry_used; const char* detection_string; + /*-------------------------------------------------------------------------------------*\ + | Client Info Changed Callback | + \*-------------------------------------------------------------------------------------*/ + std::vector ClientInfoChangeCallbacks; + std::vector ClientInfoChangeCallbackArgs; /*-------------------------------------------------------------------------------------*\ | Device List Changed Callback | diff --git a/ResourceManagerInterface.h b/ResourceManagerInterface.h index 92bc5ee3..0e074e34 100644 --- a/ResourceManagerInterface.h +++ b/ResourceManagerInterface.h @@ -10,6 +10,7 @@ class ProfileManager; class RGBController; class SettingsManager; +typedef void (*ClientInfoChangeCallback)(void *); typedef void (*DeviceListChangeCallback)(void *); typedef void (*DetectionProgressCallback)(void *); typedef void (*DetectionStartCallback)(void *); diff --git a/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp b/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp index 63cfa124..d91924fd 100644 --- a/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp +++ b/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp @@ -41,12 +41,9 @@ OpenRGBClientInfoPage::OpenRGBClientInfoPage(QWidget *parent) : ui->ClientPortValue->setText(QString::number(OPENRGB_SDK_PORT)); /*-----------------------------------------------------*\ - | Register callbacks for existing clients | + | Register callbacks with resource manager | \*-----------------------------------------------------*/ - for(unsigned int client_idx = 0; client_idx < ResourceManager::get()->GetClients().size(); client_idx++) - { - ResourceManager::get()->GetClients()[client_idx]->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); - } + ResourceManager::get()->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); /*-----------------------------------------------------*\ | Update the information view |