Christoph Frick : dinput: Dynamic handling of buttons of a device.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 9 05:47:19 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 094e85398b999f016a71df20c0ce54816702bf72
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=094e85398b999f016a71df20c0ce54816702bf72

Author: Christoph Frick <frick at sc-networks.de>
Date:   Thu Feb  9 12:07:55 2006 +0100

dinput: Dynamic handling of buttons of a device.

---

 dlls/dinput/joystick_linuxinput.c |  171 ++++++-------------------------------
 1 files changed, 29 insertions(+), 142 deletions(-)

diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index b1c5558..5f3be50 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -120,7 +120,9 @@ struct JoystickImpl
 	int				ff_state;
 
 	/* data returned by the EVIOCGABS() ioctl */
-	int				axes[ABS_MAX+1][5];
+	int				axes[ABS_MAX][5];
+	/* LUT for KEY_ to offset in rgbButtons */
+	BYTE				buttons[KEY_MAX];
 
 #define AXE_ABS		0
 #define AXE_ABSMIN	1
@@ -457,7 +459,7 @@ static HRESULT WINAPI JoystickAImpl_SetD
   */
 static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
 {
-    int		i;
+    int		i,buttons;
     JoystickImpl *This = (JoystickImpl *)iface;
     char	buf[200];
     BOOL	readonly = TRUE;
@@ -529,7 +531,7 @@ static HRESULT WINAPI JoystickAImpl_Acqu
 	if (test_bit(This->absbits,i)) {
 	  if (-1==ioctl(This->joyfd,EVIOCGABS(i),&(This->axes[i])))
 	    continue;
-	  FIXME("axe %d: cur=%d, min=%d, max=%d, fuzz=%d, flat=%d\n",
+	  TRACE("axe %d: cur=%d, min=%d, max=%d, fuzz=%d, flat=%d\n",
 	      i,
 	      This->axes[i][AXE_ABS],
 	      This->axes[i][AXE_ABSMIN],
@@ -541,7 +543,14 @@ static HRESULT WINAPI JoystickAImpl_Acqu
 	  This->havemax[i] = This->axes[i][AXE_ABSMAX];
 	}
     }
-    MESSAGE("\n");
+    buttons = 0;
+    for (i=0;i<KEY_MAX;i++) {
+	    if (test_bit(This->keybits,i)) {
+		    TRACE("button %d: %d\n", i, buttons);
+		    This->buttons[i] = 0x80 | buttons;
+		    buttons++;
+	    }
+    }
 
 	fake_current_js_state(This);
 
@@ -661,6 +670,7 @@ static void joy_polldev(JoystickImpl *Th
     struct timeval tv;
     fd_set	readfds;
     struct	input_event ie;
+    int         btn;
 
     if (This->joyfd==-1)
 	return;
@@ -680,76 +690,14 @@ 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 */
-	    switch (ie.code) {
-	    case BTN_TRIGGER:	/* normal flight stick */
-	    case BTN_A:		/* gamepad */
-	    case BTN_1:		/* generic */
-		This->js.rgbButtons[0] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(0),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_THUMB:
-	    case BTN_B:
-	    case BTN_2:
-		This->js.rgbButtons[1] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(1),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_THUMB2:
-	    case BTN_C:
-	    case BTN_3:
-		This->js.rgbButtons[2] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(2),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_TOP:
-	    case BTN_X:
-	    case BTN_4:
-		This->js.rgbButtons[3] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(3),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_TOP2:
-	    case BTN_Y:
-	    case BTN_5:
-		This->js.rgbButtons[4] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(4),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_PINKIE:
-	    case BTN_Z:
-	    case BTN_6:
-		This->js.rgbButtons[5] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(5),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
+		btn = This->buttons[ie.code];
+		TRACE("(%p) %d -> %d\n", This, ie.code, btn);
+		if (btn&0x80) {
+			btn &= 0x7F;
+			This->js.rgbButtons[btn] = ie.value?0x80:0x00;
+			GEN_EVENT(DIJOFS_BUTTON(btn),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
+		}
 		break;
-	    case BTN_BASE:
-	    case BTN_TL:
-	    case BTN_7:
-		This->js.rgbButtons[6] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(6),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_BASE2:
-	    case BTN_TR:
-	    case BTN_8:
-		This->js.rgbButtons[7] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(7),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_BASE3:
-	    case BTN_TL2:
-	    case BTN_9:
-		This->js.rgbButtons[8] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(8),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_BASE4:
-	    case BTN_TR2:
-		This->js.rgbButtons[9] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(9),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    case BTN_BASE5:
-	    case BTN_SELECT:
-		This->js.rgbButtons[10] = ie.value?0x80:0x00;
-		GEN_EVENT(DIJOFS_BUTTON(10),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++);
-		break;
-	    default:
-		FIXME("unhandled joystick button %x, value %d\n",ie.code,ie.value);
-		break;
-	    }
-	    break;
 	case EV_ABS:
 	    switch (ie.code) {
 	    case ABS_X:
@@ -794,6 +742,9 @@ static void joy_polldev(JoystickImpl *Th
 	    This->ff_state = ie.value;
 	    break;
 #endif
+	case EV_SYN:
+	    /* there is nothing to do */
+	    break;
 	default:
 	    FIXME("joystick cannot handle type %d event (code %d)\n",ie.type,ie.code);
 	    break;
@@ -1141,7 +1092,7 @@ static HRESULT WINAPI JoystickAImpl_Enum
 
   if ((dwFlags == DIDFT_ALL) ||
       (dwFlags & DIDFT_BUTTON)) {
-    int i;
+    int i, btncount=0;
 
     /*The DInput SDK says that GUID_Button is only for mouse buttons but well*/
 
@@ -1149,74 +1100,10 @@ static HRESULT WINAPI JoystickAImpl_Enum
 
     for (i = 0; i < KEY_MAX; i++) {
       if (!test_bit(This->keybits,i)) continue;
-
-      switch (i) {
-      case BTN_TRIGGER:
-      case BTN_A:
-      case BTN_1:
-	  ddoi.dwOfs = DIJOFS_BUTTON(0);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 0) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_THUMB:
-	case BTN_B:
-	case BTN_2:
-	  ddoi.dwOfs = DIJOFS_BUTTON(1);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 1) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_THUMB2:
-	case BTN_C:
-	case BTN_3:
-	  ddoi.dwOfs = DIJOFS_BUTTON(2);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 2) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_TOP:
-	case BTN_X:
-	case BTN_4:
-	  ddoi.dwOfs = DIJOFS_BUTTON(3);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 3) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_TOP2:
-	case BTN_Y:
-	case BTN_5:
-	  ddoi.dwOfs = DIJOFS_BUTTON(4);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 4) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_PINKIE:
-	case BTN_Z:
-	case BTN_6:
-	  ddoi.dwOfs = DIJOFS_BUTTON(5);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 5) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_BASE:
-	case BTN_TL:
-	case BTN_7:
-	  ddoi.dwOfs = DIJOFS_BUTTON(6);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 6) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_BASE2:
-	case BTN_TR:
-	case BTN_8:
-	  ddoi.dwOfs = DIJOFS_BUTTON(7);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 7) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_BASE3:
-	case BTN_TL2:
-	case BTN_9:
-	  ddoi.dwOfs = DIJOFS_BUTTON(8);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 8) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_BASE4:
-	case BTN_TR2:
-	  ddoi.dwOfs = DIJOFS_BUTTON(9);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 9) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-	case BTN_BASE5:
-	case BTN_SELECT:
-	  ddoi.dwOfs = DIJOFS_BUTTON(10);
-	  ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 10) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
-	  break;
-      }
-      sprintf(ddoi.tszName, "%d-Button", i);
+      ddoi.dwOfs = DIJOFS_BUTTON(btncount);
+      ddoi.dwType = DIDFT_MAKEINSTANCE(btncount << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
+      sprintf(ddoi.tszName, "%d-Button", btncount);
+      btncount++;
       _dump_OBJECTINSTANCEA(&ddoi);
       if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
 	/* return to unaquired state if that's where we were */




More information about the wine-cvs mailing list