Jonas Maebe : dinput: Hook up joysticks to DirectInput event queue on Mac OS X.
Alexandre Julliard
julliard at winehq.org
Fri Jun 17 13:13:46 CDT 2011
Module: wine
Branch: master
Commit: 90d8608185e44c4c1973d163568f60eba661f055
URL: http://source.winehq.org/git/wine.git/?a=commit;h=90d8608185e44c4c1973d163568f60eba661f055
Author: Jonas Maebe <jonas.bugzilla at gmail.com>
Date: Thu Jun 16 21:11:46 2011 +0200
dinput: Hook up joysticks to DirectInput event queue on Mac OS X.
---
dlls/dinput/joystick_osx.c | 61 ++++++++++++++++++++++++++++++++++++--------
1 files changed, 50 insertions(+), 11 deletions(-)
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 29c7856..439c8ad 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -516,12 +516,13 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
int button_idx = 0;
int pov_idx = 0;
int slider_idx = 0;
+ int inst_id;
CFIndex idx, cnt = CFArrayGetCount( gElementCFArrayRef );
for ( idx = 0; idx < cnt; idx++ )
{
IOHIDValueRef valueRef;
- int val;
+ int val, oldVal, newVal;
IOHIDElementRef tIOHIDElementRef = ( IOHIDElementRef ) CFArrayGetValueAtIndex( gElementCFArrayRef, idx );
int eleType = IOHIDElementGetType( tIOHIDElementRef );
@@ -532,7 +533,14 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
{
IOHIDDeviceGetValue(tIOHIDDeviceRef, tIOHIDElementRef, &valueRef);
val = IOHIDValueGetIntegerValue(valueRef);
- device->generic.js.rgbButtons[button_idx] = val ? 0x80 : 0x00;
+ newVal = val ? 0x80 : 0x0;
+ oldVal = device->generic.js.rgbButtons[button_idx];
+ device->generic.js.rgbButtons[button_idx] = newVal;
+ if (oldVal != newVal)
+ {
+ inst_id = DIDFT_MAKEINSTANCE(button_idx) | DIDFT_PSHBUTTON;
+ queue_event(iface,inst_id,newVal,GetCurrentTime(),device->generic.base.dinput->evsequence++);
+ }
button_idx ++;
}
break;
@@ -545,10 +553,17 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
{
IOHIDDeviceGetValue(tIOHIDDeviceRef, tIOHIDElementRef, &valueRef);
val = IOHIDValueGetIntegerValue(valueRef);
+ oldVal = device->generic.js.rgdwPOV[pov_idx];
if (val >= 8)
- device->generic.js.rgdwPOV[pov_idx] = -1;
+ newVal = -1;
else
- device->generic.js.rgdwPOV[pov_idx] = val * 4500;
+ newVal = val * 4500;
+ device->generic.js.rgdwPOV[pov_idx] = newVal;
+ if (oldVal != newVal)
+ {
+ inst_id = DIDFT_MAKEINSTANCE(pov_idx) | DIDFT_POV;
+ queue_event(iface,inst_id,newVal,GetCurrentTime(),device->generic.base.dinput->evsequence++);
+ }
pov_idx ++;
break;
}
@@ -560,33 +575,57 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
case kHIDUsage_GD_Rz:
case kHIDUsage_GD_Slider:
{
+ int wine_obj = -1;
+
IOHIDDeviceGetValue(tIOHIDDeviceRef, tIOHIDElementRef, &valueRef);
val = IOHIDValueGetIntegerValue(valueRef);
+ newVal = joystick_map_axis(&device->generic.props[idx], val);
switch (usage)
{
case kHIDUsage_GD_X:
- device->generic.js.lX = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 0;
+ oldVal = device->generic.js.lX;
+ device->generic.js.lX = newVal;
break;
case kHIDUsage_GD_Y:
- device->generic.js.lY = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 1;
+ oldVal = device->generic.js.lY;
+ device->generic.js.lY = newVal;
break;
case kHIDUsage_GD_Z:
- device->generic.js.lZ = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 2;
+ oldVal = device->generic.js.lZ;
+ device->generic.js.lZ = newVal;
break;
case kHIDUsage_GD_Rx:
- device->generic.js.lRx = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 3;
+ oldVal = device->generic.js.lRx;
+ device->generic.js.lRx = newVal;
break;
case kHIDUsage_GD_Ry:
- device->generic.js.lRy = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 4;
+ oldVal = device->generic.js.lRy;
+ device->generic.js.lRy = newVal;
break;
case kHIDUsage_GD_Rz:
- device->generic.js.lRz = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 5;
+ oldVal = device->generic.js.lRz;
+ device->generic.js.lRz = newVal;
break;
case kHIDUsage_GD_Slider:
- device->generic.js.rglSlider[slider_idx] = joystick_map_axis(&device->generic.props[idx], val);
+ wine_obj = 6 + slider_idx;
+ oldVal = device->generic.js.rglSlider[slider_idx];
+ device->generic.js.rglSlider[slider_idx] = newVal;
slider_idx ++;
break;
}
+ if ((wine_obj != -1) &&
+ (oldVal != newVal))
+ {
+ inst_id = DIDFT_MAKEINSTANCE(wine_obj) | DIDFT_ABSAXIS;
+ queue_event(iface,inst_id,newVal,GetCurrentTime(),device->generic.base.dinput->evsequence++);
+ }
+
break;
}
default:
More information about the wine-cvs
mailing list