From ae038bc8e90c5a2319c4e1efa8ae28bc2296e73b Mon Sep 17 00:00:00 2001 From: Daniel Clark Date: Sun, 16 Aug 2026 21:33:11 +0000 Subject: [PATCH] Update DetectionManger to handle generic wildcards in safe mode. --- DetectionManager.cpp | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/DetectionManager.cpp b/DetectionManager.cpp index 8dc35b93e..ffbf33e4c 100644 --- a/DetectionManager.cpp +++ b/DetectionManager.cpp @@ -107,7 +107,8 @@ bool BasicHIDBlock::compare(hid_device_info* info) bool BasicHIDBlock::matching_id(hid_device_info* info) { - return((vid == info->vendor_id) && (pid == info->product_id)); + return(((vid == HID_VID_ANY) || (vid == info->vendor_id)) + && ((pid == HID_PID_ANY) || (pid == info->product_id))); } /*---------------------------------------------------------*\ @@ -852,14 +853,14 @@ void DetectionManager::BackgroundDetectDevices() | Track if rules exist in any /etc location | | Note: Flatpak mounts this at /run/host/etc | \*-----------------------------------------------------*/ - bool in_etc = (access("/etc/udev/rules.d/60-openrgb.rules", F_OK) == 0) || + bool in_etc = (access("/etc/udev/rules.d/60-openrgb.rules", F_OK) == 0) || (access("/run/host/etc/udev/rules.d/60-openrgb.rules", F_OK) == 0); /*-----------------------------------------------------*\ | Track if rules exist in any /usr/lib location | | Note: Flatpak mounts this at /run/host/usr | \*-----------------------------------------------------*/ - bool in_usr_lib = (access("/usr/lib/udev/rules.d/60-openrgb.rules", F_OK) == 0) || + bool in_usr_lib = (access("/usr/lib/udev/rules.d/60-openrgb.rules", F_OK) == 0) || (access("/run/host/usr/lib/udev/rules.d/60-openrgb.rules", F_OK) == 0); /*-----------------------------------------------------*\ @@ -1180,7 +1181,9 @@ void DetectionManager::BackgroundDetectHIDDevicesSafe(json& detector_settings) LOG_VERBOSE("[%s] Trying to run detector for [%s] (for %04x:%04x)", DETECTIONMANAGER, detector.name.c_str(), detector.vid, detector.pid); - hid_device_info* current_hid_device = hid_enumerate(detector.vid, detector.pid); + unsigned short enumerate_vid = (detector.vid == HID_VID_ANY) ? 0 : detector.vid; + unsigned short enumerate_pid = (detector.pid == HID_PID_ANY) ? 0 : detector.pid; + hid_device_info* current_hid_device = hid_enumerate(enumerate_vid, enumerate_pid); while(current_hid_device) { @@ -1469,12 +1472,14 @@ void DetectionManager::RunHIDDetector(hid_device_info* current_hid_device, json& if(this_device_enabled) { /*-----------------------------------------*\ - | If this was a specific detector, this | - | device VID/PID has at least one specific | - | detector available, so ignore generic | - | detectors. | + | Exact VID/PID detectors take precedence | + | over generic detectors. Wildcard-ID | + | detectors must not suppress generic | + | detectors on unrelated interfaces. | \*-----------------------------------------*/ - if(!generic_detector) + if(!generic_detector + && detector->vid != HID_VID_ANY + && detector->pid != HID_PID_ANY) { skip_generic_detectors = true; } @@ -1585,12 +1590,14 @@ void DetectionManager::RunHIDWrappedDetector(const hidapi_wrapper* wrapper, hid_ if(this_device_enabled) { /*-----------------------------------------*\ - | If this was a specific detector, this | - | device VID/PID has at least one specific | - | detector available, so ignore generic | - | detectors. | + | Exact VID/PID detectors take precedence | + | over generic detectors. Wildcard-ID | + | detectors must not suppress generic | + | detectors on unrelated interfaces. | \*-----------------------------------------*/ - if(!generic_detector) + if(!generic_detector + && detector->vid != HID_VID_ANY + && detector->pid != HID_PID_ANY) { skip_generic_detectors = true; }