[PATCH v2 10/10] winejoystick.drv: Remove unnecessary driver.

Andrew Eikum aeikum at codeweavers.com
Thu Dec 9 09:33:15 CST 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Fri, Dec 03, 2021 at 12:19:10PM +0100, Rémi Bernon wrote:
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>  configure.ac                                |   2 -
>  dlls/winejoystick.drv/Makefile.in           |  10 -
>  dlls/winejoystick.drv/joystick.c            |  52 --
>  dlls/winejoystick.drv/joystick.h            |  34 -
>  dlls/winejoystick.drv/joystick_linux.c      | 462 ----------
>  dlls/winejoystick.drv/joystick_osx.c        | 935 --------------------
>  dlls/winejoystick.drv/winejoystick.drv.spec |   1 -
>  tools/winapi/win32.api                      |  13 -
>  8 files changed, 1509 deletions(-)
>  delete mode 100644 dlls/winejoystick.drv/Makefile.in
>  delete mode 100644 dlls/winejoystick.drv/joystick.c
>  delete mode 100644 dlls/winejoystick.drv/joystick.h
>  delete mode 100644 dlls/winejoystick.drv/joystick_linux.c
>  delete mode 100644 dlls/winejoystick.drv/joystick_osx.c
>  delete mode 100644 dlls/winejoystick.drv/winejoystick.drv.spec
> 
> diff --git a/configure.ac b/configure.ac
> index 2fe4b186fd6..328f80f17c9 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -899,7 +899,6 @@ esac
>  enable_winecoreaudio_drv=${enable_winecoreaudio_drv:-no}
>  enable_wineandroid_drv=${enable_wineandroid_drv:-no}
>  enable_winemac_drv=${enable_winemac_drv:-no}
> -test "$ac_cv_header_linux_joystick_h" = "yes" -o "$ac_cv_header_IOKit_hid_IOHIDLib_h" = "yes" || enable_winejoystick_drv=${enable_winejoystick_drv:-no}
>  
>  dnl Check for cross compiler to build test programs
>  AC_SUBST(CROSSTARGET)
> @@ -3488,7 +3487,6 @@ WINE_CONFIG_MAKEFILE(dlls/winecrt0)
>  WINE_CONFIG_MAKEFILE(dlls/wined3d)
>  WINE_CONFIG_MAKEFILE(dlls/winegstreamer)
>  WINE_CONFIG_MAKEFILE(dlls/winehid.sys)
> -WINE_CONFIG_MAKEFILE(dlls/winejoystick.drv)
>  WINE_CONFIG_MAKEFILE(dlls/winemac.drv)
>  WINE_CONFIG_MAKEFILE(dlls/winemapi)
>  WINE_CONFIG_MAKEFILE(dlls/wineoss.drv)
> diff --git a/dlls/winejoystick.drv/Makefile.in b/dlls/winejoystick.drv/Makefile.in
> deleted file mode 100644
> index 52564855994..00000000000
> --- a/dlls/winejoystick.drv/Makefile.in
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -MODULE    = winejoystick.drv
> -IMPORTS   = winmm user32
> -EXTRALIBS = $(IOKIT_LIBS)
> -
> -EXTRADLLFLAGS = -mcygwin
> -
> -C_SRCS = \
> -	joystick.c \
> -	joystick_linux.c \
> -	joystick_osx.c
> diff --git a/dlls/winejoystick.drv/joystick.c b/dlls/winejoystick.drv/joystick.c
> deleted file mode 100644
> index 3e140b91175..00000000000
> --- a/dlls/winejoystick.drv/joystick.c
> +++ /dev/null
> @@ -1,52 +0,0 @@
> -/*
> - * WinMM joystick driver common code
> - *
> - * Copyright 1997 Andreas Mohr
> - * Copyright 2000 Wolfgang Schwotzer
> - * Copyright 2002 David Hagood
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> - */
> -
> -#include "joystick.h"
> -
> -
> -/**************************************************************************
> - *                              DriverProc (JOYSTICK.@)
> - */
> -LRESULT CALLBACK JSTCK_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
> -{
> -    switch(wMsg) {
> -    case DRV_LOAD:              return 1;
> -    case DRV_FREE:              return 1;
> -    case DRV_OPEN:              return driver_open((LPSTR)dwParam1, dwParam2);
> -    case DRV_CLOSE:             return driver_close(dwDevID);
> -    case DRV_ENABLE:            return 1;
> -    case DRV_DISABLE:           return 1;
> -    case DRV_QUERYCONFIGURE:    return 1;
> -    case DRV_CONFIGURE:         MessageBoxA(0, "JoyStick MultiMedia Driver !", "JoyStick Driver", MB_OK);       return 1;
> -    case DRV_INSTALL:           return DRVCNF_RESTART;
> -    case DRV_REMOVE:            return DRVCNF_RESTART;
> -
> -    case JDD_GETNUMDEVS:        return 1;
> -    case JDD_GETDEVCAPS:        return driver_joyGetDevCaps(dwDevID, (LPJOYCAPSW)dwParam1, dwParam2);
> -    case JDD_GETPOS:            return driver_joyGetPos(dwDevID, (LPJOYINFO)dwParam1);
> -    case JDD_SETCALIBRATION:
> -    case JDD_CONFIGCHANGED:     return JOYERR_NOCANDO;
> -    case JDD_GETPOSEX:          return driver_joyGetPosEx(dwDevID, (LPJOYINFOEX)dwParam1);
> -    default:
> -        return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
> -    }
> -}
> diff --git a/dlls/winejoystick.drv/joystick.h b/dlls/winejoystick.drv/joystick.h
> deleted file mode 100644
> index 1ec1edb8133..00000000000
> --- a/dlls/winejoystick.drv/joystick.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/*
> - * WinMM joystick driver header
> - *
> - * Copyright 2015 Ken Thomases for CodeWeavers Inc.
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> - */
> -
> -
> -#include <stdarg.h>
> -
> -#include "windef.h"
> -#include "winbase.h"
> -#include "mmddk.h"
> -#include "winuser.h"
> -
> -
> -LRESULT driver_open(LPSTR str, DWORD index) DECLSPEC_HIDDEN;
> -LRESULT driver_close(DWORD_PTR device_id) DECLSPEC_HIDDEN;
> -LRESULT driver_joyGetDevCaps(DWORD_PTR device_id, JOYCAPSW* caps, DWORD size) DECLSPEC_HIDDEN;
> -LRESULT driver_joyGetPosEx(DWORD_PTR device_id, JOYINFOEX* info) DECLSPEC_HIDDEN;
> -LRESULT driver_joyGetPos(DWORD_PTR device_id, JOYINFO* info) DECLSPEC_HIDDEN;
> diff --git a/dlls/winejoystick.drv/joystick_linux.c b/dlls/winejoystick.drv/joystick_linux.c
> deleted file mode 100644
> index 7fd2c95aff1..00000000000
> --- a/dlls/winejoystick.drv/joystick_linux.c
> +++ /dev/null
> @@ -1,462 +0,0 @@
> -/*
> - * joystick functions
> - *
> - * Copyright 1997 Andreas Mohr
> - * Copyright 2000 Wolfgang Schwotzer
> - * Copyright 2002 David Hagood
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> - *
> - * NOTES:
> - *
> - * - nearly all joystick functions can be regarded as obsolete,
> - *   as Linux (2.1.x) now supports extended joysticks with a completely
> - *   new joystick driver interface
> - *   New driver's documentation says:
> - *     "For backward compatibility the old interface is still included,
> - *     but will be dropped in the future."
> - *   Thus we should implement the new interface and at most keep the old
> - *   routines for backward compatibility.
> - * - better support of enhanced joysticks (Linux 2.2 interface is available)
> - * - support more joystick drivers (like the XInput extension)
> - * - should load joystick DLL as any other driver (instead of hardcoding)
> - *   the driver's name, and load it as any low lever driver.
> - */
> -
> -#include "config.h"
> -
> -#ifdef HAVE_LINUX_22_JOYSTICK_API
> -
> -#ifdef HAVE_UNISTD_H
> -# include <unistd.h>
> -#endif
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <fcntl.h>
> -#ifdef HAVE_SYS_IOCTL_H
> -#include <sys/ioctl.h>
> -#endif
> -#ifdef HAVE_LINUX_IOCTL_H
> -#include <linux/ioctl.h>
> -#endif
> -#include <linux/joystick.h>
> -#ifdef SW_MAX
> -#undef SW_MAX
> -#endif
> -#define JOYDEV_NEW "/dev/input/js%d"
> -#define JOYDEV_OLD "/dev/js%d"
> -#include <errno.h>
> -
> -#include "joystick.h"
> -
> -#include "wingdi.h"
> -#include "winnls.h"
> -#include "wine/debug.h"
> -
> -WINE_DEFAULT_DEBUG_CHANNEL(joystick);
> -
> -#define MAXJOYSTICK (JOYSTICKID2 + 30)
> -
> -typedef struct tagWINE_JSTCK {
> -    int		joyIntf;
> -    BOOL        in_use;
> -    /* Some extra info we need to make this actually work under the
> -       Linux 2.2 event api.
> -       First of all, we cannot keep closing and reopening the device file -
> -       that blows away the state of the stick device, and we lose events. So, we
> -       need to open the low-level device once, and close it when we are done.
> -
> -       Secondly, the event API only gives us what's changed. However, Windows apps
> -       want the whole state every time, so we have to cache the data.
> -    */
> -
> -    int         dev; /* Linux level device file descriptor */
> -    int         x;
> -    int         y;
> -    int         z;
> -    int         r;
> -    int         u;
> -    int         v;
> -    int         pov_x;
> -    int         pov_y;
> -    int         buttons;
> -    char        axesMap[ABS_MAX + 1];
> -} WINE_JSTCK;
> -
> -static	WINE_JSTCK	JSTCK_Data[MAXJOYSTICK];
> -
> -/**************************************************************************
> - * 				JSTCK_drvGet			[internal]
> - */
> -static WINE_JSTCK *JSTCK_drvGet(DWORD_PTR dwDevID)
> -{
> -    int	p;
> -
> -    if ((dwDevID - (DWORD_PTR)JSTCK_Data) % sizeof(JSTCK_Data[0]) != 0)
> -	return NULL;
> -    p = (dwDevID - (DWORD_PTR)JSTCK_Data) / sizeof(JSTCK_Data[0]);
> -    if (p < 0 || p >= MAXJOYSTICK || !((WINE_JSTCK*)dwDevID)->in_use)
> -	return NULL;
> -
> -    return (WINE_JSTCK*)dwDevID;
> -}
> -
> -/**************************************************************************
> - * 				driver_open
> - */
> -LRESULT driver_open(LPSTR str, DWORD dwIntf)
> -{
> -    if (dwIntf >= MAXJOYSTICK || JSTCK_Data[dwIntf].in_use)
> -	return 0;
> -
> -    JSTCK_Data[dwIntf].joyIntf = dwIntf;
> -    JSTCK_Data[dwIntf].dev = -1;
> -    JSTCK_Data[dwIntf].in_use = TRUE;
> -    return (LRESULT)&JSTCK_Data[dwIntf];
> -}
> -
> -/**************************************************************************
> - * 				driver_close
> - */
> -LRESULT driver_close(DWORD_PTR dwDevID)
> -{
> -    WINE_JSTCK*	jstck = JSTCK_drvGet(dwDevID);
> -
> -    if (jstck == NULL)
> -	return 0;
> -    jstck->in_use = FALSE;
> -    if (jstck->dev > 0)
> -    {
> -       close(jstck->dev);
> -       jstck->dev = 0;
> -    }
> -    return 1;
> -}
> -
> -struct js_status
> -{
> -    int buttons;
> -    int x;
> -    int y;
> -};
> -
> -/**************************************************************************
> - *                              JSTCK_OpenDevice           [internal]
> - */
> -static	int	JSTCK_OpenDevice(WINE_JSTCK* jstick)
> -{
> -    char  buf[20];
> -    int   flags, fd, found_ix, i;
> -    static DWORD last_attempt;
> -    DWORD now;
> -
> -    if (jstick->dev > 0)
> -      return jstick->dev;
> -
> -    now = GetTickCount();
> -    if (now - last_attempt < 2000)
> -      return -1;
> -    last_attempt = now;
> -
> -    flags = O_RDONLY | O_NONBLOCK;
> -
> -    /* The first joystick may not be at /dev/input/js0, find the correct
> -     * first or second device. For example the driver for XBOX 360 wireless
> -     * receiver creates entries starting at 20.
> -     */
> -    for (found_ix = i = 0; i < MAXJOYSTICK; i++) {
> -        sprintf(buf, JOYDEV_NEW, i);
> -        if ((fd = open(buf, flags)) < 0) {
> -            sprintf(buf, JOYDEV_OLD, i);
> -            if ((fd = open(buf, flags)) < 0)
> -                continue;
> -        }
> -
> -        if (found_ix++ == jstick->joyIntf)
> -        {
> -            TRACE("Found joystick[%d] at %s\n", jstick->joyIntf, buf);
> -            jstick->dev = fd;
> -            last_attempt = 0;
> -            break;
> -        }
> -
> -        close(fd);
> -    }
> -
> -    if (jstick->dev > 0)
> -        ioctl(jstick->dev, JSIOCGAXMAP, jstick->axesMap);
> -
> -    return jstick->dev;
> -}
> -
> -
> -/**************************************************************************
> - * 				JoyGetDevCaps		[MMSYSTEM.102]
> - */
> -LRESULT driver_joyGetDevCaps(DWORD_PTR dwDevID, LPJOYCAPSW lpCaps, DWORD dwSize)
> -{
> -    WINE_JSTCK*	jstck;
> -    int		dev;
> -    char	nrOfAxes;
> -    char	nrOfButtons;
> -    char	identString[MAXPNAMELEN];
> -    int		i;
> -    int		driverVersion;
> -
> -    if ((jstck = JSTCK_drvGet(dwDevID)) == NULL)
> -	return MMSYSERR_NODRIVER;
> -
> -    if ((dev = JSTCK_OpenDevice(jstck)) < 0) return JOYERR_PARMS;
> -    ioctl(dev, JSIOCGAXES, &nrOfAxes);
> -    ioctl(dev, JSIOCGBUTTONS, &nrOfButtons);
> -    ioctl(dev, JSIOCGVERSION, &driverVersion);
> -    ioctl(dev, JSIOCGNAME(sizeof(identString)), identString);
> -    TRACE("Driver: 0x%06x, Name: %s, #Axes: %d, #Buttons: %d\n",
> -	  driverVersion, identString, nrOfAxes, nrOfButtons);
> -    lpCaps->wMid = MM_MICROSOFT;
> -    lpCaps->wPid = MM_PC_JOYSTICK;
> -    MultiByteToWideChar(CP_UNIXCP, 0, identString, -1, lpCaps->szPname, MAXPNAMELEN);
> -    lpCaps->szPname[MAXPNAMELEN-1] = '\0';
> -    lpCaps->wXmin = 0;
> -    lpCaps->wXmax = 0xFFFF;
> -    lpCaps->wYmin = 0;
> -    lpCaps->wYmax = 0xFFFF;
> -    lpCaps->wZmin = 0;
> -    lpCaps->wZmax = (nrOfAxes >= 3) ? 0xFFFF : 0;
> -#ifdef BODGE_THE_HAT
> -    /* Half-Life won't allow you to map an axis event to things like
> -       "next weapon" and "use". Linux reports the hat on my stick as
> -       axis U and V. So, IFF BODGE_THE_HAT is defined, lie through our
> -       teeth and say we have 32 buttons, and we will map the axes to
> -       the high buttons. Really, perhaps this should be a registry entry,
> -       or even a parameter to the Linux joystick driver (which would completely
> -       remove the need for this.)
> -    */
> -    lpCaps->wNumButtons = 32;
> -#else
> -    lpCaps->wNumButtons = nrOfButtons;
> -#endif
> -    if (dwSize == sizeof(JOYCAPSW)) {
> -	/* complete 95 structure */
> -	lpCaps->wRmin = 0;
> -	lpCaps->wRmax = 0xFFFF;
> -	lpCaps->wUmin = 0;
> -	lpCaps->wUmax = 0xFFFF;
> -	lpCaps->wVmin = 0;
> -	lpCaps->wVmax = 0xFFFF;
> -	lpCaps->wMaxAxes = 6; /* same as MS Joystick Driver */
> -	lpCaps->wNumAxes = 0; /* nr of axes in use */
> -	lpCaps->wMaxButtons = 32; /* same as MS Joystick Driver */
> -	lpCaps->szRegKey[0] = 0;
> -	lpCaps->szOEMVxD[0] = 0;
> -	lpCaps->wCaps = 0;
> -        for (i = 0; i < nrOfAxes; i++) {
> -	    switch (jstck->axesMap[i]) {
> -	    case 0: /* X */
> -	    case 1: /* Y */
> -	    case 8: /* Wheel */
> -	    case 9: /* Gas */
> -		lpCaps->wNumAxes++;
> -		break;
> -	    case 2: /* Z */
> -	    case 6: /* Throttle */
> -	    case 10: /* Brake */
> -		lpCaps->wNumAxes++;
> -		lpCaps->wCaps |= JOYCAPS_HASZ;
> -		break;
> -	    case 5: /* Rz */
> -	    case 7: /* Rudder */
> -		lpCaps->wNumAxes++;
> -		lpCaps->wCaps |= JOYCAPS_HASR;
> -		break;
> -	    case 3: /* Rx */
> -		lpCaps->wNumAxes++;
> -		lpCaps->wCaps |= JOYCAPS_HASU;
> -		break;
> -	    case 4: /* Ry */
> -		lpCaps->wNumAxes++;
> -		lpCaps->wCaps |= JOYCAPS_HASV;
> -		break;
> -	    case 16: /* Hat 0 X */
> -	    case 17: /* Hat 0 Y */
> -		lpCaps->wCaps |= JOYCAPS_HASPOV | JOYCAPS_POV4DIR;
> -		/* TODO: JOYCAPS_POVCTS handling */
> -		break;
> -	    default:
> -		WARN("Unknown axis %hhu(%u). Skipped.\n", jstck->axesMap[i], i);
> -	    }
> -	}
> -    }
> -
> -    return JOYERR_NOERROR;
> -}
> -
> -/**************************************************************************
> - * 				driver_joyGetPos
> - */
> -LRESULT driver_joyGetPosEx(DWORD_PTR dwDevID, LPJOYINFOEX lpInfo)
> -{
> -    WINE_JSTCK*		jstck;
> -    int			dev;
> -    struct js_event 	ev;
> -
> -    if ((jstck = JSTCK_drvGet(dwDevID)) == NULL)
> -	return MMSYSERR_NODRIVER;
> -
> -    if ((dev = JSTCK_OpenDevice(jstck)) < 0) return JOYERR_PARMS;
> -
> -    while ((read(dev, &ev, sizeof(struct js_event))) > 0) {
> -	if (ev.type == (JS_EVENT_AXIS)) {
> -	    switch (jstck->axesMap[ev.number]) {
> -	    case 0: /* X */
> -	    case 8: /* Wheel */
> -		jstck->x = ev.value;
> -		break;
> -	    case 1: /* Y */
> -	    case 9: /* Gas */
> -		jstck->y = ev.value;
> -		break;
> -	    case 2: /* Z */
> -	    case 6: /* Throttle */
> -	    case 10: /* Brake */
> -		jstck->z = ev.value;
> -		break;
> -	    case 5: /* Rz */
> -	    case 7: /* Rudder */
> -		jstck->r = ev.value;
> -		break;
> -	    case 3: /* Rx */
> -		jstck->u = ev.value;
> -		break;
> -	    case 4: /* Ry */
> -		jstck->v = ev.value;
> -		break;
> -	    case 16: /* Hat 0 X */
> -		jstck->pov_x = ev.value;
> -		break;
> -	    case 17: /* Hat 0 Y */
> -		jstck->pov_y = ev.value;
> -		break;
> -	    default:
> -		FIXME("Unknown joystick event '%d'\n", ev.number);
> -	    }
> -	} else if (ev.type == (JS_EVENT_BUTTON)) {
> -	    if (ev.value) {
> -		    jstck->buttons |= (1 << ev.number);
> -		    /* FIXME: what to do for this field when
> -		     * multiple buttons are depressed ?
> -		     */
> -		    if (lpInfo->dwFlags & JOY_RETURNBUTTONS)
> -                       lpInfo->dwButtonNumber = ev.number + 1;
> -		}
> -             else
> -               jstck->buttons  &= ~(1 << ev.number);
> -	}
> -    }
> -    /* EAGAIN is returned when the queue is empty */
> -    if (errno != EAGAIN) {
> -	/* FIXME: error should not be ignored */
> -	ERR("Error while reading joystick state (%s)\n", strerror(errno));
> -    }
> -    /* Now, copy the cached values into Window's structure... */
> -    if (lpInfo->dwFlags & JOY_RETURNBUTTONS)
> -       lpInfo->dwButtons = jstck->buttons;
> -    if (lpInfo->dwFlags & JOY_RETURNX)
> -       lpInfo->dwXpos   = jstck->x + 32767;
> -    if (lpInfo->dwFlags & JOY_RETURNY)
> -       lpInfo->dwYpos   = jstck->y + 32767;
> -    if (lpInfo->dwFlags & JOY_RETURNZ)
> -       lpInfo->dwZpos   = jstck->z + 32767;
> -    if (lpInfo->dwFlags & JOY_RETURNR)
> -       lpInfo->dwRpos   = jstck->r + 32767;
> -# ifdef BODGE_THE_HAT
> -    else if (lpInfo->dwFlags & JOY_RETURNBUTTONS)
> -    {
> -         if (jstck->r > 0)
> -            lpInfo->dwButtons |= 1<<7;
> -         else if (jstck->r < 0)
> -            lpInfo->dwButtons |= 1<<8;
> -    }
> -# endif
> -    if (lpInfo->dwFlags & JOY_RETURNU)
> -	lpInfo->dwUpos   = jstck->u + 32767;
> -# ifdef BODGE_THE_HAT
> -    else if (lpInfo->dwFlags & JOY_RETURNBUTTONS)
> -    {
> -       if (jstck->u > 0)
> -          lpInfo->dwButtons |= 1<<9;
> -        else if (jstck->u < 0)
> -          lpInfo->dwButtons |= 1<<10;
> -    }
> -# endif
> -    if (lpInfo->dwFlags & JOY_RETURNV)
> -       lpInfo->dwVpos   = jstck->v + 32767;
> -    if (lpInfo->dwFlags & JOY_RETURNPOV) {
> -	if (jstck->pov_y > 0) {
> -	    if (jstck->pov_x < 0)
> -		lpInfo->dwPOV = 22500; /* SW */
> -	    else if (jstck->pov_x > 0)
> -		lpInfo->dwPOV = 13500; /* SE */
> -	    else
> -		lpInfo->dwPOV = 18000; /* S, JOY_POVBACKWARD */
> -	} else if (jstck->pov_y < 0) {
> -	    if (jstck->pov_x < 0)
> -		lpInfo->dwPOV = 31500; /* NW */
> -	    else if (jstck->pov_x > 0)
> -		lpInfo->dwPOV = 4500; /* NE */
> -	    else
> -		lpInfo->dwPOV = 0; /* N, JOY_POVFORWARD */
> -	} else if (jstck->pov_x < 0)
> -	    lpInfo->dwPOV = 27000; /* W, JOY_POVLEFT */
> -	else if (jstck->pov_x > 0)
> -	    lpInfo->dwPOV = 9000; /* E, JOY_POVRIGHT */
> -	else
> -	    lpInfo->dwPOV = JOY_POVCENTERED; /* Center */
> -    }
> -
> -    TRACE("x: %d, y: %d, z: %d, r: %d, u: %d, v: %d, buttons: 0x%04x, flags: 0x%04x (fd %d)\n",
> -	  lpInfo->dwXpos, lpInfo->dwYpos, lpInfo->dwZpos,
> -	  lpInfo->dwRpos, lpInfo->dwUpos, lpInfo->dwVpos,
> -	  lpInfo->dwButtons, lpInfo->dwFlags, dev
> -         );
> -
> -    return JOYERR_NOERROR;
> -}
> -
> -/**************************************************************************
> - * 				driver_joyGetPos
> - */
> -LRESULT driver_joyGetPos(DWORD_PTR dwDevID, LPJOYINFO lpInfo)
> -{
> -    JOYINFOEX	ji;
> -    LONG	ret;
> -
> -    memset(&ji, 0, sizeof(ji));
> -
> -    ji.dwSize = sizeof(ji);
> -    ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNBUTTONS;
> -    ret = driver_joyGetPosEx(dwDevID, &ji);
> -    if (ret == JOYERR_NOERROR)	{
> -	lpInfo->wXpos    = ji.dwXpos;
> -	lpInfo->wYpos    = ji.dwYpos;
> -	lpInfo->wZpos    = ji.dwZpos;
> -	lpInfo->wButtons = ji.dwButtons;
> -    }
> -
> -    return ret;
> -}
> -
> -#endif /* HAVE_LINUX_JOYSTICK_H */
> diff --git a/dlls/winejoystick.drv/joystick_osx.c b/dlls/winejoystick.drv/joystick_osx.c
> deleted file mode 100644
> index 6f53477937f..00000000000
> --- a/dlls/winejoystick.drv/joystick_osx.c
> +++ /dev/null
> @@ -1,935 +0,0 @@
> -/*
> - * WinMM joystick driver OS X implementation
> - *
> - * Copyright 1997 Andreas Mohr
> - * Copyright 1998 Marcus Meissner
> - * Copyright 1998,1999 Lionel Ulmer
> - * Copyright 2000 Wolfgang Schwotzer
> - * Copyright 2000-2001 TransGaming Technologies Inc.
> - * Copyright 2002 David Hagood
> - * Copyright 2009 CodeWeavers, Aric Stewart
> - * Copyright 2015 Ken Thomases for CodeWeavers Inc.
> - * Copyright 2016 David Lawrie
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> - */
> -
> -#include "config.h"
> -
> -#if defined(HAVE_IOKIT_HID_IOHIDLIB_H)
> -
> -#define DWORD UInt32
> -#define LPDWORD UInt32*
> -#define LONG SInt32
> -#define LPLONG SInt32*
> -#define E_PENDING __carbon_E_PENDING
> -#define ULONG __carbon_ULONG
> -#define E_INVALIDARG __carbon_E_INVALIDARG
> -#define E_OUTOFMEMORY __carbon_E_OUTOFMEMORY
> -#define E_HANDLE __carbon_E_HANDLE
> -#define E_ACCESSDENIED __carbon_E_ACCESSDENIED
> -#define E_UNEXPECTED __carbon_E_UNEXPECTED
> -#define E_FAIL __carbon_E_FAIL
> -#define E_ABORT __carbon_E_ABORT
> -#define E_POINTER __carbon_E_POINTER
> -#define E_NOINTERFACE __carbon_E_NOINTERFACE
> -#define E_NOTIMPL __carbon_E_NOTIMPL
> -#define S_FALSE __carbon_S_FALSE
> -#define S_OK __carbon_S_OK
> -#define HRESULT_FACILITY __carbon_HRESULT_FACILITY
> -#define IS_ERROR __carbon_IS_ERROR
> -#define FAILED __carbon_FAILED
> -#define SUCCEEDED __carbon_SUCCEEDED
> -#define MAKE_HRESULT __carbon_MAKE_HRESULT
> -#define HRESULT __carbon_HRESULT
> -#define STDMETHODCALLTYPE __carbon_STDMETHODCALLTYPE
> -#include <IOKit/IOKitLib.h>
> -#include <IOKit/hid/IOHIDLib.h>
> -#undef ULONG
> -#undef E_INVALIDARG
> -#undef E_OUTOFMEMORY
> -#undef E_HANDLE
> -#undef E_ACCESSDENIED
> -#undef E_UNEXPECTED
> -#undef E_FAIL
> -#undef E_ABORT
> -#undef E_POINTER
> -#undef E_NOINTERFACE
> -#undef E_NOTIMPL
> -#undef S_FALSE
> -#undef S_OK
> -#undef HRESULT_FACILITY
> -#undef IS_ERROR
> -#undef FAILED
> -#undef SUCCEEDED
> -#undef MAKE_HRESULT
> -#undef HRESULT
> -#undef STDMETHODCALLTYPE
> -#undef DWORD
> -#undef LPDWORD
> -#undef LONG
> -#undef LPLONG
> -#undef E_PENDING
> -
> -#include "joystick.h"
> -
> -#include "wine/debug.h"
> -
> -
> -WINE_DEFAULT_DEBUG_CHANNEL(joystick);
> -
> -
> -#define MAXJOYSTICK (JOYSTICKID2 + 30)
> -
> -
> -enum {
> -    AXIS_X,  /* Winmm X */
> -    AXIS_Y,  /* Winmm Y */
> -    AXIS_Z,  /* Winmm Z */
> -    AXIS_RX, /* Winmm V */
> -    AXIS_RY, /* Winmm U */
> -    AXIS_RZ, /* Winmm R */
> -    NUM_AXES
> -};
> -
> -struct axis {
> -    IOHIDElementRef element;
> -    CFIndex min_value, max_value;
> -};
> -
> -typedef struct {
> -    BOOL                in_use;
> -    IOHIDElementRef     element;
> -    struct axis         axes[NUM_AXES];
> -    CFMutableArrayRef   buttons;
> -    IOHIDElementRef     hatswitch;
> -} joystick_t;
> -
> -
> -static joystick_t joysticks[MAXJOYSTICK];
> -static CFMutableArrayRef device_main_elements = NULL;
> -
> -static long get_device_property_long(IOHIDDeviceRef device, CFStringRef key)
> -{
> -    CFTypeRef ref;
> -    long result = 0;
> -
> -    if (device)
> -    {
> -        assert(IOHIDDeviceGetTypeID() == CFGetTypeID(device));
> -
> -        ref = IOHIDDeviceGetProperty(device, key);
> -
> -        if (ref && CFNumberGetTypeID() == CFGetTypeID(ref))
> -            CFNumberGetValue((CFNumberRef)ref, kCFNumberLongType, &result);
> -    }
> -
> -    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));
> -}
> -
> -static const char* debugstr_cf(CFTypeRef t)
> -{
> -    CFStringRef s;
> -    const char* ret;
> -
> -    if (!t) return "(null)";
> -
> -    if (CFGetTypeID(t) == CFStringGetTypeID())
> -        s = t;
> -    else
> -        s = CFCopyDescription(t);
> -    ret = CFStringGetCStringPtr(s, kCFStringEncodingUTF8);
> -    if (ret) ret = debugstr_a(ret);
> -    if (!ret)
> -    {
> -        const UniChar* u = CFStringGetCharactersPtr(s);
> -        if (u)
> -            ret = debugstr_wn((const WCHAR*)u, CFStringGetLength(s));
> -    }
> -    if (!ret)
> -    {
> -        UniChar buf[200];
> -        int len = min(CFStringGetLength(s), ARRAY_SIZE(buf));
> -        CFStringGetCharacters(s, CFRangeMake(0, len), buf);
> -        ret = debugstr_wn(buf, len);
> -    }
> -    if (s != t) CFRelease(s);
> -    return ret;
> -}
> -
> -static const char* debugstr_device(IOHIDDeviceRef device)
> -{
> -    return wine_dbg_sprintf("<IOHIDDevice %p product %s IOHIDLocationID %lu>", device,
> -                            debugstr_cf(IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey))),
> -                            get_device_location_ID(device));
> -}
> -
> -static const char* debugstr_element(IOHIDElementRef element)
> -{
> -    return wine_dbg_sprintf("<IOHIDElement %p type %d usage %u/%u device %p>", element,
> -                            IOHIDElementGetType(element), IOHIDElementGetUsagePage(element),
> -                            IOHIDElementGetUsage(element), IOHIDElementGetDevice(element));
> -}
> -
> -static int axis_for_usage_GD(int usage)
> -{
> -    switch (usage)
> -    {
> -        case kHIDUsage_GD_X: return AXIS_X;
> -        case kHIDUsage_GD_Y: return AXIS_Y;
> -        case kHIDUsage_GD_Z: return AXIS_Z;
> -        case kHIDUsage_GD_Rx: return AXIS_RX;
> -        case kHIDUsage_GD_Ry: return AXIS_RY;
> -        case kHIDUsage_GD_Rz: return AXIS_RZ;
> -    }
> -
> -    return -1;
> -}
> -
> -static int axis_for_usage_Sim(int usage)
> -{
> -    switch (usage)
> -    {
> -        case kHIDUsage_Sim_Rudder: return AXIS_RZ;
> -        case kHIDUsage_Sim_Throttle: return AXIS_Z;
> -        case kHIDUsage_Sim_Steering: return AXIS_X;
> -        case kHIDUsage_Sim_Accelerator: return AXIS_Y;
> -        case kHIDUsage_Sim_Brake: return AXIS_RZ;
> -    }
> -
> -    return -1;
> -}
> -
> -/**************************************************************************
> - *                              joystick_from_id
> - */
> -static joystick_t* joystick_from_id(DWORD_PTR device_id)
> -{
> -    int index;
> -
> -    if ((device_id - (DWORD_PTR)joysticks) % sizeof(joysticks[0]) != 0)
> -        return NULL;
> -    index = (device_id - (DWORD_PTR)joysticks) / sizeof(joysticks[0]);
> -    if (index < 0 || index >= MAXJOYSTICK || !((joystick_t*)device_id)->in_use)
> -        return NULL;
> -
> -    return (joystick_t*)device_id;
> -}
> -
> -/**************************************************************************
> - *                              create_osx_device_match
> - */
> -static CFDictionaryRef create_osx_device_match(int usage)
> -{
> -    CFDictionaryRef result = NULL;
> -    int number;
> -    CFStringRef keys[] = { CFSTR(kIOHIDDeviceUsagePageKey), CFSTR(kIOHIDDeviceUsageKey) };
> -    CFNumberRef values[2];
> -    int i;
> -
> -    TRACE("usage %d\n", usage);
> -
> -    number = kHIDPage_GenericDesktop;
> -    values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &number);
> -    values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage);
> -
> -    if (values[0] && values[1])
> -    {
> -        result = CFDictionaryCreate(NULL, (const void**)keys, (const void**)values, ARRAY_SIZE(values),
> -                                    &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
> -
> -        if (!result)
> -            ERR("CFDictionaryCreate failed.\n");
> -    }
> -    else
> -        ERR("CFNumberCreate failed.\n");
> -
> -    for (i = 0; i < ARRAY_SIZE(values); i++)
> -        if (values[i]) CFRelease(values[i]);
> -
> -    return result;
> -}
> -
> -/**************************************************************************
> - *                              find_top_level
> - */
> -static CFIndex find_top_level(IOHIDDeviceRef hid_device, CFMutableArrayRef main_elements)
> -{
> -    CFArrayRef      elements;
> -    CFIndex         total = 0;
> -
> -    TRACE("hid_device %s\n", debugstr_device(hid_device));
> -
> -    if (!hid_device)
> -        return 0;
> -
> -    elements = IOHIDDeviceCopyMatchingElements(hid_device, NULL, 0);
> -
> -    if (elements)
> -    {
> -        CFIndex i, count = CFArrayGetCount(elements);
> -        for (i = 0; i < count; i++)
> -        {
> -            IOHIDElementRef element = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i);
> -            int type = IOHIDElementGetType(element);
> -
> -            TRACE("element %s\n", debugstr_element(element));
> -
> -            /* Check for top-level gaming device collections */
> -            if (type == kIOHIDElementTypeCollection && IOHIDElementGetParent(element) == 0)
> -            {
> -                int usage_page = IOHIDElementGetUsagePage(element);
> -                int usage = IOHIDElementGetUsage(element);
> -
> -                if (usage_page == kHIDPage_GenericDesktop &&
> -                    (usage == kHIDUsage_GD_Joystick || usage == kHIDUsage_GD_GamePad || usage == kHIDUsage_GD_MultiAxisController))
> -                {
> -                    CFArrayAppendValue(main_elements, element);
> -                    total++;
> -                }
> -            }
> -        }
> -        CFRelease(elements);
> -    }
> -
> -    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_name_comparator
> - *
> - * 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_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);
> -
> -    if (loc1 < loc2)
> -        return kCFCompareLessThan;
> -    else if (loc1 > loc2)
> -        return kCFCompareGreaterThan;
> -    return device_name_comparator(device1, device2);
> -}
> -
> -/**************************************************************************
> - *                              copy_set_to_array
> - *
> - * Helper to copy the CFSet to a CFArray
> - */
> -static void copy_set_to_array(const void *value, void *context)
> -{
> -    CFArrayAppendValue(context, value);
> -}
> -
> -/**************************************************************************
> - *                              find_osx_devices
> - */
> -static int find_osx_devices(void)
> -{
> -    IOHIDManagerRef hid_manager;
> -    int usages[] = { kHIDUsage_GD_Joystick, kHIDUsage_GD_GamePad, kHIDUsage_GD_MultiAxisController };
> -    int i;
> -    CFDictionaryRef matching_dicts[ARRAY_SIZE(usages)];
> -    CFArrayRef matching;
> -    CFSetRef devset;
> -
> -    TRACE("()\n");
> -
> -    hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L);
> -    if (IOHIDManagerOpen(hid_manager, 0) != kIOReturnSuccess)
> -    {
> -        ERR("Couldn't open IOHIDManager.\n");
> -        CFRelease(hid_manager);
> -        return 0;
> -    }
> -
> -    for (i = 0; i < ARRAY_SIZE(matching_dicts); i++)
> -    {
> -        matching_dicts[i] = create_osx_device_match(usages[i]);
> -        if (!matching_dicts[i])
> -        {
> -            while (i > 0)
> -                CFRelease(matching_dicts[--i]);
> -            goto fail;
> -        }
> -    }
> -
> -    matching = CFArrayCreate(NULL, (const void**)matching_dicts, ARRAY_SIZE(matching_dicts),
> -                             &kCFTypeArrayCallBacks);
> -
> -    for (i = 0; i < ARRAY_SIZE(matching_dicts); i++)
> -        CFRelease(matching_dicts[i]);
> -
> -    IOHIDManagerSetDeviceMatchingMultiple(hid_manager, matching);
> -    CFRelease(matching);
> -    devset = IOHIDManagerCopyDevices(hid_manager);
> -    if (devset)
> -    {
> -        CFIndex num_devices, num_main_elements;
> -        CFMutableArrayRef devices;
> -
> -        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_name_comparator, NULL);
> -
> -        CFRelease(devset);
> -        if (!devices)
> -            goto fail;
> -
> -        device_main_elements = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
> -        if (!device_main_elements)
> -        {
> -            CFRelease(devices);
> -            goto fail;
> -        }
> -
> -        num_main_elements = 0;
> -        for (i = 0; i < num_devices; i++)
> -        {
> -            IOHIDDeviceRef hid_device = (IOHIDDeviceRef)CFArrayGetValueAtIndex(devices, i);
> -            TRACE("hid_device %s\n", debugstr_device(hid_device));
> -            num_main_elements += find_top_level(hid_device, device_main_elements);
> -        }
> -
> -        CFRelease(devices);
> -
> -        TRACE("found %i device(s), %i collection(s)\n",(int)num_devices,(int)num_main_elements);
> -        return (int)num_main_elements;
> -    }
> -
> -fail:
> -    IOHIDManagerClose(hid_manager, 0);
> -    CFRelease(hid_manager);
> -    return 0;
> -}
> -
> -/**************************************************************************
> - *                              collect_joystick_elements
> - */
> -static void collect_joystick_elements(joystick_t* joystick, IOHIDElementRef collection)
> -{
> -    CFIndex    i, count;
> -    CFArrayRef children = IOHIDElementGetChildren(collection);
> -
> -    TRACE("collection %s\n", debugstr_element(collection));
> -
> -    count = CFArrayGetCount(children);
> -    for (i = 0; i < count; i++)
> -    {
> -        IOHIDElementRef child;
> -        int type;
> -        uint32_t usage_page;
> -
> -        child = (IOHIDElementRef)CFArrayGetValueAtIndex(children, i);
> -        TRACE("child %s\n", debugstr_element(child));
> -        type = IOHIDElementGetType(child);
> -        usage_page = IOHIDElementGetUsagePage(child);
> -
> -        switch (type)
> -        {
> -            case kIOHIDElementTypeCollection:
> -                collect_joystick_elements(joystick, child);
> -                break;
> -            case kIOHIDElementTypeInput_Button:
> -            {
> -                TRACE("kIOHIDElementTypeInput_Button usage_page %d\n", usage_page);
> -
> -                /* avoid strange elements found on the 360 controller */
> -                if (usage_page == kHIDPage_Button)
> -                    CFArrayAppendValue(joystick->buttons, child);
> -                break;
> -            }
> -            case kIOHIDElementTypeInput_Axis:
> -            case kIOHIDElementTypeInput_Misc:
> -            {
> -                uint32_t usage = IOHIDElementGetUsage( child );
> -                switch (usage_page)
> -                {
> -                    case kHIDPage_GenericDesktop:
> -                    {
> -                        switch(usage)
> -                        {
> -                            case kHIDUsage_GD_Hatswitch:
> -                            {
> -                                TRACE("kIOHIDElementTypeInput_Axis/Misc / kHIDUsage_GD_Hatswitch\n");
> -                                if (joystick->hatswitch)
> -                                    TRACE("    ignoring additional hatswitch\n");
> -                                else
> -                                    joystick->hatswitch = (IOHIDElementRef)CFRetain(child);
> -                                break;
> -                            }
> -                            case kHIDUsage_GD_X:
> -                            case kHIDUsage_GD_Y:
> -                            case kHIDUsage_GD_Z:
> -                            case kHIDUsage_GD_Rx:
> -                            case kHIDUsage_GD_Ry:
> -                            case kHIDUsage_GD_Rz:
> -                            {
> -                                int axis = axis_for_usage_GD(usage);
> -                                TRACE("kIOHIDElementTypeInput_Axis/Misc / kHIDUsage_GD_<axis> (%d) axis %d\n", usage, axis);
> -                                if (axis < 0 || joystick->axes[axis].element)
> -                                    TRACE("    ignoring\n");
> -                                else
> -                                {
> -                                    joystick->axes[axis].element = (IOHIDElementRef)CFRetain(child);
> -                                    joystick->axes[axis].min_value = IOHIDElementGetLogicalMin(child);
> -                                    joystick->axes[axis].max_value = IOHIDElementGetLogicalMax(child);
> -                                }
> -                                break;
> -                            }
> -                            case kHIDUsage_GD_Slider:
> -                            case kHIDUsage_GD_Dial:
> -                            case kHIDUsage_GD_Wheel:
> -                            {
> -                                /* if one axis is taken, fall to the next until axes are filled */
> -                                int possible_axes[3] = {AXIS_Z,AXIS_RY,AXIS_RX};
> -                                int axis = 0;
> -                                while(axis < 3 && joystick->axes[possible_axes[axis]].element)
> -                                    axis++;
> -                                if (axis == 3)
> -                                    TRACE("kIOHIDElementTypeInput_Axis/Misc / kHIDUsage_GD_<axis> (%d)\n    ignoring\n", usage);
> -                                else
> -                                {
> -                                    TRACE("kIOHIDElementTypeInput_Axis/Misc / kHIDUsage_GD_<axis> (%d) axis %d\n", usage, possible_axes[axis]);
> -                                    joystick->axes[possible_axes[axis]].element = (IOHIDElementRef)CFRetain(child);
> -                                    joystick->axes[possible_axes[axis]].min_value = IOHIDElementGetLogicalMin(child);
> -                                    joystick->axes[possible_axes[axis]].max_value = IOHIDElementGetLogicalMax(child);
> -                                }
> -                                break;
> -                            }
> -                            default:
> -                                FIXME("kIOHIDElementTypeInput_Axis/Misc / Unhandled GD Page usage %d\n", usage);
> -                                break;
> -                        }
> -                        break;
> -                    }
> -                    case kHIDPage_Simulation:
> -                    {
> -                        switch(usage)
> -                        {
> -                            case kHIDUsage_Sim_Rudder:
> -                            case kHIDUsage_Sim_Throttle:
> -                            case kHIDUsage_Sim_Steering:
> -                            case kHIDUsage_Sim_Accelerator:
> -                            case kHIDUsage_Sim_Brake:
> -                            {
> -                                int axis = axis_for_usage_Sim(usage);
> -                                TRACE("kIOHIDElementTypeInput_Axis/Misc / kHIDUsage_Sim_<axis> (%d) axis %d\n", usage, axis);
> -                                if (axis < 0 || joystick->axes[axis].element)
> -                                    TRACE("    ignoring\n");
> -                                else
> -                                {
> -                                    joystick->axes[axis].element = (IOHIDElementRef)CFRetain(child);
> -                                    joystick->axes[axis].min_value = IOHIDElementGetLogicalMin(child);
> -                                    joystick->axes[axis].max_value = IOHIDElementGetLogicalMax(child);
> -                                }
> -                                break;
> -                            }
> -                            default:
> -                                FIXME("kIOHIDElementTypeInput_Axis/Misc / Unhandled Sim Page usage %d\n", usage);
> -                                break;
> -                        }
> -                        break;
> -                    }
> -                    default:
> -                        FIXME("kIOHIDElementTypeInput_Axis/Misc / Unhandled Usage Page %d\n", usage_page);
> -                        break;
> -                }
> -                break;
> -            }
> -            case kIOHIDElementTypeFeature:
> -                /* Describes input and output elements not intended for consumption by the end user. Ignoring. */
> -                break;
> -            default:
> -                FIXME("Unhandled type %i\n",type);
> -                break;
> -        }
> -    }
> -}
> -
> -/**************************************************************************
> - *                              button_usage_comparator
> - */
> -static CFComparisonResult button_usage_comparator(const void *val1, const void *val2, void *context)
> -{
> -    IOHIDElementRef element1 = (IOHIDElementRef)val1, element2 = (IOHIDElementRef)val2;
> -    int usage1 = IOHIDElementGetUsage(element1), usage2 = IOHIDElementGetUsage(element2);
> -
> -    if (usage1 < usage2)
> -        return kCFCompareLessThan;
> -    if (usage1 > usage2)
> -        return kCFCompareGreaterThan;
> -    return kCFCompareEqualTo;
> -}
> -
> -/**************************************************************************
> - *                              driver_open
> - */
> -LRESULT driver_open(LPSTR str, DWORD index)
> -{
> -    if (index >= MAXJOYSTICK || joysticks[index].in_use)
> -        return 0;
> -
> -    joysticks[index].in_use = TRUE;
> -    return (LRESULT)&joysticks[index];
> -}
> -
> -/**************************************************************************
> - *                              driver_close
> - */
> -LRESULT driver_close(DWORD_PTR device_id)
> -{
> -    joystick_t* joystick = joystick_from_id(device_id);
> -    int i;
> -
> -    if (joystick == NULL)
> -        return 0;
> -
> -    CFRelease(joystick->element);
> -    for (i = 0; i < NUM_AXES; i++)
> -    {
> -        if (joystick->axes[i].element)
> -            CFRelease(joystick->axes[i].element);
> -    }
> -    if (joystick->buttons)
> -        CFRelease(joystick->buttons);
> -    if (joystick->hatswitch)
> -        CFRelease(joystick->hatswitch);
> -
> -    memset(joystick, 0, sizeof(*joystick));
> -    return 1;
> -}
> -
> -/**************************************************************************
> - *                              open_joystick
> - */
> -static BOOL open_joystick(joystick_t* joystick)
> -{
> -    CFIndex index;
> -    CFRange range;
> -
> -    if (joystick->element)
> -        return TRUE;
> -
> -    if (!device_main_elements)
> -    {
> -        find_osx_devices();
> -        if (!device_main_elements)
> -            return FALSE;
> -    }
> -
> -    index = joystick - joysticks;
> -    if (index >= CFArrayGetCount(device_main_elements))
> -        return FALSE;
> -
> -    joystick->element = (IOHIDElementRef)CFArrayGetValueAtIndex(device_main_elements, index);
> -    joystick->buttons = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
> -    collect_joystick_elements(joystick, joystick->element);
> -
> -    /* Sort buttons into correct order */
> -    range.location = 0;
> -    range.length = CFArrayGetCount(joystick->buttons);
> -    CFArraySortValues(joystick->buttons, range, button_usage_comparator, NULL);
> -    if (range.length > 32)
> -    {
> -        /* Delete any buttons beyond the first 32 */
> -        range.location = 32;
> -        range.length -= 32;
> -        CFArrayReplaceValues(joystick->buttons, range, NULL, 0);
> -    }
> -
> -    return TRUE;
> -}
> -
> -
> -/**************************************************************************
> - *                              driver_joyGetDevCaps
> - */
> -LRESULT driver_joyGetDevCaps(DWORD_PTR device_id, JOYCAPSW* caps, DWORD size)
> -{
> -    joystick_t* joystick;
> -    IOHIDDeviceRef device;
> -
> -    if ((joystick = joystick_from_id(device_id)) == NULL)
> -        return MMSYSERR_NODRIVER;
> -
> -    if (!open_joystick(joystick))
> -        return JOYERR_PARMS;
> -
> -    caps->szPname[0] = 0;
> -
> -    device = IOHIDElementGetDevice(joystick->element);
> -    if (device)
> -    {
> -        CFStringRef product_name = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));
> -        if (product_name)
> -        {
> -            CFRange range;
> -
> -            range.location = 0;
> -            range.length = min(MAXPNAMELEN - 1, CFStringGetLength(product_name));
> -            CFStringGetCharacters(product_name, range, (UniChar*)caps->szPname);
> -            caps->szPname[range.length] = 0;
> -        }
> -    }
> -
> -    caps->wMid = MM_MICROSOFT;
> -    caps->wPid = MM_PC_JOYSTICK;
> -    caps->wXmin = 0;
> -    caps->wXmax = 0xFFFF;
> -    caps->wYmin = 0;
> -    caps->wYmax = 0xFFFF;
> -    caps->wZmin = 0;
> -    caps->wZmax = joystick->axes[AXIS_Z].element ? 0xFFFF : 0;
> -    caps->wNumButtons = CFArrayGetCount(joystick->buttons);
> -    if (size == sizeof(JOYCAPSW))
> -    {
> -        int i;
> -
> -        /* complete 95 structure */
> -        caps->wRmin = 0;
> -        caps->wRmax = 0xFFFF;
> -        caps->wUmin = 0;
> -        caps->wUmax = 0xFFFF;
> -        caps->wVmin = 0;
> -        caps->wVmax = 0xFFFF;
> -        caps->wMaxAxes = 6; /* same as MS Joystick Driver */
> -        caps->wNumAxes = 0;
> -        caps->wMaxButtons = 32; /* same as MS Joystick Driver */
> -        caps->szRegKey[0] = 0;
> -        caps->szOEMVxD[0] = 0;
> -        caps->wCaps = 0;
> -
> -        for (i = 0; i < NUM_AXES; i++)
> -        {
> -            if (joystick->axes[i].element)
> -            {
> -                caps->wNumAxes++;
> -                switch (i)
> -                {
> -                    case AXIS_Z:  caps->wCaps |= JOYCAPS_HASZ; break;
> -                    case AXIS_RX: caps->wCaps |= JOYCAPS_HASV; break;
> -                    case AXIS_RY: caps->wCaps |= JOYCAPS_HASU; break;
> -                    case AXIS_RZ: caps->wCaps |= JOYCAPS_HASR; break;
> -                }
> -            }
> -        }
> -
> -        if (joystick->hatswitch)
> -            caps->wCaps |= JOYCAPS_HASPOV | JOYCAPS_POV4DIR;
> -    }
> -
> -    TRACE("name %s buttons %u axes %d caps 0x%08x\n", debugstr_w(caps->szPname), caps->wNumButtons, caps->wNumAxes, caps->wCaps);
> -
> -    return JOYERR_NOERROR;
> -}
> -
> -/*
> - * Helper to get the value from an element
> - */
> -static LRESULT driver_getElementValue(IOHIDDeviceRef device, IOHIDElementRef element, IOHIDValueRef *pValueRef)
> -{
> -    IOReturn ret;
> -    ret = IOHIDDeviceGetValue(device, element, pValueRef);
> -    switch (ret)
> -    {
> -        case kIOReturnSuccess:
> -            return JOYERR_NOERROR;
> -        case kIOReturnNotAttached:
> -            return JOYERR_UNPLUGGED;
> -        default:
> -            ERR("IOHIDDeviceGetValue returned 0x%x\n",ret);
> -            return JOYERR_NOCANDO;
> -    }
> -}
> -
> -/**************************************************************************
> - *                              driver_joyGetPosEx
> - */
> -LRESULT driver_joyGetPosEx(DWORD_PTR device_id, JOYINFOEX* info)
> -{
> -    static const struct {
> -        DWORD flag;
> -        off_t offset;
> -    } axis_map[NUM_AXES] = {
> -        { JOY_RETURNX, FIELD_OFFSET(JOYINFOEX, dwXpos) },
> -        { JOY_RETURNY, FIELD_OFFSET(JOYINFOEX, dwYpos) },
> -        { JOY_RETURNZ, FIELD_OFFSET(JOYINFOEX, dwZpos) },
> -        { JOY_RETURNV, FIELD_OFFSET(JOYINFOEX, dwVpos) },
> -        { JOY_RETURNU, FIELD_OFFSET(JOYINFOEX, dwUpos) },
> -        { JOY_RETURNR, FIELD_OFFSET(JOYINFOEX, dwRpos) },
> -    };
> -
> -    joystick_t* joystick;
> -    IOHIDDeviceRef device;
> -    CFIndex i, count;
> -    IOHIDValueRef valueRef;
> -    long value;
> -    LRESULT rc;
> -
> -    if ((joystick = joystick_from_id(device_id)) == NULL)
> -        return MMSYSERR_NODRIVER;
> -
> -    if (!open_joystick(joystick))
> -        return JOYERR_PARMS;
> -
> -    device = IOHIDElementGetDevice(joystick->element);
> -
> -    if (info->dwFlags & JOY_RETURNBUTTONS)
> -    {
> -        info->dwButtons = 0;
> -        info->dwButtonNumber = 0;
> -
> -        count = CFArrayGetCount(joystick->buttons);
> -        for (i = 0; i < count; i++)
> -        {
> -            IOHIDElementRef button = (IOHIDElementRef)CFArrayGetValueAtIndex(joystick->buttons, i);
> -            rc = driver_getElementValue(device, button, &valueRef);
> -            if (rc != JOYERR_NOERROR)
> -                return rc;
> -            value = IOHIDValueGetIntegerValue(valueRef);
> -            if (value)
> -            {
> -                info->dwButtons |= 1 << i;
> -                info->dwButtonNumber++;
> -            }
> -        }
> -    }
> -
> -    for (i = 0; i < NUM_AXES; i++)
> -    {
> -        if (info->dwFlags & axis_map[i].flag)
> -        {
> -            DWORD* field = (DWORD*)((char*)info + axis_map[i].offset);
> -            if (joystick->axes[i].element)
> -            {
> -                rc = driver_getElementValue(device, joystick->axes[i].element, &valueRef);
> -                if (rc != JOYERR_NOERROR)
> -                    return rc;
> -                value = IOHIDValueGetIntegerValue(valueRef) - joystick->axes[i].min_value;
> -                *field = MulDiv(value, 0xFFFF, joystick->axes[i].max_value - joystick->axes[i].min_value);
> -            }
> -            else
> -            {
> -                *field = 0;
> -                info->dwFlags &= ~axis_map[i].flag;
> -            }
> -        }
> -    }
> -
> -    if (info->dwFlags & JOY_RETURNPOV)
> -    {
> -        if (joystick->hatswitch)
> -        {
> -            rc = driver_getElementValue(device, joystick->hatswitch, &valueRef);
> -            if (rc != JOYERR_NOERROR)
> -                return rc;
> -            value = IOHIDValueGetIntegerValue(valueRef);
> -            if (value >= 8)
> -                info->dwPOV = JOY_POVCENTERED;
> -            else
> -                info->dwPOV = value * 4500;
> -        }
> -        else
> -        {
> -            info->dwPOV = JOY_POVCENTERED;
> -            info->dwFlags &= ~JOY_RETURNPOV;
> -        }
> -    }
> -
> -    TRACE("x: %d, y: %d, z: %d, r: %d, u: %d, v: %d, buttons: 0x%04x, pov %d, flags: 0x%04x\n",
> -          info->dwXpos, info->dwYpos, info->dwZpos, info->dwRpos, info->dwUpos, info->dwVpos, info->dwButtons, info->dwPOV, info->dwFlags);
> -
> -    return JOYERR_NOERROR;
> -}
> -
> -/**************************************************************************
> - *                              driver_joyGetPos
> - */
> -LRESULT driver_joyGetPos(DWORD_PTR device_id, JOYINFO* info)
> -{
> -    JOYINFOEX ji;
> -    LONG ret;
> -
> -    memset(&ji, 0, sizeof(ji));
> -
> -    ji.dwSize = sizeof(ji);
> -    ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNBUTTONS;
> -    ret = driver_joyGetPosEx(device_id, &ji);
> -    if (ret == JOYERR_NOERROR)
> -    {
> -        info->wXpos    = ji.dwXpos;
> -        info->wYpos    = ji.dwYpos;
> -        info->wZpos    = ji.dwZpos;
> -        info->wButtons = ji.dwButtons;
> -    }
> -
> -    return ret;
> -}
> -
> -#endif /* HAVE_IOKIT_HID_IOHIDLIB_H */
> diff --git a/dlls/winejoystick.drv/winejoystick.drv.spec b/dlls/winejoystick.drv/winejoystick.drv.spec
> deleted file mode 100644
> index 29932efde7c..00000000000
> --- a/dlls/winejoystick.drv/winejoystick.drv.spec
> +++ /dev/null
> @@ -1 +0,0 @@
> -@ stdcall -private DriverProc(long long long long long) JSTCK_DriverProc
> diff --git a/tools/winapi/win32.api b/tools/winapi/win32.api
> index d9b77dbce39..5f3dd85cc93 100644
> --- a/tools/winapi/win32.api
> +++ b/tools/winapi/win32.api
> @@ -5615,19 +5615,6 @@ IUnknown *
>  IWineD3D *
>  IWineD3DClipper *
>  
> -%%winejoystick.drv
> -
> -%long
> -
> -HDRVR
> -LPARAM
> -LRESULT
> -UINT
> -
> -%long --pointer
> -
> -DWORD_PTR
> -
>  %%l3codeca.acm
>  
>  %long
> -- 
> 2.34.0
> 
> 



More information about the wine-devel mailing list