Changeset 2499 for trunk/src/dinput/dinput.cpp
- Timestamp:
- Jan 22, 2000, 11:31:06 AM (26 years ago)
- File:
-
- 1 edited
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 /* 1 /* $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 * 19 * 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 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 110 intjoyfd;111 LPDIDATAFORMATdf;112 HANDLE 113 LONGlMin,lMax,deadzone;114 LPDIDEVICEOBJECTDATA 115 int 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 132 LPMOUSE_EVENT_PROC 133 HWND 134 DWORD 135 LPDIDEVICEOBJECTDATA 136 int 137 int 138 int 139 HANDLE 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 * 208 * DirectInputCreate32A 203 209 */ 204 210 HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter) 205 211 { 206 207 208 209 210 211 212 213 214 215 } 216 /****************************************************************************** 217 * 212 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 221 226 LPDIRECTINPUTA iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, 227 LPVOID pvRef, DWORD dwFlags 222 228 ) 223 229 { 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 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 263 264 265 devInstance.guidInstance= GUID_Joystick;266 devInstance.guidProduct= DInput_Wine_Joystick_GUID;267 268 devInstance.dwDevType= DIDEVTYPE_JOYSTICK | DIDEVTYPEJOYSTICK_TRADITIONAL;269 strcpy(devInstance.tszInstanceName,"Joystick");270 271 strcpy(devInstance.tszProductName,"Wine Joystick");272 273 274 275 276 277 278 #endif 279 280 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 286 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 292 293 294 295 296 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 301 306 LPDIRECTINPUTA iface,REFGUID rguid,LPDIRECTINPUTDEVICEA* pdev, 307 LPUNKNOWN punk 302 308 ) { 303 304 charxbuf[50];305 306 307 308 309 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 318 319 320 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 323 324 325 326 327 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 330 337 return DI_OK; 338 } 331 339 #ifdef HAVE_LINUX_22_JOYSTICK_API 332 333 340 if ((!memcmp(&GUID_Joystick,rguid,sizeof(GUID_Joystick))) || 341 (!memcmp(&DInput_Wine_Joystick_GUID,rguid,sizeof(GUID_Joystick)))) { 334 342 JoystickAImpl* newDevice; 335 336 newDevice->ref= 1;337 ICOM_VTBL(newDevice)= &JoystickAvt;338 newDevice->joyfd= -1;339 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 342 343 #endif 344 349 return DI_OK; 350 } 351 #endif 352 return E_FAIL; 345 353 } 346 354 347 355 static HRESULT WINAPI IDirectInputAImpl_QueryInterface( 348 356 LPDIRECTINPUTA iface,REFIID riid,LPVOID *ppobj 349 357 ) { 350 351 charxbuf[50];352 353 354 355 356 357 358 359 360 361 362 363 364 365 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 377 LPDIRECTINPUTA iface,HINSTANCE hinst,DWORD x 370 378 ) { 371 379 return DIERR_ALREADYINITIALIZED; 372 380 } 373 381 374 382 static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUTA iface, 375 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 387 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 397 398 399 400 401 402 403 404 402 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 * 416 * IDirectInputDeviceA 409 417 */ 410 418 411 419 static HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( 412 420 LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df 413 421 ) { 414 415 416 417 418 419 420 421 422 423 424 425 charxbuf[50];426 427 428 429 430 431 432 433 434 435 436 437 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 449 LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags 442 450 ) { 443 444 445 // 446 // 447 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 459 LPDIRECTINPUTDEVICE2A iface,HANDLE hnd 452 460 ) { 453 454 455 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 461 462 463 464 465 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 477 LPDIRECTINPUTDEVICE2A iface,REFGUID rguid,LPCDIPROPHEADER ph 470 478 ) 471 479 { 472 473 charxbuf[50];474 475 476 477 478 479 TRACE("(this=%p,%s,%p)\n",This,xbuf,ph);480 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 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 493 494 LPCDIPROPDWORDpd = (LPCDIPROPDWORD)ph;495 496 497 498 499 500 501 502 503 #endif 504 505 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 522 LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr 510 523 ) 511 524 { 512 525 #ifdef __WIN32OS2__ 513 526 return OSLibGetDIState(len, ptr) ? DI_OK : E_FAIL; 514 527 #else 515 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 521 533 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 647 LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj 595 648 ) 596 649 { 597 598 charxbuf[50];599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 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 622 { 623 624 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 629 630 { 631 632 633 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 638 639 640 641 { 642 690 LPDIRECTINPUTDEVICE2A iface, 691 LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, 692 LPVOID lpvRef, 693 DWORD dwFlags) 694 { 695 FIXME("stub!\n"); 643 696 #if 0 644 645 646 #endif 647 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 652 653 654 { 655 656 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 661 662 663 664 { 665 666 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 671 672 { 673 674 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 679 680 681 { 682 683 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 688 689 690 691 { 692 693 694 } 695 696 /****************************************************************************** 697 * 740 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 702 703 704 705 706 { 707 708 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 713 714 715 716 { 717 718 719 720 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 725 726 727 { 728 729 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 734 735 { 736 737 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 742 743 { 744 745 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 750 751 752 753 { 754 755 756 757 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 762 763 { 764 765 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 770 { 771 772 822 LPDIRECTINPUTDEVICE2A iface) 823 { 824 FIXME("stub!\n"); 825 return DI_OK; 773 826 } 774 827 775 828 static HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData( 776 777 778 779 780 781 { 782 783 784 } 785 786 /****************************************************************************** 787 * 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 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 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 874 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 899 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 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 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 994 GEN_EVENT(DIMOFS_X, posX, xtime, 0); 942 995 if (posY != This->prevY) 943 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 948 949 950 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 953 954 955 956 957 958 959 960 961 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 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 1140 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 1144 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 1154 1155 1156 1206 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 1220 1272 REFGUID rguid, 1273 LPCDIPROPHEADER ph) 1221 1274 { 1222 1275 ICOM_THIS(SysMouseAImpl,iface); 1223 char 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 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 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 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 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 1327 HANDLE hnd) { 1275 1328 ICOM_THIS(SysMouseAImpl,iface); 1276 1329 … … 1284 1337 #ifdef HAVE_LINUX_22_JOYSTICK_API 1285 1338 /****************************************************************************** 1286 * 1339 * Joystick 1287 1340 */ 1288 1341 static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE2A iface) 1289 1342 { 1290 1291 1292 1293 1294 1295 1296 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 1357 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 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 1397 return 0; 1345 1398 This->joyfd=open(JOYDEV,O_RDONLY); 1346 1399 if (This->joyfd==-1) 1347 1400 return DIERR_NOTFOUND; 1348 1401 return 0; 1349 1402 } … … 1358 1411 TRACE("(this=%p)\n",This); 1359 1412 if (This->joyfd!=-1) { 1360 1361 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 1371 struct 1423 fd_set readfds; 1424 struct js_event jse; 1372 1425 1373 1426 if (This->joyfd==-1) 1374 1427 return; 1375 1428 while (1) { 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 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 1469 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 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 1435 1436 1437 1487 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 1458 1510 REFGUID rguid, 1511 LPCDIPROPHEADER ph) 1459 1512 { 1460 1513 ICOM_THIS(JoystickAImpl,iface); 1461 char 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 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 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 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 1559 LPDIRECTINPUTDEVICE2A iface, HANDLE hnd 1507 1560 ) { 1508 1561 ICOM_THIS(JoystickAImpl,iface); … … 1514 1567 1515 1568 static HRESULT WINAPI JoystickAImpl_GetCapabilities( 1516 1517 1569 LPDIRECTINPUTDEVICE2A iface, 1570 LPDIDEVCAPS lpDIDevCaps) 1518 1571 { 1519 1572 ICOM_THIS(JoystickAImpl,iface); 1520 BYTE 1521 int 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 1526 lpDIDevCaps->dwFlags 1527 lpDIDevCaps->dwDevType 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 1583 axes = 2; 1531 1584 lpDIDevCaps->dwAxes = axes; 1532 1585 #endif 1533 1586 #ifdef JSIOCGBUTTONS 1534 1587 if (-1==ioctl(xfd,JSIOCGAXES,&buttons)) 1535 1588 buttons = 2; 1536 1589 lpDIDevCaps->dwButtons = buttons; 1537 1590 #endif 1538 1591 if (xfd!=This->joyfd) 1539 1592 close(xfd); 1540 1593 return DI_OK; 1541 1594 } … … 1552 1605 /****************************************************************************/ 1553 1606 1554 ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt = 1555 { 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 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 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 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 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 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.