Vitaliy Margolen : dinput: [joystick_linuxinput] Use correct offset to queue events.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 11 05:34:06 CST 2007


Module: wine
Branch: master
Commit: 3d093256cac9bc5579e2f126d734d53c0cc4a1c3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3d093256cac9bc5579e2f126d734d53c0cc4a1c3

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Tue Jan  9 13:44:49 2007 -0700

dinput: [joystick_linuxinput] Use correct offset to queue events.

---

 dlls/dinput/joystick_linuxinput.c |  112 +++++++++++++------------------------
 1 files changed, 40 insertions(+), 72 deletions(-)

diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 86e8d16..3ce3949 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -146,7 +146,6 @@ struct JoystickImpl
 static void fake_current_js_state(JoystickImpl *ji);
 static DWORD map_pov(int event_value, int is_x);
 static void find_joydevs(void);
-static int lxinput_to_user_offset(JoystickImpl *This, int ie_type, int ie_code);
 
 /* This GUID is slightly different from the linux joystick one. Take note. */
 static const GUID DInput_Wine_Joystick_Base_GUID = { /* 9e573eda-7734-11d2-8d4a-23903fb6bdf7 */
@@ -660,8 +659,7 @@ static DWORD map_pov(int event_value, in
 }
 
 /* defines how the linux input system offset mappings into c_dfDIJoystick2 */
-static int
-lxinput_to_user_offset(JoystickImpl *This, int ie_type, int ie_code )
+static int lxinput_to_user_index(JoystickImpl *This, int ie_type, int ie_code )
 {
   int offset = -1;
   switch (ie_type) {
@@ -696,19 +694,23 @@ lxinput_to_user_offset(JoystickImpl *Thi
       FIXME("Unhandled type(0x%02X)\n", ie_type);
       return -1;
   }
-  return This->base.data_format.offsets[offset];
+  return offset;
 }
 
 /* convert wine format offset to user format object index */
-static void joy_polldev(JoystickImpl *This) {
+static void joy_polldev(JoystickImpl *This)
+{
     struct pollfd plfd;
-    struct	input_event ie;
-    int         btn, offset;
+    struct input_event ie;
 
     if (This->joyfd==-1)
 	return;
 
-    while (1) {
+    while (1)
+    {
+        LONG value = 0;
+        int inst_id = -1;
+
 	plfd.fd = This->joyfd;
 	plfd.events = POLLIN;
 
@@ -722,86 +724,48 @@ static void joy_polldev(JoystickImpl *Th
 	TRACE("input_event: type %d, code %d, value %d\n",ie.type,ie.code,ie.value);
 	switch (ie.type) {
 	case EV_KEY:	/* button */
-            btn = This->joydev->buttons[ie.code];
+        {
+            int btn = This->joydev->buttons[ie.code];
+
             TRACE("(%p) %d -> %d\n", This, ie.code, btn);
-            if (btn&0x80) {
-              btn &= 0x7F;
-	      if ((offset = lxinput_to_user_offset(This, ie.type, btn)) == -1) {
-		return;
-	      }
-              This->js.rgbButtons[btn] = ie.value?0x80:0x00;
-              queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rgbButtons[btn],
-                          ie.time.tv_usec, This->dinput->evsequence++);
+            if (btn & 0x80)
+            {
+                btn &= 0x7F;
+                inst_id = DIDFT_MAKEINSTANCE(btn) | DIDFT_PSHBUTTON;
+                This->js.rgbButtons[btn] = value = ie.value ? 0x80 : 0x00;
             }
             break;
+        }
 	case EV_ABS:
-            if ((offset = lxinput_to_user_offset(This, ie.type, ie.code)) == -1) {
-              return;
-            }
+            if ((inst_id = lxinput_to_user_index(This, ie.type, ie.code)) == -1)
+                return;
+            inst_id = DIDFT_MAKEINSTANCE(inst_id) | (inst_id < ABS_HAT0X ? DIDFT_AXIS : DIDFT_POV);
+            value = map_axis(This, ie.code, ie.value);
+
 	    switch (ie.code) {
-	    case ABS_X:
-		This->js.lX = map_axis(This,ABS_X,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lX,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_Y:
-		This->js.lY = map_axis(This,ABS_Y,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lY,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_Z:
-		This->js.lZ = map_axis(This,ABS_Z,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lZ,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_RX:
-		This->js.lRx = map_axis(This,ABS_RX,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lRx,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_RY:
-		This->js.lRy = map_axis(This,ABS_RY,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lRy,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_RZ:
-		This->js.lRz = map_axis(This,ABS_RZ,ie.value);
-		queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.lRz,
-                            ie.time.tv_usec, This->dinput->evsequence++);
-		break;
-	    case ABS_THROTTLE:
-                This->js.rglSlider[0] = map_axis(This,ABS_THROTTLE,ie.value);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rglSlider[0],
-                            ie.time.tv_usec, This->dinput->evsequence++);
-                break;
-	    case ABS_RUDDER:
-                This->js.rglSlider[1] = map_axis(This,ABS_RUDDER,ie.value);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rglSlider[1],
-                            ie.time.tv_usec, This->dinput->evsequence++);
-                break;
+            case ABS_X:         This->js.lX  = value; break;
+            case ABS_Y:         This->js.lY  = value; break;
+            case ABS_Z:         This->js.lZ  = value; break;
+            case ABS_RX:        This->js.lRx = value; break;
+            case ABS_RY:        This->js.lRy = value; break;
+            case ABS_RZ:        This->js.lRz = value; break;
+            case ABS_THROTTLE:  This->js.rglSlider[0] = value; break;
+            case ABS_RUDDER:    This->js.rglSlider[1] = value; break;
 	    case ABS_HAT0X:
 	    case ABS_HAT0Y:
-                This->js.rgdwPOV[0] = map_pov(ie.value,ie.code==ABS_HAT0X);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rgdwPOV[0],
-                            ie.time.tv_usec, This->dinput->evsequence++);
+                This->js.rgdwPOV[0] = value = map_pov(ie.value, ie.code==ABS_HAT0X);
                 break;
 	    case ABS_HAT1X:
 	    case ABS_HAT1Y:
-                This->js.rgdwPOV[1] = map_pov(ie.value,ie.code==ABS_HAT1X);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rgdwPOV[1],
-                            ie.time.tv_usec, This->dinput->evsequence++);
+                This->js.rgdwPOV[1] = value = map_pov(ie.value, ie.code==ABS_HAT1X);
                 break;
 	    case ABS_HAT2X:
 	    case ABS_HAT2Y:
-                This->js.rgdwPOV[2] = map_pov(ie.value,ie.code==ABS_HAT2X);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rgdwPOV[2],
-                            ie.time.tv_usec, This->dinput->evsequence++);
+                This->js.rgdwPOV[2] = value  = map_pov(ie.value, ie.code==ABS_HAT2X);
                 break;
 	    case ABS_HAT3X:
 	    case ABS_HAT3Y:
-                This->js.rgdwPOV[3] = map_pov(ie.value,ie.code==ABS_HAT3X);
-                queue_event((LPDIRECTINPUTDEVICE8A)This, offset, This->js.rgdwPOV[3],
-                            ie.time.tv_usec, This->dinput->evsequence++);
+                This->js.rgdwPOV[3] = value  = map_pov(ie.value, ie.code==ABS_HAT3X);
                 break;
 	    default:
 		FIXME("unhandled joystick axe event (code %d, value %d)\n",ie.code,ie.value);
@@ -822,6 +786,10 @@ static void joy_polldev(JoystickImpl *Th
 	    FIXME("joystick cannot handle type %d event (code %d)\n",ie.type,ie.code);
 	    break;
 	}
+        if (inst_id >= 0)
+            queue_event((LPDIRECTINPUTDEVICE8A)This,
+                        id_to_offset(&This->base.data_format, inst_id),
+                        value, ie.time.tv_usec, This->dinput->evsequence++);
     }
 }
 




More information about the wine-cvs mailing list