- Timestamp:
- Jan 22, 2000, 11:31:06 AM (26 years ago)
- File:
-
- 1 edited
-
trunk/src/dinput/dinput.cpp (modified) (50 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/dinput/dinput.cpp
r2462 r2499 1 /* $Id: dinput.cpp,v 1. 3 2000-01-17 17:18:38sandervl Exp $ */2 /* DirectInput1 /* $Id: dinput.cpp,v 1.4 2000-01-22 10:31:06 sandervl Exp $ */ 2 /* DirectInput 3 3 * 4 4 * Copyright 1998 Marcus Meissner … … 12 12 * - WingCommander Prophecy Demo: 13 13 * Doesn't get Input Focus. 14 * 14 * 15 15 * - Fallout : works great in X and DGA mode 16 16 * 17 17 * FIXME: The keyboard handling needs to (and will) be merged into keyboard.c 18 * (The current implementation is currently only a proof of concept and19 * an utter mess.)18 * (The current implementation is currently only a proof of concept and 19 * an utter mess.) 20 20 */ 21 21 #ifdef __WIN32OS2__ … … 44 44 #ifdef HAVE_LINUX_JOYSTICK_H 45 45 # include <linux/joystick.h> 46 # define JOYDEV "/dev/js0"46 # define JOYDEV "/dev/js0" 47 47 #endif 48 48 #include "wine/obj_base.h" … … 66 66 DEFAULT_DEBUG_CHANNEL(dinput) 67 67 68 extern VOID WIN32API KEYBOARD_Enable(WNDPROC handler); 68 69 69 70 extern BYTE InputKeyStateTable[256]; … … 94 95 GUID guid; 95 96 /* SysKeyboardAImpl */ 97 LPDIDEVICEOBJECTDATA data_queue; 98 int queue_pos, queue_len; 99 CRITICAL_SECTION crit; 100 int acquired; 96 101 BYTE keystate[256]; 97 102 }; … … 107 112 GUID guid; 108 113 109 /* joystick private */110 intjoyfd;111 LPDIDATAFORMATdf;112 HANDLE hEvent;113 LONGlMin,lMax,deadzone;114 LPDIDEVICEOBJECTDATA data_queue;115 int queue_pos, queue_len;116 DIJOYSTATEjs;114 /* joystick private */ 115 int joyfd; 116 LPDIDATAFORMAT df; 117 HANDLE hEvent; 118 LONG lMin,lMax,deadzone; 119 LPDIDEVICEOBJECTDATA data_queue; 120 int queue_pos, queue_len; 121 DIJOYSTATE js; 117 122 }; 118 123 #endif … … 125 130 GUID guid; 126 131 127 LPDIDATAFORMATdf;132 LPDIDATAFORMAT df; 128 133 /* SysMouseAImpl */ 129 134 BYTE absolute; 130 135 /* Previous position for relative moves */ 131 LONG prevX, prevY;132 LPMOUSE_EVENT_PROC prev_handler;133 HWND win;134 DWORD win_centerX, win_centerY;135 LPDIDEVICEOBJECTDATA data_queue;136 int queue_pos, queue_len;137 int need_warp;138 int acquired;139 HANDLE hEvent;140 CRITICAL_SECTIONcrit;136 LONG prevX, prevY; 137 LPMOUSE_EVENT_PROC prev_handler; 138 HWND win; 139 DWORD win_centerX, win_centerY; 140 LPDIDEVICEOBJECTDATA data_queue; 141 int queue_pos, queue_len; 142 int need_warp; 143 int acquired; 144 HANDLE hEvent; 145 CRITICAL_SECTION crit; 141 146 }; 142 147 … … 170 175 171 176 /* FIXME: This is ugly and not thread safe :/ */ 172 static IDirectInputDevice2A* current_lock = NULL; 173 174 /****************************************************************************** 175 * Various debugging tools 177 static IDirectInputDevice2A* current_lock = NULL; 178 static IDirectInputDeviceA* current_keylock = NULL; 179 180 /****************************************************************************** 181 * Various debugging tools 176 182 */ 177 183 static void _dump_cooperativelevel(DWORD dwFlags) { … … 200 206 201 207 /****************************************************************************** 202 * DirectInputCreate32A208 * DirectInputCreate32A 203 209 */ 204 210 HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter) 205 211 { 206 IDirectInputAImpl* This;207 TRACE("(0x%08lx,%04lx,%p,%p)\n",208 (DWORD)hinst,dwVersion,ppDI,punkOuter209 );210 This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl));211 This->ref = 1;212 ICOM_VTBL(This) = &ddiavt;213 *ppDI=(IDirectInputA*)This;214 return 0;215 } 216 /****************************************************************************** 217 * IDirectInputA_EnumDevices212 IDirectInputAImpl* This; 213 TRACE("(0x%08lx,%04lx,%p,%p)\n", 214 (DWORD)hinst,dwVersion,ppDI,punkOuter 215 ); 216 This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); 217 This->ref = 1; 218 ICOM_VTBL(This) = &ddiavt; 219 *ppDI=(IDirectInputA*)This; 220 return 0; 221 } 222 /****************************************************************************** 223 * IDirectInputA_EnumDevices 218 224 */ 219 225 static HRESULT WINAPI IDirectInputAImpl_EnumDevices( 220 LPDIRECTINPUTA iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback,221 LPVOID pvRef, DWORD dwFlags226 LPDIRECTINPUTA iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, 227 LPVOID pvRef, DWORD dwFlags 222 228 ) 223 229 { 224 ICOM_THIS(IDirectInputAImpl,iface);225 DIDEVICEINSTANCEA devInstance;226 int ret;227 228 TRACE("(this=%p,0x%04lx,%p,%p,%04lx)\n", This, dwDevType, lpCallback, pvRef, dwFlags);229 230 devInstance.dwSize = sizeof(DIDEVICEINSTANCEA);231 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) {232 /* Return keyboard */233 devInstance.guidInstance = GUID_SysKeyboard;/* DInput's GUID */234 devInstance.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */235 devInstance.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);236 strcpy(devInstance.tszInstanceName, "Keyboard");237 strcpy(devInstance.tszProductName, "Wine Keyboard");238 239 ret = lpCallback(&devInstance, pvRef);240 TRACE("Keyboard registered\n");241 if (ret == DIENUM_STOP)242 return 0;243 }244 245 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_MOUSE)) {246 /* Return mouse */247 devInstance.guidInstance = GUID_SysMouse;/* DInput's GUID */248 devInstance.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */249 devInstance.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8);250 strcpy(devInstance.tszInstanceName, "Mouse");251 strcpy(devInstance.tszProductName, "Wine Mouse");252 253 ret = lpCallback(&devInstance, pvRef);254 TRACE("Mouse registered\n");255 if (ret == DIENUM_STOP)256 return 0;257 }258 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_JOYSTICK)) {259 /* check whether we have a joystick */230 ICOM_THIS(IDirectInputAImpl,iface); 231 DIDEVICEINSTANCEA devInstance; 232 int ret; 233 234 TRACE("(this=%p,0x%04lx,%p,%p,%04lx)\n", This, dwDevType, lpCallback, pvRef, dwFlags); 235 236 devInstance.dwSize = sizeof(DIDEVICEINSTANCEA); 237 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) { 238 /* Return keyboard */ 239 devInstance.guidInstance = GUID_SysKeyboard;/* DInput's GUID */ 240 devInstance.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */ 241 devInstance.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); 242 strcpy(devInstance.tszInstanceName, "Keyboard"); 243 strcpy(devInstance.tszProductName, "Wine Keyboard"); 244 245 ret = lpCallback(&devInstance, pvRef); 246 TRACE("Keyboard registered\n"); 247 if (ret == DIENUM_STOP) 248 return 0; 249 } 250 251 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_MOUSE)) { 252 /* Return mouse */ 253 devInstance.guidInstance = GUID_SysMouse;/* DInput's GUID */ 254 devInstance.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */ 255 devInstance.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8); 256 strcpy(devInstance.tszInstanceName, "Mouse"); 257 strcpy(devInstance.tszProductName, "Wine Mouse"); 258 259 ret = lpCallback(&devInstance, pvRef); 260 TRACE("Mouse registered\n"); 261 if (ret == DIENUM_STOP) 262 return 0; 263 } 264 if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_JOYSTICK)) { 265 /* check whether we have a joystick */ 260 266 #ifdef HAVE_LINUX_22_JOYSTICK_API 261 if ( (access(JOYDEV,O_RDONLY)!=-1)||262 (errno!=ENODEV && errno!=ENOENT)263 ) {264 /* Return joystick */265 devInstance.guidInstance= GUID_Joystick;266 devInstance.guidProduct= DInput_Wine_Joystick_GUID;267 /* we only support traditional joysticks for now */268 devInstance.dwDevType= DIDEVTYPE_JOYSTICK | DIDEVTYPEJOYSTICK_TRADITIONAL;269 strcpy(devInstance.tszInstanceName,"Joystick");270 /* ioctl JSIOCGNAME(len) */271 strcpy(devInstance.tszProductName,"Wine Joystick");272 273 ret = lpCallback(&devInstance,pvRef);274 TRACE("Joystick registered\n");275 if (ret == DIENUM_STOP)276 return 0;277 }278 #endif 279 }280 return 0;267 if ( (access(JOYDEV,O_RDONLY)!=-1) || 268 (errno!=ENODEV && errno!=ENOENT) 269 ) { 270 /* Return joystick */ 271 devInstance.guidInstance = GUID_Joystick; 272 devInstance.guidProduct = DInput_Wine_Joystick_GUID; 273 /* we only support traditional joysticks for now */ 274 devInstance.dwDevType = DIDEVTYPE_JOYSTICK | DIDEVTYPEJOYSTICK_TRADITIONAL; 275 strcpy(devInstance.tszInstanceName, "Joystick"); 276 /* ioctl JSIOCGNAME(len) */ 277 strcpy(devInstance.tszProductName, "Wine Joystick"); 278 279 ret = lpCallback(&devInstance,pvRef); 280 TRACE("Joystick registered\n"); 281 if (ret == DIENUM_STOP) 282 return 0; 283 } 284 #endif 285 } 286 return 0; 281 287 } 282 288 283 289 static ULONG WINAPI IDirectInputAImpl_AddRef(LPDIRECTINPUTA iface) 284 290 { 285 ICOM_THIS(IDirectInputAImpl,iface);286 return ++(This->ref);291 ICOM_THIS(IDirectInputAImpl,iface); 292 return ++(This->ref); 287 293 } 288 294 289 295 static ULONG WINAPI IDirectInputAImpl_Release(LPDIRECTINPUTA iface) 290 296 { 291 ICOM_THIS(IDirectInputAImpl,iface);292 if (!(--This->ref)) {293 HeapFree(GetProcessHeap(),0,This);294 return 0;295 }296 return This->ref;297 ICOM_THIS(IDirectInputAImpl,iface); 298 if (!(--This->ref)) { 299 HeapFree(GetProcessHeap(),0,This); 300 return 0; 301 } 302 return This->ref; 297 303 } 298 304 299 305 static HRESULT WINAPI IDirectInputAImpl_CreateDevice( 300 LPDIRECTINPUTA iface,REFGUID rguid,LPDIRECTINPUTDEVICEA* pdev,301 LPUNKNOWN punk306 LPDIRECTINPUTA iface,REFGUID rguid,LPDIRECTINPUTDEVICEA* pdev, 307 LPUNKNOWN punk 302 308 ) { 303 ICOM_THIS(IDirectInputAImpl,iface);304 charxbuf[50];305 306 WINE_StringFromCLSID(rguid,xbuf);307 FIXME("(this=%p,%s,%p,%p): stub\n",This,xbuf,pdev,punk);308 if ((!memcmp(&GUID_SysKeyboard,rguid,sizeof(GUID_SysKeyboard))) || /* Generic Keyboard */309 (!memcmp(&DInput_Wine_Keyboard_GUID,rguid,sizeof(GUID_SysKeyboard)))) { /* Wine Keyboard */309 ICOM_THIS(IDirectInputAImpl,iface); 310 char xbuf[50]; 311 312 WINE_StringFromCLSID(rguid,xbuf); 313 FIXME("(this=%p,%s,%p,%p): stub\n",This,xbuf,pdev,punk); 314 if ((!memcmp(&GUID_SysKeyboard,rguid,sizeof(GUID_SysKeyboard))) || /* Generic Keyboard */ 315 (!memcmp(&DInput_Wine_Keyboard_GUID,rguid,sizeof(GUID_SysKeyboard)))) { /* Wine Keyboard */ 310 316 SysKeyboardAImpl* newDevice; 311 newDevice = (SysKeyboardAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardAImpl)); 312 newDevice->ref = 1; 313 ICOM_VTBL(newDevice) = &SysKeyboardAvt; 314 memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); 315 memset(newDevice->keystate,0,256); 317 newDevice = (SysKeyboardAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardAImpl)); 318 newDevice->ref = 1; 319 ICOM_VTBL(newDevice) = &SysKeyboardAvt; 320 InitializeCriticalSection(&(newDevice->crit)); 321 MakeCriticalSectionGlobal(&(newDevice->crit)); 322 memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); 323 memset(newDevice->keystate,0,256); 316 324 *pdev=(IDirectInputDeviceA*)newDevice; 317 return DI_OK;318 }319 if ((!memcmp(&GUID_SysMouse,rguid,sizeof(GUID_SysMouse))) || /* Generic Mouse */320 (!memcmp(&DInput_Wine_Mouse_GUID,rguid,sizeof(GUID_SysMouse)))) { /* Wine Mouse */325 return DI_OK; 326 } 327 if ((!memcmp(&GUID_SysMouse,rguid,sizeof(GUID_SysMouse))) || /* Generic Mouse */ 328 (!memcmp(&DInput_Wine_Mouse_GUID,rguid,sizeof(GUID_SysMouse)))) { /* Wine Mouse */ 321 329 SysMouseAImpl* newDevice; 322 newDevice = (SysMouseAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseAImpl));323 newDevice->ref = 1;324 ICOM_VTBL(newDevice) = &SysMouseAvt;325 InitializeCriticalSection(&(newDevice->crit));326 MakeCriticalSectionGlobal(&(newDevice->crit));327 memcpy(&(newDevice->guid),rguid,sizeof(*rguid));330 newDevice = (SysMouseAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseAImpl)); 331 newDevice->ref = 1; 332 ICOM_VTBL(newDevice) = &SysMouseAvt; 333 InitializeCriticalSection(&(newDevice->crit)); 334 MakeCriticalSectionGlobal(&(newDevice->crit)); 335 memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); 328 336 *pdev=(IDirectInputDeviceA*)newDevice; 329 return DI_OK;330 }337 return DI_OK; 338 } 331 339 #ifdef HAVE_LINUX_22_JOYSTICK_API 332 if ((!memcmp(&GUID_Joystick,rguid,sizeof(GUID_Joystick))) ||333 (!memcmp(&DInput_Wine_Joystick_GUID,rguid,sizeof(GUID_Joystick)))) {340 if ((!memcmp(&GUID_Joystick,rguid,sizeof(GUID_Joystick))) || 341 (!memcmp(&DInput_Wine_Joystick_GUID,rguid,sizeof(GUID_Joystick)))) { 334 342 JoystickAImpl* newDevice; 335 newDevice = (JoystickAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl));336 newDevice->ref= 1;337 ICOM_VTBL(newDevice)= &JoystickAvt;338 newDevice->joyfd= -1;339 memcpy(&(newDevice->guid),rguid,sizeof(*rguid));343 newDevice = (JoystickAImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl)); 344 newDevice->ref = 1; 345 ICOM_VTBL(newDevice) = &JoystickAvt; 346 newDevice->joyfd = -1; 347 memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); 340 348 *pdev=(IDirectInputDeviceA*)newDevice; 341 return DI_OK;342 }343 #endif 344 return E_FAIL;349 return DI_OK; 350 } 351 #endif 352 return E_FAIL; 345 353 } 346 354 347 355 static HRESULT WINAPI IDirectInputAImpl_QueryInterface( 348 LPDIRECTINPUTA iface,REFIID riid,LPVOID *ppobj356 LPDIRECTINPUTA iface,REFIID riid,LPVOID *ppobj 349 357 ) { 350 ICOM_THIS(IDirectInputAImpl,iface);351 charxbuf[50];352 353 WINE_StringFromCLSID(riid,xbuf);354 TRACE("(this=%p,%s,%p)\n",This,xbuf,ppobj);355 if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) {356 IDirectInputA_AddRef(iface);357 *ppobj = This;358 return 0;359 }360 if (!memcmp(&IID_IDirectInputA,riid,sizeof(*riid))) {361 IDirectInputA_AddRef(iface);362 *ppobj = This;363 return 0;364 }365 return E_FAIL;358 ICOM_THIS(IDirectInputAImpl,iface); 359 char xbuf[50]; 360 361 WINE_StringFromCLSID(riid,xbuf); 362 TRACE("(this=%p,%s,%p)\n",This,xbuf,ppobj); 363 if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) { 364 IDirectInputA_AddRef(iface); 365 *ppobj = This; 366 return 0; 367 } 368 if (!memcmp(&IID_IDirectInputA,riid,sizeof(*riid))) { 369 IDirectInputA_AddRef(iface); 370 *ppobj = This; 371 return 0; 372 } 373 return E_FAIL; 366 374 } 367 375 368 376 static HRESULT WINAPI IDirectInputAImpl_Initialize( 369 LPDIRECTINPUTA iface,HINSTANCE hinst,DWORD x377 LPDIRECTINPUTA iface,HINSTANCE hinst,DWORD x 370 378 ) { 371 return DIERR_ALREADYINITIALIZED;379 return DIERR_ALREADYINITIALIZED; 372 380 } 373 381 374 382 static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUTA iface, 375 REFGUID rguid) {383 REFGUID rguid) { 376 384 ICOM_THIS(IDirectInputAImpl,iface); 377 385 char xbuf[50]; 378 386 379 387 WINE_StringFromCLSID(rguid,xbuf); 380 388 FIXME("(%p)->(%s): stub\n",This,xbuf); 381 389 382 390 return DI_OK; 383 391 } 384 392 385 393 static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUTA iface, 386 HWND hwndOwner,387 DWORD dwFlags) {394 HWND hwndOwner, 395 DWORD dwFlags) { 388 396 ICOM_THIS(IDirectInputAImpl,iface); 389 397 FIXME("(%p)->(%08lx,%08lx): stub\n",This, (DWORD) hwndOwner, dwFlags); 390 398 391 399 return DI_OK; 392 400 } 393 401 394 ICOM_VTABLE(IDirectInputA) ddiavt = 395 { 396 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE397 IDirectInputAImpl_QueryInterface,398 IDirectInputAImpl_AddRef,399 IDirectInputAImpl_Release,400 IDirectInputAImpl_CreateDevice,401 IDirectInputAImpl_EnumDevices,402 IDirectInputAImpl_GetDeviceStatus,403 IDirectInputAImpl_RunControlPanel,404 IDirectInputAImpl_Initialize402 ICOM_VTABLE(IDirectInputA) ddiavt = 403 { 404 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 405 IDirectInputAImpl_QueryInterface, 406 IDirectInputAImpl_AddRef, 407 IDirectInputAImpl_Release, 408 IDirectInputAImpl_CreateDevice, 409 IDirectInputAImpl_EnumDevices, 410 IDirectInputAImpl_GetDeviceStatus, 411 IDirectInputAImpl_RunControlPanel, 412 IDirectInputAImpl_Initialize 405 413 }; 406 414 407 415 /****************************************************************************** 408 * IDirectInputDeviceA416 * IDirectInputDeviceA 409 417 */ 410 418 411 419 static HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( 412 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df420 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df 413 421 ) { 414 /*415 int i;416 TRACE(dinput,"(this=%p,%p)\n",This,df);417 418 TRACE(dinput,"df.dwSize=%ld\n",df->dwSize);419 TRACE(dinput,"(df.dwObjsize=%ld)\n",df->dwObjSize);420 TRACE(dinput,"(df.dwFlags=0x%08lx)\n",df->dwFlags);421 TRACE(dinput,"(df.dwDataSize=%ld)\n",df->dwDataSize);422 TRACE(dinput,"(df.dwNumObjs=%ld)\n",df->dwNumObjs);423 424 for (i=0;i<df->dwNumObjs;i++) {425 charxbuf[50];426 427 if (df->rgodf[i].pguid)428 WINE_StringFromCLSID(df->rgodf[i].pguid,xbuf);429 else430 strcpy(xbuf,"<no guid>");431 TRACE(dinput,"df.rgodf[%d].guid %s\n",i,xbuf);432 TRACE(dinput,"df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs);433 TRACE(dinput,"dwType 0x%02lx,dwInstance %ld\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType));434 TRACE(dinput,"df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags);435 }436 */437 return 0;422 /* 423 int i; 424 TRACE(dinput,"(this=%p,%p)\n",This,df); 425 426 TRACE(dinput,"df.dwSize=%ld\n",df->dwSize); 427 TRACE(dinput,"(df.dwObjsize=%ld)\n",df->dwObjSize); 428 TRACE(dinput,"(df.dwFlags=0x%08lx)\n",df->dwFlags); 429 TRACE(dinput,"(df.dwDataSize=%ld)\n",df->dwDataSize); 430 TRACE(dinput,"(df.dwNumObjs=%ld)\n",df->dwNumObjs); 431 432 for (i=0;i<df->dwNumObjs;i++) { 433 char xbuf[50]; 434 435 if (df->rgodf[i].pguid) 436 WINE_StringFromCLSID(df->rgodf[i].pguid,xbuf); 437 else 438 strcpy(xbuf,"<no guid>"); 439 TRACE(dinput,"df.rgodf[%d].guid %s\n",i,xbuf); 440 TRACE(dinput,"df.rgodf[%d].dwOfs %ld\n",i,df->rgodf[i].dwOfs); 441 TRACE(dinput,"dwType 0x%02lx,dwInstance %ld\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType)); 442 TRACE(dinput,"df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags); 443 } 444 */ 445 return 0; 438 446 } 439 447 440 448 static HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( 441 LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags449 LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags 442 450 ) { 443 ICOM_THIS(IDirectInputDevice2AImpl,iface);444 FIXME("(this=%p,0x%08lx,0x%08lx): stub\n",This,(DWORD)hwnd,dwflags);445 // if (TRACE_ON(dinput))446 // _dump_cooperativelevel(dwflags);447 return 0;451 ICOM_THIS(IDirectInputDevice2AImpl,iface); 452 FIXME("(this=%p,0x%08lx,0x%08lx): stub\n",This,(DWORD)hwnd,dwflags); 453 // if (TRACE_ON(dinput)) 454 // _dump_cooperativelevel(dwflags); 455 return 0; 448 456 } 449 457 450 458 static HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( 451 LPDIRECTINPUTDEVICE2A iface,HANDLE hnd459 LPDIRECTINPUTDEVICE2A iface,HANDLE hnd 452 460 ) { 453 ICOM_THIS(IDirectInputDevice2AImpl,iface);454 FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd);455 return 0;461 ICOM_THIS(IDirectInputDevice2AImpl,iface); 462 FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd); 463 return 0; 456 464 } 457 465 458 466 static ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE2A iface) 459 467 { 460 ICOM_THIS(IDirectInputDevice2AImpl,iface);461 This->ref--;462 if (This->ref)463 return This->ref;464 HeapFree(GetProcessHeap(),0,This);465 return 0;468 ICOM_THIS(IDirectInputDevice2AImpl,iface); 469 This->ref--; 470 if (This->ref) 471 return This->ref; 472 HeapFree(GetProcessHeap(),0,This); 473 return 0; 466 474 } 467 475 468 476 static HRESULT WINAPI SysKeyboardAImpl_SetProperty( 469 LPDIRECTINPUTDEVICE2A iface,REFGUID rguid,LPCDIPROPHEADER ph477 LPDIRECTINPUTDEVICE2A iface,REFGUID rguid,LPCDIPROPHEADER ph 470 478 ) 471 479 { 472 ICOM_THIS(SysKeyboardAImpl,iface);473 charxbuf[50];474 475 if (HIWORD(rguid))476 WINE_StringFromCLSID(rguid,xbuf);477 else478 sprintf(xbuf,"<special guid %ld>",(DWORD)rguid);479 TRACE("(this=%p,%s,%p)\n",This,xbuf,ph);480 TRACE("(size=%ld,headersize=%ld,obj=%ld,how=%ld\n",480 ICOM_THIS(SysKeyboardAImpl,iface); 481 char xbuf[50]; 482 483 if (HIWORD(rguid)) 484 WINE_StringFromCLSID(rguid,xbuf); 485 else 486 sprintf(xbuf,"<special guid %ld>",(DWORD)rguid); 487 TRACE("DINPUT-SKAI: SetProperty (this=%p,%s,%p)\n",This,xbuf,ph); 488 TRACE("(size=%ld,headersize=%ld,obj=%ld,how=%ld\n", 481 489 ph->dwSize,ph->dwHeaderSize,ph->dwObj,ph->dwHow); 482 if (!HIWORD(rguid)) {490 if (!HIWORD(rguid)) { 483 491 #ifdef __WIN32OS2__ 484 if(rguid == DIPROP_BUFFERSIZE) { 485 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 486 487 TRACE("(buffersize=%ld)\n",pd->dwData); 488 } 489 else WARN("Unknown type %ld\n",(DWORD)rguid); 492 if(rguid == DIPROP_BUFFERSIZE) { 493 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 494 495 This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0, 496 pd->dwData * sizeof(DIDEVICEOBJECTDATA)); 497 This->queue_pos = 0; 498 This->queue_len = pd->dwData; 499 500 TRACE("(buffersize=%ld)\n",pd->dwData); 501 } 502 else WARN("Unknown type %ld\n",(DWORD)rguid); 490 503 491 504 #else 492 switch ((DWORD)rguid) {493 case (DWORD) DIPROP_BUFFERSIZE: {494 LPCDIPROPDWORDpd = (LPCDIPROPDWORD)ph;495 496 TRACE("(buffersize=%ld)\n",pd->dwData);497 break;498 }499 default:500 WARN("Unknown type %ld\n",(DWORD)rguid);501 break;502 }503 #endif 504 }505 return 0;505 switch ((DWORD)rguid) { 506 case (DWORD) DIPROP_BUFFERSIZE: { 507 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 508 509 TRACE("(buffersize=%ld)\n",pd->dwData); 510 break; 511 } 512 default: 513 WARN("Unknown type %ld\n",(DWORD)rguid); 514 break; 515 } 516 #endif 517 } 518 return 0; 506 519 } 507 520 508 521 static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState( 509 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr522 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr 510 523 ) 511 524 { 512 525 #ifdef __WIN32OS2__ 513 return OSLibGetDIState(len, ptr) ? DI_OK : E_FAIL;526 return OSLibGetDIState(len, ptr) ? DI_OK : E_FAIL; 514 527 #else 515 return KEYBOARD_Driver->pGetDIState(len, ptr)?DI_OK:E_FAIL;528 return KEYBOARD_Driver->pGetDIState(len, ptr)?DI_OK:E_FAIL; 516 529 #endif 517 530 } 518 531 519 532 static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData( 520 LPDIRECTINPUTDEVICE2A iface,DWORD dodsize,LPDIDEVICEOBJECTDATA dod,521 LPDWORD entries,DWORD flags533 LPDIRECTINPUTDEVICE2A iface,DWORD dodsize,LPDIDEVICEOBJECTDATA dod, 534 LPDWORD entries,DWORD flags 522 535 ) 523 536 { 524 ICOM_THIS(SysKeyboardAImpl,iface); 525 HRESULT ret; 526 int i; 527 528 TRACE("(this=%p,%ld,%p,%p(%ld)),0x%08lx)\n", 529 This,dodsize,dod,entries,entries?*entries:0,flags); 530 531 #ifdef __WIN32OS2__ 532 //Copied this from the X11 keyboard driver (991031) 533 { 534 int keyc,n,xentries; 535 BYTE win32keys[256]; 536 537 OSLibGetDIState(256, &win32keys); 538 /* FIXME !!! */ 539 540 if (entries) 541 xentries = *entries; 542 else 543 xentries = 1; 544 545 n = 0; 546 547 for (int i=0;i<256 && (n<xentries);i++) 548 { 549 if (This->keystate[i] == (win32keys[i]&0x80)) 550 continue; 551 if (dod) { 552 /* add an entry */ 553 dod[n].dwOfs = i; /* scancode */ 554 dod[n].dwData = win32keys[i]&0x80; 555 dod[n].dwTimeStamp = time(NULL); 556 dod[n].dwSequence = evsequence++; 557 n++; 558 } 559 if (!(flags & DIGDD_PEEK)) 560 This->keystate[i] = win32keys[i]&0x80; 561 562 } 563 564 if(entries) *entries = n; 565 ret = DI_OK; 566 } 567 #else 568 ret=KEYBOARD_Driver->pGetDIData( 569 This->keystate, dodsize, dod, entries, flags)?DI_OK:E_FAIL; 570 571 for (i=0;i<*entries;i++) { 572 dod[i].dwTimeStamp = time(NULL); 573 dod[i].dwSequence = evsequence++; 574 } 575 #endif 576 return ret; 537 ICOM_THIS(SysKeyboardAImpl,iface); 538 HRESULT ret; 539 int i; 540 541 TRACE("DINPUT-SKAI: GetDeviceData (this=%p,%ld,%p,%p(%ld)),0x%08lx)\n", 542 This,dodsize,dod,entries,entries?*entries:0,flags); 543 544 EnterCriticalSection(&(This->crit)); 545 TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags); 546 547 if (flags & DIGDD_PEEK) 548 FIXME("DIGDD_PEEK\n"); 549 550 if (dod == NULL) { 551 *entries = This->queue_pos; 552 This->queue_pos = 0; 553 } else { 554 /* Check for buffer overflow */ 555 if (This->queue_pos > *entries) { 556 WARN("Buffer overflow not handled properly yet...\n"); 557 This->queue_pos = *entries; 558 } 559 if (dodsize != sizeof(DIDEVICEOBJECTDATA)) { 560 ERR("Wrong structure size !\n"); 561 LeaveCriticalSection(&(This->crit)); 562 return DIERR_INVALIDPARAM; 563 } 564 565 if (This->queue_pos) 566 TRACE("Application retrieving %d event(s).\n", This->queue_pos); 567 568 /* Copy the buffered data into the application queue */ 569 memcpy(dod, This->data_queue, This->queue_pos * dodsize); 570 *entries = This->queue_pos; 571 572 /* Reset the event queue */ 573 This->queue_pos = 0; 574 } 575 LeaveCriticalSection(&(This->crit)); 576 ret = DI_OK; 577 578 return ret; 579 } 580 581 #define GEN_KEYEVENT(offset,data,xtime,seq) \ 582 { \ 583 if (This->queue_pos < This->queue_len) { \ 584 This->data_queue[This->queue_pos].dwOfs = offset; \ 585 This->data_queue[This->queue_pos].dwData = data; \ 586 This->data_queue[This->queue_pos].dwTimeStamp = xtime; \ 587 This->data_queue[This->queue_pos].dwSequence = seq; \ 588 This->queue_pos++; \ 589 } \ 590 } 591 592 LRESULT CALLBACK event_keyHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 593 TRACE("DINPUT-SKAI: keyHandler (msg=%x wParam=0x%X, lParam=0x%lX)\n", msg, wParam, lParam); 594 595 SysKeyboardAImpl* This = (SysKeyboardAImpl*) current_keylock; 596 597 // fake a key up transition for typematic repeat 598 if (msg == WM_KEYDOWN) 599 if (lParam & 0x40000000) { // key was down before 600 dprintf(("Repeat\n")); 601 GEN_KEYEVENT((lParam >> 16) & 0xFF, // scancode 602 0, // key up 603 time(NULL), evsequence++); 604 } 605 GEN_KEYEVENT((lParam >> 16) & 0xFF, // scancode 606 (lParam & 0x80000000) ? 0 : 0x80, 607 time(NULL), evsequence++); 608 return TRUE; 577 609 } 578 610 579 611 static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) 580 612 { 581 ICOM_THIS(SysKeyboardAImpl,iface); 582 TRACE("(this=%p): stub\n",This); 583 return 0; 613 ICOM_THIS(SysKeyboardAImpl,iface); 614 TRACE("DINPUT-SKAI: Acquire (this=%p)\n",This); 615 616 if (This->acquired == 0) { 617 /* Store (in a global variable) the current lock */ 618 current_keylock = (IDirectInputDeviceA*)This; 619 620 /* register the keyboard event callback */ 621 KEYBOARD_Enable(event_keyHandler); 622 This->acquired = 1; 623 } 624 return 0; 584 625 } 585 626 586 627 static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) 587 628 { 588 ICOM_THIS(SysKeyboardAImpl,iface); 589 TRACE("(this=%p): stub\n",This); 590 return 0; 629 ICOM_THIS(SysKeyboardAImpl,iface); 630 TRACE("DINPUT-SKAI: Unacquire (this=%p)\n",This); 631 632 /* unregister the callback */ 633 KEYBOARD_Enable(NULL); 634 635 /* Free the data queue */ 636 if (This->data_queue != NULL) 637 HeapFree(GetProcessHeap(),0,This->data_queue); 638 639 /* No more locks */ 640 current_keylock = NULL; 641 642 This->acquired = 0; 643 return 0; 591 644 } 592 645 593 646 static HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( 594 LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj647 LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj 595 648 ) 596 649 { 597 ICOM_THIS(IDirectInputDevice2AImpl,iface);598 charxbuf[50];599 600 WINE_StringFromCLSID(riid,xbuf);601 TRACE("(this=%p,%s,%p)\n",This,xbuf,ppobj);602 if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) {603 IDirectInputDevice2_AddRef(iface);604 *ppobj = This;605 return 0;606 }607 if (!memcmp(&IID_IDirectInputDeviceA,riid,sizeof(*riid))) {608 IDirectInputDevice2_AddRef(iface);609 *ppobj = This;610 return 0;611 }612 if (!memcmp(&IID_IDirectInputDevice2A,riid,sizeof(*riid))) {613 IDirectInputDevice2_AddRef(iface);614 *ppobj = This;615 return 0;616 }617 return E_FAIL;650 ICOM_THIS(IDirectInputDevice2AImpl,iface); 651 char xbuf[50]; 652 653 WINE_StringFromCLSID(riid,xbuf); 654 TRACE("(this=%p,%s,%p)\n",This,xbuf,ppobj); 655 if (!memcmp(&IID_IUnknown,riid,sizeof(*riid))) { 656 IDirectInputDevice2_AddRef(iface); 657 *ppobj = This; 658 return 0; 659 } 660 if (!memcmp(&IID_IDirectInputDeviceA,riid,sizeof(*riid))) { 661 IDirectInputDevice2_AddRef(iface); 662 *ppobj = This; 663 return 0; 664 } 665 if (!memcmp(&IID_IDirectInputDevice2A,riid,sizeof(*riid))) { 666 IDirectInputDevice2_AddRef(iface); 667 *ppobj = This; 668 return 0; 669 } 670 return E_FAIL; 618 671 } 619 672 620 673 static ULONG WINAPI IDirectInputDevice2AImpl_AddRef( 621 LPDIRECTINPUTDEVICE2A iface)622 { 623 ICOM_THIS(IDirectInputDevice2AImpl,iface);624 return ++This->ref;674 LPDIRECTINPUTDEVICE2A iface) 675 { 676 ICOM_THIS(IDirectInputDevice2AImpl,iface); 677 return ++This->ref; 625 678 } 626 679 627 680 static HRESULT WINAPI IDirectInputDevice2AImpl_GetCapabilities( 628 LPDIRECTINPUTDEVICE2A iface,629 LPDIDEVCAPS lpDIDevCaps)630 { 631 lpDIDevCaps->dwFlags = DIDC_ATTACHED;632 FIXME("stub!\n");633 return DI_OK;681 LPDIRECTINPUTDEVICE2A iface, 682 LPDIDEVCAPS lpDIDevCaps) 683 { 684 lpDIDevCaps->dwFlags = DIDC_ATTACHED; 685 FIXME("stub!\n"); 686 return DI_OK; 634 687 } 635 688 636 689 static HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects( 637 LPDIRECTINPUTDEVICE2A iface,638 LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback,639 LPVOID lpvRef,640 DWORD dwFlags)641 { 642 FIXME("stub!\n");690 LPDIRECTINPUTDEVICE2A iface, 691 LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, 692 LPVOID lpvRef, 693 DWORD dwFlags) 694 { 695 FIXME("stub!\n"); 643 696 #if 0 644 if (lpCallback)645 lpCallback(NULL, lpvRef);646 #endif 647 return DI_OK;648 } 649 697 if (lpCallback) 698 lpCallback(NULL, lpvRef); 699 #endif 700 return DI_OK; 701 } 702 650 703 static HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( 651 LPDIRECTINPUTDEVICE2A iface,652 REFGUID rguid,653 LPDIPROPHEADER pdiph)654 { 655 FIXME("stub!\n");656 return DI_OK;704 LPDIRECTINPUTDEVICE2A iface, 705 REFGUID rguid, 706 LPDIPROPHEADER pdiph) 707 { 708 FIXME("stub!\n"); 709 return DI_OK; 657 710 } 658 711 659 712 static HRESULT WINAPI IDirectInputDevice2AImpl_GetObjectInfo( 660 LPDIRECTINPUTDEVICE2A iface,661 LPDIDEVICEOBJECTINSTANCEA pdidoi,662 DWORD dwObj,663 DWORD dwHow)664 { 665 FIXME("stub!\n");666 return DI_OK;667 } 668 713 LPDIRECTINPUTDEVICE2A iface, 714 LPDIDEVICEOBJECTINSTANCEA pdidoi, 715 DWORD dwObj, 716 DWORD dwHow) 717 { 718 FIXME("stub!\n"); 719 return DI_OK; 720 } 721 669 722 static HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( 670 LPDIRECTINPUTDEVICE2A iface,671 LPDIDEVICEINSTANCEA pdidi)672 { 673 FIXME("stub!\n");674 return DI_OK;675 } 676 723 LPDIRECTINPUTDEVICE2A iface, 724 LPDIDEVICEINSTANCEA pdidi) 725 { 726 FIXME("stub!\n"); 727 return DI_OK; 728 } 729 677 730 static HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( 678 LPDIRECTINPUTDEVICE2A iface,679 HWND hwndOwner,680 DWORD dwFlags)681 { 682 FIXME("stub!\n");683 return DI_OK;684 } 685 731 LPDIRECTINPUTDEVICE2A iface, 732 HWND hwndOwner, 733 DWORD dwFlags) 734 { 735 FIXME("stub!\n"); 736 return DI_OK; 737 } 738 686 739 static HRESULT WINAPI IDirectInputDevice2AImpl_Initialize( 687 LPDIRECTINPUTDEVICE2A iface,688 HINSTANCE hinst,689 DWORD dwVersion,690 REFGUID rguid)691 { 692 FIXME("stub!\n");693 return DI_OK;694 } 695 696 /****************************************************************************** 697 * IDirectInputDevice2A740 LPDIRECTINPUTDEVICE2A iface, 741 HINSTANCE hinst, 742 DWORD dwVersion, 743 REFGUID rguid) 744 { 745 FIXME("stub!\n"); 746 return DI_OK; 747 } 748 749 /****************************************************************************** 750 * IDirectInputDevice2A 698 751 */ 699 752 700 753 static HRESULT WINAPI IDirectInputDevice2AImpl_CreateEffect( 701 LPDIRECTINPUTDEVICE2A iface,702 REFGUID rguid,703 LPCDIEFFECT lpeff,704 LPDIRECTINPUTEFFECT *ppdef,705 LPUNKNOWN pUnkOuter)706 { 707 FIXME("stub!\n");708 return DI_OK;754 LPDIRECTINPUTDEVICE2A iface, 755 REFGUID rguid, 756 LPCDIEFFECT lpeff, 757 LPDIRECTINPUTEFFECT *ppdef, 758 LPUNKNOWN pUnkOuter) 759 { 760 FIXME("stub!\n"); 761 return DI_OK; 709 762 } 710 763 711 764 static HRESULT WINAPI IDirectInputDevice2AImpl_EnumEffects( 712 LPDIRECTINPUTDEVICE2A iface,713 LPDIENUMEFFECTSCALLBACKA lpCallback,714 LPVOID lpvRef,715 DWORD dwFlags)716 { 717 FIXME("stub!\n");718 if (lpCallback)719 lpCallback(NULL, lpvRef);720 return DI_OK;765 LPDIRECTINPUTDEVICE2A iface, 766 LPDIENUMEFFECTSCALLBACKA lpCallback, 767 LPVOID lpvRef, 768 DWORD dwFlags) 769 { 770 FIXME("stub!\n"); 771 if (lpCallback) 772 lpCallback(NULL, lpvRef); 773 return DI_OK; 721 774 } 722 775 723 776 static HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( 724 LPDIRECTINPUTDEVICE2A iface,725 LPDIEFFECTINFOA lpdei,726 REFGUID rguid)727 { 728 FIXME("stub!\n");729 return DI_OK;777 LPDIRECTINPUTDEVICE2A iface, 778 LPDIEFFECTINFOA lpdei, 779 REFGUID rguid) 780 { 781 FIXME("stub!\n"); 782 return DI_OK; 730 783 } 731 784 732 785 static HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( 733 LPDIRECTINPUTDEVICE2A iface,734 LPDWORD pdwOut)735 { 736 FIXME("stub!\n");737 return DI_OK;786 LPDIRECTINPUTDEVICE2A iface, 787 LPDWORD pdwOut) 788 { 789 FIXME("stub!\n"); 790 return DI_OK; 738 791 } 739 792 740 793 static HRESULT WINAPI IDirectInputDevice2AImpl_SendForceFeedbackCommand( 741 LPDIRECTINPUTDEVICE2A iface,742 DWORD dwFlags)743 { 744 FIXME("stub!\n");745 return DI_OK;794 LPDIRECTINPUTDEVICE2A iface, 795 DWORD dwFlags) 796 { 797 FIXME("stub!\n"); 798 return DI_OK; 746 799 } 747 800 748 801 static HRESULT WINAPI IDirectInputDevice2AImpl_EnumCreatedEffectObjects( 749 LPDIRECTINPUTDEVICE2A iface,750 LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback,751 LPVOID lpvRef,752 DWORD dwFlags)753 { 754 FIXME("stub!\n");755 if (lpCallback)756 lpCallback(NULL, lpvRef);757 return DI_OK;802 LPDIRECTINPUTDEVICE2A iface, 803 LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, 804 LPVOID lpvRef, 805 DWORD dwFlags) 806 { 807 FIXME("stub!\n"); 808 if (lpCallback) 809 lpCallback(NULL, lpvRef); 810 return DI_OK; 758 811 } 759 812 760 813 static HRESULT WINAPI IDirectInputDevice2AImpl_Escape( 761 LPDIRECTINPUTDEVICE2A iface,762 LPDIEFFESCAPE lpDIEEsc)763 { 764 FIXME("stub!\n");765 return DI_OK;814 LPDIRECTINPUTDEVICE2A iface, 815 LPDIEFFESCAPE lpDIEEsc) 816 { 817 FIXME("stub!\n"); 818 return DI_OK; 766 819 } 767 820 768 821 static HRESULT WINAPI IDirectInputDevice2AImpl_Poll( 769 LPDIRECTINPUTDEVICE2A iface)770 { 771 FIXME("stub!\n");772 return DI_OK;822 LPDIRECTINPUTDEVICE2A iface) 823 { 824 FIXME("stub!\n"); 825 return DI_OK; 773 826 } 774 827 775 828 static HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData( 776 LPDIRECTINPUTDEVICE2A iface,777 DWORD cbObjectData,778 LPDIDEVICEOBJECTDATA rgdod,779 LPDWORD pdwInOut,780 DWORD dwFlags)781 { 782 FIXME("stub!\n");783 return DI_OK;784 } 785 786 /****************************************************************************** 787 * SysMouseA (DInput Mouse support)829 LPDIRECTINPUTDEVICE2A iface, 830 DWORD cbObjectData, 831 LPDIDEVICEOBJECTDATA rgdod, 832 LPDWORD pdwInOut, 833 DWORD dwFlags) 834 { 835 FIXME("stub!\n"); 836 return DI_OK; 837 } 838 839 /****************************************************************************** 840 * SysMouseA (DInput Mouse support) 788 841 */ 789 842 … … 793 846 static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE2A iface) 794 847 { 795 ICOM_THIS(SysMouseAImpl,iface);796 797 This->ref--;798 if (This->ref)799 return This->ref;800 801 /* Free the data queue */802 if (This->data_queue != NULL)803 HeapFree(GetProcessHeap(),0,This->data_queue);804 805 /* Install the previous event handler (in case of releasing an aquired806 mouse device) */807 if (This->prev_handler != NULL)808 MOUSE_Enable(This->prev_handler);809 DeleteCriticalSection(&(This->crit));810 811 HeapFree(GetProcessHeap(),0,This);812 return 0;848 ICOM_THIS(SysMouseAImpl,iface); 849 850 This->ref--; 851 if (This->ref) 852 return This->ref; 853 854 /* Free the data queue */ 855 if (This->data_queue != NULL) 856 HeapFree(GetProcessHeap(),0,This->data_queue); 857 858 /* Install the previous event handler (in case of releasing an aquired 859 mouse device) */ 860 if (This->prev_handler != NULL) 861 MOUSE_Enable(This->prev_handler); 862 DeleteCriticalSection(&(This->crit)); 863 864 HeapFree(GetProcessHeap(),0,This); 865 return 0; 813 866 } 814 867 … … 819 872 */ 820 873 static HRESULT WINAPI SysMouseAImpl_SetCooperativeLevel( 821 LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags874 LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags 822 875 ) 823 876 { … … 831 884 /* Store the window which asks for the mouse */ 832 885 This->win = hwnd; 833 886 834 887 return 0; 835 888 } … … 844 897 */ 845 898 static HRESULT WINAPI SysMouseAImpl_SetDataFormat( 846 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df899 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df 847 900 ) 848 901 { 849 902 ICOM_THIS(SysMouseAImpl,iface); 850 903 int i; 851 904 852 905 TRACE("(this=%p,%p)\n",This,df); 853 906 … … 859 912 860 913 for (i=0;i<df->dwNumObjs;i++) { 861 char xbuf[50];862 914 char xbuf[50]; 915 863 916 if (df->rgodf[i].pguid) 864 917 WINE_StringFromCLSID(df->rgodf[i].pguid,xbuf); … … 877 930 return DIERR_INVALIDPARAM; 878 931 } 879 932 880 933 /* For the moment, ignore these fields and return always as if 881 934 c_dfDIMouse was passed as format... */ … … 888 941 else 889 942 ERR("Neither absolute nor relative flag set."); 890 943 891 944 This->df = (LPCDIDATAFORMAT)HeapAlloc(GetProcessHeap(),0,df->dwSize+(df->dwNumObjs*df->dwObjSize)); 892 945 memcpy(This->df,df,df->dwSize+(df->dwNumObjs*df->dwObjSize)); … … 894 947 } 895 948 896 #define GEN_EVENT(offset,data,xtime,seq) \897 { \898 if (This->queue_pos < This->queue_len) { \899 This->data_queue[This->queue_pos].dwOfs = offset; \900 This->data_queue[This->queue_pos].dwData = data; \901 This->data_queue[This->queue_pos].dwTimeStamp = xtime; \902 This->data_queue[This->queue_pos].dwSequence = seq; \903 This->queue_pos++; \904 } \905 } 906 907 949 #define GEN_EVENT(offset,data,xtime,seq) \ 950 { \ 951 if (This->queue_pos < This->queue_len) { \ 952 This->data_queue[This->queue_pos].dwOfs = offset; \ 953 This->data_queue[This->queue_pos].dwData = data; \ 954 This->data_queue[This->queue_pos].dwTimeStamp = xtime; \ 955 This->data_queue[This->queue_pos].dwSequence = seq; \ 956 This->queue_pos++; \ 957 } \ 958 } 959 960 908 961 /* Our private mouse event handler */ 909 962 static void WINAPI dinput_mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, 910 DWORD cButtons, DWORD dwExtraInfo )963 DWORD cButtons, DWORD dwExtraInfo ) 911 964 { 912 965 DWORD posX, posY, keyState, xtime, extra; 913 966 SysMouseAImpl* This = (SysMouseAImpl*) current_lock; 914 967 915 968 EnterCriticalSection(&(This->crit)); 916 969 /* Mouse moved -> send event if asked */ 917 970 if (This->hEvent) 918 971 SetEvent(This->hEvent); 919 972 920 973 if ( !IsBadReadPtr( (LPVOID)dwExtraInfo, sizeof(WINE_MOUSEEVENT) ) 921 974 && ((WINE_MOUSEEVENT *)dwExtraInfo)->magic == WINE_MOUSEEVENT_MAGIC ) { … … 924 977 xtime = wme->time; 925 978 extra = (DWORD)wme->hWnd; 926 979 927 980 assert( dwFlags & MOUSEEVENTF_ABSOLUTE ); 928 981 posX = (dx * GetSystemMetrics(SM_CXSCREEN)) >> 16; … … 939 992 if (This->absolute) { 940 993 if (posX != This->prevX) 941 GEN_EVENT(DIMOFS_X, posX, xtime, 0);994 GEN_EVENT(DIMOFS_X, posX, xtime, 0); 942 995 if (posY != This->prevY) 943 GEN_EVENT(DIMOFS_Y, posY, xtime, 0);996 GEN_EVENT(DIMOFS_Y, posY, xtime, 0); 944 997 } else { 945 998 /* Relative mouse input : the real fun starts here... */ 946 999 if (This->need_warp) { 947 if (posX != This->prevX)948 GEN_EVENT(DIMOFS_X, posX - This->prevX, xtime, evsequence++);949 if (posY != This->prevY)950 GEN_EVENT(DIMOFS_Y, posY - This->prevY, xtime, evsequence++);1000 if (posX != This->prevX) 1001 GEN_EVENT(DIMOFS_X, posX - This->prevX, xtime, evsequence++); 1002 if (posY != This->prevY) 1003 GEN_EVENT(DIMOFS_Y, posY - This->prevY, xtime, evsequence++); 951 1004 } else { 952 /* This is the first time the event handler has been called after a953 GetData of GetState. */954 if (posX != This->win_centerX) {955 GEN_EVENT(DIMOFS_X, posX - This->win_centerX, xtime, evsequence++);956 This->need_warp = 1;957 }958 959 if (posY != This->win_centerY) {960 GEN_EVENT(DIMOFS_Y, posY - This->win_centerY, xtime, evsequence++);961 This->need_warp = 1;962 }1005 /* This is the first time the event handler has been called after a 1006 GetData of GetState. */ 1007 if (posX != This->win_centerX) { 1008 GEN_EVENT(DIMOFS_X, posX - This->win_centerX, xtime, evsequence++); 1009 This->need_warp = 1; 1010 } 1011 1012 if (posY != This->win_centerY) { 1013 GEN_EVENT(DIMOFS_Y, posY - This->win_centerY, xtime, evsequence++); 1014 This->need_warp = 1; 1015 } 963 1016 } 964 1017 } … … 1015 1068 { 1016 1069 ICOM_THIS(SysMouseAImpl,iface); 1017 RECT rect;1018 1070 RECT rect; 1071 1019 1072 TRACE("(this=%p)\n",This); 1020 1073 … … 1028 1081 This->prev_handler = mouse_event; 1029 1082 #endif 1030 1083 1031 1084 /* Store (in a global variable) the current lock */ 1032 1085 current_lock = (IDirectInputDevice2A*)This; 1033 1086 1034 1087 /* Install our own mouse event handler */ 1035 1088 MOUSE_Enable(dinput_mouse_event); 1036 1089 1037 1090 /* Get the window dimension and find the center */ 1038 1091 GetWindowRect(This->win, &rect); … … 1068 1121 MOUSE_Enable(This->prev_handler); 1069 1122 This->prev_handler = NULL; 1070 1123 1071 1124 /* No more locks */ 1072 1125 current_lock = NULL; … … 1074 1127 /* Unacquire device */ 1075 1128 This->acquired = 0; 1076 1129 1077 1130 return 0; 1078 1131 } … … 1085 1138 */ 1086 1139 static HRESULT WINAPI SysMouseAImpl_GetDeviceState( 1087 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr1140 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr 1088 1141 ) { 1089 1142 ICOM_THIS(SysMouseAImpl,iface); 1090 1143 DWORD rx, ry, state; 1091 1144 struct DIMOUSESTATE *mstate = (struct DIMOUSESTATE *) ptr; 1092 1145 1093 1146 TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr); 1094 1147 1095 1148 /* Check if the buffer is big enough */ 1096 1149 if (len < sizeof(struct DIMOUSESTATE)) { … … 1098 1151 return DIERR_INVALIDPARAM; 1099 1152 } 1100 1153 1101 1154 /* Get the mouse position */ 1102 1155 #ifdef __WIN32OS2__ … … 1123 1176 mstate->rgbButtons[2] = (state & MK_MBUTTON ? 0xFF : 0x00); 1124 1177 mstate->rgbButtons[3] = 0x00; 1125 1178 1126 1179 /* Check if we need to do a mouse warping */ 1127 1180 if (This->need_warp) { … … 1139 1192 This->need_warp = 0; 1140 1193 } 1141 1194 1142 1195 TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n", 1143 mstate->lX, mstate->lY,1144 mstate->rgbButtons[0], mstate->rgbButtons[2], mstate->rgbButtons[1]);1145 1196 mstate->lX, mstate->lY, 1197 mstate->rgbButtons[0], mstate->rgbButtons[2], mstate->rgbButtons[1]); 1198 1146 1199 return 0; 1147 1200 } … … 1151 1204 */ 1152 1205 static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE2A iface, 1153 DWORD dodsize,1154 LPDIDEVICEOBJECTDATA dod,1155 LPDWORD entries,1156 DWORD flags1206 DWORD dodsize, 1207 LPDIDEVICEOBJECTDATA dod, 1208 LPDWORD entries, 1209 DWORD flags 1157 1210 ) { 1158 1211 ICOM_THIS(SysMouseAImpl,iface); 1159 1212 1160 1213 EnterCriticalSection(&(This->crit)); 1161 1214 TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags); … … 1180 1233 1181 1234 if (This->queue_pos) 1182 TRACE("Application retrieving %d event(s).\n", This->queue_pos);1183 1235 TRACE("Application retrieving %d event(s).\n", This->queue_pos); 1236 1184 1237 /* Copy the buffered data into the application queue */ 1185 1238 memcpy(dod, This->data_queue, This->queue_pos * dodsize); … … 1190 1243 } 1191 1244 LeaveCriticalSection(&(This->crit)); 1192 1245 1193 1246 #if 0 /* FIXME: seems to create motion events, which fire back at us. */ 1194 1247 /* Check if we need to do a mouse warping */ … … 1217 1270 */ 1218 1271 static HRESULT WINAPI SysMouseAImpl_SetProperty(LPDIRECTINPUTDEVICE2A iface, 1219 REFGUID rguid,1220 LPCDIPROPHEADER ph)1272 REFGUID rguid, 1273 LPCDIPROPHEADER ph) 1221 1274 { 1222 1275 ICOM_THIS(SysMouseAImpl,iface); 1223 char xbuf[50];1276 char xbuf[50]; 1224 1277 1225 1278 if (HIWORD(rguid)) … … 1229 1282 1230 1283 TRACE("(this=%p,%s,%p)\n",This,xbuf,ph); 1231 1284 1232 1285 if (!HIWORD(rguid)) { 1233 1286 #ifdef __WIN32OS2__ 1234 1287 if(rguid == DIPROP_BUFFERSIZE) { 1235 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;1236 1288 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 1289 1237 1290 TRACE("buffersize = %ld\n",pd->dwData); 1238 1291 1239 1292 This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0, 1240 pd->dwData * sizeof(DIDEVICEOBJECTDATA));1293 pd->dwData * sizeof(DIDEVICEOBJECTDATA)); 1241 1294 This->queue_pos = 0; 1242 1295 This->queue_len = pd->dwData; … … 1248 1301 switch ((DWORD)rguid) { 1249 1302 case (DWORD) DIPROP_BUFFERSIZE: { 1250 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;1251 1303 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 1304 1252 1305 TRACE("buffersize = %ld\n",pd->dwData); 1253 1306 1254 1307 This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0, 1255 pd->dwData * sizeof(DIDEVICEOBJECTDATA));1308 pd->dwData * sizeof(DIDEVICEOBJECTDATA)); 1256 1309 This->queue_pos = 0; 1257 1310 This->queue_len = pd->dwData; … … 1264 1317 #endif 1265 1318 } 1266 1319 1267 1320 return 0; 1268 1321 } … … 1272 1325 */ 1273 1326 static HRESULT WINAPI SysMouseAImpl_SetEventNotification(LPDIRECTINPUTDEVICE2A iface, 1274 HANDLE hnd) {1327 HANDLE hnd) { 1275 1328 ICOM_THIS(SysMouseAImpl,iface); 1276 1329 … … 1284 1337 #ifdef HAVE_LINUX_22_JOYSTICK_API 1285 1338 /****************************************************************************** 1286 * Joystick1339 * Joystick 1287 1340 */ 1288 1341 static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE2A iface) 1289 1342 { 1290 ICOM_THIS(JoystickAImpl,iface);1291 1292 This->ref--;1293 if (This->ref)1294 return This->ref;1295 HeapFree(GetProcessHeap(),0,This);1296 return 0;1343 ICOM_THIS(JoystickAImpl,iface); 1344 1345 This->ref--; 1346 if (This->ref) 1347 return This->ref; 1348 HeapFree(GetProcessHeap(),0,This); 1349 return 0; 1297 1350 } 1298 1351 … … 1302 1355 */ 1303 1356 static HRESULT WINAPI JoystickAImpl_SetDataFormat( 1304 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df1357 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df 1305 1358 ) 1306 1359 { 1307 1360 ICOM_THIS(JoystickAImpl,iface); 1308 1361 int i; 1309 1362 1310 1363 TRACE("(this=%p,%p)\n",This,df); 1311 1364 … … 1317 1370 1318 1371 for (i=0;i<df->dwNumObjs;i++) { 1319 char xbuf[50];1320 1372 char xbuf[50]; 1373 1321 1374 if (df->rgodf[i].pguid) 1322 1375 WINE_StringFromCLSID(df->rgodf[i].pguid,xbuf); … … 1339 1392 { 1340 1393 ICOM_THIS(JoystickAImpl,iface); 1341 1394 1342 1395 TRACE("(this=%p)\n",This); 1343 1396 if (This->joyfd!=-1) 1344 return 0;1397 return 0; 1345 1398 This->joyfd=open(JOYDEV,O_RDONLY); 1346 1399 if (This->joyfd==-1) 1347 return DIERR_NOTFOUND;1400 return DIERR_NOTFOUND; 1348 1401 return 0; 1349 1402 } … … 1358 1411 TRACE("(this=%p)\n",This); 1359 1412 if (This->joyfd!=-1) { 1360 close(This->joyfd);1361 This->joyfd = -1;1413 close(This->joyfd); 1414 This->joyfd = -1; 1362 1415 } 1363 1416 return 0; … … 1368 1421 static void joy_polldev(JoystickAImpl *This) { 1369 1422 struct timeval tv; 1370 fd_set readfds;1371 struct js_event jse;1423 fd_set readfds; 1424 struct js_event jse; 1372 1425 1373 1426 if (This->joyfd==-1) 1374 return;1427 return; 1375 1428 while (1) { 1376 memset(&tv,0,sizeof(tv));1377 FD_ZERO(&readfds);FD_SET(This->joyfd,&readfds);1378 if (1>select(This->joyfd+1,&readfds,NULL,NULL,&tv))1379 return;1380 /* we have one event, so we can read */1381 if (sizeof(jse)!=read(This->joyfd,&jse,sizeof(jse))) {1382 return;1383 }1384 TRACE("js_event: type 0x%x, number %d, value %d\n",jse.type,jse.number,jse.value);1385 if (jse.type & JS_EVENT_BUTTON) {1386 GEN_EVENT(DIJOFS_BUTTON(jse.number),jse.value?0x80:0x00,jse.time,evsequence++);1387 This->js.rgbButtons[jse.number] = jse.value?0x80:0x00;1388 }1389 if (jse.type & JS_EVENT_AXIS) {1390 switch (jse.number) {1391 case 0:1392 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++);1393 This->js.lX = map_axis(jse.value);1394 break;1395 case 1:1396 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++);1397 This->js.lY = map_axis(jse.value);1398 break;1399 case 2:1400 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++);1401 This->js.lZ = map_axis(jse.value);1402 break;1403 default:1404 FIXME("more then 3 axes (%d) not handled!\n",jse.number);1405 break;1406 }1407 }1429 memset(&tv,0,sizeof(tv)); 1430 FD_ZERO(&readfds);FD_SET(This->joyfd,&readfds); 1431 if (1>select(This->joyfd+1,&readfds,NULL,NULL,&tv)) 1432 return; 1433 /* we have one event, so we can read */ 1434 if (sizeof(jse)!=read(This->joyfd,&jse,sizeof(jse))) { 1435 return; 1436 } 1437 TRACE("js_event: type 0x%x, number %d, value %d\n",jse.type,jse.number,jse.value); 1438 if (jse.type & JS_EVENT_BUTTON) { 1439 GEN_EVENT(DIJOFS_BUTTON(jse.number),jse.value?0x80:0x00,jse.time,evsequence++); 1440 This->js.rgbButtons[jse.number] = jse.value?0x80:0x00; 1441 } 1442 if (jse.type & JS_EVENT_AXIS) { 1443 switch (jse.number) { 1444 case 0: 1445 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++); 1446 This->js.lX = map_axis(jse.value); 1447 break; 1448 case 1: 1449 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++); 1450 This->js.lY = map_axis(jse.value); 1451 break; 1452 case 2: 1453 GEN_EVENT(jse.number*4,jse.value,jse.time,evsequence++); 1454 This->js.lZ = map_axis(jse.value); 1455 break; 1456 default: 1457 FIXME("more then 3 axes (%d) not handled!\n",jse.number); 1458 break; 1459 } 1460 } 1408 1461 } 1409 1462 } … … 1414 1467 */ 1415 1468 static HRESULT WINAPI JoystickAImpl_GetDeviceState( 1416 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr1469 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr 1417 1470 ) { 1418 1471 ICOM_THIS(JoystickAImpl,iface); 1419 1472 1420 1473 joy_polldev(This); 1421 1474 TRACE("(this=%p,0x%08lx,%p)\n",This,len,ptr); 1422 1475 if (len != sizeof(DIJOYSTATE)) { 1423 FIXME("len %ld is not sizeof(DIJOYSTATE), unsupported format.\n",len);1476 FIXME("len %ld is not sizeof(DIJOYSTATE), unsupported format.\n",len); 1424 1477 } 1425 1478 memcpy(ptr,&(This->js),len); … … 1432 1485 */ 1433 1486 static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE2A iface, 1434 DWORD dodsize,1435 LPDIDEVICEOBJECTDATA dod,1436 LPDWORD entries,1437 DWORD flags1487 DWORD dodsize, 1488 LPDIDEVICEOBJECTDATA dod, 1489 LPDWORD entries, 1490 DWORD flags 1438 1491 ) { 1439 1492 ICOM_THIS(JoystickAImpl,iface); 1440 1493 1441 1494 FIXME("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx),STUB!\n",This,dodsize,*entries,flags); 1442 1495 … … 1455 1508 */ 1456 1509 static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE2A iface, 1457 REFGUID rguid,1458 LPCDIPROPHEADER ph)1510 REFGUID rguid, 1511 LPCDIPROPHEADER ph) 1459 1512 { 1460 1513 ICOM_THIS(JoystickAImpl,iface); 1461 char xbuf[50];1514 char xbuf[50]; 1462 1515 1463 1516 if (HIWORD(rguid)) … … 1468 1521 FIXME("(this=%p,%s,%p)\n",This,xbuf,ph); 1469 1522 FIXME("ph.dwSize = %ld, ph.dwHeaderSize =%ld, ph.dwObj = %ld, ph.dwHow= %ld\n",ph->dwSize, ph->dwHeaderSize,ph->dwObj,ph->dwHow); 1470 1523 1471 1524 if (!HIWORD(rguid)) { 1472 1525 switch ((DWORD)rguid) { 1473 1526 case (DWORD) DIPROP_BUFFERSIZE: { 1474 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;1527 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 1475 1528 1476 1529 FIXME("buffersize = %ld\n",pd->dwData); … … 1478 1531 } 1479 1532 case (DWORD)DIPROP_RANGE: { 1480 LPCDIPROPRANGE pr = (LPCDIPROPRANGE)ph;1533 LPCDIPROPRANGE pr = (LPCDIPROPRANGE)ph; 1481 1534 1482 1535 FIXME("proprange(%ld,%ld)\n",pr->lMin,pr->lMax); … … 1486 1539 } 1487 1540 case (DWORD)DIPROP_DEADZONE: { 1488 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph;1541 LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; 1489 1542 1490 1543 FIXME("deadzone(%ld)\n",pd->dwData); … … 1504 1557 */ 1505 1558 static HRESULT WINAPI JoystickAImpl_SetEventNotification( 1506 LPDIRECTINPUTDEVICE2A iface, HANDLE hnd1559 LPDIRECTINPUTDEVICE2A iface, HANDLE hnd 1507 1560 ) { 1508 1561 ICOM_THIS(JoystickAImpl,iface); … … 1514 1567 1515 1568 static HRESULT WINAPI JoystickAImpl_GetCapabilities( 1516 LPDIRECTINPUTDEVICE2A iface,1517 LPDIDEVCAPS lpDIDevCaps)1569 LPDIRECTINPUTDEVICE2A iface, 1570 LPDIDEVCAPS lpDIDevCaps) 1518 1571 { 1519 1572 ICOM_THIS(JoystickAImpl,iface); 1520 BYTE axes,buttons;1521 int xfd = This->joyfd;1573 BYTE axes,buttons; 1574 int xfd = This->joyfd; 1522 1575 1523 1576 TRACE("%p->(%p)\n",iface,lpDIDevCaps); 1524 1577 if (xfd==-1) 1525 xfd = open(JOYDEV,O_RDONLY);1526 lpDIDevCaps->dwFlags = DIDC_ATTACHED;1527 lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK;1578 xfd = open(JOYDEV,O_RDONLY); 1579 lpDIDevCaps->dwFlags = DIDC_ATTACHED; 1580 lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK; 1528 1581 #ifdef JSIOCGAXES 1529 1582 if (-1==ioctl(xfd,JSIOCGAXES,&axes)) 1530 axes = 2;1583 axes = 2; 1531 1584 lpDIDevCaps->dwAxes = axes; 1532 1585 #endif 1533 1586 #ifdef JSIOCGBUTTONS 1534 1587 if (-1==ioctl(xfd,JSIOCGAXES,&buttons)) 1535 buttons = 2;1588 buttons = 2; 1536 1589 lpDIDevCaps->dwButtons = buttons; 1537 1590 #endif 1538 1591 if (xfd!=This->joyfd) 1539 close(xfd);1592 close(xfd); 1540 1593 return DI_OK; 1541 1594 } … … 1552 1605 /****************************************************************************/ 1553 1606 1554 ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt = 1555 { 1556 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE1557 IDirectInputDevice2AImpl_QueryInterface,1558 IDirectInputDevice2AImpl_AddRef,1559 IDirectInputDevice2AImpl_Release,1560 IDirectInputDevice2AImpl_GetCapabilities,1561 IDirectInputDevice2AImpl_EnumObjects,1562 IDirectInputDevice2AImpl_GetProperty,1563 SysKeyboardAImpl_SetProperty,1564 SysKeyboardAImpl_Acquire,1565 SysKeyboardAImpl_Unacquire,1566 SysKeyboardAImpl_GetDeviceState,1567 SysKeyboardAImpl_GetDeviceData,1568 IDirectInputDevice2AImpl_SetDataFormat,1569 IDirectInputDevice2AImpl_SetEventNotification,1570 IDirectInputDevice2AImpl_SetCooperativeLevel,1571 IDirectInputDevice2AImpl_GetObjectInfo,1572 IDirectInputDevice2AImpl_GetDeviceInfo,1573 IDirectInputDevice2AImpl_RunControlPanel,1574 IDirectInputDevice2AImpl_Initialize,1575 IDirectInputDevice2AImpl_CreateEffect,1576 IDirectInputDevice2AImpl_EnumEffects,1577 IDirectInputDevice2AImpl_GetEffectInfo,1578 IDirectInputDevice2AImpl_GetForceFeedbackState,1579 IDirectInputDevice2AImpl_SendForceFeedbackCommand,1580 IDirectInputDevice2AImpl_EnumCreatedEffectObjects,1581 IDirectInputDevice2AImpl_Escape,1582 IDirectInputDevice2AImpl_Poll,1583 IDirectInputDevice2AImpl_SendDeviceData,1607 ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt = 1608 { 1609 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1610 IDirectInputDevice2AImpl_QueryInterface, 1611 IDirectInputDevice2AImpl_AddRef, 1612 IDirectInputDevice2AImpl_Release, 1613 IDirectInputDevice2AImpl_GetCapabilities, 1614 IDirectInputDevice2AImpl_EnumObjects, 1615 IDirectInputDevice2AImpl_GetProperty, 1616 SysKeyboardAImpl_SetProperty, 1617 SysKeyboardAImpl_Acquire, 1618 SysKeyboardAImpl_Unacquire, 1619 SysKeyboardAImpl_GetDeviceState, 1620 SysKeyboardAImpl_GetDeviceData, 1621 IDirectInputDevice2AImpl_SetDataFormat, 1622 IDirectInputDevice2AImpl_SetEventNotification, 1623 IDirectInputDevice2AImpl_SetCooperativeLevel, 1624 IDirectInputDevice2AImpl_GetObjectInfo, 1625 IDirectInputDevice2AImpl_GetDeviceInfo, 1626 IDirectInputDevice2AImpl_RunControlPanel, 1627 IDirectInputDevice2AImpl_Initialize, 1628 IDirectInputDevice2AImpl_CreateEffect, 1629 IDirectInputDevice2AImpl_EnumEffects, 1630 IDirectInputDevice2AImpl_GetEffectInfo, 1631 IDirectInputDevice2AImpl_GetForceFeedbackState, 1632 IDirectInputDevice2AImpl_SendForceFeedbackCommand, 1633 IDirectInputDevice2AImpl_EnumCreatedEffectObjects, 1634 IDirectInputDevice2AImpl_Escape, 1635 IDirectInputDevice2AImpl_Poll, 1636 IDirectInputDevice2AImpl_SendDeviceData, 1584 1637 }; 1585 1638 1586 ICOM_VTABLE(IDirectInputDevice2A) SysMouseAvt = 1587 { 1588 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE1589 IDirectInputDevice2AImpl_QueryInterface,1590 IDirectInputDevice2AImpl_AddRef,1591 SysMouseAImpl_Release,1592 IDirectInputDevice2AImpl_GetCapabilities,1593 IDirectInputDevice2AImpl_EnumObjects,1594 IDirectInputDevice2AImpl_GetProperty,1595 SysMouseAImpl_SetProperty,1596 SysMouseAImpl_Acquire,1597 SysMouseAImpl_Unacquire,1598 SysMouseAImpl_GetDeviceState,1599 SysMouseAImpl_GetDeviceData,1600 SysMouseAImpl_SetDataFormat,1601 SysMouseAImpl_SetEventNotification,1602 SysMouseAImpl_SetCooperativeLevel,1603 IDirectInputDevice2AImpl_GetObjectInfo,1604 IDirectInputDevice2AImpl_GetDeviceInfo,1605 IDirectInputDevice2AImpl_RunControlPanel,1606 IDirectInputDevice2AImpl_Initialize,1607 IDirectInputDevice2AImpl_CreateEffect,1608 IDirectInputDevice2AImpl_EnumEffects,1609 IDirectInputDevice2AImpl_GetEffectInfo,1610 IDirectInputDevice2AImpl_GetForceFeedbackState,1611 IDirectInputDevice2AImpl_SendForceFeedbackCommand,1612 IDirectInputDevice2AImpl_EnumCreatedEffectObjects,1613 IDirectInputDevice2AImpl_Escape,1614 IDirectInputDevice2AImpl_Poll,1615 IDirectInputDevice2AImpl_SendDeviceData,1639 ICOM_VTABLE(IDirectInputDevice2A) SysMouseAvt = 1640 { 1641 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1642 IDirectInputDevice2AImpl_QueryInterface, 1643 IDirectInputDevice2AImpl_AddRef, 1644 SysMouseAImpl_Release, 1645 IDirectInputDevice2AImpl_GetCapabilities, 1646 IDirectInputDevice2AImpl_EnumObjects, 1647 IDirectInputDevice2AImpl_GetProperty, 1648 SysMouseAImpl_SetProperty, 1649 SysMouseAImpl_Acquire, 1650 SysMouseAImpl_Unacquire, 1651 SysMouseAImpl_GetDeviceState, 1652 SysMouseAImpl_GetDeviceData, 1653 SysMouseAImpl_SetDataFormat, 1654 SysMouseAImpl_SetEventNotification, 1655 SysMouseAImpl_SetCooperativeLevel, 1656 IDirectInputDevice2AImpl_GetObjectInfo, 1657 IDirectInputDevice2AImpl_GetDeviceInfo, 1658 IDirectInputDevice2AImpl_RunControlPanel, 1659 IDirectInputDevice2AImpl_Initialize, 1660 IDirectInputDevice2AImpl_CreateEffect, 1661 IDirectInputDevice2AImpl_EnumEffects, 1662 IDirectInputDevice2AImpl_GetEffectInfo, 1663 IDirectInputDevice2AImpl_GetForceFeedbackState, 1664 IDirectInputDevice2AImpl_SendForceFeedbackCommand, 1665 IDirectInputDevice2AImpl_EnumCreatedEffectObjects, 1666 IDirectInputDevice2AImpl_Escape, 1667 IDirectInputDevice2AImpl_Poll, 1668 IDirectInputDevice2AImpl_SendDeviceData, 1616 1669 }; 1617 1670 1618 1671 #ifdef HAVE_LINUX_22_JOYSTICK_API 1619 ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt = 1620 { 1621 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE1622 IDirectInputDevice2AImpl_QueryInterface,1623 IDirectInputDevice2AImpl_AddRef,1624 JoystickAImpl_Release,1625 JoystickAImpl_GetCapabilities,1626 IDirectInputDevice2AImpl_EnumObjects,1627 IDirectInputDevice2AImpl_GetProperty,1628 JoystickAImpl_SetProperty,1629 JoystickAImpl_Acquire,1630 JoystickAImpl_Unacquire,1631 JoystickAImpl_GetDeviceState,1632 JoystickAImpl_GetDeviceData,1633 JoystickAImpl_SetDataFormat,1634 JoystickAImpl_SetEventNotification,1635 IDirectInputDevice2AImpl_SetCooperativeLevel,1636 IDirectInputDevice2AImpl_GetObjectInfo,1637 IDirectInputDevice2AImpl_GetDeviceInfo,1638 IDirectInputDevice2AImpl_RunControlPanel,1639 IDirectInputDevice2AImpl_Initialize,1640 IDirectInputDevice2AImpl_CreateEffect,1641 IDirectInputDevice2AImpl_EnumEffects,1642 IDirectInputDevice2AImpl_GetEffectInfo,1643 IDirectInputDevice2AImpl_GetForceFeedbackState,1644 IDirectInputDevice2AImpl_SendForceFeedbackCommand,1645 IDirectInputDevice2AImpl_EnumCreatedEffectObjects,1646 IDirectInputDevice2AImpl_Escape,1647 JoystickAImpl_Poll,1648 IDirectInputDevice2AImpl_SendDeviceData,1672 ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt = 1673 { 1674 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1675 IDirectInputDevice2AImpl_QueryInterface, 1676 IDirectInputDevice2AImpl_AddRef, 1677 JoystickAImpl_Release, 1678 JoystickAImpl_GetCapabilities, 1679 IDirectInputDevice2AImpl_EnumObjects, 1680 IDirectInputDevice2AImpl_GetProperty, 1681 JoystickAImpl_SetProperty, 1682 JoystickAImpl_Acquire, 1683 JoystickAImpl_Unacquire, 1684 JoystickAImpl_GetDeviceState, 1685 JoystickAImpl_GetDeviceData, 1686 JoystickAImpl_SetDataFormat, 1687 JoystickAImpl_SetEventNotification, 1688 IDirectInputDevice2AImpl_SetCooperativeLevel, 1689 IDirectInputDevice2AImpl_GetObjectInfo, 1690 IDirectInputDevice2AImpl_GetDeviceInfo, 1691 IDirectInputDevice2AImpl_RunControlPanel, 1692 IDirectInputDevice2AImpl_Initialize, 1693 IDirectInputDevice2AImpl_CreateEffect, 1694 IDirectInputDevice2AImpl_EnumEffects, 1695 IDirectInputDevice2AImpl_GetEffectInfo, 1696 IDirectInputDevice2AImpl_GetForceFeedbackState, 1697 IDirectInputDevice2AImpl_SendForceFeedbackCommand, 1698 IDirectInputDevice2AImpl_EnumCreatedEffectObjects, 1699 IDirectInputDevice2AImpl_Escape, 1700 JoystickAImpl_Poll, 1701 IDirectInputDevice2AImpl_SendDeviceData, 1649 1702 }; 1650 1703 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
