From cfd2bc478fc7272ee9442c4c4075a00e59384707 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Wed, 14 Jan 2026 19:55:24 -0600 Subject: [PATCH] Rework list handling in ResourceManager by having NetworkClient own its own list rather than sharing ResourceManager's list --- DetectionManager.cpp | 7 +- NetworkClient.cpp | 110 +++++++----------- NetworkClient.h | 8 +- ResourceManager.cpp | 94 +++++---------- ResourceManager.h | 1 - cli.cpp | 2 +- .../OpenRGBClientInfoPage.cpp | 14 +-- 7 files changed, 85 insertions(+), 151 deletions(-) diff --git a/DetectionManager.cpp b/DetectionManager.cpp index 90524b1b1..b6803b886 100644 --- a/DetectionManager.cpp +++ b/DetectionManager.cpp @@ -1392,8 +1392,6 @@ void DetectionManager::ProcessCleanup() { WaitForDetection(); - SignalUpdate(DETECTIONMANAGER_UPDATE_REASON_RGBCONTROLLER_LIST_CLEARED); - /*-----------------------------------------------------*\ | Make a copy of the list so that the controllers can | | be deleted after the list is cleared | @@ -1405,6 +1403,11 @@ void DetectionManager::ProcessCleanup() \*-----------------------------------------------------*/ rgb_controllers.clear(); + /*-----------------------------------------------------*\ + | Signal the list cleared callback | + \*-----------------------------------------------------*/ + SignalUpdate(DETECTIONMANAGER_UPDATE_REASON_RGBCONTROLLER_LIST_CLEARED); + /*-----------------------------------------------------*\ | Delete the controllers | \*-----------------------------------------------------*/ diff --git a/NetworkClient.cpp b/NetworkClient.cpp index edca62923..43419d08b 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -36,7 +36,7 @@ const char yes = 1; using namespace std::chrono_literals; -NetworkClient::NetworkClient(std::vector& control) : controllers(control) +NetworkClient::NetworkClient() { port_ip = "127.0.0.1"; port_num = OPENRGB_SDK_PORT; @@ -470,6 +470,11 @@ void NetworkClient::SettingsManager_SetSettings(std::string settings_json_str) /*---------------------------------------------------------*\ | RGBController functions | \*---------------------------------------------------------*/ +std::vector& NetworkClient::GetRGBControllers() +{ + return(server_controllers); +} + void NetworkClient::SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone) { if(change_in_progress) @@ -839,26 +844,6 @@ void NetworkClient::ConnectionThreadFunction() } else { - ControllerListMutex.lock(); - - /*-----------------------------------------*\ - | All controllers received, add them to | - | master list | - \*-----------------------------------------*/ - printf("Client: All controllers received, adding them to master list\r\n"); - for(std::size_t controller_idx = 0; controller_idx < server_controllers.size(); controller_idx++) - { - controllers.push_back(server_controllers[controller_idx]); - } - - ControllerListMutex.unlock(); - - /*-----------------------------------------*\ - | Client info has changed, call the | - | callbacks | - \*-----------------------------------------*/ - SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_DEVICE_LIST_UPDATED); - server_initialized = true; } } @@ -1044,18 +1029,6 @@ listen_done: ControllerListMutex.lock(); - for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++) - { - for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++) - { - if(controllers[controller_idx] == server_controllers[server_controller_idx]) - { - controllers.erase(controllers.begin() + controller_idx); - break; - } - } - } - std::vector server_controllers_copy = server_controllers; server_controllers.clear(); @@ -1067,9 +1040,9 @@ listen_done: ControllerListMutex.unlock(); - /*---------------------------------------------------------*\ - | Client info has changed, call the callbacks | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-----------------------------------------------------*/ SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_CLIENT_DISCONNECTED); } @@ -1092,10 +1065,10 @@ void NetworkClient::ProcessReply_ControllerCount(unsigned int data_size, char * void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * data, unsigned int dev_idx) { - /*---------------------------------------------------------*\ - | Verify the controller description size (first 4 bytes of | - | data) matches the packet size in the header | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Verify the controller description size (first 4 bytes | + | of data) matches the packet size in the header | + \*-----------------------------------------------------*/ if(data_size == *((unsigned int*)data)) { data += sizeof(data_size); @@ -1104,9 +1077,9 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * d new_controller->SetDeviceDescription((unsigned char *)data, GetProtocolVersion()); - /*-----------------------------------------------------*\ - | Mark this controller as remote owned | - \*-----------------------------------------------------*/ + /*-------------------------------------------------*\ + | Mark this controller as remote owned | + \*-------------------------------------------------*/ new_controller->flags &= ~CONTROLLER_FLAG_LOCAL; new_controller->flags |= CONTROLLER_FLAG_REMOTE; @@ -1115,6 +1088,11 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * d if(dev_idx >= server_controllers.size()) { server_controllers.push_back(new_controller); + + /*---------------------------------------------*\ + | Signal list updated callback | + \*---------------------------------------------*/ + SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_DEVICE_LIST_UPDATED); } else { @@ -1172,27 +1150,21 @@ void NetworkClient::ProcessRequest_DeviceListChanged() { change_in_progress = true; - /*---------------------------------------------------------*\ - | Delete all controllers from the server's controller list | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Delete all controllers from the server's controller | + | list | + \*-----------------------------------------------------*/ ControllerListMutex.lock(); - for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++) - { - for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++) - { - if(controllers[controller_idx] == server_controllers[server_controller_idx]) - { - controllers.erase(controllers.begin() + controller_idx); - break; - } - } - } - std::vector server_controllers_copy = server_controllers; server_controllers.clear(); + /*-----------------------------------------------------*\ + | Signal list updated callback | + \*-----------------------------------------------------*/ + SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_DEVICE_LIST_UPDATED); + for(size_t server_controller_idx = 0; server_controller_idx < server_controllers_copy.size(); server_controller_idx++) { delete server_controllers_copy[server_controller_idx]; @@ -1200,16 +1172,16 @@ void NetworkClient::ProcessRequest_DeviceListChanged() ControllerListMutex.unlock(); - /*---------------------------------------------------------*\ - | Client info has changed, call the callbacks | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-----------------------------------------------------*/ SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_DEVICE_LIST_UPDATED); - /*---------------------------------------------------------*\ - | Mark server as uninitialized and reset server | - | initialization state so that it restarts the list | - | requesting process | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Mark server as uninitialized and reset server | + | initialization state so that it restarts the list | + | requesting process | + \*-----------------------------------------------------*/ controller_data_requested = false; controller_data_received = false; requested_controllers = 0; @@ -1291,9 +1263,9 @@ void NetworkClient::ProcessRequest_ServerString(unsigned int data_size, char * d { server_name.assign(data, data_size); - /*---------------------------------------------------------*\ - | Client info has changed, call the callbacks | - \*---------------------------------------------------------*/ + /*-----------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-----------------------------------------------------*/ SignalNetworkClientUpdate(NETWORKCLIENT_UPDATE_REASON_SERVER_STRING_RECEIVED); } diff --git a/NetworkClient.h b/NetworkClient.h index 61b329595..58eb15dcf 100644 --- a/NetworkClient.h +++ b/NetworkClient.h @@ -46,7 +46,7 @@ enum class NetworkClient { public: - NetworkClient(std::vector& control); + NetworkClient(); ~NetworkClient(); /*-----------------------------------------------------*\ @@ -105,6 +105,8 @@ public: /*-----------------------------------------------------*\ | RGBController functions | \*-----------------------------------------------------*/ + std::vector& GetRGBControllers(); + void SendRequest_RGBController_ClearSegments(unsigned int dev_idx, int zone); void SendRequest_RGBController_AddSegment(unsigned int dev_idx, unsigned char * data, unsigned int size); void SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size); @@ -121,8 +123,6 @@ public: void WaitOnControllerData(); - std::vector server_controllers; - private: /*-----------------------------------------------------*\ | Client state variables | @@ -182,7 +182,7 @@ private: | Controller list | \*-----------------------------------------------------*/ std::mutex ControllerListMutex; - std::vector& controllers; + std::vector server_controllers; /*-----------------------------------------------------*\ | Detection variables | diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 8cb0c3e30..b394a2c4a 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -49,11 +49,8 @@ static void ResourceManagerDetectionCallback(void * this_ptr, unsigned int updat case DETECTIONMANAGER_UPDATE_REASON_RGBCONTROLLER_REGISTERED: case DETECTIONMANAGER_UPDATE_REASON_RGBCONTROLLER_UNREGISTERED: - this_obj->UpdateDeviceList(); - break; - case DETECTIONMANAGER_UPDATE_REASON_RGBCONTROLLER_LIST_CLEARED: - this_obj->ClearLocalDevices(); + this_obj->UpdateDeviceList(); break; case DETECTIONMANAGER_UPDATE_REASON_DETECTION_PROGRESS_CHANGED: @@ -449,78 +446,41 @@ void ResourceManager::StopDeviceDetection() //TODO: Call DetectionManager::AbortDetection() or send SDK command if local client } -void ResourceManager::ClearLocalDevices() -{ - DeviceListChangeMutex.lock(); - - /*-----------------------------------------------------*\ - | Remove hardware controllers from controller list | - \*-----------------------------------------------------*/ - std::vector& rgb_controllers_hw = DetectionManager::get()->GetRGBControllers(); - - for(std::size_t hw_controller_idx = 0; hw_controller_idx < rgb_controllers_hw.size(); hw_controller_idx++) - { - for(std::size_t controller_idx = 0; controller_idx < rgb_controllers.size(); controller_idx++) - { - if(rgb_controllers[controller_idx] == rgb_controllers_hw[hw_controller_idx]) - { - rgb_controllers.erase(rgb_controllers.begin() + controller_idx); - break; - } - } - } - - DeviceListChangeMutex.unlock(); - - /*-----------------------------------------------------*\ - | Signal device list update | - \*-----------------------------------------------------*/ - SignalResourceManagerUpdate(RESOURCEMANAGER_UPDATE_REASON_DEVICE_LIST_UPDATED); -} - void ResourceManager::UpdateDeviceList() { DeviceListChangeMutex.lock(); + /*-----------------------------------------------------*\ + | Clear the controller list | + \*-----------------------------------------------------*/ + rgb_controllers.clear(); + /*-----------------------------------------------------*\ | Insert hardware controllers into controller list | \*-----------------------------------------------------*/ - std::vector& rgb_controllers_hw = DetectionManager::get()->GetRGBControllers(); + std::vector rgb_controllers_hw = DetectionManager::get()->GetRGBControllers(); - for(std::size_t hw_controller_idx = 0; hw_controller_idx < rgb_controllers_hw.size(); hw_controller_idx++) + for(std::size_t rgb_controller_idx = 0; rgb_controller_idx < rgb_controllers_hw.size(); rgb_controller_idx++) { - /*-------------------------------------------------*\ - | Check if the controller is already in the list | - | at the correct index | - \*-------------------------------------------------*/ - if(hw_controller_idx < rgb_controllers.size()) - { - if(rgb_controllers[hw_controller_idx] == rgb_controllers_hw[hw_controller_idx]) - { - continue; - } - } - - /*-------------------------------------------------*\ - | If not, check if the controller is already in the | - | list at a different index | - \*-------------------------------------------------*/ - for(std::size_t controller_idx = 0; controller_idx < rgb_controllers.size(); controller_idx++) - { - if(rgb_controllers[controller_idx] == rgb_controllers_hw[hw_controller_idx]) - { - rgb_controllers.erase(rgb_controllers.begin() + controller_idx); - rgb_controllers.insert(rgb_controllers.begin() + hw_controller_idx, rgb_controllers_hw[hw_controller_idx]); - break; - } - } - - /*-------------------------------------------------*\ - | If it still hasn't been found, add it to the list | - \*-------------------------------------------------*/ - rgb_controllers.insert(rgb_controllers.begin() + hw_controller_idx, rgb_controllers_hw[hw_controller_idx]); + rgb_controllers.push_back(rgb_controllers_hw[rgb_controller_idx]); } + /*-----------------------------------------------------*\ + | Insert client controllers into controller list | + \*-----------------------------------------------------*/ + for(std::size_t client_idx = 0; client_idx < clients.size(); client_idx++) + { + std::vector rgb_controllers_client = clients[client_idx]->GetRGBControllers(); + + for(std::size_t rgb_controller_idx = 0; rgb_controller_idx < rgb_controllers_client.size(); rgb_controller_idx++) + { + rgb_controllers.push_back(rgb_controllers_client[rgb_controller_idx]); + } + } + + /*-----------------------------------------------------*\ + | Signal list has changed | + \*-----------------------------------------------------*/ DeviceListChangeMutex.unlock(); /*-----------------------------------------------------*\ @@ -606,7 +566,7 @@ bool ResourceManager::AttemptLocalConnection() bool success = false; - auto_connection_client = new NetworkClient(ResourceManager::get()->GetRGBControllers()); + auto_connection_client = new NetworkClient(); std::string titleString = "OpenRGB "; titleString.append(VERSION_STRING); @@ -703,7 +663,7 @@ void ResourceManager::Initialize(bool tryConnect, bool detectDevices, bool start { for(unsigned int client_idx = 0; client_idx < client_settings["clients"].size(); client_idx++) { - NetworkClient * client = new NetworkClient(rgb_controllers); + NetworkClient * client = new NetworkClient(); std::string titleString = "OpenRGB "; titleString.append(VERSION_STRING); diff --git a/ResourceManager.h b/ResourceManager.h index 347102f2d..4a185101b 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -88,7 +88,6 @@ public: std::string GetDetectionString(); void StopDeviceDetection(); void RescanDevices(); - void ClearLocalDevices(); void UpdateDeviceList(); void WaitForDetection(); diff --git a/cli.cpp b/cli.cpp index 4542cd9f7..8af0194f9 100644 --- a/cli.cpp +++ b/cli.cpp @@ -1355,7 +1355,7 @@ unsigned int cli_pre_detection(int argc, char* argv[]) \*---------------------------------------------------------*/ else if(option == "--client") { - NetworkClient * client = new NetworkClient(ResourceManager::get()->GetRGBControllers()); + NetworkClient * client = new NetworkClient(); std::size_t pos = argument.find(":"); std::string ip = argument.substr(0, pos); diff --git a/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp b/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp index a4aae76a5..c716f120d 100644 --- a/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp +++ b/qt/OpenRGBClientInfoPage/OpenRGBClientInfoPage.cpp @@ -214,19 +214,19 @@ void OpenRGBClientInfoPage::UpdateInfo() /*-----------------------------------------------------*\ | Add child items for each device in the client | \*-----------------------------------------------------*/ - for(std::size_t dev_idx = 0; dev_idx < ResourceManager::get()->GetClients()[client_idx]->server_controllers.size(); dev_idx++) + for(std::size_t dev_idx = 0; dev_idx < ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers().size(); dev_idx++) { /*-----------------------------------------------------*\ | Create child tree widget items and display the device | | names in them | \*-----------------------------------------------------*/ QTreeWidgetItem* new_item = new QTreeWidgetItem(new_top_item); - new_item->setText(0, QString::fromStdString(ResourceManager::get()->GetClients()[client_idx]->server_controllers[dev_idx]->GetName())); + new_item->setText(0, QString::fromStdString(ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers()[dev_idx]->GetName())); /*-----------------------------------------------------*\ | Add child items for each zone in the device | \*-----------------------------------------------------*/ - for(std::size_t zone_idx = 0; zone_idx < ResourceManager::get()->GetClients()[client_idx]->server_controllers[dev_idx]->GetZoneCount(); zone_idx++) + for(std::size_t zone_idx = 0; zone_idx < ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers()[dev_idx]->GetZoneCount(); zone_idx++) { /*-----------------------------------------------------*\ | Create child tree widget items and display the zone | @@ -234,11 +234,11 @@ void OpenRGBClientInfoPage::UpdateInfo() \*-----------------------------------------------------*/ QTreeWidgetItem* new_child = new QTreeWidgetItem(); - std::string zone_str = ResourceManager::get()->GetClients()[client_idx]->server_controllers[dev_idx]->GetZoneName(zone_idx) + ", "; - zone_str.append(std::to_string(ResourceManager::get()->GetClients()[client_idx]->server_controllers[dev_idx]->GetZoneLEDsCount(zone_idx))); + std::string zone_str = ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers()[dev_idx]->GetZoneName(zone_idx) + ", "; + zone_str.append(std::to_string(ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers()[dev_idx]->GetZoneLEDsCount(zone_idx))); zone_str.append(" LEDs, "); // TODO : translate - switch(ResourceManager::get()->GetClients()[client_idx]->server_controllers[dev_idx]->GetZoneType(zone_idx)) + switch(ResourceManager::get()->GetClients()[client_idx]->GetRGBControllers()[dev_idx]->GetZoneType(zone_idx)) { case ZONE_TYPE_SINGLE: zone_str.append("Single"); @@ -272,7 +272,7 @@ void OpenRGBClientInfoPage::on_ClientConnectButton_clicked() /*-----------------------------------------------------*\ | Create a new client and set name, IP, and port values | \*-----------------------------------------------------*/ - NetworkClient * rgb_client = new NetworkClient(ResourceManager::get()->GetRGBControllers()); + NetworkClient * rgb_client = new NetworkClient(); std::string titleString = "OpenRGB "; titleString.append(VERSION_STRING);