[dinput] some mouse stuff

Christian Costa titan.costa at wanadoo.fr
Tue Jun 3 15:04:41 CDT 2003


Hi,

This patch fix the mouse cursor in Incoming Forces demo.

Bye.

Changelog :
Fix SetDataFormat and implement GetDeviceInfo for mouse device.

Christian Costa   titan.costa at wanadoo.fr

-------------- next part --------------
Index: main.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/mouse/main.c,v
retrieving revision 1.21
diff -u -r1.21 main.c
--- main.c	15 Mar 2003 00:12:42 -0000	1.21
+++ main.c	3 Jun 2003 19:43:49 -0000
@@ -136,6 +136,9 @@
 	Wine_InternalMouseData          m_state;
 };
 
+/* FIXME: This is ugly and not thread safe :/ */
+static IDirectInputDevice8A* current_lock = NULL;
+
 static GUID DInput_Wine_Mouse_GUID = { /* 9e573ed8-7734-11d2-8d4a-23903fb6bdf7 */
   0x9e573ed8,
   0x7734,
@@ -143,21 +146,33 @@
   {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
 };
 
-/* FIXME: This is ugly and not thread safe :/ */
-static IDirectInputDevice8A* current_lock = NULL;
+static void fill_mouse_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) {
+    DWORD dwSize;
+    DIDEVICEINSTANCEA ddi;
+    
+    dwSize = lpddi->dwSize;
+
+    TRACE("%ld %p\n", dwSize, lpddi);
+    
+    memset(lpddi, 0, dwSize);
+    memset(&ddi, 0, sizeof(ddi));
+
+    ddi.dwSize = dwSize;
+    ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
+    ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
+    ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8);
+    strcpy(ddi.tszInstanceName, "Mouse");
+    strcpy(ddi.tszProductName, "Wine Mouse");
 
+    memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
+}
 
 static BOOL mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
 {
   if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_MOUSE)) {
     TRACE("Enumerating the mouse device\n");
 
-    /* Return mouse */
-    lpddi->guidInstance = GUID_SysMouse;/* DInput's GUID */
-    lpddi->guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
-    lpddi->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8);
-    strcpy(lpddi->tszInstanceName, "Mouse");
-    strcpy(lpddi->tszProductName, "Wine Mouse");
+    fill_mouse_dideviceinstancea(lpddi);
 
     return TRUE;
   }
@@ -315,13 +330,10 @@
     TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
   }
 
-  /* Check if the mouse is in absolute or relative mode */
-  if (df->dwFlags == DIDF_ABSAXIS)
-    This->absolute = 1;
-  else if (df->dwFlags == DIDF_RELAXIS)
-    This->absolute = 0;
-  else
-    ERR("Neither absolute nor relative flag set\n");
+  /* Tests under windows show that a call to SetDataFormat always sets the mouse
+     in relative mode whatever the dwFlags value (DIDF_ABSAXIS/DIDF_RELAXIS).
+     To switch in absolute mode, SetProperty must be used. */
+  This->absolute = 0;
 
   /* Store the new data format */
   This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);
@@ -934,6 +946,25 @@
   return DI_OK;
 }
 
+/******************************************************************************
+  *     GetDeviceInfo : get information about a device's identity
+  */
+static HRESULT WINAPI SysMouseAImpl_GetDeviceInfo(
+	LPDIRECTINPUTDEVICE8A iface,
+	LPDIDEVICEINSTANCEA pdidi)
+{
+    ICOM_THIS(SysMouseAImpl,iface);
+    TRACE("(this=%p,%p)\n", This, pdidi);
+
+    if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) {
+        WARN(" dinput3 not supporte yet...\n");
+	return DI_OK;
+    }
+
+    fill_mouse_dideviceinstancea(pdidi);
+    
+    return DI_OK;
+}
 
 static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt =
 {
@@ -953,7 +984,7 @@
 	SysMouseAImpl_SetEventNotification,
 	SysMouseAImpl_SetCooperativeLevel,
 	IDirectInputDevice2AImpl_GetObjectInfo,
-	IDirectInputDevice2AImpl_GetDeviceInfo,
+	SysMouseAImpl_GetDeviceInfo,
 	IDirectInputDevice2AImpl_RunControlPanel,
 	IDirectInputDevice2AImpl_Initialize,
 	IDirectInputDevice2AImpl_CreateEffect,


More information about the wine-patches mailing list