Commit 9aa678ca authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

Fixed joystick ID/deviceID/driver handle/instance ID mixup.

parent e4c46518
...@@ -34,20 +34,22 @@ typedef struct tagWINE_JOYSTICK { ...@@ -34,20 +34,22 @@ typedef struct tagWINE_JOYSTICK {
UINT wTimer; UINT wTimer;
DWORD threshold; DWORD threshold;
BOOL bChanged; BOOL bChanged;
HDRVR hDriver;
} WINE_JOYSTICK; } WINE_JOYSTICK;
static WINE_JOYSTICK JOY_Sticks[MAXJOYSTICK]; static WINE_JOYSTICK JOY_Sticks[MAXJOYSTICK];
static HDRVR JOY_Driver;
/************************************************************************** /**************************************************************************
* JOY_LoadDriver [internal] * JOY_LoadDriver [internal]
*/ */
static BOOL JOY_LoadDriver(void) static BOOL JOY_LoadDriver(DWORD dwJoyID)
{ {
if (JOY_Driver) if (dwJoyID >= MAXJOYSTICK)
return FALSE;
if (JOY_Sticks[dwJoyID].hDriver)
return TRUE; return TRUE;
return JOY_Driver = OpenDriverA("joystick.drv", 0, 0); return JOY_Sticks[dwJoyID].hDriver = OpenDriverA("joystick.drv", 0, dwJoyID);
} }
/************************************************************************** /**************************************************************************
...@@ -98,9 +100,15 @@ static void CALLBACK JOY_Timer(HWND hWnd, UINT wMsg, UINT wTimer, DWORD dwTime) ...@@ -98,9 +100,15 @@ static void CALLBACK JOY_Timer(HWND hWnd, UINT wMsg, UINT wTimer, DWORD dwTime)
*/ */
UINT WINAPI joyGetNumDevs(void) UINT WINAPI joyGetNumDevs(void)
{ {
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; UINT ret = 0;
int i;
return SendDriverMessage(JOY_Driver, JDD_GETNUMDEVS, 0L, 0L); for (i = 0; i < MAXJOYSTICK; i++) {
if (JOY_LoadDriver(i)) {
ret += SendDriverMessage(JOY_Sticks[i].hDriver, JDD_GETNUMDEVS, 0L, 0L);
}
}
return ret;
} }
/************************************************************************** /**************************************************************************
...@@ -117,12 +125,12 @@ UINT16 WINAPI joyGetNumDevs16(void) ...@@ -117,12 +125,12 @@ UINT16 WINAPI joyGetNumDevs16(void)
MMRESULT WINAPI joyGetDevCapsA(UINT wID, LPJOYCAPSA lpCaps, UINT wSize) MMRESULT WINAPI joyGetDevCapsA(UINT wID, LPJOYCAPSA lpCaps, UINT wSize)
{ {
if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (wID >= MAXJOYSTICK) return JOYERR_PARMS;
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER;
lpCaps->wPeriodMin = JOY_PERIOD_MIN; /* FIXME */ lpCaps->wPeriodMin = JOY_PERIOD_MIN; /* FIXME */
lpCaps->wPeriodMax = JOY_PERIOD_MAX; /* FIXME (same as MS Joystick Driver) */ lpCaps->wPeriodMax = JOY_PERIOD_MAX; /* FIXME (same as MS Joystick Driver) */
return SendDriverMessage(JOY_Driver, JDD_GETDEVCAPS, (DWORD)lpCaps, wSize); return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETDEVCAPS, (DWORD)lpCaps, wSize);
} }
/************************************************************************** /**************************************************************************
...@@ -213,7 +221,7 @@ MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo) ...@@ -213,7 +221,7 @@ MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo)
TRACE("(%d, %p);\n", wID, lpInfo); TRACE("(%d, %p);\n", wID, lpInfo);
if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (wID >= MAXJOYSTICK) return JOYERR_PARMS;
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER;
lpInfo->dwXpos = 0; lpInfo->dwXpos = 0;
lpInfo->dwYpos = 0; lpInfo->dwYpos = 0;
...@@ -227,7 +235,7 @@ MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo) ...@@ -227,7 +235,7 @@ MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo)
lpInfo->dwReserved1 = 0; lpInfo->dwReserved1 = 0;
lpInfo->dwReserved2 = 0; lpInfo->dwReserved2 = 0;
return SendDriverMessage(JOY_Driver, JDD_GETPOSEX, (DWORD)lpInfo, 0L); return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETPOSEX, (DWORD)lpInfo, 0L);
} }
/************************************************************************** /**************************************************************************
...@@ -246,14 +254,14 @@ MMRESULT WINAPI joyGetPos(UINT wID, LPJOYINFO lpInfo) ...@@ -246,14 +254,14 @@ MMRESULT WINAPI joyGetPos(UINT wID, LPJOYINFO lpInfo)
TRACE("(%d, %p);\n", wID, lpInfo); TRACE("(%d, %p);\n", wID, lpInfo);
if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (wID >= MAXJOYSTICK) return JOYERR_PARMS;
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER;
lpInfo->wXpos = 0; lpInfo->wXpos = 0;
lpInfo->wYpos = 0; lpInfo->wYpos = 0;
lpInfo->wZpos = 0; lpInfo->wZpos = 0;
lpInfo->wButtons = 0; lpInfo->wButtons = 0;
return SendDriverMessage(JOY_Driver, JDD_GETPOS, (DWORD)lpInfo, 0L); return SendDriverMessage(JOY_Sticks[wID].hDriver, JDD_GETPOS, (DWORD)lpInfo, 0L);
} }
/************************************************************************** /**************************************************************************
...@@ -309,7 +317,7 @@ MMRESULT WINAPI joyReleaseCapture(UINT wID) ...@@ -309,7 +317,7 @@ MMRESULT WINAPI joyReleaseCapture(UINT wID)
TRACE("(%04X);\n", wID); TRACE("(%04X);\n", wID);
if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (wID >= MAXJOYSTICK) return JOYERR_PARMS;
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER;
if (!JOY_Sticks[wID].hCapture) return JOYERR_NOCANDO; if (!JOY_Sticks[wID].hCapture) return JOYERR_NOCANDO;
KillTimer(JOY_Sticks[wID].hCapture, JOY_Sticks[wID].wTimer); KillTimer(JOY_Sticks[wID].hCapture, JOY_Sticks[wID].wTimer);
...@@ -336,7 +344,7 @@ MMRESULT WINAPI joySetCapture(HWND hWnd, UINT wID, UINT wPeriod, BOOL bChanged) ...@@ -336,7 +344,7 @@ MMRESULT WINAPI joySetCapture(HWND hWnd, UINT wID, UINT wPeriod, BOOL bChanged)
if (wID >= MAXJOYSTICK || hWnd == 0) return JOYERR_PARMS; if (wID >= MAXJOYSTICK || hWnd == 0) return JOYERR_PARMS;
if (wPeriod<JOY_PERIOD_MIN || wPeriod>JOY_PERIOD_MAX) return JOYERR_PARMS; if (wPeriod<JOY_PERIOD_MIN || wPeriod>JOY_PERIOD_MAX) return JOYERR_PARMS;
if (!JOY_LoadDriver()) return MMSYSERR_NODRIVER; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER;
if (JOY_Sticks[wID].hCapture || !IsWindow(hWnd)) if (JOY_Sticks[wID].hCapture || !IsWindow(hWnd))
return JOYERR_NOCANDO; /* FIXME: what should be returned ? */ return JOYERR_NOCANDO; /* FIXME: what should be returned ? */
......
...@@ -49,19 +49,40 @@ DEFAULT_DEBUG_CHANNEL(joystick); ...@@ -49,19 +49,40 @@ DEFAULT_DEBUG_CHANNEL(joystick);
#define MAXJOYSTICK (JOYSTICKID2 + 1) #define MAXJOYSTICK (JOYSTICKID2 + 1)
static struct dummy_struct* JSTCK_Dummy = NULL; typedef struct tagWINE_JSTCK {
int joyIntf;
int in_use;
} WINE_JSTCK;
static WINE_JSTCK JSTCK_Data[MAXJOYSTICK];
/**************************************************************************
* JSTCK_drvGet [internal]
*/
static WINE_JSTCK* JSTCK_drvGet(DWORD dwDevID)
{
int p;
if ((dwDevID - (DWORD)JSTCK_Data) % sizeof(JSTCK_Data[0]) != 0)
return NULL;
p = (dwDevID - (DWORD)JSTCK_Data) / sizeof(JSTCK_Data[0]);
if (p < 0 || p >= MAXJOYSTICK || !((WINE_JSTCK*)dwDevID)->in_use)
return NULL;
return (WINE_JSTCK*)dwDevID;
}
/************************************************************************** /**************************************************************************
* JSTCK_drvOpen [internal] * JSTCK_drvOpen [internal]
*/ */
static DWORD JSTCK_drvOpen(LPSTR str) static DWORD JSTCK_drvOpen(LPSTR str, DWORD dwIntf)
{ {
if (JSTCK_Dummy) if (dwIntf >= MAXJOYSTICK || JSTCK_Data[dwIntf].in_use)
return 0; return 0;
/* I know, this is ugly, but who cares... */ JSTCK_Data[dwIntf].joyIntf = dwIntf;
JSTCK_Dummy = (struct dummy_struct*)1; JSTCK_Data[dwIntf].in_use = 1;
return 1; return (DWORD)&JSTCK_Data[dwIntf];
} }
/************************************************************************** /**************************************************************************
...@@ -69,11 +90,12 @@ static DWORD JSTCK_drvOpen(LPSTR str) ...@@ -69,11 +90,12 @@ static DWORD JSTCK_drvOpen(LPSTR str)
*/ */
static DWORD JSTCK_drvClose(DWORD dwDevID) static DWORD JSTCK_drvClose(DWORD dwDevID)
{ {
if (JSTCK_Dummy) { WINE_JSTCK* jstck = JSTCK_drvGet(dwDevID);
JSTCK_Dummy = NULL;
return 1; if (jstck == NULL)
} return 0;
return 0; jstck->in_use = 0;
return 1;
} }
struct js_status struct js_status
...@@ -86,14 +108,12 @@ struct js_status ...@@ -86,14 +108,12 @@ struct js_status
/************************************************************************** /**************************************************************************
* JSTCK_OpenDevice [internal] * JSTCK_OpenDevice [internal]
*/ */
static int JSTCK_OpenDevice(WORD wID) static int JSTCK_OpenDevice(WINE_JSTCK* jstick)
{ {
char buf[20]; char buf[20];
int flags; int flags;
if (wID >= MAXJOYSTICK) return -1;
sprintf(buf, JOYDEV, wID); sprintf(buf, JOYDEV, jstick->joyIntf);
#ifdef HAVE_LINUX_22_JOYSTICK_API #ifdef HAVE_LINUX_22_JOYSTICK_API
flags = O_RDONLY | O_NONBLOCK; flags = O_RDONLY | O_NONBLOCK;
#else #else
...@@ -107,6 +127,7 @@ static int JSTCK_OpenDevice(WORD wID) ...@@ -107,6 +127,7 @@ static int JSTCK_OpenDevice(WORD wID)
*/ */
static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize) static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize)
{ {
WINE_JSTCK* jstck;
#ifdef HAVE_LINUX_22_JOYSTICK_API #ifdef HAVE_LINUX_22_JOYSTICK_API
int dev; int dev;
char nrOfAxes; char nrOfAxes;
...@@ -115,11 +136,12 @@ static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize) ...@@ -115,11 +136,12 @@ static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize)
int driverVersion; int driverVersion;
#endif #endif
if (dwDevID >= MAXJOYSTICK) return MMSYSERR_NODRIVER; if ((jstck = JSTCK_drvGet(dwDevID)) == NULL)
return MMSYSERR_NODRIVER;
#ifdef HAVE_LINUX_22_JOYSTICK_API #ifdef HAVE_LINUX_22_JOYSTICK_API
if ((dev = JSTCK_OpenDevice(dwDevID)) < 0) return JOYERR_PARMS; if ((dev = JSTCK_OpenDevice(jstck)) < 0) return JOYERR_PARMS;
ioctl(dev, JSIOCGAXES, &nrOfAxes); ioctl(dev, JSIOCGAXES, &nrOfAxes);
ioctl(dev, JSIOCGBUTTONS, &nrOfButtons); ioctl(dev, JSIOCGBUTTONS, &nrOfButtons);
ioctl(dev, JSIOCGVERSION, &driverVersion); ioctl(dev, JSIOCGVERSION, &driverVersion);
...@@ -200,6 +222,7 @@ static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize) ...@@ -200,6 +222,7 @@ static LONG JSTCK_GetDevCaps(DWORD dwDevID, LPJOYCAPSA lpCaps, DWORD dwSize)
*/ */
static LONG JSTCK_GetPosEx(DWORD dwDevID, LPJOYINFOEX lpInfo) static LONG JSTCK_GetPosEx(DWORD dwDevID, LPJOYINFOEX lpInfo)
{ {
WINE_JSTCK* jstck;
int dev; int dev;
#ifdef HAVE_LINUX_22_JOYSTICK_API #ifdef HAVE_LINUX_22_JOYSTICK_API
struct js_event ev; struct js_event ev;
...@@ -208,7 +231,10 @@ static LONG JSTCK_GetPosEx(DWORD dwDevID, LPJOYINFOEX lpInfo) ...@@ -208,7 +231,10 @@ static LONG JSTCK_GetPosEx(DWORD dwDevID, LPJOYINFOEX lpInfo)
int dev_stat; int dev_stat;
#endif #endif
if ((dev = JSTCK_OpenDevice(dwDevID)) < 0) return JOYERR_PARMS; if ((jstck = JSTCK_drvGet(dwDevID)) == NULL)
return MMSYSERR_NODRIVER;
if ((dev = JSTCK_OpenDevice(jstck)) < 0) return JOYERR_PARMS;
#ifdef HAVE_LINUX_22_JOYSTICK_API #ifdef HAVE_LINUX_22_JOYSTICK_API
/* After opening the device it's state can be /* After opening the device it's state can be
...@@ -312,7 +338,7 @@ static LONG JSTCK_GetPos(DWORD dwDevID, LPJOYINFO lpInfo) ...@@ -312,7 +338,7 @@ static LONG JSTCK_GetPos(DWORD dwDevID, LPJOYINFO lpInfo)
* JSTCK_DriverProc [internal] * JSTCK_DriverProc [internal]
*/ */
LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
DWORD dwParam1, DWORD dwParam2) DWORD dwParam1, DWORD dwParam2)
{ {
/* EPP TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", */ /* EPP TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", */
/* EPP dwDevID, hDriv, wMsg, dwParam1, dwParam2); */ /* EPP dwDevID, hDriv, wMsg, dwParam1, dwParam2); */
...@@ -320,7 +346,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, ...@@ -320,7 +346,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
switch(wMsg) { switch(wMsg) {
case DRV_LOAD: return 1; case DRV_LOAD: return 1;
case DRV_FREE: return 1; case DRV_FREE: return 1;
case DRV_OPEN: return JSTCK_drvOpen((LPSTR)dwParam1); case DRV_OPEN: return JSTCK_drvOpen((LPSTR)dwParam1, dwParam2);
case DRV_CLOSE: return JSTCK_drvClose(dwDevID); case DRV_CLOSE: return JSTCK_drvClose(dwDevID);
case DRV_ENABLE: return 1; case DRV_ENABLE: return 1;
case DRV_DISABLE: return 1; case DRV_DISABLE: return 1;
...@@ -329,7 +355,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, ...@@ -329,7 +355,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
case DRV_INSTALL: return DRVCNF_RESTART; case DRV_INSTALL: return DRVCNF_RESTART;
case DRV_REMOVE: return DRVCNF_RESTART; case DRV_REMOVE: return DRVCNF_RESTART;
case JDD_GETNUMDEVS: return MAXJOYSTICK; case JDD_GETNUMDEVS: return 1;
case JDD_GETDEVCAPS: return JSTCK_GetDevCaps(dwDevID, (LPJOYCAPSA)dwParam1, dwParam2); case JDD_GETDEVCAPS: return JSTCK_GetDevCaps(dwDevID, (LPJOYCAPSA)dwParam1, dwParam2);
case JDD_GETPOS: return JSTCK_GetPos(dwDevID, (LPJOYINFO)dwParam1); case JDD_GETPOS: return JSTCK_GetPos(dwDevID, (LPJOYINFO)dwParam1);
case JDD_SETCALIBRATION: case JDD_SETCALIBRATION:
...@@ -346,7 +372,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, ...@@ -346,7 +372,7 @@ LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
* JSTCK_DriverProc [internal] * JSTCK_DriverProc [internal]
*/ */
LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, LONG CALLBACK JSTCK_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
DWORD dwParam1, DWORD dwParam2) DWORD dwParam1, DWORD dwParam2)
{ {
/* EPP TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", */ /* EPP TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", */
/* EPP dwDevID, hDriv, wMsg, dwParam1, dwParam2); */ /* EPP dwDevID, hDriv, wMsg, dwParam1, dwParam2); */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment