static VALUE pointable_id(VALUE self) { Leap::Pointable * pointer; const char * string; Data_Get_Struct(self, Leap::Pointable, pointer); return INT2NUM(pointer->id()); }
void DefaultQtLeapMouseHandler::onFrame(const Leap::Frame &frame) { /////// MOUSE EVENTS ///////// // MOUSE BUTTON PRESSED // MOUSE BUTTON RELEASED // MOUSE MOVE if (this->listeners.empty()) return ; Leap::Pointable pointer = frame.pointable(this->savedMousePointableId); if (!pointer.isValid()) { pointer = frame.pointables().frontmost(); this->savedMousePointableId = pointer.id(); } bool forceRelease = (frame.pointables().count() == 0 && this->mousePressed); QMouseEvent::Type frameMouseEvent = QMouseEvent::None; QPointF globalPointerPos = QtLeapUtils::convertPointablePosToScreenPos(frame.interactionBox(), pointer); Qt::MouseButton button = Qt::NoButton; Qt::MouseButtons buttons = Qt::NoButton; // FINGER TOUCHING AND NO PREVIOUS PRESS -> SETTING BUTTON PRESS if (pointer.touchDistance() <= 0 && pointer.touchZone() == Leap::Pointable::ZONE_TOUCHING && !this->mousePressed) { this->mousePressed = true; frameMouseEvent = QMouseEvent::MouseButtonPress; button = Qt::LeftButton; } else if (this->mousePressed && (pointer.touchDistance() > 0 || pointer.touchZone() == Leap::Pointable::ZONE_NONE || forceRelease)) // FINGER NOT TOUCHING AND PREVIOUS PRESS -> RELEASING BUTTON PRESS { frameMouseEvent = QMouseEvent::MouseButtonRelease; this->mousePressed = false; button = Qt::LeftButton; } else if (frameMouseEvent == QMouseEvent::None && // FINGER IN TOUCHING OR HOVERING ZONE AND NO BUTTON PRESS / RELEASE CHANGE -> MouseMove pointer.touchZone() != Leap::Pointable::ZONE_NONE && globalPointerPos.toPoint() != this->previousPos) { frameMouseEvent = QMouseEvent::MouseMove; this->previousPos = globalPointerPos.toPoint(); QCursor::setPos(this->previousPos); } if (this->mousePressed) buttons |= Qt::LeftButton; if (frameMouseEvent != QMouseEvent::None) foreach (QObject *listener, this->listeners) QCoreApplication::postEvent(listener, new QMouseEvent(frameMouseEvent, QtLeapUtils::convertGlobalPosToLocalPos(listener, globalPointerPos), globalPointerPos, button, buttons, Qt::NoModifier)); }