[DInput] Fix RailroadTycoon
Lionel Ulmer
lionel.ulmer at free.fr
Mon May 31 11:03:53 CDT 2004
Sorry for the huge diff, but I got sick when I saw my previous 2-space
indenting style, so I had to re-indent everything... For people who want to
do a code review, I could send them a 'diff -w' version :-)
And before anyone complains, yeah, I should have sent two patches (one
cosmetic, one with the real meat in it) :-)
Lionel
Changelog:
- some TRACEing improvements
- fix mouse Acquire which switched right and middle buttons
- reset the mouse cursor at its original location on Unacquiring the device
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
? dlls/dinput/dinput.dll-UQrvOo.spec.c
Index: dlls/dinput/device.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/device.c,v
retrieving revision 1.16
diff -u -r1.16 device.c
--- dlls/dinput/device.c 7 Oct 2003 03:30:47 -0000 1.16
+++ dlls/dinput/device.c 31 May 2004 15:59:22 -0000
@@ -42,271 +42,383 @@
* Various debugging tools
*/
void _dump_cooperativelevel_DI(DWORD dwFlags) {
- int i;
- const struct {
- DWORD mask;
- const char *name;
- } flags[] = {
-#define FE(x) { x, #x},
- FE(DISCL_BACKGROUND)
- FE(DISCL_EXCLUSIVE)
- FE(DISCL_FOREGROUND)
- FE(DISCL_NONEXCLUSIVE)
+ if (TRACE_ON(dinput)) {
+ int i;
+ static const struct {
+ DWORD mask;
+ const char *name;
+ } flags[] = {
+#define FE(x) { x, #x}
+ FE(DISCL_BACKGROUND),
+ FE(DISCL_EXCLUSIVE),
+ FE(DISCL_FOREGROUND),
+ FE(DISCL_NONEXCLUSIVE)
#undef FE
- };
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if (flags[i].mask & dwFlags)
- DPRINTF("%s ",flags[i].name);
- DPRINTF("\n");
+ };
+ for (i = 0; i < (sizeof(flags) / sizeof(flags[0])); i++)
+ if (flags[i].mask & dwFlags)
+ DPRINTF("%s ",flags[i].name);
+ DPRINTF("\n");
+ }
}
void _dump_EnumObjects_flags(DWORD dwFlags) {
- int i;
- const struct {
- DWORD mask;
- const char *name;
- } flags[] = {
-#define FE(x) { x, #x},
- FE(DIDFT_ABSAXIS)
- FE(DIDFT_ALL)
- FE(DIDFT_AXIS)
- FE(DIDFT_BUTTON)
- FE(DIDFT_COLLECTION)
- FE(DIDFT_FFACTUATOR)
- FE(DIDFT_FFEFFECTTRIGGER)
- FE(DIDFT_NOCOLLECTION)
- FE(DIDFT_NODATA)
- FE(DIDFT_OUTPUT)
- FE(DIDFT_POV)
- FE(DIDFT_PSHBUTTON)
- FE(DIDFT_RELAXIS)
- FE(DIDFT_TGLBUTTON)
+ if (TRACE_ON(dinput)) {
+ int i;
+ DWORD type, instance;
+ static const struct {
+ DWORD mask;
+ const char *name;
+ } flags[] = {
+#define FE(x) { x, #x}
+ FE(DIDFT_RELAXIS),
+ FE(DIDFT_ABSAXIS),
+ FE(DIDFT_PSHBUTTON),
+ FE(DIDFT_TGLBUTTON),
+ FE(DIDFT_POV),
+ FE(DIDFT_COLLECTION),
+ FE(DIDFT_NODATA),
+ FE(DIDFT_FFACTUATOR),
+ FE(DIDFT_FFEFFECTTRIGGER),
+ FE(DIDFT_OUTPUT)
#undef FE
- };
- if (dwFlags == DIDFT_ALL) {
- DPRINTF("DIDFT_ALL");
- return;
- }
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if (flags[i].mask & dwFlags)
- DPRINTF("%s ",flags[i].name);
- if (dwFlags & DIDFT_INSTANCEMASK)
- DPRINTF("Instance(%04lx) ", dwFlags >> 8);
+ };
+ type = (dwFlags & 0xFF0000FF);
+ instance = ((dwFlags >> 8) & 0xFFFF);
+ DPRINTF("Type:");
+ if (type == DIDFT_ALL) {
+ DPRINTF(" DIDFT_ALL");
+ } else {
+ for (i = 0; i < (sizeof(flags) / sizeof(flags[0])); i++) {
+ if (flags[i].mask & type) {
+ type &= ~flags[i].mask;
+ DPRINTF(" %s",flags[i].name);
+ }
+ }
+ if (type) {
+ DPRINTF(" (unhandled: %08lx)", type);
+ }
+ }
+ DPRINTF(" / Instance: ");
+ if (instance == ((DIDFT_ANYINSTANCE >> 8) & 0xFFFF)) {
+ DPRINTF("DIDFT_ANYINSTANCE");
+ } else {
+ DPRINTF("%3ld", instance);
+ }
+ }
}
void _dump_DIPROPHEADER(DIPROPHEADER *diph) {
- DPRINTF(" - dwObj = 0x%08lx\n", diph->dwObj);
- DPRINTF(" - dwHow = %s\n",
- ((diph->dwHow == DIPH_DEVICE) ? "DIPH_DEVICE" :
- ((diph->dwHow == DIPH_BYOFFSET) ? "DIPH_BYOFFSET" :
- ((diph->dwHow == DIPH_BYID)) ? "DIPH_BYID" : "unknown")));
+ if (TRACE_ON(dinput)) {
+ DPRINTF(" - dwObj = 0x%08lx\n", diph->dwObj);
+ DPRINTF(" - dwHow = %s\n",
+ ((diph->dwHow == DIPH_DEVICE) ? "DIPH_DEVICE" :
+ ((diph->dwHow == DIPH_BYOFFSET) ? "DIPH_BYOFFSET" :
+ ((diph->dwHow == DIPH_BYID)) ? "DIPH_BYID" : "unknown")));
+ }
}
void _dump_OBJECTINSTANCEA(DIDEVICEOBJECTINSTANCEA *ddoi) {
- if (TRACE_ON(dinput)) {
- DPRINTF(" - enumerating : %s - %2ld - 0x%08lx - %s\n",
- debugstr_guid(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, ddoi->tszName);
- }
+ if (TRACE_ON(dinput)) {
+ DPRINTF(" - enumerating : %s ('%s') - %2ld - 0x%08lx - %s\n",
+ debugstr_guid(&ddoi->guidType), _dump_dinput_GUID(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, ddoi->tszName);
+ }
}
void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) {
- if (TRACE_ON(dinput)) {
- DPRINTF(" - enumerating : %s - %2ld - 0x%08lx - %s\n",
- debugstr_guid(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, debugstr_w(ddoi->tszName));
- }
+ if (TRACE_ON(dinput)) {
+ DPRINTF(" - enumerating : %s ('%s'), - %2ld - 0x%08lx - %s\n",
+ debugstr_guid(&ddoi->guidType), _dump_dinput_GUID(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, debugstr_w(ddoi->tszName));
+ }
}
-/* Conversion between internal data buffer and external data buffer */
-void fill_DataFormat(void *out, void *in, DataFormat *df) {
- int i;
- char *in_c = (char *) in;
- char *out_c = (char *) out;
-
- if (df->dt == NULL) {
- /* This means that the app uses Wine's internal data format */
- memcpy(out, in, df->internal_format_size);
- } else {
- for (i = 0; i < df->size; i++) {
- if (df->dt[i].offset_in >= 0) {
- switch (df->dt[i].size) {
- case 1:
- TRACE("Copying (c) to %d from %d (value %d)\n",
- df->dt[i].offset_out, df->dt[i].offset_in, *((char *) (in_c + df->dt[i].offset_in)));
- *((char *) (out_c + df->dt[i].offset_out)) = *((char *) (in_c + df->dt[i].offset_in));
- break;
-
- case 2:
- TRACE("Copying (s) to %d from %d (value %d)\n",
- df->dt[i].offset_out, df->dt[i].offset_in, *((short *) (in_c + df->dt[i].offset_in)));
- *((short *) (out_c + df->dt[i].offset_out)) = *((short *) (in_c + df->dt[i].offset_in));
- break;
-
- case 4:
- TRACE("Copying (i) to %d from %d (value %d)\n",
- df->dt[i].offset_out, df->dt[i].offset_in, *((int *) (in_c + df->dt[i].offset_in)));
- *((int *) (out_c + df->dt[i].offset_out)) = *((int *) (in_c + df->dt[i].offset_in));
- break;
-
- default:
- memcpy((out_c + df->dt[i].offset_out), (in_c + df->dt[i].offset_in), df->dt[i].size);
- }
- } else {
- switch (df->dt[i].size) {
- case 1:
- TRACE("Copying (c) to %d default value %d\n",
- df->dt[i].offset_out, df->dt[i].value);
- *((char *) (out_c + df->dt[i].offset_out)) = (char) df->dt[i].value;
- break;
-
- case 2:
- TRACE("Copying (s) to %d default value %d\n",
- df->dt[i].offset_out, df->dt[i].value);
- *((short *) (out_c + df->dt[i].offset_out)) = (short) df->dt[i].value;
- break;
-
- case 4:
- TRACE("Copying (i) to %d default value %d\n",
- df->dt[i].offset_out, df->dt[i].value);
- *((int *) (out_c + df->dt[i].offset_out)) = (int) df->dt[i].value;
- break;
-
- default:
- memset((out_c + df->dt[i].offset_out), df->dt[i].size, 0);
+/* This function is a helper to convert a GUID into any possible DInput GUID out there */
+const char *_dump_dinput_GUID(const GUID *guid) {
+ int i;
+ static const struct {
+ const GUID *guid;
+ const char *name;
+ } guids[] = {
+#define FE(x) { &x, #x}
+ FE(GUID_XAxis),
+ FE(GUID_YAxis),
+ FE(GUID_ZAxis),
+ FE(GUID_RxAxis),
+ FE(GUID_RyAxis),
+ FE(GUID_RzAxis),
+ FE(GUID_Slider),
+ FE(GUID_Button),
+ FE(GUID_Key),
+ FE(GUID_POV),
+ FE(GUID_Unknown),
+ FE(GUID_SysMouse),
+ FE(GUID_SysKeyboard),
+ FE(GUID_Joystick),
+ FE(GUID_ConstantForce),
+ FE(GUID_RampForce),
+ FE(GUID_Square),
+ FE(GUID_Sine),
+ FE(GUID_Triangle),
+ FE(GUID_SawtoothUp),
+ FE(GUID_SawtoothDown),
+ FE(GUID_Spring),
+ FE(GUID_Damper),
+ FE(GUID_Inertia),
+ FE(GUID_Friction),
+ FE(GUID_CustomForce)
+#undef FE
+ };
+ if (guid == NULL)
+ return "null GUID";
+ for (i = 0; i < (sizeof(guids) / sizeof(guids[0])); i++) {
+ if (IsEqualGUID(guids[i].guid, guid)) {
+ return guids[i].name;
}
- }
}
- }
+ return "Unknown GUID";
}
-DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) {
- DataFormat *ret;
- DataTransform *dt;
- int i, j;
- int same = 1;
- int *done;
- int index = 0;
-
- ret = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));
-
- done = (int *) HeapAlloc(GetProcessHeap(), 0, sizeof(int) * asked_format->dwNumObjs);
- memset(done, 0, sizeof(int) * asked_format->dwNumObjs);
+void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) {
+ int i;
- dt = (DataTransform *) HeapAlloc(GetProcessHeap(), 0, asked_format->dwNumObjs * sizeof(DataTransform));
-
- TRACE("Creating DataTransform : \n");
+ TRACE("Dumping DIDATAFORMAT structure:\n");
+ TRACE(" - dwSize: %ld\n", df->dwSize);
+ if (df->dwSize != sizeof(DIDATAFORMAT)) {
+ WARN("Non-standard DIDATAFORMAT structure size (%ld instead of %d).\n", df->dwSize, sizeof(DIDATAFORMAT));
+ }
+ TRACE(" - dwObjsize: %ld\n", df->dwObjSize);
+ if (df->dwObjSize != sizeof(DIOBJECTDATAFORMAT)) {
+ WARN("Non-standard DIOBJECTDATAFORMAT structure size (%ld instead of %d).\n", df->dwObjSize, sizeof(DIOBJECTDATAFORMAT));
+ }
+ TRACE(" - dwFlags: 0x%08lx (", df->dwFlags);
+ switch (df->dwFlags) {
+ case DIDF_ABSAXIS: TRACE("DIDF_ABSAXIS"); break;
+ case DIDF_RELAXIS: TRACE("DIDF_RELAXIS"); break;
+ default: TRACE("unknown"); break;
+ }
+ TRACE(")\n");
+ TRACE(" - dwDataSize: %ld\n", df->dwDataSize);
+ TRACE(" - dwNumObjs: %ld\n", df->dwNumObjs);
+
+ for (i = 0; i < df->dwNumObjs; i++) {
+ TRACE(" - Object %d:\n", i);
+ TRACE(" * GUID: %s ('%s')\n", debugstr_guid(df->rgodf[i].pguid), _dump_dinput_GUID(df->rgodf[i].pguid));
+ TRACE(" * dwOfs: %ld\n", df->rgodf[i].dwOfs);
+ TRACE(" * dwType: 0x%08lx\n", df->rgodf[i].dwType);
+ TRACE(" "); _dump_EnumObjects_flags(df->rgodf[i].dwType); TRACE("\n");
+ TRACE(" * dwFlags: 0x%08lx\n", df->rgodf[i].dwFlags);
+ }
+}
- for (i = 0; i < wine_format->dwNumObjs; i++) {
- offset[i] = -1;
+/* Conversion between internal data buffer and external data buffer */
+void fill_DataFormat(void *out, void *in, DataFormat *df) {
+ int i;
+ char *in_c = (char *) in;
+ char *out_c = (char *) out;
+
+ if (df->dt == NULL) {
+ /* This means that the app uses Wine's internal data format */
+ memcpy(out, in, df->internal_format_size);
+ } else {
+ for (i = 0; i < df->size; i++) {
+ if (df->dt[i].offset_in >= 0) {
+ switch (df->dt[i].size) {
+ case 1:
+ TRACE("Copying (c) to %d from %d (value %d)\n",
+ df->dt[i].offset_out, df->dt[i].offset_in, *((char *) (in_c + df->dt[i].offset_in)));
+ *((char *) (out_c + df->dt[i].offset_out)) = *((char *) (in_c + df->dt[i].offset_in));
+ break;
+
+ case 2:
+ TRACE("Copying (s) to %d from %d (value %d)\n",
+ df->dt[i].offset_out, df->dt[i].offset_in, *((short *) (in_c + df->dt[i].offset_in)));
+ *((short *) (out_c + df->dt[i].offset_out)) = *((short *) (in_c + df->dt[i].offset_in));
+ break;
+
+ case 4:
+ TRACE("Copying (i) to %d from %d (value %d)\n",
+ df->dt[i].offset_out, df->dt[i].offset_in, *((int *) (in_c + df->dt[i].offset_in)));
+ *((int *) (out_c + df->dt[i].offset_out)) = *((int *) (in_c + df->dt[i].offset_in));
+ break;
+
+ default:
+ memcpy((out_c + df->dt[i].offset_out), (in_c + df->dt[i].offset_in), df->dt[i].size);
+ break;
+ }
+ } else {
+ switch (df->dt[i].size) {
+ case 1:
+ TRACE("Copying (c) to %d default value %d\n",
+ df->dt[i].offset_out, df->dt[i].value);
+ *((char *) (out_c + df->dt[i].offset_out)) = (char) df->dt[i].value;
+ break;
+
+ case 2:
+ TRACE("Copying (s) to %d default value %d\n",
+ df->dt[i].offset_out, df->dt[i].value);
+ *((short *) (out_c + df->dt[i].offset_out)) = (short) df->dt[i].value;
+ break;
+
+ case 4:
+ TRACE("Copying (i) to %d default value %d\n",
+ df->dt[i].offset_out, df->dt[i].value);
+ *((int *) (out_c + df->dt[i].offset_out)) = (int) df->dt[i].value;
+ break;
+
+ default:
+ memset((out_c + df->dt[i].offset_out), df->dt[i].size, 0);
+ break;
+ }
+ }
+ }
+ }
+}
+DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) {
+ DataFormat *ret;
+ DataTransform *dt;
+ int i, j;
+ int same = 1;
+ int *done;
+ int index = 0;
+
+ ret = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));
+
+ done = (int *) HeapAlloc(GetProcessHeap(), 0, sizeof(int) * asked_format->dwNumObjs);
+ memset(done, 0, sizeof(int) * asked_format->dwNumObjs);
+
+ dt = (DataTransform *) HeapAlloc(GetProcessHeap(), 0, asked_format->dwNumObjs * sizeof(DataTransform));
+
+ TRACE("Creating DataTransform : \n");
+
+ for (i = 0; i < wine_format->dwNumObjs; i++) {
+ offset[i] = -1;
+
+ for (j = 0; j < asked_format->dwNumObjs; j++) {
+ if (done[j] == 1)
+ continue;
+
+ if (/* Check if the application either requests any GUID and if not, it if matches
+ * the GUID of the Wine object.
+ */
+ ((asked_format->rgodf[j].pguid == NULL) ||
+ (IsEqualGUID(wine_format->rgodf[i].pguid, asked_format->rgodf[j].pguid)))
+ &&
+ (/* Then check if it accepts any instance id, and if not, if it matches Wine's
+ * instance id.
+ */
+ ((asked_format->rgodf[j].dwType & 0x00FFFF00) == DIDFT_ANYINSTANCE) ||
+ (DIDFT_GETINSTANCE(wine_format->rgodf[i].dwType) == DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType)))) {
+
+ done[j] = 1;
+
+ TRACE("Matching : \n");
+ TRACE(" - Asked (%d) :\n", j);
+ TRACE(" * GUID: %s ('%s')\n",
+ debugstr_guid(asked_format->rgodf[j].pguid),
+ _dump_dinput_GUID(asked_format->rgodf[j].pguid));
+ TRACE(" * Offset: %3ld\n", asked_format->rgodf[j].dwOfs);
+ TRACE(" * dwType: %08lx\n", asked_format->rgodf[j].dwType);
+ TRACE(" "); _dump_EnumObjects_flags(asked_format->rgodf[j].dwType); TRACE("\n");
+
+ TRACE(" - Wine (%d) :\n", j);
+ TRACE(" * GUID: %s ('%s')\n",
+ debugstr_guid(wine_format->rgodf[j].pguid),
+ _dump_dinput_GUID(wine_format->rgodf[j].pguid));
+ TRACE(" * Offset: %3ld\n", wine_format->rgodf[j].dwOfs);
+ TRACE(" * dwType: %08lx\n", wine_format->rgodf[j].dwType);
+ TRACE(" "); _dump_EnumObjects_flags(wine_format->rgodf[j].dwType); TRACE("\n");
+
+ if (wine_format->rgodf[i].dwType & DIDFT_BUTTON)
+ dt[index].size = sizeof(BYTE);
+ else
+ dt[index].size = sizeof(DWORD);
+ dt[index].offset_in = wine_format ->rgodf[i].dwOfs;
+ dt[index].offset_out = asked_format->rgodf[j].dwOfs;
+ dt[index].value = 0;
+ index++;
+
+ if (wine_format->rgodf[i].dwOfs != asked_format->rgodf[j].dwOfs)
+ same = 0;
+
+ offset[i] = asked_format->rgodf[j].dwOfs;
+ break;
+ }
+ }
+
+ if (j == asked_format->dwNumObjs)
+ same = 0;
+ }
+
+ TRACE("Setting to default value :\n");
for (j = 0; j < asked_format->dwNumObjs; j++) {
- if (done[j] == 1)
- continue;
-
- if (((asked_format->rgodf[j].pguid == NULL) || (IsEqualGUID(wine_format->rgodf[i].pguid, asked_format->rgodf[j].pguid)))
- &&
- (wine_format->rgodf[i].dwType & asked_format->rgodf[j].dwType)) {
-
- done[j] = 1;
-
- TRACE("Matching : \n");
- TRACE(" - Asked (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
- j, debugstr_guid(asked_format->rgodf[j].pguid),
- asked_format->rgodf[j].dwOfs,
- DIDFT_GETTYPE(asked_format->rgodf[j].dwType), DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType));
-
- TRACE(" - Wine (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
- j, debugstr_guid(wine_format->rgodf[i].pguid),
- wine_format->rgodf[i].dwOfs,
- DIDFT_GETTYPE(wine_format->rgodf[i].dwType), DIDFT_GETINSTANCE(wine_format->rgodf[i].dwType));
-
- if (wine_format->rgodf[i].dwType & DIDFT_BUTTON)
- dt[index].size = sizeof(BYTE);
- else
- dt[index].size = sizeof(DWORD);
- dt[index].offset_in = wine_format ->rgodf[i].dwOfs;
- dt[index].offset_out = asked_format->rgodf[j].dwOfs;
- dt[index].value = 0;
- index++;
-
- if (wine_format->rgodf[i].dwOfs != asked_format->rgodf[j].dwOfs)
- same = 0;
-
- offset[i] = asked_format->rgodf[j].dwOfs;
- break;
- }
- }
-
- if (j == asked_format->dwNumObjs)
- same = 0;
- }
-
- TRACE("Setting to default value :\n");
- for (j = 0; j < asked_format->dwNumObjs; j++) {
- if (done[j] == 0) {
- TRACE(" - Asked (%d) : %s - Ofs = %3ld - (Type = 0x%02x | Instance = %04x)\n",
- j, debugstr_guid(asked_format->rgodf[j].pguid),
- asked_format->rgodf[j].dwOfs,
- DIDFT_GETTYPE(asked_format->rgodf[j].dwType), DIDFT_GETINSTANCE(asked_format->rgodf[j].dwType));
-
-
- if (asked_format->rgodf[j].dwType & DIDFT_BUTTON)
- dt[index].size = sizeof(BYTE);
- else
- dt[index].size = sizeof(DWORD);
- dt[index].offset_in = -1;
- dt[index].offset_out = asked_format->rgodf[j].dwOfs;
- dt[index].value = 0;
- index++;
-
- same = 0;
- }
- }
-
- ret->internal_format_size = wine_format->dwDataSize;
- ret->size = index;
- if (same) {
- ret->dt = NULL;
- HeapFree(GetProcessHeap(), 0, dt);
- } else {
- ret->dt = dt;
- }
-
- HeapFree(GetProcessHeap(), 0, done);
-
- return ret;
+ if (done[j] == 0) {
+ TRACE(" - Asked (%d) :\n", j);
+ TRACE(" * GUID: %s ('%s')\n",
+ debugstr_guid(asked_format->rgodf[j].pguid),
+ _dump_dinput_GUID(asked_format->rgodf[j].pguid));
+ TRACE(" * Offset: %3ld\n", asked_format->rgodf[j].dwOfs);
+ TRACE(" * dwType: %08lx\n", asked_format->rgodf[j].dwType);
+ TRACE(" "); _dump_EnumObjects_flags(asked_format->rgodf[j].dwType); TRACE("\n");
+
+ if (asked_format->rgodf[j].dwType & DIDFT_BUTTON)
+ dt[index].size = sizeof(BYTE);
+ else
+ dt[index].size = sizeof(DWORD);
+ dt[index].offset_in = -1;
+ dt[index].offset_out = asked_format->rgodf[j].dwOfs;
+ dt[index].value = 0;
+ index++;
+
+ same = 0;
+ }
+ }
+
+ ret->internal_format_size = wine_format->dwDataSize;
+ ret->size = index;
+ if (same) {
+ ret->dt = NULL;
+ HeapFree(GetProcessHeap(), 0, dt);
+ } else {
+ ret->dt = dt;
+ }
+
+ HeapFree(GetProcessHeap(), 0, done);
+
+ return ret;
}
BOOL DIEnumDevicesCallbackAtoW(LPCDIDEVICEOBJECTINSTANCEA lpddi, LPVOID lpvRef) {
- DIDEVICEOBJECTINSTANCEW ddtmp;
- device_enumobjects_AtoWcb_data* data;
+ DIDEVICEOBJECTINSTANCEW ddtmp;
+ device_enumobjects_AtoWcb_data* data;
- data = (device_enumobjects_AtoWcb_data*) lpvRef;
-
- memset(&ddtmp, 0, sizeof(DIDEVICEINSTANCEW));
-
- ddtmp.dwSize = sizeof(DIDEVICEINSTANCEW);
- ddtmp.guidType = lpddi->guidType;
- ddtmp.dwOfs = lpddi->dwOfs;
- ddtmp.dwType = lpddi->dwType;
- ddtmp.dwFlags = lpddi->dwFlags;
- MultiByteToWideChar(CP_ACP, 0, lpddi->tszName, -1, ddtmp.tszName, MAX_PATH);
-
- if (lpddi->dwSize == sizeof(DIDEVICEINSTANCEA)) {
- /**
- * if dwSize < sizeof(DIDEVICEINSTANCEA of DInput version >= 5)
- * force feedback and other newer datas aren't available
- */
- ddtmp.dwFFMaxForce = lpddi->dwFFMaxForce;
- ddtmp.dwFFForceResolution = lpddi->dwFFForceResolution;
- ddtmp.wCollectionNumber = lpddi->wCollectionNumber;
- ddtmp.wDesignatorIndex = lpddi->wDesignatorIndex;
- ddtmp.wUsagePage = lpddi->wUsagePage;
- ddtmp.wUsage = lpddi->wUsage;
- ddtmp.dwDimension = lpddi->dwDimension;
- ddtmp.wExponent = lpddi->wExponent;
- ddtmp.wReserved = lpddi->wReserved;
- }
- return data->lpCallBack(&ddtmp, data->lpvRef);
+ data = (device_enumobjects_AtoWcb_data*) lpvRef;
+
+ memset(&ddtmp, 0, sizeof(DIDEVICEINSTANCEW));
+
+ ddtmp.dwSize = sizeof(DIDEVICEINSTANCEW);
+ ddtmp.guidType = lpddi->guidType;
+ ddtmp.dwOfs = lpddi->dwOfs;
+ ddtmp.dwType = lpddi->dwType;
+ ddtmp.dwFlags = lpddi->dwFlags;
+ MultiByteToWideChar(CP_ACP, 0, lpddi->tszName, -1, ddtmp.tszName, MAX_PATH);
+
+ if (lpddi->dwSize == sizeof(DIDEVICEINSTANCEA)) {
+ /**
+ * if dwSize < sizeof(DIDEVICEINSTANCEA of DInput version >= 5)
+ * force feedback and other newer datas aren't available
+ */
+ ddtmp.dwFFMaxForce = lpddi->dwFFMaxForce;
+ ddtmp.dwFFForceResolution = lpddi->dwFFForceResolution;
+ ddtmp.wCollectionNumber = lpddi->wCollectionNumber;
+ ddtmp.wDesignatorIndex = lpddi->wDesignatorIndex;
+ ddtmp.wUsagePage = lpddi->wUsagePage;
+ ddtmp.wUsage = lpddi->wUsage;
+ ddtmp.dwDimension = lpddi->dwDimension;
+ ddtmp.wExponent = lpddi->wExponent;
+ ddtmp.wReserved = lpddi->wReserved;
+ }
+ return data->lpCallBack(&ddtmp, data->lpvRef);
}
/******************************************************************************
@@ -316,123 +428,112 @@
HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(
LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df
) {
- int i;
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
-
- TRACE("(this=%p,%p)\n",This,df);
-
- TRACE("df.dwSize=%ld\n",df->dwSize);
- TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
- TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
- TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
- TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
-
- for (i=0;i<df->dwNumObjs;i++) {
- TRACE("df.rgodf[%d].guid %s\n",i,debugstr_guid(df->rgodf[i].pguid));
- TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
- TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
- TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
- }
- return DI_OK;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+
+ TRACE("(this=%p,%p)\n",This,df);
+
+ _dump_DIDATAFORMAT(df);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel(
LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags
) {
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
- TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags);
- if (TRACE_ON(dinput)) {
- TRACE(" cooperative level : ");
- _dump_cooperativelevel_DI(dwflags);
- }
- return DI_OK;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+ TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags);
+ if (TRACE_ON(dinput)) {
+ TRACE(" cooperative level : ");
+ _dump_cooperativelevel_DI(dwflags);
+ }
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification(
LPDIRECTINPUTDEVICE8A iface,HANDLE hnd
) {
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
- FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd);
- return DI_OK;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+ FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd);
+ return DI_OK;
}
ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface)
{
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
- This->ref--;
- if (This->ref)
- return This->ref;
- HeapFree(GetProcessHeap(),0,This);
- return DI_OK;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+ This->ref--;
+ if (This->ref)
+ return This->ref;
+ HeapFree(GetProcessHeap(),0,This);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface(
LPDIRECTINPUTDEVICE8A iface,REFIID riid,LPVOID *ppobj
)
{
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
-
- TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (IsEqualGUID(&IID_IUnknown,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDeviceA,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) {
- IDirectInputDevice7_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- TRACE("Unsupported interface !\n");
- return E_FAIL;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+
+ TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+ if (IsEqualGUID(&IID_IUnknown,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDeviceA,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) {
+ IDirectInputDevice7_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ TRACE("Unsupported interface !\n");
+ return E_FAIL;
}
HRESULT WINAPI IDirectInputDevice2WImpl_QueryInterface(
LPDIRECTINPUTDEVICE8W iface,REFIID riid,LPVOID *ppobj
)
{
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
-
- TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (IsEqualGUID(&IID_IUnknown,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDeviceW,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDevice2W,riid)) {
- IDirectInputDevice2_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- if (IsEqualGUID(&IID_IDirectInputDevice7W,riid)) {
- IDirectInputDevice7_AddRef(iface);
- *ppobj = This;
- return DI_OK;
- }
- TRACE("Unsupported interface !\n");
- return E_FAIL;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+
+ TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+ if (IsEqualGUID(&IID_IUnknown,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDeviceW,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDevice2W,riid)) {
+ IDirectInputDevice2_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ if (IsEqualGUID(&IID_IDirectInputDevice7W,riid)) {
+ IDirectInputDevice7_AddRef(iface);
+ *ppobj = This;
+ return DI_OK;
+ }
+ TRACE("Unsupported interface !\n");
+ return E_FAIL;
}
ULONG WINAPI IDirectInputDevice2AImpl_AddRef(
LPDIRECTINPUTDEVICE8A iface)
{
- ICOM_THIS(IDirectInputDevice2AImpl,iface);
- return ++This->ref;
+ ICOM_THIS(IDirectInputDevice2AImpl,iface);
+ return ++This->ref;
}
HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects(
@@ -441,14 +542,14 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags);
- if (TRACE_ON(dinput)) {
- DPRINTF(" - flags = ");
- _dump_EnumObjects_flags(dwFlags);
- DPRINTF("\n");
- }
-
- return DI_OK;
+ FIXME("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags);
+ if (TRACE_ON(dinput)) {
+ DPRINTF(" - flags = ");
+ _dump_EnumObjects_flags(dwFlags);
+ DPRINTF("\n");
+ }
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects(
@@ -457,14 +558,14 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags);
- if (TRACE_ON(dinput)) {
- DPRINTF(" - flags = ");
- _dump_EnumObjects_flags(dwFlags);
- DPRINTF("\n");
- }
-
- return DI_OK;
+ FIXME("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags);
+ if (TRACE_ON(dinput)) {
+ DPRINTF(" - flags = ");
+ _dump_EnumObjects_flags(dwFlags);
+ DPRINTF("\n");
+ }
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty(
@@ -472,13 +573,13 @@
REFGUID rguid,
LPDIPROPHEADER pdiph)
{
- FIXME("(this=%p,%s,%p): stub!\n",
- iface, debugstr_guid(rguid), pdiph);
-
- if (TRACE_ON(dinput))
- _dump_DIPROPHEADER(pdiph);
-
- return DI_OK;
+ FIXME("(this=%p,%s,%p): stub!\n",
+ iface, debugstr_guid(rguid), pdiph);
+
+ if (TRACE_ON(dinput))
+ _dump_DIPROPHEADER(pdiph);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_GetObjectInfo(
@@ -487,10 +588,10 @@
DWORD dwObj,
DWORD dwHow)
{
- FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n",
- iface, pdidoi, dwObj, dwHow);
-
- return DI_OK;
+ FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n",
+ iface, pdidoi, dwObj, dwHow);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2WImpl_GetObjectInfo(
@@ -499,29 +600,30 @@
DWORD dwObj,
DWORD dwHow)
{
- FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n",
- iface, pdidoi, dwObj, dwHow);
-
- return DI_OK;
+ FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n",
+ iface, pdidoi, dwObj, dwHow);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo(
LPDIRECTINPUTDEVICE8A iface,
LPDIDEVICEINSTANCEA pdidi)
{
- FIXME("(this=%p,%p): stub!\n",
- iface, pdidi);
-
- return DI_OK;
+ FIXME("(this=%p,%p): stub!\n",
+ iface, pdidi);
+
+ return DI_OK;
}
+
HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceInfo(
LPDIRECTINPUTDEVICE8W iface,
LPDIDEVICEINSTANCEW pdidi)
{
- FIXME("(this=%p,%p): stub!\n",
- iface, pdidi);
-
- return DI_OK;
+ FIXME("(this=%p,%p): stub!\n",
+ iface, pdidi);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel(
@@ -529,10 +631,10 @@
HWND hwndOwner,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,0x%08lx): stub!\n",
- iface, hwndOwner, dwFlags);
+ FIXME("(this=%p,%p,0x%08lx): stub!\n",
+ iface, hwndOwner, dwFlags);
- return DI_OK;
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_Initialize(
@@ -541,9 +643,9 @@
DWORD dwVersion,
REFGUID rguid)
{
- FIXME("(this=%p,%p,%ld,%s): stub!\n",
- iface, hinst, dwVersion, debugstr_guid(rguid));
- return DI_OK;
+ FIXME("(this=%p,%p,%ld,%s): stub!\n",
+ iface, hinst, dwVersion, debugstr_guid(rguid));
+ return DI_OK;
}
/******************************************************************************
@@ -557,9 +659,9 @@
LPDIRECTINPUTEFFECT *ppdef,
LPUNKNOWN pUnkOuter)
{
- FIXME("(this=%p,%s,%p,%p,%p): stub!\n",
- iface, debugstr_guid(rguid), lpeff, ppdef, pUnkOuter);
- return DI_OK;
+ FIXME("(this=%p,%s,%p,%p,%p): stub!\n",
+ iface, debugstr_guid(rguid), lpeff, ppdef, pUnkOuter);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_EnumEffects(
@@ -568,12 +670,12 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
- iface, lpCallback, lpvRef, dwFlags);
-
- if (lpCallback)
- lpCallback(NULL, lpvRef);
- return DI_OK;
+ FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
+ iface, lpCallback, lpvRef, dwFlags);
+
+ if (lpCallback)
+ lpCallback(NULL, lpvRef);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2WImpl_EnumEffects(
@@ -582,12 +684,12 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
- iface, lpCallback, lpvRef, dwFlags);
-
- if (lpCallback)
- lpCallback(NULL, lpvRef);
- return DI_OK;
+ FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
+ iface, lpCallback, lpvRef, dwFlags);
+
+ if (lpCallback)
+ lpCallback(NULL, lpvRef);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo(
@@ -595,9 +697,9 @@
LPDIEFFECTINFOA lpdei,
REFGUID rguid)
{
- FIXME("(this=%p,%p,%s): stub!\n",
- iface, lpdei, debugstr_guid(rguid));
- return DI_OK;
+ FIXME("(this=%p,%p,%s): stub!\n",
+ iface, lpdei, debugstr_guid(rguid));
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2WImpl_GetEffectInfo(
@@ -605,27 +707,27 @@
LPDIEFFECTINFOW lpdei,
REFGUID rguid)
{
- FIXME("(this=%p,%p,%s): stub!\n",
- iface, lpdei, debugstr_guid(rguid));
- return DI_OK;
+ FIXME("(this=%p,%p,%s): stub!\n",
+ iface, lpdei, debugstr_guid(rguid));
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState(
LPDIRECTINPUTDEVICE8A iface,
LPDWORD pdwOut)
{
- FIXME("(this=%p,%p): stub!\n",
- iface, pdwOut);
- return DI_OK;
+ FIXME("(this=%p,%p): stub!\n",
+ iface, pdwOut);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SendForceFeedbackCommand(
LPDIRECTINPUTDEVICE8A iface,
DWORD dwFlags)
{
- FIXME("(this=%p,0x%08lx): stub!\n",
- iface, dwFlags);
- return DI_OK;
+ FIXME("(this=%p,0x%08lx): stub!\n",
+ iface, dwFlags);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_EnumCreatedEffectObjects(
@@ -634,27 +736,27 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
- iface, lpCallback, lpvRef, dwFlags);
- if (lpCallback)
- lpCallback(NULL, lpvRef);
- return DI_OK;
+ FIXME("(this=%p,%p,%p,0x%08lx): stub!\n",
+ iface, lpCallback, lpvRef, dwFlags);
+ if (lpCallback)
+ lpCallback(NULL, lpvRef);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_Escape(
LPDIRECTINPUTDEVICE8A iface,
LPDIEFFESCAPE lpDIEEsc)
{
- FIXME("(this=%p,%p): stub!\n",
- iface, lpDIEEsc);
- return DI_OK;
+ FIXME("(this=%p,%p): stub!\n",
+ iface, lpDIEEsc);
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice2AImpl_Poll(
LPDIRECTINPUTDEVICE8A iface)
{
- /* Because wine devices do not need to be polled, just return DI_NOEFFECT */
- return DI_NOEFFECT;
+ /* Because wine devices do not need to be polled, just return DI_NOEFFECT */
+ return DI_NOEFFECT;
}
HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData(
@@ -664,10 +766,10 @@
LPDWORD pdwInOut,
DWORD dwFlags)
{
- FIXME("(this=%p,0x%08lx,%p,%p,0x%08lx): stub!\n",
- iface, cbObjectData, rgdod, pdwInOut, dwFlags);
-
- return DI_OK;
+ FIXME("(this=%p,0x%08lx,%p,%p,0x%08lx): stub!\n",
+ iface, cbObjectData, rgdod, pdwInOut, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8A iface,
@@ -676,9 +778,9 @@
LPVOID pvRef,
DWORD dwFlags)
{
- FIXME("(%p)->(%s,%p,%p,%08lx): stub !\n", iface, lpszFileName, pec, pvRef, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%s,%p,%p,%08lx): stub !\n", iface, lpszFileName, pec, pvRef, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice7WImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8W iface,
@@ -687,9 +789,9 @@
LPVOID pvRef,
DWORD dwFlags)
{
- FIXME("(%p)->(%s,%p,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), pec, pvRef, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%s,%p,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), pec, pvRef, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8A iface,
@@ -698,9 +800,9 @@
LPDIFILEEFFECT rgDiFileEft,
DWORD dwFlags)
{
- FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, lpszFileName, dwEntries, rgDiFileEft, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, lpszFileName, dwEntries, rgDiFileEft, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice7WImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8W iface,
@@ -709,9 +811,9 @@
LPDIFILEEFFECT rgDiFileEft,
DWORD dwFlags)
{
- FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), dwEntries, rgDiFileEft, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), dwEntries, rgDiFileEft, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
@@ -719,9 +821,9 @@
LPCSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
@@ -729,9 +831,9 @@
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8AImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
@@ -739,9 +841,9 @@
LPCSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
@@ -749,23 +851,23 @@
LPCWSTR lpszUserName,
DWORD dwFlags)
{
- FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-
- return DI_OK;
+ FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface,
LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader)
{
- FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader);
-
- return DI_OK;
+ FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader);
+
+ return DI_OK;
}
HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface,
LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader)
{
- FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader);
-
- return DI_OK;
+ FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader);
+
+ return DI_OK;
}
Index: dlls/dinput/device_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dinput/device_private.h,v
retrieving revision 1.6
diff -u -r1.6 device_private.h
--- dlls/dinput/device_private.h 5 Sep 2003 23:08:40 -0000 1.6
+++ dlls/dinput/device_private.h 31 May 2004 15:59:22 -0000
@@ -49,7 +49,7 @@
DataTransform *dt;
} DataFormat;
extern void fill_DataFormat(void *out, void *in, DataFormat *df) ;
-extern DataFormat *create_DataFormat(DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
+extern DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
/* Used to fill events in the queue */
#define GEN_EVENT(offset,data,xtime,seq) \
@@ -91,6 +91,8 @@
extern void _dump_DIPROPHEADER(DIPROPHEADER *diph) ;
extern void _dump_OBJECTINSTANCEA(DIDEVICEOBJECTINSTANCEA *ddoi) ;
extern void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) ;
+extern void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) ;
+extern const char *_dump_dinput_GUID(const GUID *guid) ;
/* And the stubs */
extern HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(
Index: dlls/dinput/joystick_linux.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/joystick_linux.c,v
retrieving revision 1.3
diff -u -r1.3 joystick_linux.c
--- dlls/dinput/joystick_linux.c 27 May 2004 01:54:43 -0000 1.3
+++ dlls/dinput/joystick_linux.c 31 May 2004 15:59:23 -0000
@@ -258,22 +258,10 @@
)
{
ICOM_THIS(JoystickImpl,iface);
- int i;
TRACE("(this=%p,%p)\n",This,df);
- TRACE("(df.dwSize=%ld)\n",df->dwSize);
- TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
- TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
- TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
- TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
-
- for (i=0;i<df->dwNumObjs;i++) {
- TRACE("df.rgodf[%d].guid %s (%p)\n",i,debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
- TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
- TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
- TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
- }
+ _dump_DIDATAFORMAT(df);
/* Store the new data format */
This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);
Index: dlls/dinput/joystick_linuxinput.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/joystick_linuxinput.c,v
retrieving revision 1.4
diff -u -r1.4 joystick_linuxinput.c
--- dlls/dinput/joystick_linuxinput.c 27 May 2004 01:54:43 -0000 1.4
+++ dlls/dinput/joystick_linuxinput.c 31 May 2004 15:59:23 -0000
@@ -349,23 +349,11 @@
)
{
ICOM_THIS(JoystickImpl,iface);
- int i;
TRACE("(this=%p,%p)\n",This,df);
- TRACE("(df.dwSize=%ld)\n",df->dwSize);
- TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
- TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
- TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
- TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
-
- for (i=0;i<df->dwNumObjs;i++) {
- TRACE("df.rgodf[%d].guid %s (%p)\n",i,debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
- TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
- TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
- TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
- }
-
+ _dump_DIDATAFORMAT(df);
+
/* Store the new data format */
This->df = HeapAlloc(GetProcessHeap(),0,df->dwSize);
memcpy(This->df, df, df->dwSize);
Index: dlls/dinput/mouse.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/mouse.c,v
retrieving revision 1.1
diff -u -r1.1 mouse.c
--- dlls/dinput/mouse.c 12 Feb 2004 23:28:00 -0000 1.1
+++ dlls/dinput/mouse.c 31 May 2004 15:59:23 -0000
@@ -42,12 +42,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
/* Wine mouse driver object instances */
-#define WINE_MOUSE_X_AXIS_INSTANCE 0x0001
-#define WINE_MOUSE_Y_AXIS_INSTANCE 0x0002
-#define WINE_MOUSE_Z_AXIS_INSTANCE 0x0004
-#define WINE_MOUSE_L_BUTTON_INSTANCE 0x0008
-#define WINE_MOUSE_R_BUTTON_INSTANCE 0x0010
-#define WINE_MOUSE_M_BUTTON_INSTANCE 0x0020
+#define WINE_MOUSE_X_AXIS_INSTANCE 0
+#define WINE_MOUSE_Y_AXIS_INSTANCE 1
+#define WINE_MOUSE_Z_AXIS_INSTANCE 2
+#define WINE_MOUSE_L_BUTTON_INSTANCE 0
+#define WINE_MOUSE_R_BUTTON_INSTANCE 1
+#define WINE_MOUSE_M_BUTTON_INSTANCE 2
+#define WINE_MOUSE_D_BUTTON_INSTANCE 3
/* ------------------------------- */
/* Wine mouse internal data format */
@@ -62,36 +63,36 @@
#define WINE_MOUSE_M_POSITION 5
typedef struct {
- LONG lX;
- LONG lY;
- LONG lZ;
- BYTE rgbButtons[4];
+ LONG lX;
+ LONG lY;
+ LONG lZ;
+ BYTE rgbButtons[4];
} Wine_InternalMouseData;
#define WINE_INTERNALMOUSE_NUM_OBJS 6
-static DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_OBJS] = {
- { &GUID_XAxis, FIELD_OFFSET(Wine_InternalMouseData, lX),
- DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
- { &GUID_YAxis, FIELD_OFFSET(Wine_InternalMouseData, lY),
- DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
- { &GUID_ZAxis, FIELD_OFFSET(Wine_InternalMouseData, lZ),
- DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
- { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 0,
- DIDFT_MAKEINSTANCE(WINE_MOUSE_L_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 },
- { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 1,
- DIDFT_MAKEINSTANCE(WINE_MOUSE_R_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 },
- { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 2,
- DIDFT_MAKEINSTANCE(WINE_MOUSE_M_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 }
+static const DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_OBJS] = {
+ { &GUID_XAxis, FIELD_OFFSET(Wine_InternalMouseData, lX),
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
+ { &GUID_YAxis, FIELD_OFFSET(Wine_InternalMouseData, lY),
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
+ { &GUID_ZAxis, FIELD_OFFSET(Wine_InternalMouseData, lZ),
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 },
+ { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 0,
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_L_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 },
+ { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 1,
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_R_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 },
+ { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 2,
+ DIDFT_MAKEINSTANCE(WINE_MOUSE_M_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 }
};
-static DIDATAFORMAT Wine_InternalMouseFormat = {
- 0, /* dwSize - unused */
- 0, /* dwObjsize - unused */
- 0, /* dwFlags - unused */
- sizeof(Wine_InternalMouseData),
- WINE_INTERNALMOUSE_NUM_OBJS, /* dwNumObjs */
- Wine_InternalMouseObjectFormat
+static const DIDATAFORMAT Wine_InternalMouseFormat = {
+ 0, /* dwSize - unused */
+ 0, /* dwObjsize - unused */
+ 0, /* dwFlags - unused */
+ sizeof(Wine_InternalMouseData),
+ WINE_INTERNALMOUSE_NUM_OBJS, /* dwNumObjs */
+ (LPDIOBJECTDATAFORMAT) Wine_InternalMouseObjectFormat
};
static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt;
@@ -100,55 +101,57 @@
typedef struct SysMouseImpl SysMouseImpl;
typedef enum {
- WARP_NEEDED, /* Warping is needed */
- WARP_STARTED, /* Warping has been done, waiting for the warp event */
- WARP_DONE /* Warping has been done */
+ WARP_DONE, /* Warping has been done */
+ WARP_NEEDED, /* Warping is needed */
+ WARP_STARTED /* Warping has been done, waiting for the warp event */
} WARP_STATUS;
struct SysMouseImpl
{
- LPVOID lpVtbl;
- DWORD ref;
- GUID guid;
-
- IDirectInputImpl *dinput;
-
- /* The current data format and the conversion between internal
- and external data formats */
- LPDIDATAFORMAT df;
- DataFormat *wine_df;
- int offset_array[WINE_INTERNALMOUSE_NUM_OBJS];
-
- /* SysMouseAImpl */
- BYTE absolute;
- /* Previous position for relative moves */
- LONG prevX, prevY;
- HHOOK hook;
- HWND win;
- DWORD dwCoopLevel;
- POINT mapped_center;
- DWORD win_centerX, win_centerY;
- LPDIDEVICEOBJECTDATA data_queue;
- int queue_head, queue_tail, queue_len;
- /* warping: whether we need to move mouse back to middle once we
- * reach window borders (for e.g. shooters, "surface movement" games) */
- WARP_STATUS need_warp;
- int acquired;
- HANDLE hEvent;
- CRITICAL_SECTION crit;
-
- /* This is for mouse reporting. */
- Wine_InternalMouseData m_state;
+ LPVOID lpVtbl;
+ DWORD ref;
+ GUID guid;
+
+ IDirectInputImpl *dinput;
+
+ /* The current data format and the conversion between internal
+ and external data formats */
+ DIDATAFORMAT *df;
+ DataFormat *wine_df;
+ int offset_array[WINE_INTERNALMOUSE_NUM_OBJS];
+
+ /* SysMouseAImpl */
+ BYTE absolute;
+ /* Previous position for relative moves */
+ LONG prevX, prevY;
+ /* These are used in case of relative -> absolute transitions */
+ POINT org_coords;
+ HHOOK hook;
+ HWND win;
+ DWORD dwCoopLevel;
+ POINT mapped_center;
+ DWORD win_centerX, win_centerY;
+ LPDIDEVICEOBJECTDATA data_queue;
+ int queue_head, queue_tail, queue_len;
+ /* warping: whether we need to move mouse back to middle once we
+ * reach window borders (for e.g. shooters, "surface movement" games) */
+ WARP_STATUS need_warp;
+ int acquired;
+ HANDLE hEvent;
+ CRITICAL_SECTION crit;
+
+ /* This is for mouse reporting. */
+ 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,
- 0x11d2,
- {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
+ 0x9e573ed8,
+ 0x7734,
+ 0x11d2,
+ {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
};
static void fill_mouse_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, int version) {
@@ -201,43 +204,43 @@
static BOOL mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version)
{
- if ((dwDevType == 0) ||
- ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||
- ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {
- TRACE("Enumerating the mouse device\n");
-
- fill_mouse_dideviceinstanceA(lpddi, version);
-
- return TRUE;
- }
-
- return FALSE;
+ if ((dwDevType == 0) ||
+ ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||
+ ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {
+ TRACE("Enumerating the mouse device\n");
+
+ fill_mouse_dideviceinstanceA(lpddi, version);
+
+ return TRUE;
+ }
+
+ return FALSE;
}
static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version)
{
- if ((dwDevType == 0) ||
- ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||
- ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {
- TRACE("Enumerating the mouse device\n");
-
- fill_mouse_dideviceinstanceW(lpddi, version);
-
- return TRUE;
- }
-
- return FALSE;
+ if ((dwDevType == 0) ||
+ ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||
+ ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {
+ TRACE("Enumerating the mouse device\n");
+
+ fill_mouse_dideviceinstanceW(lpddi, version);
+
+ return TRUE;
+ }
+
+ return FALSE;
}
static SysMouseImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputImpl *dinput)
{
int offset_array[WINE_INTERNALMOUSE_NUM_OBJS] = {
- FIELD_OFFSET(Wine_InternalMouseData, lX),
- FIELD_OFFSET(Wine_InternalMouseData, lY),
- FIELD_OFFSET(Wine_InternalMouseData, lZ),
- FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 0,
- FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 1,
- FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 2
+ FIELD_OFFSET(Wine_InternalMouseData, lX),
+ FIELD_OFFSET(Wine_InternalMouseData, lY),
+ FIELD_OFFSET(Wine_InternalMouseData, lZ),
+ FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 0,
+ FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 1,
+ FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 2
};
SysMouseImpl* newDevice;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl));
@@ -247,7 +250,7 @@
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
/* Per default, Wine uses its internal data format */
- newDevice->df = &Wine_InternalMouseFormat;
+ newDevice->df = (DIDATAFORMAT *) &Wine_InternalMouseFormat;
memcpy(newDevice->offset_array, offset_array, WINE_INTERNALMOUSE_NUM_OBJS * sizeof(int));
newDevice->wine_df = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));
newDevice->wine_df->size = 0;
@@ -260,47 +263,47 @@
static HRESULT mousedev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
{
- if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
- (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
- if ((riid == NULL) ||
- IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
- *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput);
- TRACE("Creating a Mouse device (%p)\n", *pdev);
- return DI_OK;
- } else
- return DIERR_NOINTERFACE;
- }
-
- return DIERR_DEVICENOTREG;
+ if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
+ (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
+ if ((riid == NULL) ||
+ IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
+ *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput);
+ TRACE("Creating a Mouse device (%p)\n", *pdev);
+ return DI_OK;
+ } else
+ return DIERR_NOINTERFACE;
+ }
+
+ return DIERR_DEVICENOTREG;
}
static HRESULT mousedev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
- if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
- (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
- if ((riid == NULL) ||
- IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
- IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
- *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysMouseWvt, dinput);
- TRACE("Creating a Mouse device (%p)\n", *pdev);
- return DI_OK;
- } else
- return DIERR_NOINTERFACE;
- }
-
- return DIERR_DEVICENOTREG;
+ if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
+ (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
+ if ((riid == NULL) ||
+ IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
+ IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
+ *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysMouseWvt, dinput);
+ TRACE("Creating a Mouse device (%p)\n", *pdev);
+ return DI_OK;
+ } else
+ return DIERR_NOINTERFACE;
+ }
+
+ return DIERR_DEVICENOTREG;
}
static dinput_device mousedev = {
- 100,
- mousedev_enum_deviceA,
- mousedev_enum_deviceW,
- mousedev_create_deviceA,
- mousedev_create_deviceW
+ 100,
+ mousedev_enum_deviceA,
+ mousedev_enum_deviceW,
+ mousedev_create_deviceA,
+ mousedev_create_deviceW
};
DECL_GLOBAL_CONSTRUCTOR(mousedev_register) { dinput_register_device(&mousedev); }
@@ -314,31 +317,31 @@
*/
static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- This->ref--;
- if (This->ref)
- return This->ref;
-
- /* Free the data queue */
- if (This->data_queue != NULL)
- HeapFree(GetProcessHeap(),0,This->data_queue);
-
- if (This->hook) {
- UnhookWindowsHookEx( This->hook );
- if (This->dwCoopLevel & DISCL_EXCLUSIVE)
+ ICOM_THIS(SysMouseImpl,iface);
+
+ This->ref--;
+ if (This->ref)
+ return This->ref;
+
+ /* Free the data queue */
+ if (This->data_queue != NULL)
+ HeapFree(GetProcessHeap(),0,This->data_queue);
+
+ if (This->hook) {
+ UnhookWindowsHookEx( This->hook );
+ if (This->dwCoopLevel & DISCL_EXCLUSIVE)
ShowCursor(TRUE); /* show cursor */
- }
- DeleteCriticalSection(&(This->crit));
-
- /* Free the DataFormat */
- if (This->df != &(Wine_InternalMouseFormat)) {
- HeapFree(GetProcessHeap(), 0, This->df->rgodf);
- HeapFree(GetProcessHeap(), 0, This->df);
- }
-
- HeapFree(GetProcessHeap(),0,This);
- return DI_OK;
+ }
+ DeleteCriticalSection(&(This->crit));
+
+ /* Free the DataFormat */
+ if (This->df != &(Wine_InternalMouseFormat)) {
+ HeapFree(GetProcessHeap(), 0, This->df->rgodf);
+ HeapFree(GetProcessHeap(), 0, This->df);
+ }
+
+ HeapFree(GetProcessHeap(),0,This);
+ return DI_OK;
}
@@ -350,22 +353,22 @@
LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags
)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags);
-
- if (TRACE_ON(dinput)) {
- TRACE(" cooperative level : ");
- _dump_cooperativelevel_DI(dwflags);
- }
-
- /* Store the window which asks for the mouse */
- if (!hwnd)
- hwnd = GetDesktopWindow();
- This->win = hwnd;
- This->dwCoopLevel = dwflags;
-
- return DI_OK;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags);
+
+ if (TRACE_ON(dinput)) {
+ TRACE(" cooperative level : ");
+ _dump_cooperativelevel_DI(dwflags);
+ }
+
+ /* Store the window which asks for the mouse */
+ if (!hwnd)
+ hwnd = GetDesktopWindow();
+ This->win = hwnd;
+ This->dwCoopLevel = dwflags;
+
+ return DI_OK;
}
@@ -380,40 +383,27 @@
LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df
)
{
- ICOM_THIS(SysMouseImpl,iface);
- int i;
-
- TRACE("(this=%p,%p)\n",This,df);
-
- TRACE("(df.dwSize=%ld)\n",df->dwSize);
- TRACE("(df.dwObjsize=%ld)\n",df->dwObjSize);
- TRACE("(df.dwFlags=0x%08lx)\n",df->dwFlags);
- TRACE("(df.dwDataSize=%ld)\n",df->dwDataSize);
- TRACE("(df.dwNumObjs=%ld)\n",df->dwNumObjs);
-
- for (i=0;i<df->dwNumObjs;i++) {
-
- TRACE("df.rgodf[%d].guid %s (%p)\n",i, debugstr_guid(df->rgodf[i].pguid), df->rgodf[i].pguid);
- TRACE("df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);
- TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));
- TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);
- }
-
- /* 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);
- memcpy(This->df, df, df->dwSize);
- This->df->rgodf = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*df->dwObjSize);
- memcpy(This->df->rgodf,df->rgodf,df->dwNumObjs*df->dwObjSize);
-
- /* Prepare all the data-conversion filters */
- This->wine_df = create_DataFormat(&(Wine_InternalMouseFormat), df, This->offset_array);
-
- return DI_OK;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,%p)\n",This,df);
+
+ _dump_DIDATAFORMAT(df);
+
+ /* 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);
+ memcpy(This->df, df, df->dwSize);
+ This->df->rgodf = HeapAlloc(GetProcessHeap(),0,df->dwNumObjs*df->dwObjSize);
+ memcpy(This->df->rgodf,df->rgodf,df->dwNumObjs*df->dwObjSize);
+
+ /* Prepare all the data-conversion filters */
+ This->wine_df = create_DataFormat(&(Wine_InternalMouseFormat), df, This->offset_array);
+
+ return DI_OK;
}
/* low-level mouse hook */
@@ -438,137 +428,141 @@
*/
if (((GetCurrentTime() - last_event) < 10)
&& wparam == WM_MOUSEMOVE)
- goto end;
+ goto end;
else last_event = GetCurrentTime();
-
+
/* Mouse moved -> send event if asked */
if (This->hEvent)
SetEvent(This->hEvent);
-
+
if (wparam == WM_MOUSEMOVE) {
if (This->absolute) {
- if (hook->pt.x != This->prevX)
- GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x, hook->time, 0);
- if (hook->pt.y != This->prevY)
- GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y, hook->time, 0);
- } else {
- /* Now, warp handling */
- if ((This->need_warp == WARP_STARTED) &&
- (hook->pt.x == This->mapped_center.x) && (hook->pt.y == This->mapped_center.y)) {
- /* Warp has been done... */
- This->need_warp = WARP_DONE;
- goto end;
- }
-
- /* Relative mouse input with absolute mouse event : the real fun starts here... */
- if ((This->need_warp == WARP_NEEDED) ||
- (This->need_warp == WARP_STARTED)) {
if (hook->pt.x != This->prevX)
- GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->prevX, hook->time, (This->dinput->evsequence)++);
+ GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x, hook->time, 0);
if (hook->pt.y != This->prevY)
- GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->prevY, hook->time, (This->dinput->evsequence)++);
- } else {
- /* This is the first time the event handler has been called after a
- GetDeviceData or GetDeviceState. */
- if (hook->pt.x != This->mapped_center.x) {
- GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->mapped_center.x, hook->time, (This->dinput->evsequence)++);
- This->need_warp = WARP_NEEDED;
+ GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y, hook->time, 0);
+ } else {
+ /* Now, warp handling */
+ if ((This->need_warp == WARP_STARTED) &&
+ (hook->pt.x == This->mapped_center.x) && (hook->pt.y == This->mapped_center.y)) {
+ /* Warp has been done... */
+ This->need_warp = WARP_DONE;
+ goto end;
}
-
- if (hook->pt.y != This->mapped_center.y) {
- GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->mapped_center.y, hook->time, (This->dinput->evsequence)++);
- This->need_warp = WARP_NEEDED;
+
+ /* Relative mouse input with absolute mouse event : the real fun starts here... */
+ if ((This->need_warp == WARP_NEEDED) ||
+ (This->need_warp == WARP_STARTED)) {
+ if (hook->pt.x != This->prevX)
+ GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->prevX,
+ hook->time, (This->dinput->evsequence)++);
+ if (hook->pt.y != This->prevY)
+ GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->prevY,
+ hook->time, (This->dinput->evsequence)++);
+ } else {
+ /* This is the first time the event handler has been called after a
+ GetDeviceData or GetDeviceState. */
+ if (hook->pt.x != This->mapped_center.x) {
+ GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->mapped_center.x,
+ hook->time, (This->dinput->evsequence)++);
+ This->need_warp = WARP_NEEDED;
+ }
+
+ if (hook->pt.y != This->mapped_center.y) {
+ GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->mapped_center.y,
+ hook->time, (This->dinput->evsequence)++);
+ This->need_warp = WARP_NEEDED;
+ }
}
- }
}
-
+
This->prevX = hook->pt.x;
This->prevY = hook->pt.y;
-
+
if (This->absolute) {
- This->m_state.lX = hook->pt.x;
- This->m_state.lY = hook->pt.y;
+ This->m_state.lX = hook->pt.x;
+ This->m_state.lY = hook->pt.y;
} else {
- This->m_state.lX = hook->pt.x - This->mapped_center.x;
- This->m_state.lY = hook->pt.y - This->mapped_center.y;
+ This->m_state.lX = hook->pt.x - This->mapped_center.x;
+ This->m_state.lY = hook->pt.y - This->mapped_center.y;
}
}
-
+
TRACE(" msg %x pt %ld %ld (W=%d)\n",
wparam, hook->pt.x, hook->pt.y, (!This->absolute) && This->need_warp );
+
+ switch(wparam) {
+ case WM_LBUTTONDOWN:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0xFF,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[0] = 0xFF;
+ break;
+ case WM_LBUTTONUP:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0x00,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[0] = 0x00;
+ break;
+ case WM_RBUTTONDOWN:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0xFF,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[1] = 0xFF;
+ break;
+ case WM_RBUTTONUP:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0x00,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[1] = 0x00;
+ break;
+ case WM_MBUTTONDOWN:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0xFF,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[2] = 0xFF;
+ break;
+ case WM_MBUTTONUP:
+ GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0x00,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.rgbButtons[2] = 0x00;
+ break;
+ case WM_MOUSEWHEEL:
+ wdata = (short)HIWORD(hook->mouseData);
+ GEN_EVENT(This->offset_array[WINE_MOUSE_Z_POSITION], wdata,
+ hook->time, This->dinput->evsequence++);
+ This->m_state.lZ += wdata;
+ break;
+ }
+
+ TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n",
+ This->m_state.lX, This->m_state.lY,
+ This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
+
+ end:
+ LeaveCriticalSection(&(This->crit));
+
+ if (dwCoop & DISCL_NONEXCLUSIVE) {
+ /* Pass the events down to previous handlers (e.g. win32 input) */
+ ret = CallNextHookEx( This->hook, code, wparam, lparam );
+ } else {
+ /* Ignore message */
+ ret = 1;
+ }
+ return ret;
+}
+
- switch(wparam)
- {
- case WM_LBUTTONDOWN:
- GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0xFF,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[0] = 0xFF;
- break;
- case WM_LBUTTONUP:
- GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0x00,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[0] = 0x00;
- break;
- case WM_RBUTTONDOWN:
- GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0xFF,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[1] = 0xFF;
- break;
- case WM_RBUTTONUP:
- GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0x00,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[1] = 0x00;
- break;
- case WM_MBUTTONDOWN:
- GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0xFF,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[2] = 0xFF;
- break;
- case WM_MBUTTONUP:
- GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0x00,
- hook->time, This->dinput->evsequence++);
- This->m_state.rgbButtons[2] = 0x00;
- break;
- case WM_MOUSEWHEEL:
- wdata = (short)HIWORD(hook->mouseData);
- GEN_EVENT(This->offset_array[WINE_MOUSE_Z_POSITION], wdata,
- hook->time, This->dinput->evsequence++);
- This->m_state.lZ += wdata;
- break;
- }
-
- TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n",
- This->m_state.lX, This->m_state.lY,
- This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
-
-end:
- LeaveCriticalSection(&(This->crit));
-
- if (dwCoop & DISCL_NONEXCLUSIVE)
- { /* pass the events down to previous handlers (e.g. win32 input) */
- ret = CallNextHookEx( This->hook, code, wparam, lparam );
- }
- else ret = 1; /* ignore message */
- return ret;
-}
-
-
-static void dinput_window_check(SysMouseImpl* This)
-{
- RECT rect;
- DWORD centerX, centerY;
-
- /* make sure the window hasn't moved */
- GetWindowRect(This->win, &rect);
- centerX = (rect.right - rect.left) / 2;
- centerY = (rect.bottom - rect.top ) / 2;
- if (This->win_centerX != centerX || This->win_centerY != centerY) {
- This->win_centerX = centerX;
- This->win_centerY = centerY;
- }
- This->mapped_center.x = This->win_centerX;
- This->mapped_center.y = This->win_centerY;
- MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);
+static void dinput_window_check(SysMouseImpl* This) {
+ RECT rect;
+ DWORD centerX, centerY;
+
+ /* make sure the window hasn't moved */
+ GetWindowRect(This->win, &rect);
+ centerX = (rect.right - rect.left) / 2;
+ centerY = (rect.bottom - rect.top ) / 2;
+ if (This->win_centerX != centerX || This->win_centerY != centerY) {
+ This->win_centerX = centerX;
+ This->win_centerY = centerY;
+ }
+ This->mapped_center.x = This->win_centerX;
+ This->mapped_center.y = This->win_centerY;
+ MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);
}
@@ -577,61 +571,62 @@
*/
static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
{
- ICOM_THIS(SysMouseImpl,iface);
- RECT rect;
-
- TRACE("(this=%p)\n",This);
-
- if (This->acquired == 0) {
- POINT point;
-
- /* Store (in a global variable) the current lock */
- current_lock = (IDirectInputDevice8A*)This;
-
- /* Init the mouse state */
- if (This->absolute) {
- GetCursorPos( &point );
- This->m_state.lX = point.x;
- This->m_state.lY = point.y;
- This->prevX = point.x;
- This->prevY = point.y;
- } else {
- This->m_state.lX = 0;
- This->m_state.lY = 0;
- }
- This->m_state.lZ = 0;
- This->m_state.rgbButtons[0] = (GetKeyState(VK_LBUTTON) ? 0xFF : 0x00);
- This->m_state.rgbButtons[1] = (GetKeyState(VK_MBUTTON) ? 0xFF : 0x00);
- This->m_state.rgbButtons[2] = (GetKeyState(VK_RBUTTON) ? 0xFF : 0x00);
-
- /* Install our mouse hook */
- if (This->dwCoopLevel & DISCL_EXCLUSIVE)
- ShowCursor(FALSE); /* hide cursor */
- This->hook = SetWindowsHookExA( WH_MOUSE_LL, dinput_mouse_hook, DINPUT_instance, 0 );
-
- /* Get the window dimension and find the center */
- GetWindowRect(This->win, &rect);
- This->win_centerX = (rect.right - rect.left) / 2;
- This->win_centerY = (rect.bottom - rect.top ) / 2;
-
- /* Warp the mouse to the center of the window */
- if (This->absolute == 0) {
- This->mapped_center.x = This->win_centerX;
- This->mapped_center.y = This->win_centerY;
- MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);
- TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
- SetCursorPos( This->mapped_center.x, This->mapped_center.y );
+ ICOM_THIS(SysMouseImpl,iface);
+ RECT rect;
+
+ TRACE("(this=%p)\n",This);
+
+ if (This->acquired == 0) {
+ POINT point;
+
+ /* Store (in a global variable) the current lock */
+ current_lock = (IDirectInputDevice8A*)This;
+
+ /* Init the mouse state */
+ GetCursorPos( &point );
+ if (This->absolute) {
+ This->m_state.lX = point.x;
+ This->m_state.lY = point.y;
+ This->prevX = point.x;
+ This->prevY = point.y;
+ } else {
+ This->m_state.lX = 0;
+ This->m_state.lY = 0;
+ This->org_coords = point;
+ }
+ This->m_state.lZ = 0;
+ This->m_state.rgbButtons[0] = ((GetKeyState(VK_LBUTTON) & 0x80) ? 0xFF : 0x00);
+ This->m_state.rgbButtons[1] = ((GetKeyState(VK_RBUTTON) & 0x80) ? 0xFF : 0x00);
+ This->m_state.rgbButtons[2] = ((GetKeyState(VK_MBUTTON) & 0x80) ? 0xFF : 0x00);
+
+ /* Install our mouse hook */
+ if (This->dwCoopLevel & DISCL_EXCLUSIVE)
+ ShowCursor(FALSE); /* hide cursor */
+ This->hook = SetWindowsHookExA( WH_MOUSE_LL, dinput_mouse_hook, DINPUT_instance, 0 );
+
+ /* Get the window dimension and find the center */
+ GetWindowRect(This->win, &rect);
+ This->win_centerX = (rect.right - rect.left) / 2;
+ This->win_centerY = (rect.bottom - rect.top ) / 2;
+
+ /* Warp the mouse to the center of the window */
+ if (This->absolute == 0) {
+ This->mapped_center.x = This->win_centerX;
+ This->mapped_center.y = This->win_centerY;
+ MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);
+ TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
+ SetCursorPos( This->mapped_center.x, This->mapped_center.y );
#ifdef MOUSE_HACK
- This->need_warp = WARP_DONE;
+ This->need_warp = WARP_DONE;
#else
- This->need_warp = WARP_STARTED;
+ This->need_warp = WARP_STARTED;
#endif
+ }
+
+ This->acquired = 1;
+ return DI_OK;
}
-
- This->acquired = 1;
- return DI_OK;
- }
- return S_FALSE;
+ return S_FALSE;
}
/******************************************************************************
@@ -640,27 +635,33 @@
static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
{
ICOM_THIS(SysMouseImpl,iface);
-
+
TRACE("(this=%p)\n",This);
+
+ if (This->acquired) {
+ /* Reinstall previous mouse event handler */
+ if (This->hook) {
+ UnhookWindowsHookEx( This->hook );
+ This->hook = 0;
- if (This->acquired)
- {
- /* Reinstall previous mouse event handler */
- if (This->hook) {
- UnhookWindowsHookEx( This->hook );
- This->hook = 0;
- if (This->dwCoopLevel & DISCL_EXCLUSIVE)
- ShowCursor(TRUE); /* show cursor */
+ if (This->dwCoopLevel & DISCL_EXCLUSIVE)
+ ShowCursor(TRUE); /* show cursor */
}
-
+
/* No more locks */
current_lock = NULL;
-
+
/* Unacquire device */
This->acquired = 0;
- }
- else
+
+ /* And put the mouse cursor back where it was at acquire time */
+ if (This->absolute == 0) {
+ TRACE(" warping mouse back to (%ld , %ld)\n", This->org_coords.x, This->org_coords.y);
+ SetCursorPos(This->org_coords.x, This->org_coords.y);
+ }
+ } else {
return DI_NOEFFECT;
+ }
return DI_OK;
}
@@ -674,118 +675,119 @@
static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr
) {
- ICOM_THIS(SysMouseImpl,iface);
-
- EnterCriticalSection(&(This->crit));
- TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr);
-
- /* Copy the current mouse state */
- fill_DataFormat(ptr, &(This->m_state), This->wine_df);
-
- /* Initialize the buffer when in relative mode */
- if (This->absolute == 0) {
- This->m_state.lX = 0;
- This->m_state.lY = 0;
- This->m_state.lZ = 0;
- }
-
- /* Check if we need to do a mouse warping */
- if (This->need_warp == WARP_NEEDED) {
- dinput_window_check(This);
- TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
- SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-
+ ICOM_THIS(SysMouseImpl,iface);
+
+ EnterCriticalSection(&(This->crit));
+ TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr);
+
+ /* Copy the current mouse state */
+ fill_DataFormat(ptr, &(This->m_state), This->wine_df);
+
+ /* Initialize the buffer when in relative mode */
+ if (This->absolute == 0) {
+ This->m_state.lX = 0;
+ This->m_state.lY = 0;
+ This->m_state.lZ = 0;
+ }
+
+ /* Check if we need to do a mouse warping */
+ if (This->need_warp == WARP_NEEDED) {
+ dinput_window_check(This);
+ TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
+ SetCursorPos( This->mapped_center.x, This->mapped_center.y );
+
#ifdef MOUSE_HACK
- This->need_warp = WARP_DONE;
+ This->need_warp = WARP_DONE;
#else
- This->need_warp = WARP_STARTED;
+ This->need_warp = WARP_STARTED;
#endif
- }
-
- LeaveCriticalSection(&(This->crit));
-
- TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n",
- This->m_state.lX, This->m_state.lY,
- This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
-
- return DI_OK;
+ }
+
+ LeaveCriticalSection(&(This->crit));
+
+ TRACE("(X: %ld - Y: %ld - Z: %ld L: %02x M: %02x R: %02x)\n",
+ This->m_state.lX, This->m_state.lY, This->m_state.lZ,
+ This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);
+
+ return DI_OK;
}
/******************************************************************************
* GetDeviceState : gets buffered input data.
*/
static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
- DWORD dodsize,
- LPDIDEVICEOBJECTDATA dod,
- LPDWORD entries,
- DWORD flags
+ DWORD dodsize,
+ LPDIDEVICEOBJECTDATA dod,
+ LPDWORD entries,
+ DWORD flags
) {
- ICOM_THIS(SysMouseImpl,iface);
- DWORD len, nqtail;
-
- TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags);
-
- if (This->acquired == 0) {
- WARN(" application tries to get data from an unacquired device !\n");
- return DIERR_NOTACQUIRED;
- }
-
- EnterCriticalSection(&(This->crit));
-
- len = ((This->queue_head < This->queue_tail) ? This->queue_len : 0)
- + (This->queue_head - This->queue_tail);
- if (len > *entries) len = *entries;
-
- if (dod == NULL) {
- if (len)
- TRACE("Application discarding %ld event(s).\n", len);
-
- *entries = len;
- nqtail = This->queue_tail + len;
- while (nqtail >= This->queue_len) nqtail -= This->queue_len;
- } else {
- if (dodsize < sizeof(DIDEVICEOBJECTDATA)) {
- ERR("Wrong structure size !\n");
- LeaveCriticalSection(&(This->crit));
- return DIERR_INVALIDPARAM;
- }
-
- if (len)
- TRACE("Application retrieving %ld event(s).\n", len);
-
- *entries = 0;
- nqtail = This->queue_tail;
- while (len) {
- DWORD span = ((This->queue_head < nqtail) ? This->queue_len : This->queue_head)
- - nqtail;
- if (span > len) span = len;
- /* Copy the buffered data into the application queue */
- memcpy(dod + *entries, This->data_queue + nqtail, span * dodsize);
- /* Advance position */
- nqtail += span;
- if (nqtail >= This->queue_len) nqtail -= This->queue_len;
- *entries += span;
- len -= span;
- }
- }
- if (!(flags & DIGDD_PEEK))
- This->queue_tail = nqtail;
-
- LeaveCriticalSection(&(This->crit));
-
- /* Check if we need to do a mouse warping */
- if (This->need_warp == WARP_NEEDED) {
- dinput_window_check(This);
- TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
- SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-
+ ICOM_THIS(SysMouseImpl,iface);
+ DWORD len, nqtail;
+
+ TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags);
+
+ if (This->acquired == 0) {
+ WARN(" application tries to get data from an unacquired device !\n");
+ return DIERR_NOTACQUIRED;
+ }
+
+ EnterCriticalSection(&(This->crit));
+
+ len = ((This->queue_head < This->queue_tail) ? This->queue_len : 0)
+ + (This->queue_head - This->queue_tail);
+ if (len > *entries) len = *entries;
+
+ if (dod == NULL) {
+ if (len)
+ TRACE("Application discarding %ld event(s).\n", len);
+
+ *entries = len;
+ nqtail = This->queue_tail + len;
+ while (nqtail >= This->queue_len) nqtail -= This->queue_len;
+ } else {
+ if (dodsize < sizeof(DIDEVICEOBJECTDATA)) {
+ ERR("Wrong structure size !\n");
+ LeaveCriticalSection(&(This->crit));
+ return DIERR_INVALIDPARAM;
+ }
+
+ if (len)
+ TRACE("Application retrieving %ld event(s).\n", len);
+
+ *entries = 0;
+ nqtail = This->queue_tail;
+ while (len) {
+ DWORD span = ((This->queue_head < nqtail) ? This->queue_len : This->queue_head) - nqtail;
+ if (span > len)
+ span = len;
+
+ /* Copy the buffered data into the application queue */
+ memcpy(dod + *entries, This->data_queue + nqtail, span * dodsize);
+ /* Advance position */
+ nqtail += span;
+ if (nqtail >= This->queue_len) nqtail -= This->queue_len;
+ *entries += span;
+ len -= span;
+ }
+ }
+ if (!(flags & DIGDD_PEEK))
+ This->queue_tail = nqtail;
+
+ LeaveCriticalSection(&(This->crit));
+
+ /* Check if we need to do a mouse warping */
+ if (This->need_warp == WARP_NEEDED) {
+ dinput_window_check(This);
+ TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
+ SetCursorPos( This->mapped_center.x, This->mapped_center.y );
+
#ifdef MOUSE_HACK
- This->need_warp = WARP_DONE;
+ This->need_warp = WARP_DONE;
#else
- This->need_warp = WARP_STARTED;
+ This->need_warp = WARP_STARTED;
#endif
- }
- return DI_OK;
+ }
+ return DI_OK;
}
/******************************************************************************
@@ -795,37 +797,37 @@
REFGUID rguid,
LPCDIPROPHEADER ph)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph);
-
- if (!HIWORD(rguid)) {
- switch ((DWORD)rguid) {
- case (DWORD) DIPROP_BUFFERSIZE: {
- LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;
-
- TRACE("buffersize = %ld\n",pd->dwData);
-
- This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0,
- pd->dwData * sizeof(DIDEVICEOBJECTDATA));
- This->queue_head = 0;
- This->queue_tail = 0;
- This->queue_len = pd->dwData;
- break;
- }
- case (DWORD) DIPROP_AXISMODE: {
- LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;
- This->absolute = !(pd->dwData);
- TRACE("Using %s coordinates mode now\n", This->absolute ? "absolute" : "relative");
- break;
- }
- default:
- FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid));
- break;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph);
+
+ if (!HIWORD(rguid)) {
+ switch ((DWORD)rguid) {
+ case (DWORD) DIPROP_BUFFERSIZE: {
+ LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;
+
+ TRACE("buffersize = %ld\n",pd->dwData);
+
+ This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0,
+ pd->dwData * sizeof(DIDEVICEOBJECTDATA));
+ This->queue_head = 0;
+ This->queue_tail = 0;
+ This->queue_len = pd->dwData;
+ break;
+ }
+ case (DWORD) DIPROP_AXISMODE: {
+ LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;
+ This->absolute = !(pd->dwData);
+ TRACE("Using %s coordinates mode now\n", This->absolute ? "absolute" : "relative");
+ break;
+ }
+ default:
+ FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid));
+ break;
+ }
}
- }
-
- return DI_OK;
+
+ return DI_OK;
}
/******************************************************************************
@@ -835,57 +837,56 @@
REFGUID rguid,
LPDIPROPHEADER pdiph)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- TRACE("(this=%p,%s,%p): stub!\n",
- iface, debugstr_guid(rguid), pdiph);
-
- if (TRACE_ON(dinput))
- _dump_DIPROPHEADER(pdiph);
-
- if (!HIWORD(rguid)) {
- switch ((DWORD)rguid) {
- case (DWORD) DIPROP_BUFFERSIZE: {
- LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph;
-
- TRACE(" return buffersize = %d\n",This->queue_len);
- pd->dwData = This->queue_len;
- break;
- }
-
- case (DWORD) DIPROP_GRANULARITY: {
- LPDIPROPDWORD pr = (LPDIPROPDWORD) pdiph;
-
- /* We'll just assume that the app asks about the Z axis */
- pr->dwData = WHEEL_DELTA;
-
- break;
- }
-
- case (DWORD) DIPROP_RANGE: {
- LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph;
-
- if ((pdiph->dwHow == DIPH_BYID) &&
- ((pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS)) ||
- (pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS)))) {
- /* Querying the range of either the X or the Y axis. As I do
- not know the range, do as if the range were
- unrestricted...*/
- pr->lMin = DIPROPRANGE_NOMIN;
- pr->lMax = DIPROPRANGE_NOMAX;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,%s,%p): stub!\n",
+ iface, debugstr_guid(rguid), pdiph);
+
+ if (TRACE_ON(dinput))
+ _dump_DIPROPHEADER(pdiph);
+
+ if (!HIWORD(rguid)) {
+ switch ((DWORD)rguid) {
+ case (DWORD) DIPROP_BUFFERSIZE: {
+ LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph;
+
+ TRACE(" return buffersize = %d\n",This->queue_len);
+ pd->dwData = This->queue_len;
+ break;
+ }
+
+ case (DWORD) DIPROP_GRANULARITY: {
+ LPDIPROPDWORD pr = (LPDIPROPDWORD) pdiph;
+
+ /* We'll just assume that the app asks about the Z axis */
+ pr->dwData = WHEEL_DELTA;
+
+ break;
+ }
+
+ case (DWORD) DIPROP_RANGE: {
+ LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph;
+
+ if ((pdiph->dwHow == DIPH_BYID) &&
+ ((pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS)) ||
+ (pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS)))) {
+ /* Querying the range of either the X or the Y axis. As I do
+ not know the range, do as if the range were
+ unrestricted...*/
+ pr->lMin = DIPROPRANGE_NOMIN;
+ pr->lMax = DIPROPRANGE_NOMAX;
+ }
+
+ break;
+ }
+
+ default:
+ FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid));
+ break;
+ }
}
-
- break;
- }
-
- default:
- FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid));
- break;
- }
- }
-
-
- return DI_OK;
+
+ return DI_OK;
}
@@ -895,13 +896,13 @@
*/
static HRESULT WINAPI SysMouseAImpl_SetEventNotification(LPDIRECTINPUTDEVICE8A iface,
HANDLE hnd) {
- ICOM_THIS(SysMouseImpl,iface);
-
- TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd);
-
- This->hEvent = hnd;
-
- return DI_OK;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd);
+
+ This->hEvent = hnd;
+
+ return DI_OK;
}
/******************************************************************************
@@ -911,30 +912,30 @@
LPDIRECTINPUTDEVICE8A iface,
LPDIDEVCAPS lpDIDevCaps)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- TRACE("(this=%p,%p)\n",This,lpDIDevCaps);
-
- if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
- lpDIDevCaps->dwFlags = DIDC_ATTACHED;
- if (This->dinput->version >= 8)
- lpDIDevCaps->dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
- else
- lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);
- lpDIDevCaps->dwAxes = 3;
- lpDIDevCaps->dwButtons = 3;
- lpDIDevCaps->dwPOVs = 0;
- lpDIDevCaps->dwFFSamplePeriod = 0;
- lpDIDevCaps->dwFFMinTimeResolution = 0;
- lpDIDevCaps->dwFirmwareRevision = 100;
- lpDIDevCaps->dwHardwareRevision = 100;
- lpDIDevCaps->dwFFDriverVersion = 0;
- } else {
- /* DirectX 3.0 */
- FIXME("DirectX 3.0 not supported....\n");
- }
-
- return DI_OK;
+ ICOM_THIS(SysMouseImpl,iface);
+
+ TRACE("(this=%p,%p)\n",This,lpDIDevCaps);
+
+ if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {
+ lpDIDevCaps->dwFlags = DIDC_ATTACHED;
+ if (This->dinput->version >= 8)
+ lpDIDevCaps->dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
+ else
+ lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);
+ lpDIDevCaps->dwAxes = 3;
+ lpDIDevCaps->dwButtons = 3;
+ lpDIDevCaps->dwPOVs = 0;
+ lpDIDevCaps->dwFFSamplePeriod = 0;
+ lpDIDevCaps->dwFFMinTimeResolution = 0;
+ lpDIDevCaps->dwFirmwareRevision = 100;
+ lpDIDevCaps->dwHardwareRevision = 100;
+ lpDIDevCaps->dwFFDriverVersion = 0;
+ } else {
+ /* DirectX 3.0 */
+ FIXME("DirectX 3.0 not supported....\n");
+ }
+
+ return DI_OK;
}
@@ -947,87 +948,87 @@
LPVOID lpvRef,
DWORD dwFlags)
{
- ICOM_THIS(SysMouseImpl,iface);
- DIDEVICEOBJECTINSTANCEA ddoi;
-
- TRACE("(this=%p,%p,%p,%08lx)\n", This, lpCallback, lpvRef, dwFlags);
- if (TRACE_ON(dinput)) {
- TRACE(" - flags = ");
- _dump_EnumObjects_flags(dwFlags);
- TRACE("\n");
- }
-
- /* Only the fields till dwFFMaxForce are relevant */
- memset(&ddoi, 0, sizeof(ddoi));
- ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
-
- /* In a mouse, we have : two relative axis and three buttons */
- if ((dwFlags == DIDFT_ALL) ||
- (dwFlags & DIDFT_AXIS)) {
- /* X axis */
- ddoi.guidType = GUID_XAxis;
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_X_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS;
- strcpy(ddoi.tszName, "X-Axis");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
-
- /* Y axis */
- ddoi.guidType = GUID_YAxis;
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_Y_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS;
- strcpy(ddoi.tszName, "Y-Axis");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
-
- /* Z axis */
- ddoi.guidType = GUID_ZAxis;
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_Z_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS;
- strcpy(ddoi.tszName, "Z-Axis");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
- }
-
- if ((dwFlags == DIDFT_ALL) ||
- (dwFlags & DIDFT_BUTTON)) {
- ddoi.guidType = GUID_Button;
-
- /* Left button */
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_L_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_L_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
- strcpy(ddoi.tszName, "Left-Button");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
-
- /* Right button */
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_R_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_R_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
- strcpy(ddoi.tszName, "Right-Button");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
-
- /* Middle button */
- ddoi.dwOfs = This->offset_array[WINE_MOUSE_M_POSITION];
- ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_M_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
- strcpy(ddoi.tszName, "Middle-Button");
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
- }
+ ICOM_THIS(SysMouseImpl,iface);
+ DIDEVICEOBJECTINSTANCEA ddoi;
+
+ TRACE("(this=%p,%p,%p,%08lx)\n", This, lpCallback, lpvRef, dwFlags);
+ if (TRACE_ON(dinput)) {
+ TRACE(" - flags = ");
+ _dump_EnumObjects_flags(dwFlags);
+ TRACE("\n");
+ }
+
+ /* Only the fields till dwFFMaxForce are relevant */
+ memset(&ddoi, 0, sizeof(ddoi));
+ ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
+
+ /* In a mouse, we have : two relative axis and three buttons */
+ if ((dwFlags == DIDFT_ALL) ||
+ (dwFlags & DIDFT_AXIS)) {
+ /* X axis */
+ ddoi.guidType = GUID_XAxis;
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_X_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS;
+ strcpy(ddoi.tszName, "X-Axis");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+
+ /* Y axis */
+ ddoi.guidType = GUID_YAxis;
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_Y_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS;
+ strcpy(ddoi.tszName, "Y-Axis");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+
+ /* Z axis */
+ ddoi.guidType = GUID_ZAxis;
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_Z_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS;
+ strcpy(ddoi.tszName, "Z-Axis");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+ }
- return DI_OK;
+ if ((dwFlags == DIDFT_ALL) ||
+ (dwFlags & DIDFT_BUTTON)) {
+ ddoi.guidType = GUID_Button;
+
+ /* Left button */
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_L_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_L_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
+ strcpy(ddoi.tszName, "Left-Button");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+
+ /* Right button */
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_R_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_R_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
+ strcpy(ddoi.tszName, "Right-Button");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+
+ /* Middle button */
+ ddoi.dwOfs = This->offset_array[WINE_MOUSE_M_POSITION];
+ ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_M_BUTTON_INSTANCE) | DIDFT_PSHBUTTON;
+ strcpy(ddoi.tszName, "Middle-Button");
+ _dump_OBJECTINSTANCEA(&ddoi);
+ if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
+ }
+
+ return DI_OK;
}
static HRESULT WINAPI SysMouseWImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface, LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID lpvRef,DWORD dwFlags)
{
- ICOM_THIS(SysMouseImpl,iface);
-
- device_enumobjects_AtoWcb_data data;
-
- data.lpCallBack = lpCallback;
- data.lpvRef = lpvRef;
-
- return SysMouseAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags);
+ ICOM_THIS(SysMouseImpl,iface);
+
+ device_enumobjects_AtoWcb_data data;
+
+ data.lpCallBack = lpCallback;
+ data.lpvRef = lpvRef;
+
+ return SysMouseAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags);
}
/******************************************************************************
@@ -1068,39 +1069,39 @@
static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt =
{
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- IDirectInputDevice2AImpl_QueryInterface,
- IDirectInputDevice2AImpl_AddRef,
- SysMouseAImpl_Release,
- SysMouseAImpl_GetCapabilities,
- SysMouseAImpl_EnumObjects,
- SysMouseAImpl_GetProperty,
- SysMouseAImpl_SetProperty,
- SysMouseAImpl_Acquire,
- SysMouseAImpl_Unacquire,
- SysMouseAImpl_GetDeviceState,
- SysMouseAImpl_GetDeviceData,
- SysMouseAImpl_SetDataFormat,
- SysMouseAImpl_SetEventNotification,
- SysMouseAImpl_SetCooperativeLevel,
- IDirectInputDevice2AImpl_GetObjectInfo,
- SysMouseAImpl_GetDeviceInfo,
- IDirectInputDevice2AImpl_RunControlPanel,
- IDirectInputDevice2AImpl_Initialize,
- IDirectInputDevice2AImpl_CreateEffect,
- IDirectInputDevice2AImpl_EnumEffects,
- IDirectInputDevice2AImpl_GetEffectInfo,
- IDirectInputDevice2AImpl_GetForceFeedbackState,
- IDirectInputDevice2AImpl_SendForceFeedbackCommand,
- IDirectInputDevice2AImpl_EnumCreatedEffectObjects,
- IDirectInputDevice2AImpl_Escape,
- IDirectInputDevice2AImpl_Poll,
- IDirectInputDevice2AImpl_SendDeviceData,
- IDirectInputDevice7AImpl_EnumEffectsInFile,
- IDirectInputDevice7AImpl_WriteEffectToFile,
- IDirectInputDevice8AImpl_BuildActionMap,
- IDirectInputDevice8AImpl_SetActionMap,
- IDirectInputDevice8AImpl_GetImageInfo
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IDirectInputDevice2AImpl_QueryInterface,
+ IDirectInputDevice2AImpl_AddRef,
+ SysMouseAImpl_Release,
+ SysMouseAImpl_GetCapabilities,
+ SysMouseAImpl_EnumObjects,
+ SysMouseAImpl_GetProperty,
+ SysMouseAImpl_SetProperty,
+ SysMouseAImpl_Acquire,
+ SysMouseAImpl_Unacquire,
+ SysMouseAImpl_GetDeviceState,
+ SysMouseAImpl_GetDeviceData,
+ SysMouseAImpl_SetDataFormat,
+ SysMouseAImpl_SetEventNotification,
+ SysMouseAImpl_SetCooperativeLevel,
+ IDirectInputDevice2AImpl_GetObjectInfo,
+ SysMouseAImpl_GetDeviceInfo,
+ IDirectInputDevice2AImpl_RunControlPanel,
+ IDirectInputDevice2AImpl_Initialize,
+ IDirectInputDevice2AImpl_CreateEffect,
+ IDirectInputDevice2AImpl_EnumEffects,
+ IDirectInputDevice2AImpl_GetEffectInfo,
+ IDirectInputDevice2AImpl_GetForceFeedbackState,
+ IDirectInputDevice2AImpl_SendForceFeedbackCommand,
+ IDirectInputDevice2AImpl_EnumCreatedEffectObjects,
+ IDirectInputDevice2AImpl_Escape,
+ IDirectInputDevice2AImpl_Poll,
+ IDirectInputDevice2AImpl_SendDeviceData,
+ IDirectInputDevice7AImpl_EnumEffectsInFile,
+ IDirectInputDevice7AImpl_WriteEffectToFile,
+ IDirectInputDevice8AImpl_BuildActionMap,
+ IDirectInputDevice8AImpl_SetActionMap,
+ IDirectInputDevice8AImpl_GetImageInfo
};
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
@@ -1111,38 +1112,38 @@
static ICOM_VTABLE(IDirectInputDevice8W) SysMouseWvt =
{
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- IDirectInputDevice2WImpl_QueryInterface,
- XCAST(AddRef)IDirectInputDevice2AImpl_AddRef,
- XCAST(Release)SysMouseAImpl_Release,
- XCAST(GetCapabilities)SysMouseAImpl_GetCapabilities,
- SysMouseWImpl_EnumObjects,
- XCAST(GetProperty)SysMouseAImpl_GetProperty,
- XCAST(SetProperty)SysMouseAImpl_SetProperty,
- XCAST(Acquire)SysMouseAImpl_Acquire,
- XCAST(Unacquire)SysMouseAImpl_Unacquire,
- XCAST(GetDeviceState)SysMouseAImpl_GetDeviceState,
- XCAST(GetDeviceData)SysMouseAImpl_GetDeviceData,
- XCAST(SetDataFormat)SysMouseAImpl_SetDataFormat,
- XCAST(SetEventNotification)SysMouseAImpl_SetEventNotification,
- XCAST(SetCooperativeLevel)SysMouseAImpl_SetCooperativeLevel,
- IDirectInputDevice2WImpl_GetObjectInfo,
- SysMouseWImpl_GetDeviceInfo,
- XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel,
- XCAST(Initialize)IDirectInputDevice2AImpl_Initialize,
- XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect,
- IDirectInputDevice2WImpl_EnumEffects,
- IDirectInputDevice2WImpl_GetEffectInfo,
- XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState,
- XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand,
- XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects,
- XCAST(Escape)IDirectInputDevice2AImpl_Escape,
- XCAST(Poll)IDirectInputDevice2AImpl_Poll,
- XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData,
- IDirectInputDevice7WImpl_EnumEffectsInFile,
- IDirectInputDevice7WImpl_WriteEffectToFile,
- IDirectInputDevice8WImpl_BuildActionMap,
- IDirectInputDevice8WImpl_SetActionMap,
- IDirectInputDevice8WImpl_GetImageInfo
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IDirectInputDevice2WImpl_QueryInterface,
+ XCAST(AddRef)IDirectInputDevice2AImpl_AddRef,
+ XCAST(Release)SysMouseAImpl_Release,
+ XCAST(GetCapabilities)SysMouseAImpl_GetCapabilities,
+ SysMouseWImpl_EnumObjects,
+ XCAST(GetProperty)SysMouseAImpl_GetProperty,
+ XCAST(SetProperty)SysMouseAImpl_SetProperty,
+ XCAST(Acquire)SysMouseAImpl_Acquire,
+ XCAST(Unacquire)SysMouseAImpl_Unacquire,
+ XCAST(GetDeviceState)SysMouseAImpl_GetDeviceState,
+ XCAST(GetDeviceData)SysMouseAImpl_GetDeviceData,
+ XCAST(SetDataFormat)SysMouseAImpl_SetDataFormat,
+ XCAST(SetEventNotification)SysMouseAImpl_SetEventNotification,
+ XCAST(SetCooperativeLevel)SysMouseAImpl_SetCooperativeLevel,
+ IDirectInputDevice2WImpl_GetObjectInfo,
+ SysMouseWImpl_GetDeviceInfo,
+ XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel,
+ XCAST(Initialize)IDirectInputDevice2AImpl_Initialize,
+ XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect,
+ IDirectInputDevice2WImpl_EnumEffects,
+ IDirectInputDevice2WImpl_GetEffectInfo,
+ XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState,
+ XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand,
+ XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects,
+ XCAST(Escape)IDirectInputDevice2AImpl_Escape,
+ XCAST(Poll)IDirectInputDevice2AImpl_Poll,
+ XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData,
+ IDirectInputDevice7WImpl_EnumEffectsInFile,
+ IDirectInputDevice7WImpl_WriteEffectToFile,
+ IDirectInputDevice8WImpl_BuildActionMap,
+ IDirectInputDevice8WImpl_SetActionMap,
+ IDirectInputDevice8WImpl_GetImageInfo
};
#undef XCAST
More information about the wine-patches
mailing list