[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