- (void)handleMouseEvent:(NSEvent *)theEvent;
{
- NSPoint windowPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
- QPoint qt_windowPoint(windowPoint.x, windowPoint.y);
-
- NSTimeInterval timestamp = [theEvent timestamp];
- ulong qt_timestamp = timestamp * 1000;
-
- // ### Should the points be windowPoint and screenPoint?
- QWindowSystemInterface::handleMouseEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, m_buttons);
+ // Calculate the mouse position in the QWindow and Qt screen coordinate system,
+ // starting from coordinates in the NSWindow coordinate system.
+ //
+ // This involves translating according to the window location on screen,
+ // as well as inverting the y coordinate due to the origin change.
+ //
+ // Coordinate system overview, outer to innermost:
+ //
+ // Name Origin
+ //
+ // OS X screen bottom-left
+ // Qt screen top-left
+ // NSWindow bottom-left
+ // NSView/QWindow top-left
+ //
+ // NSView and QWindow are equal coordinate systems: the QWindow covers the
+ // entire NSView, and we've set the NSView's isFlipped property to true.
+
+ NSPoint nsWindowPoint = [theEvent locationInWindow]; // NSWindow coordinates
+
+ NSPoint nsViewPoint = [self convertPoint: nsWindowPoint fromView: nil]; // NSView/QWindow coordinates
+ QPoint qtWindowPoint(nsViewPoint.x, nsViewPoint.y); // NSView/QWindow coordinates
+
+ NSRect screenRect = [[self window] convertRectToScreen : NSMakeRect(nsWindowPoint.x, nsWindowPoint.y, 0, 0)]; // OS X screen coordinates
+ QPoint qtScreenPoint(screenRect.origin.x, qt_mac_flipYCoordinate(screenRect.origin.y)); // Qt screen coordinates
+
+ ulong timestamp = [theEvent timestamp] * 1000;
+
+ QWindowSystemInterface::handleMouseEvent(m_window, timestamp, qtWindowPoint, qtScreenPoint, m_buttons);
}
- (void)mouseDown:(NSEvent *)theEvent
\internal
*/
QWidget *QApplicationPrivate::pickMouseReceiver(QWidget *candidate, const QPoint &globalPos,
- QPoint &pos, QEvent::Type type,
+ QPoint *pos, QEvent::Type type,
Qt::MouseButtons buttons, QWidget *buttonDown,
QWidget *alienWidget)
{
if (mouseGrabber && mouseGrabber != candidate) {
receiver = mouseGrabber;
- pos = receiver->mapFromGlobal(globalPos);
+ *pos = receiver->mapFromGlobal(globalPos);
#ifdef ALIEN_DEBUG
qDebug() << " ** receiver adjusted to:" << receiver << "pos:" << pos;
#endif
static QString styleSheet;
#endif
static QPointer<QWidget> leaveAfterRelease;
- static QWidget *pickMouseReceiver(QWidget *candidate, const QPoint &globalPos, QPoint &pos,
+ static QWidget *pickMouseReceiver(QWidget *candidate, const QPoint &globalPos, QPoint *pos,
QEvent::Type type, Qt::MouseButtons buttons,
QWidget *buttonDown, QWidget *alienWidget);
static bool sendMouseEvent(QWidget *receiver, QMouseEvent *event, QWidget *alienWidget,
if (event->type() == QEvent::MouseButtonPress && !qt_button_down)
qt_button_down = widget;
- QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->globalPos(), mapped, event->type(), event->buttons(),
+ QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->globalPos(), &mapped, event->type(), event->buttons(),
qt_button_down, widget);
if (!receiver) {