Changeset 26638 in vbox
- Timestamp:
- Feb 18, 2010 9:18:04 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
include/VBox/pdmifs.h (modified) (3 diffs)
-
src/VBox/Devices/Input/DevPS2.cpp (modified) (5 diffs)
-
src/VBox/Devices/Input/DrvMouseQueue.cpp (modified) (5 diffs)
-
src/VBox/Main/MouseImpl.cpp (modified) (4 diffs)
-
src/VBox/Main/include/MouseImpl.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmifs.h
r26624 r26638 280 280 281 281 /** PDMIMOUSEPORT interface ID. */ 282 #define PDMIMOUSEPORT_IID " dcf20e6b-6cd5-4517-8759-91064605b8a8"282 #define PDMIMOUSEPORT_IID "f8d45ecc-bd6f-4a8d-b262-b85498e7f143" 283 283 /** Pointer to a mouse port interface. */ 284 284 typedef struct PDMIMOUSEPORT *PPDMIMOUSEPORT; … … 313 313 * @param i32cX The X value, in the range 0 to 0xffff. 314 314 * @param i32cY The Y value, in the range 0 to 0xffff. 315 * @thread The emulation thread. 316 */ 317 DECLR3CALLBACKMEMBER(int, pfnPutEventAbs,(PPDMIMOUSEPORT pInterface, int32_t i32cX, int32_t i32cY)); 315 * @param i32DeltaZ The Z delta. 316 * @param i32DeltaW The W (horizontal scroll button) delta. 317 * @param fButtonStates The button states, see the PDMIMOUSEPORT_BUTTON_* \#defines. 318 * @thread The emulation thread. 319 */ 320 DECLR3CALLBACKMEMBER(int, pfnPutEventAbs,(PPDMIMOUSEPORT pInterface, uint32_t i32cX, uint32_t i32cY, int32_t i32DeltaZ, int32_t i32DeltaW, uint32_t fButtonStates)); 318 321 } PDMIMOUSEPORT; 319 322 … … 347 350 348 351 /** PDMIMOUSECONNECTOR interface ID. */ 349 #define PDMIMOUSECONNECTOR_IID " 847f965f-0eb8-4363-88ac-b0ee58a05bde"352 #define PDMIMOUSECONNECTOR_IID "39e48c1c-1514-4ac6-8a9c-88034d36ae98" 350 353 351 354 -
trunk/src/VBox/Devices/Input/DevPS2.cpp
r26624 r26638 230 230 int32_t mouse_dw; 231 231 int32_t mouse_flags; 232 int32_t mouse_cx;233 int32_t mouse_cy;232 uint32_t mouse_cx; 233 uint32_t mouse_cy; 234 234 uint8_t mouse_buttons; 235 235 uint8_t mouse_buttons_reported; … … 847 847 { 848 848 int aux = fToCmdQueue ? 1 : 2; 849 int cx1 = s->mouse_cx * 4096/ 0xffff;850 int cy1 = 4096 - (s->mouse_cy * 4096/ 0xffff);849 unsigned cx1 = s->mouse_cx * 4095 / 0xffff; 850 unsigned cy1 = 4095 - (s->mouse_cy * 4095 / 0xffff); 851 851 unsigned fButtons = s->mouse_buttons & 0x03; 852 unsigned int b ;852 unsigned int b[6]; 853 853 854 854 LogRel3(("%s: cx1=%d, cy1=%d, fButtons=0x%x\n", __PRETTY_FUNCTION__, 855 855 cx1, cy1, fButtons)); 856 b = 4 /* Screen is being touched */ | fButtons; 857 kbd_queue(s, b, aux); 858 b = ((cy1 << 2) & 0xc0) | (cx1 >> 6); 859 kbd_queue(s, b, aux); 860 b = ((cx1 << 2) & 0xc0) | (cx1 & 0x3f); 861 kbd_queue(s, b, aux); 862 kbd_queue(s, 0xc0, aux); /* This byte is really wasted in the protocol */ 863 b = ((cx1 << 2) & 0xc0) | (cy1 >> 6); 864 kbd_queue(s, b, aux); 865 b = ((cy1 << 2) & 0xc0) | (cy1 & 0x3f); 866 kbd_queue(s, b, aux); 856 b[0] = 4 /* Screen is being touched */ | fButtons; 857 Assert((b[0] & 0xf8) == 0); 858 kbd_queue(s, b[0], aux); 859 b[1] = ((cy1 << 2) & 0xc0) | (cx1 >> 6); 860 kbd_queue(s, b[1], aux); 861 b[2] = ((cx1 << 2) & 0xc0) | (cx1 & 0x3f); 862 Assert(((b[2] & 0x30) << 2) == (b[2] & 0xc0)); 863 kbd_queue(s, b[2], aux); 864 b[3] = 0xc0; 865 kbd_queue(s, b[3], aux); /* This byte is really wasted in the protocol */ 866 b[4] = ((cx1 << 2) & 0xc0) | (cy1 >> 6); 867 Assert((b[4] & 0xc0) == (b[2] & 0xc0)); 868 kbd_queue(s, b[4], aux); 869 b[5] = ((cy1 << 2) & 0xc0) | (cy1 & 0x3f); 870 Assert( (((b[5] & 0x30) << 2) == (b[1] & 0xc0)) 871 && ((b[5] & 0xc0) == (b[1] & 0xc0))); 872 kbd_queue(s, b[5], aux); 867 873 } 868 874 … … 1339 1345 if (version_id > 3) 1340 1346 { 1341 SSMR3Get S32(f, &s->mouse_cx);1342 SSMR3Get S32(f, &s->mouse_cy);1347 SSMR3GetU32(f, &s->mouse_cx); 1348 SSMR3GetU32(f, &s->mouse_cy); 1343 1349 SSMR3GetU8(f, &s->mouse_buttons_reported); 1344 1350 SSMR3GetU8(f, &s->mouse_last_button); … … 1681 1687 * @param i32cY The Y value. 1682 1688 */ 1683 static DECLCALLBACK(int) kbdMousePutEventAbs(PPDMIMOUSEPORT pInterface, int32_t i32cX, int32_t i32cY)1689 static DECLCALLBACK(int) kbdMousePutEventAbs(PPDMIMOUSEPORT pInterface, uint32_t u32cX, uint32_t u32cY, int32_t dz, int32_t dw, uint32_t fButtons) 1684 1690 { 1685 1691 KBDState *pThis = RT_FROM_MEMBER(pInterface, KBDState, Mouse.IPort); … … 1687 1693 AssertReleaseRC(rc); 1688 1694 1689 pc_kbd_mouse_event_abs(pThis, i32cX, i32cY); 1695 if (u32cX != pThis->mouse_cx || u32cY != pThis->mouse_cy) 1696 pc_kbd_mouse_event_abs(pThis, u32cX, u32cY); 1697 if (dz || dw || fButtons != pThis->mouse_buttons) 1698 pc_kbd_mouse_event(pThis, 0, 0, dz, dw, fButtons); 1690 1699 1691 1700 PDMCritSectLeave(&pThis->CritSect); -
trunk/src/VBox/Devices/Input/DrvMouseQueue.cpp
r26624 r26638 75 75 int32_t i32DeltaW; 76 76 uint32_t fButtonStates; 77 int32_t i32cX;78 int32_t i32cY;77 uint32_t u32cX; 78 uint32_t u32cY; 79 79 } DRVMOUSEQUEUEITEM, *PDRVMOUSEQUEUEITEM; 80 80 … … 112 112 * @param i32DeltaY The Y delta. 113 113 * @param i32DeltaZ The Z delta. 114 * @param i32DeltaW The W delta. 114 115 * @param fButtonStates The button states. 115 116 * @thread Any thread. … … 142 143 * @returns VBox status code. 143 144 * @param pInterface Pointer to interface structure. 144 * @param i32cX The X value. 145 * @param i32cY The Y value. 145 * @param u32cX The X value. 146 * @param u32cY The Y value. 147 * @param i32DeltaZ The Z delta. 148 * @param i32DeltaW The W delta. 149 * @param fButtonStates The button states. 146 150 * @thread Any thread. 147 151 */ 148 static DECLCALLBACK(int) drvMouseQueuePutEventAbs(PPDMIMOUSEPORT pInterface, int32_t i32cX, int32_t i32cY)152 static DECLCALLBACK(int) drvMouseQueuePutEventAbs(PPDMIMOUSEPORT pInterface, uint32_t u32cX, uint32_t u32cY, int32_t i32DeltaZ, int32_t i32DeltaW, uint32_t fButtonStates) 149 153 { 150 154 PDRVMOUSEQUEUE pDrv = IMOUSEPORT_2_DRVMOUSEQUEUE(pInterface); … … 156 160 { 157 161 pItem->fAbs = 1; 158 pItem->i32cX = i32cX; 159 pItem->i32cY = i32cY; 162 pItem->u32cX = u32cX; 163 pItem->u32cY = u32cY; 164 pItem->i32DeltaZ = i32DeltaZ; 165 pItem->i32DeltaW = i32DeltaW; 166 pItem->fButtonStates = fButtonStates; 160 167 PDMQueueInsert(pDrv->pQueue, &pItem->Core); 161 168 return VINF_SUCCESS; … … 203 210 rc = pThis->pUpPort->pfnPutEvent(pThis->pUpPort, pItem->i32DeltaX, pItem->i32DeltaY, pItem->i32DeltaZ, pItem->i32DeltaW, pItem->fButtonStates); 204 211 else 205 rc = pThis->pUpPort->pfnPutEventAbs(pThis->pUpPort, pItem-> i32cX, pItem->i32cY);212 rc = pThis->pUpPort->pfnPutEventAbs(pThis->pUpPort, pItem->u32cX, pItem->u32cY, pItem->i32DeltaZ, pItem->i32DeltaW, pItem->fButtonStates); 206 213 return RT_SUCCESS(rc); 207 214 } -
trunk/src/VBox/Main/MouseImpl.cpp
r26624 r26638 258 258 * @returns COM status code 259 259 */ 260 int Mouse::reportAbsEventToMouseDev(uint32_t mouseXAbs, uint32_t mouseYAbs) 260 int Mouse::reportAbsEventToMouseDev(uint32_t mouseXAbs, uint32_t mouseYAbs, 261 int32_t dz, int32_t dw, uint32_t fButtons) 261 262 { 262 263 CHECK_CONSOLE_DRV (mpDrv); 263 264 264 if (mouseXAbs != mLastAbsX || mouseYAbs != mLastAbsY) 265 if ( mouseXAbs != mLastAbsX 266 || mouseYAbs != mLastAbsY 267 || dz 268 || dw 269 || fButtons != mLastButtons) 265 270 { 266 271 int vrc = mpDrv->pUpPort->pfnPutEventAbs(mpDrv->pUpPort, mouseXAbs, 267 mouseYAbs );272 mouseYAbs, dz, dw, fButtons); 268 273 if (RT_FAILURE(vrc)) 269 274 setError(VBOX_E_IPRT_ERROR, … … 405 410 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 406 411 407 LogRel3(("%s: x=%d, y=%d, dz=%d, dw=%d \n", __PRETTY_FUNCTION__,408 x, y, dz, dw));412 LogRel3(("%s: x=%d, y=%d, dz=%d, dw=%d, buttonState=0x%x\n", 413 __PRETTY_FUNCTION__, x, y, dz, dw, buttonState)); 409 414 410 415 uint32_t mouseXAbs; 411 416 rc = convertDisplayWidth(x, &mouseXAbs); 412 417 ComAssertComRCRet(rc, rc); 418 if (mouseXAbs > 0xffff) 419 mouseXAbs = mLastAbsX; 413 420 uint32_t mouseYAbs; 414 421 rc = convertDisplayHeight(y, &mouseYAbs); 415 422 ComAssertComRCRet(rc, rc); 423 if (mouseYAbs > 0xffff) 424 mouseYAbs = mLastAbsY; 416 425 uint32_t fButtons = mouseButtonsToPDM(buttonState); 417 426 /* Older guest additions rely on a small phony movement event on the … … 420 429 421 430 if (uDevCaps & MOUSE_DEVCAP_ABSOLUTE) 422 rc = reportAbsEventToMouseDev(mouseXAbs, mouseYAbs );431 rc = reportAbsEventToMouseDev(mouseXAbs, mouseYAbs, dz, dw, fButtons); 423 432 else 424 433 { … … 443 452 mLastAbsX = mouseXAbs; 444 453 mLastAbsY = mouseYAbs; 445 /* We may need to send a relative event for button information or to 446 * wake the guest up to the changed absolute co-ordinates. */ 447 /* If the event is a pure wake up one, we make sure it contains some 448 * (possibly phony) event data to make sure it isn't just discarded on 449 * the way. Note: we ignore dw as it is optional. */ 450 if (fNeedsJiggle || fButtons != mLastButtons || dz || dw) 451 rc = reportRelEventToMouseDev(fNeedsJiggle ? 1 : 0, 0, dz, dw, 452 fButtons); 453 if (SUCCEEDED(rc)) 454 mLastButtons = fButtons; 454 if (!(uDevCaps & MOUSE_DEVCAP_ABSOLUTE)) 455 { 456 /* We may need to send a relative event for button information or to 457 * wake the guest up to the changed absolute co-ordinates. 458 * If the event is a pure wake up one, we make sure it contains some 459 * (possibly phony) event data to make sure it isn't just discarded on 460 * the way. */ 461 if (fNeedsJiggle || fButtons != mLastButtons || dz || dw) 462 rc = reportRelEventToMouseDev(fNeedsJiggle ? 1 : 0, 0, dz, dw, 463 fButtons); 464 ComAssertComRCRet (rc, rc); 465 } 466 mLastButtons = fButtons; 455 467 return rc; 456 468 } -
trunk/src/VBox/Main/include/MouseImpl.h
r26624 r26638 111 111 int reportRelEventToMouseDev(int32_t dx, int32_t dy, int32_t dz, 112 112 int32_t dw, uint32_t fButtons); 113 int reportAbsEventToMouseDev(uint32_t mouseXAbs, uint32_t mouseYAbs); 113 int reportAbsEventToMouseDev(uint32_t mouseXAbs, uint32_t mouseYAbs, 114 int32_t dz, int32_t dw, uint32_t fButtons); 114 115 int reportAbsEventToVMMDev(uint32_t mouseXAbs, uint32_t mouseYAbs); 115 116 int convertDisplayWidth(LONG x, uint32_t *pcX); 116 117 int convertDisplayHeight(LONG y, uint32_t *pcY); 117 bool needsRelativeEvent(uint32_t cXAbs, uint32_t cYAbs, int32_t dz, int32_t dw, uint32_t fButtons, uint32_t fCaps);118 118 119 119 const ComObjPtr<Console, ComWeakRef> mParent;
Note:
See TracChangeset
for help on using the changeset viewer.

