[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