From 2a6b4573244eccce05a5bd6a2ec749765e259537 Mon Sep 17 00:00:00 2001 From: morg Date: Mon, 19 Apr 2021 18:18:03 +0200 Subject: [PATCH] Add UnregisterRGBController method to ResourceManager Commit amended by Adam Honse --- RGBController/RGBController.cpp | 6 ++++++ RGBController/RGBController.h | 2 ++ ResourceManager.cpp | 32 ++++++++++++++++++++++++++++++++ ResourceManager.h | 2 ++ 4 files changed, 42 insertions(+) diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 9007efc7..e605349f 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -1369,6 +1369,12 @@ void RGBController::UnregisterUpdateCallback(void * callback_arg) } } +void RGBController::ClearCallbacks() +{ + UpdateCallbacks.clear(); + UpdateCallbackArgs.clear(); +} + void RGBController::SignalUpdate() { UpdateMutex.lock(); diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index cd96396e..81b61cbd 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -175,6 +175,7 @@ public: virtual void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) = 0; virtual void UnregisterUpdateCallback(void * callback_arg) = 0; + virtual void ClearCallbacks() = 0; virtual void SignalUpdate() = 0; virtual void UpdateLEDs() = 0; @@ -253,6 +254,7 @@ public: void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg); void UnregisterUpdateCallback(void * callback_arg); + void ClearCallbacks(); void SignalUpdate(); void UpdateLEDs(); diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 34819536..36d91643 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -91,6 +91,38 @@ void ResourceManager::RegisterRGBController(RGBController *rgb_controller) DeviceListChanged(); } +void ResourceManager::UnregisterRGBController(RGBController *rgb_controller) +{ + LOG_NOTICE("Unregistering RGB controller: %s", rgb_controller->name.c_str()); + + /*-------------------------------------------------------------------------*\ + | Clear callbacks from the controller before removal | + \*-------------------------------------------------------------------------*/ + rgb_controller->ClearCallbacks(); + + /*-------------------------------------------------------------------------*\ + | Find the controller to remove and remove it from the hardware list | + \*-------------------------------------------------------------------------*/ + std::vector::iterator hw_it = std::find(rgb_controllers_hw.begin(), rgb_controllers_hw.end(), rgb_controller); + + if (hw_it != rgb_controllers_hw.end()) + { + rgb_controllers_hw.erase(hw_it); + } + + /*-------------------------------------------------------------------------*\ + | Find the controller to remove and remove it from the master list | + \*-------------------------------------------------------------------------*/ + std::vector::iterator rgb_it = std::find(rgb_controllers.begin(), rgb_controllers.end(), rgb_controller); + + if (rgb_it != rgb_controllers.end()) + { + rgb_controllers.erase(rgb_it); + } + + DeviceListChanged(); +} + std::vector & ResourceManager::GetRGBControllers() { return rgb_controllers; diff --git a/ResourceManager.h b/ResourceManager.h index 06ff9751..47840e5e 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -56,6 +56,7 @@ public: virtual std::vector & GetI2CBusses() = 0; virtual void RegisterRGBController(RGBController *rgb_controller) = 0; + virtual void UnregisterRGBController(RGBController *rgb_controller) = 0; virtual void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg) = 0; virtual void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg) = 0; @@ -92,6 +93,7 @@ public: std::vector & GetI2CBusses(); void RegisterRGBController(RGBController *rgb_controller); + void UnregisterRGBController(RGBController *rgb_controller); std::vector & GetRGBControllers();