void COSXScreen::fakeMouseMove(SInt32 x, SInt32 y) const { // synthesize event CGPoint pos; pos.x = x; pos.y = y; postMouseEvent(pos); // save new cursor position m_xCursor = static_cast<SInt32>(pos.x); m_yCursor = static_cast<SInt32>(pos.y); m_cursorPosValid = true; }
void COSXScreen::fakeMouseButton(ButtonID id, bool press) const { // get button index UInt32 index = id - kButtonLeft; if (index >= sizeof(m_buttons) / sizeof(m_buttons[0])) { return; } // update state m_buttons[index] = press; CGPoint pos; if (!m_cursorPosValid) { SInt32 x, y; getCursorPos(x, y); } pos.x = m_xCursor; pos.y = m_yCursor; postMouseEvent(pos); }
void COSXScreen::fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const { // OS X does not appear to have a fake relative mouse move function. // simulate it by getting the current mouse position and adding to // that. this can yield the wrong answer but there's not much else // we can do. // get current position Point oldPos; GetGlobalMouse(&oldPos); // synthesize event CGPoint pos; m_xCursor = static_cast<SInt32>(oldPos.h); m_yCursor = static_cast<SInt32>(oldPos.v); pos.x = oldPos.h + dx; pos.y = oldPos.v + dy; postMouseEvent(pos); // we now assume we don't know the current cursor position m_cursorPosValid = false; }