[PATCH v5 2/2] winejoystick.drv: Sort virtual joysticks by name on the Mac
DavidL
david.dljunk at gmail.com
Thu Jul 28 03:57:28 CDT 2016
Hi Ken,
Just got back - saw the final patch, thanks for cleaning it up for me!
Cheers,
David
On Sun, Jul 24, 2016 at 7:38 PM, Ken Thomases <ken at codeweavers.com> wrote:
> From: David Lawrie <david.dljunk at gmail.com>
>
> Tested on OS X 10.10.5.
>
> Signed-off-by: David Lawrie <david.dljunk at gmail.com>
> Signed-off-by: Ken Thomases <ken at codeweavers.com>
> ---
> v5: Spaces in arg lists, move variable to tigher scope, trace wording tweak
>
> dlls/winejoystick.drv/joystick_osx.c | 55
> ++++++++++++++++++++++++++++++++----
> 1 file changed, 50 insertions(+), 5 deletions(-)
>
> diff --git a/dlls/winejoystick.drv/joystick_osx.c
> b/dlls/winejoystick.drv/joystick_osx.c
> index 7e2e97f..bf82f67 100644
> --- a/dlls/winejoystick.drv/joystick_osx.c
> +++ b/dlls/winejoystick.drv/joystick_osx.c
> @@ -139,6 +139,38 @@ static long get_device_property_long(IOHIDDeviceRef
> device, CFStringRef key)
> return result;
> }
>
> +static CFStringRef copy_device_name(IOHIDDeviceRef device)
> +{
> + CFStringRef name;
> +
> + if (device)
> + {
> + CFTypeRef ref_name;
> +
> + assert(IOHIDDeviceGetTypeID() == CFGetTypeID(device));
> +
> + ref_name = IOHIDDeviceGetProperty(device,
> CFSTR(kIOHIDProductKey));
> +
> + if (ref_name && CFStringGetTypeID() == CFGetTypeID(ref_name))
> + name = CFStringCreateCopy(kCFAllocatorDefault, ref_name);
> + else
> + {
> + long vendID, prodID;
> +
> + vendID = get_device_property_long(device,
> CFSTR(kIOHIDVendorIDKey));
> + prodID = get_device_property_long(device,
> CFSTR(kIOHIDProductIDKey));
> + name = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
> CFSTR("0x%04lx 0x%04lx"), vendID, prodID);
> + }
> + }
> + else
> + {
> + ERR("NULL device\n");
> + name = CFStringCreateCopy(kCFAllocatorDefault, CFSTR(""));
> + }
> +
> + return name;
> +}
> +
> static long get_device_location_ID(IOHIDDeviceRef device)
> {
> return get_device_property_long(device, CFSTR(kIOHIDLocationIDKey));
> @@ -312,13 +344,26 @@ static CFIndex find_top_level(IOHIDDeviceRef
> hid_device, CFMutableArrayRef main_
> TRACE("-> total %d\n", (int)total);
> return total;
> }
>
> +/**************************************************************************
> + * device_name_comparator
> + *
> + * Virtual joysticks may not have a kIOHIDLocationIDKey and will default
> to location ID of 0, this orders virtual joysticks by their name
> + */
> +static CFComparisonResult device_name_comparator(IOHIDDeviceRef device1,
> IOHIDDeviceRef device2)
> +{
> + CFStringRef name1 = copy_device_name(device1), name2 =
> copy_device_name(device2);
> + CFComparisonResult result = CFStringCompare(name1, name2,
> (kCFCompareForcedOrdering | kCFCompareNumerically));
> + CFRelease(name1);
> + CFRelease(name2);
> + return result;
> +}
>
>
> /**************************************************************************
> - * device_location_comparator
> + * device_location_name_comparator
> *
> - * Helper to sort device array by location ID since location IDs are
> consistent across boots & launches
> + * Helper to sort device array first by location ID, since location IDs
> are consistent across boots & launches, then by product name
> */
> -static CFComparisonResult device_location_comparator(const void *val1,
> const void *val2, void *context)
> +static CFComparisonResult device_location_name_comparator(const void
> *val1, const void *val2, void *context)
> {
> IOHIDDeviceRef device1 = (IOHIDDeviceRef)val1, device2 =
> (IOHIDDeviceRef)val2;
> long loc1 = get_device_location_ID(device1), loc2 =
> get_device_location_ID(device2);
> @@ -327,7 +372,7 @@ static CFComparisonResult
> device_location_comparator(const void *val1, const voi
> return kCFCompareLessThan;
> else if (loc1 > loc2)
> return kCFCompareGreaterThan;
> - return kCFCompareEqualTo;
> + return device_name_comparator(device1, device2);
> }
>
>
> /**************************************************************************
> @@ -390,7 +435,7 @@ static int find_osx_devices(void)
> num_devices = CFSetGetCount(devset);
> devices = CFArrayCreateMutable(kCFAllocatorDefault, num_devices,
> &kCFTypeArrayCallBacks);
> CFSetApplyFunction(devset, copy_set_to_array, (void *)devices);
> - CFArraySortValues(devices, CFRangeMake(0, num_devices),
> device_location_comparator, NULL);
> + CFArraySortValues(devices, CFRangeMake(0, num_devices),
> device_location_name_comparator, NULL);
>
> CFRelease(devset);
> if (!devices)
> --
> 2.8.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20160728/078418e5/attachment.html>
More information about the wine-patches
mailing list