From 5b4d55bb42dfcb15e93618628e128ee3ff4625db Mon Sep 17 00:00:00 2001 From: morg Date: Tue, 8 Feb 2022 07:29:55 +0100 Subject: [PATCH] Add pre detection hooks to resource manager. Closes #2184 --- .../RazerController/RazerControllerDetect.cpp | 5 ++++- Detector.h | 3 ++- DeviceDetector.h | 11 ++++++++++- ResourceManager.cpp | 18 ++++++++++++++++++ ResourceManager.h | 5 +++++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/Controllers/RazerController/RazerControllerDetect.cpp b/Controllers/RazerController/RazerControllerDetect.cpp index 6cfbf9e0..076a15ba 100644 --- a/Controllers/RazerController/RazerControllerDetect.cpp +++ b/Controllers/RazerController/RazerControllerDetect.cpp @@ -385,7 +385,6 @@ REGISTER_HID_DETECTOR_IPU("Razer Base Station Chroma", Det REGISTER_HID_DETECTOR_IPU("Razer Base Station V2 Chroma", DetectRazerControllers, RAZER_VID, RAZER_BASE_STATION_V2_CHROMA_PID, 0x00, 0x01, 0x02); REGISTER_HID_DETECTOR_IPU("Razer Charging Pad Chroma", DetectRazerControllers, RAZER_VID, RAZER_CHARGING_PAD_CHROMA_PID, 0x00, 0x0C, 0x01); REGISTER_HID_DETECTOR_I ("Razer Chroma Addressable RGB Controller", DetectRazerARGBControllers, RAZER_VID, RAZER_CHROMA_ADDRESSABLE_RGB_CONTROLLER_PID, 0x00 ); -REGISTER_DYNAMIC_DETECTOR("Razer Chrome Addressable RGB Controller Setup", ResetRazerARGBControllersPaths ); REGISTER_HID_DETECTOR_IPU("Razer Chroma HDK", DetectRazerControllers, RAZER_VID, RAZER_CHROMA_HDK_PID, 0x02, 0x01, 0x02); REGISTER_HID_DETECTOR_IPU("Razer Chroma Mug Holder", DetectRazerControllers, RAZER_VID, RAZER_CHROMA_MUG_PID, 0x00, 0x01, 0x02); REGISTER_HID_DETECTOR_IPU("Razer Chroma PC Case Lighting Kit", DetectRazerControllers, RAZER_VID, RAZER_CHROMA_PC_CASE_LIGHTING_KIT_PID, 0x02, 0x01, 0x02); @@ -409,3 +408,7 @@ REGISTER_HID_DETECTOR_IPU("Razer Nommo Chroma", Det REGISTER_HID_DETECTOR_IPU("Razer Nommo Pro", DetectRazerControllers, RAZER_VID, RAZER_NOMMO_PRO_PID, 0x00, 0x01, 0x00); #endif +/*-----------------------------------------------------------------------------------------------------*\ +| Need to clean up some stuff before we scan/rescan | +\*-----------------------------------------------------------------------------------------------------*/ +REGISTER_PRE_DETECTION_HOOK(ResetRazerARGBControllersPaths); diff --git a/Detector.h b/Detector.h index a19a5ac2..584c9f7f 100644 --- a/Detector.h +++ b/Detector.h @@ -12,6 +12,7 @@ #define REGISTER_HID_DETECTOR_P(name, func, vid, pid, page) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY) #define REGISTER_HID_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage) #define REGISTER_DYNAMIC_DETECTOR(name, func) static DynamicDetector device_detector_obj_##func(name, func) +#define REGISTER_PRE_DETECTION_HOOK(func) static PreDetectionHook device_detector_obj_##func(func) #define REGISTER_DYNAMIC_I2C_DETECTOR(name, func) I2CDeviceDetector device_detector_obj_##func(name, func) #define REGISTER_DYNAMIC_I2C_BUS_DETECTOR(func) I2CBusDetector device_detector_obj_##func(func) @@ -20,4 +21,4 @@ #define REGISTER_DYNAMIC_HID_DETECTOR_IP(name, func, vid, pid, interface, page) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY) #define REGISTER_DYNAMIC_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage) #define REGISTER_DYNAMIC_HID_DETECTOR_P(name, func, vid, pid, page) HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY) -#define REGISTER_DYNAMIC_HID_DETECTOR_PU(name, func, vid, pid, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage) \ No newline at end of file +#define REGISTER_DYNAMIC_HID_DETECTOR_PU(name, func, vid, pid, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage) diff --git a/DeviceDetector.h b/DeviceDetector.h index bb05902b..35dceb47 100644 --- a/DeviceDetector.h +++ b/DeviceDetector.h @@ -49,4 +49,13 @@ public: { ResourceManager::get()->RegisterDynamicDetector(name, detector); } -}; \ No newline at end of file +}; + +class PreDetectionHook +{ +public: + PreDetectionHook(PreDetectionHookFunction hook) + { + ResourceManager::get()->RegisterPreDetectionHook(hook); + } +}; diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 87f36824..6b8b9446 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -228,6 +228,11 @@ void ResourceManager::RegisterDynamicDetector(std::string name, DynamicDetectorF dynamic_detectors.push_back(detector); } +void ResourceManager::RegisterPreDetectionHook(PreDetectionHookFunction hook) +{ + pre_detection_hooks.push_back(hook); +} + void ResourceManager::RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg) { DeviceListChangeCallbacks.push_back(new_callback); @@ -618,6 +623,14 @@ void ResourceManager::Cleanup() } } +void ResourceManager::ProcessPreDetectionHooks() +{ + for(unsigned int hook_idx = 0; hook_idx < pre_detection_hooks.size(); hook_idx++) + { + pre_detection_hooks[hook_idx](); + } +} + void ResourceManager::ProcessDynamicDetectors() { for(unsigned int detector_idx = 0; detector_idx < dynamic_detectors.size(); detector_idx++) @@ -630,6 +643,11 @@ void ResourceManager::ProcessDynamicDetectors() void ResourceManager::DetectDevices() { + /*-----------------------------------------------------*\ + | Process pre-detection hooks | + \*-----------------------------------------------------*/ + ProcessPreDetectionHooks(); + /*-----------------------------------------------------*\ | Process Dynamic Detectors | \*-----------------------------------------------------*/ diff --git a/ResourceManager.h b/ResourceManager.h index 8456f254..dc8d263b 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -37,6 +37,8 @@ typedef std::function&)> DeviceDetect typedef std::function&)> I2CDeviceDetectorFunction; typedef std::function HIDDeviceDetectorFunction; typedef std::function DynamicDetectorFunction; +typedef std::function PreDetectionHookFunction; + typedef struct { std::string name; @@ -119,6 +121,7 @@ public: int usage_page = HID_USAGE_PAGE_ANY, int usage = HID_USAGE_ANY); void RegisterDynamicDetector (std::string name, DynamicDetectorFunction detector); + void RegisterPreDetectionHook (PreDetectionHookFunction hook); void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg); void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg); @@ -149,6 +152,7 @@ public: void SetConfigurationDirectory(std::string directory); + void ProcessPreDetectionHooks(); void ProcessDynamicDetectors(); void UpdateDeviceList(); void DeviceListChanged(); @@ -224,6 +228,7 @@ private: std::vector hid_device_detector_strings; std::vector dynamic_detectors; std::vector dynamic_detector_strings; + std::vector pre_detection_hooks; bool dynamic_detectors_processed;