dinput device name patch
Robert Reif
reif at earthlink.net
Fri Sep 3 11:54:49 CDT 2004
Read device name from device if possible.
Fix enumerate open bug.
-------------- next part --------------
Index: dlls/dinput/joystick_linux.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/joystick_linux.c,v
retrieving revision 1.9
diff -u -r1.9 joystick_linux.c
--- dlls/dinput/joystick_linux.c 2 Sep 2004 20:09:54 -0000 1.9
+++ dlls/dinput/joystick_linux.c 3 Sep 2004 16:45:05 -0000
@@ -97,6 +97,7 @@
LPDIDEVICEOBJECTDATA data_queue;
int queue_head, queue_tail, queue_len;
BOOL acquired;
+ char *name;
};
static GUID DInput_Wine_Joystick_GUID = { /* 9e573ed9-7734-11d2-8d4a-23903fb6bdf7 */
@@ -108,68 +109,88 @@
static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
- int fd = -1;
+ int fd = -1;
- if (dwFlags & DIEDFL_FORCEFEEDBACK)
- return FALSE;
+ if (dwFlags & DIEDFL_FORCEFEEDBACK) {
+ WARN("force feedback not supported\n");
+ return FALSE;
+ }
+
+ if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {
+ /* check whether we have a joystick */
+ if ((fd = open(JOYDEV,O_RDONLY)) < 0) {
+ WARN("open(%s,O_RDONLY) failed: %s\n", JOYDEV, strerror(errno));
+ return FALSE;
+ }
- if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {
- /* check whether we have a joystick */
- if ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) {
- TRACE("Enumerating the linux Joystick device: %s\n",JOYDEV);
-
- /* Return joystick */
- lpddi->guidInstance = GUID_Joystick;
- lpddi->guidProduct = DInput_Wine_Joystick_GUID;
- /* we only support traditional joysticks for now */
- if (version >= 8)
- lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
- else
- lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
- strcpy(lpddi->tszInstanceName, "Joystick");
- /* ioctl JSIOCGNAME(len) */
- strcpy(lpddi->tszProductName, "Wine Joystick");
-
- lpddi->guidFFDriver = GUID_NULL;
- if (fd != -1)
- close(fd);
- return TRUE;
+ /* Return joystick */
+ lpddi->guidInstance = GUID_Joystick;
+ lpddi->guidProduct = DInput_Wine_Joystick_GUID;
+ /* we only support traditional joysticks for now */
+ if (version >= 8)
+ lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+ else
+ lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+ strcpy(lpddi->tszInstanceName, "Joystick");
+#if defined(JSIOCGNAME)
+ if (ioctl(fd,JSIOCGNAME(sizeof(lpddi->tszProductName)),lpddi->tszProductName) < 0) {
+ WARN("ioctl(%s,JSIOCGNAME) failed: %s\n", JOYDEV, strerror(errno));
+ strcpy(lpddi->tszProductName, "Wine Joystick");
+ }
+#else
+ strcpy(lpddi->tszProductName, "Wine Joystick");
+#endif
+
+ lpddi->guidFFDriver = GUID_NULL;
+ close(fd);
+ TRACE("Enumerating the linux Joystick device: %s (%s)\n", JOYDEV, lpddi->tszProductName);
+ return TRUE;
}
- }
- return FALSE;
+ return FALSE;
}
static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version)
{
- int fd = -1;
+ int fd = -1;
+ char name[MAX_PATH];
- if (dwFlags & DIEDFL_FORCEFEEDBACK)
- return FALSE;
+ if (dwFlags & DIEDFL_FORCEFEEDBACK) {
+ WARN("force feedback not supported\n");
+ return FALSE;
+ }
- if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {
- /* check whether we have a joystick */
- if ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) {
- TRACE("Enumerating the linux Joystick device\n");
-
- /* Return joystick */
- lpddi->guidInstance = GUID_Joystick;
- lpddi->guidProduct = DInput_Wine_Joystick_GUID;
- /* we only support traditional joysticks for now */
- lpddi->dwDevType = DIDEVTYPE_JOYSTICK |
- (DIDEVTYPEJOYSTICK_TRADITIONAL<<8);
-
- MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH);
- /* ioctl JSIOCGNAME(len) */
- MultiByteToWideChar(CP_ACP, 0, "Wine Joystick", -1, lpddi->tszProductName, MAX_PATH);
- lpddi->guidFFDriver = GUID_NULL;
- if (fd != -1)
- close(fd);
- return TRUE;
+ if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {
+ /* check whether we have a joystick */
+ if ((fd = open(JOYDEV,O_RDONLY) < 0)) {
+ WARN("open(%s,O_RDONLY) failed: %s\n", JOYDEV, strerror(errno));
+ return FALSE;
+ }
+
+ /* Return joystick */
+ lpddi->guidInstance = GUID_Joystick;
+ lpddi->guidProduct = DInput_Wine_Joystick_GUID;
+ /* we only support traditional joysticks for now */
+ lpddi->dwDevType = DIDEVTYPE_JOYSTICK |
+ (DIDEVTYPEJOYSTICK_TRADITIONAL<<8);
+
+ MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH);
+#if defined(JSIOCGNAME)
+ if (ioctl(fd,JSIOCGNAME(sizeof(name)),name) < 0) {
+ WARN("ioctl(%s,JSIOCGNAME) failed: %s\n", JOYDEV, strerror(errno));
+ strcpy(name, "Wine Joystick");
+ }
+#else
+ strcpy(name, "Wine Joystick");
+#endif
+ MultiByteToWideChar(CP_ACP, 0, name, -1, lpddi->tszProductName, MAX_PATH);
+ lpddi->guidFFDriver = GUID_NULL;
+ close(fd);
+ TRACE("Enumerating the linux Joystick device: %s (%s)\n",JOYDEV,name);
+ return TRUE;
}
- }
- return FALSE;
+ return FALSE;
}
static JoystickImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *dinput)
@@ -186,6 +207,7 @@
newDevice->joyfd = -1;
newDevice->dinput = dinput;
newDevice->acquired = FALSE;
+ newDevice->name = NULL;
CopyMemory(&(newDevice->guid),rguid,sizeof(*rguid));
/* wine uses DIJOYSTATE2 as it's internal format so copy
@@ -211,7 +233,7 @@
/* initialize default properties */
for (i = 0; i < c_dfDIJoystick2.dwNumObjs; i++) {
newDevice->props[i].lMin = 0;
- newDevice->props[i].lMax = 0xffff;
+ newDevice->props[i].lMax = 0xffff;
newDevice->props[i].lDeadZone = 1000;
newDevice->props[i].lSaturation = 0;
}
@@ -323,6 +345,10 @@
if (This->ref)
return This->ref;
+ /* Free the device name */
+ if (This->name)
+ HeapFree(GetProcessHeap(),0,This->name);
+
/* Free the data queue */
if (This->data_queue != NULL)
HeapFree(GetProcessHeap(),0,This->data_queue);
@@ -835,6 +861,18 @@
/* Only the fields till dwFFMaxForce are relevant */
ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
+
+#if defined(JSIOCGNAME)
+ if (!This->name) {
+ char name[64];
+ if (-1==ioctl(xfd,JSIOCGNAME(sizeof(name)),name)) {
+ This->name = HeapAlloc(GetProcessHeap(),0,strlen(name) + 1);
+ strcpy(This->name, name);
+ strcpy(ddoi.tszName, This->name);
+ }
+ } else
+ strcpy(ddoi.tszName, This->name);
+#endif
/* For the joystick, do as is done in the GetCapabilities function */
if ((dwFlags == DIDFT_ALL) ||
More information about the wine-patches
mailing list