Cocoa: Send proper mouse coordinates.
Clear up coordinate system confusion. Also change QApplicationPrivate::pickMouseReceiver to indicate that, yes, it does modify the 3rd argument in addition to returning the mouse receiver widget. Change-Id: If2c44eff65aedfdc78c6da1728f31d6e2db71f9d Reviewed-on: http://codereview.qt-project.org/5919 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
This commit is contained in:
parent
75a66c3d76
commit
9ac51af083
@ -146,14 +146,35 @@
|
|||||||
|
|
||||||
- (void)handleMouseEvent:(NSEvent *)theEvent;
|
- (void)handleMouseEvent:(NSEvent *)theEvent;
|
||||||
{
|
{
|
||||||
NSPoint windowPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
|
// Calculate the mouse position in the QWindow and Qt screen coordinate system,
|
||||||
QPoint qt_windowPoint(windowPoint.x, windowPoint.y);
|
// 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.
|
||||||
|
|
||||||
NSTimeInterval timestamp = [theEvent timestamp];
|
NSPoint nsWindowPoint = [theEvent locationInWindow]; // NSWindow coordinates
|
||||||
ulong qt_timestamp = timestamp * 1000;
|
|
||||||
|
|
||||||
// ### Should the points be windowPoint and screenPoint?
|
NSPoint nsViewPoint = [self convertPoint: nsWindowPoint fromView: nil]; // NSView/QWindow coordinates
|
||||||
QWindowSystemInterface::handleMouseEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, m_buttons);
|
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
|
- (void)mouseDown:(NSEvent *)theEvent
|
||||||
|
@ -2865,7 +2865,7 @@ bool QApplicationPrivate::tryModalHelper(QWidget *widget, QWidget **rettop)
|
|||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
QWidget *QApplicationPrivate::pickMouseReceiver(QWidget *candidate, const QPoint &globalPos,
|
QWidget *QApplicationPrivate::pickMouseReceiver(QWidget *candidate, const QPoint &globalPos,
|
||||||
QPoint &pos, QEvent::Type type,
|
QPoint *pos, QEvent::Type type,
|
||||||
Qt::MouseButtons buttons, QWidget *buttonDown,
|
Qt::MouseButtons buttons, QWidget *buttonDown,
|
||||||
QWidget *alienWidget)
|
QWidget *alienWidget)
|
||||||
{
|
{
|
||||||
@ -2887,7 +2887,7 @@ QWidget *QApplicationPrivate::pickMouseReceiver(QWidget *candidate, const QPoint
|
|||||||
|
|
||||||
if (mouseGrabber && mouseGrabber != candidate) {
|
if (mouseGrabber && mouseGrabber != candidate) {
|
||||||
receiver = mouseGrabber;
|
receiver = mouseGrabber;
|
||||||
pos = receiver->mapFromGlobal(globalPos);
|
*pos = receiver->mapFromGlobal(globalPos);
|
||||||
#ifdef ALIEN_DEBUG
|
#ifdef ALIEN_DEBUG
|
||||||
qDebug() << " ** receiver adjusted to:" << receiver << "pos:" << pos;
|
qDebug() << " ** receiver adjusted to:" << receiver << "pos:" << pos;
|
||||||
#endif
|
#endif
|
||||||
|
@ -473,7 +473,7 @@ public:
|
|||||||
static QString styleSheet;
|
static QString styleSheet;
|
||||||
#endif
|
#endif
|
||||||
static QPointer<QWidget> leaveAfterRelease;
|
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,
|
QEvent::Type type, Qt::MouseButtons buttons,
|
||||||
QWidget *buttonDown, QWidget *alienWidget);
|
QWidget *buttonDown, QWidget *alienWidget);
|
||||||
static bool sendMouseEvent(QWidget *receiver, QMouseEvent *event, QWidget *alienWidget,
|
static bool sendMouseEvent(QWidget *receiver, QMouseEvent *event, QWidget *alienWidget,
|
||||||
|
@ -251,7 +251,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
|
|||||||
if (event->type() == QEvent::MouseButtonPress && !qt_button_down)
|
if (event->type() == QEvent::MouseButtonPress && !qt_button_down)
|
||||||
qt_button_down = widget;
|
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);
|
qt_button_down, widget);
|
||||||
|
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user