Cocoa: implement support for wheel events
This commit is contained in:
parent
111068f383
commit
041b809a62
@ -39,12 +39,18 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
|
||||||
#include "qnsview.h"
|
#include "qnsview.h"
|
||||||
|
|
||||||
#include <QtGui/QWindowSystemInterface>
|
#include <QtGui/QWindowSystemInterface>
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
|
|
||||||
|
@interface NSEvent (Qt_Compile_Leopard_DeviceDelta)
|
||||||
|
- (CGFloat)deviceDeltaX;
|
||||||
|
- (CGFloat)deviceDeltaY;
|
||||||
|
- (CGFloat)deviceDeltaZ;
|
||||||
|
@end
|
||||||
|
|
||||||
@implementation QNSView
|
@implementation QNSView
|
||||||
|
|
||||||
- (id) init
|
- (id) init
|
||||||
@ -170,49 +176,104 @@
|
|||||||
{
|
{
|
||||||
[self handleMouseEvent:theEvent];
|
[self handleMouseEvent:theEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)mouseEntered:(NSEvent *)theEvent
|
- (void)mouseEntered:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
Q_UNUSED(theEvent);
|
Q_UNUSED(theEvent);
|
||||||
QWindowSystemInterface::handleEnterEvent(m_window);
|
QWindowSystemInterface::handleEnterEvent(m_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)mouseExited:(NSEvent *)theEvent
|
- (void)mouseExited:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
Q_UNUSED(theEvent);
|
Q_UNUSED(theEvent);
|
||||||
QWindowSystemInterface::handleLeaveEvent(m_window);
|
QWindowSystemInterface::handleLeaveEvent(m_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)rightMouseDown:(NSEvent *)theEvent
|
- (void)rightMouseDown:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
m_buttons |= Qt::RightButton;
|
m_buttons |= Qt::RightButton;
|
||||||
[self handleMouseEvent:theEvent];
|
[self handleMouseEvent:theEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)rightMouseDragged:(NSEvent *)theEvent
|
- (void)rightMouseDragged:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (!(m_buttons & Qt::LeftButton))
|
if (!(m_buttons & Qt::LeftButton))
|
||||||
qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
|
qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
|
||||||
[self handleMouseEvent:theEvent];
|
|
||||||
}
|
|
||||||
- (void)rightMouseUp:(NSEvent *)theEvent
|
|
||||||
{
|
|
||||||
m_buttons &= QFlag(~int(Qt::RightButton));
|
|
||||||
[self handleMouseEvent:theEvent];
|
|
||||||
}
|
|
||||||
- (void)otherMouseDown:(NSEvent *)theEvent
|
|
||||||
{
|
|
||||||
m_buttons |= Qt::RightButton;
|
|
||||||
[self handleMouseEvent:theEvent];
|
[self handleMouseEvent:theEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)rightMouseUp:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
m_buttons &= QFlag(~int(Qt::RightButton));
|
||||||
|
[self handleMouseEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)otherMouseDown:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
m_buttons |= Qt::RightButton;
|
||||||
|
[self handleMouseEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)otherMouseDragged:(NSEvent *)theEvent
|
- (void)otherMouseDragged:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (!(m_buttons & Qt::LeftButton))
|
if (!(m_buttons & Qt::LeftButton))
|
||||||
qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
|
qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
|
||||||
[self handleMouseEvent:theEvent];
|
[self handleMouseEvent:theEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)otherMouseUp:(NSEvent *)theEvent
|
- (void)otherMouseUp:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
m_buttons &= QFlag(~int(Qt::MiddleButton));
|
m_buttons &= QFlag(~int(Qt::MiddleButton));
|
||||||
[self handleMouseEvent:theEvent];
|
[self handleMouseEvent:theEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef QT_NO_WHEELEVENT
|
||||||
|
- (void)scrollWheel:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
int deltaX = 0;
|
||||||
|
int deltaY = 0;
|
||||||
|
int deltaZ = 0;
|
||||||
|
|
||||||
|
const EventRef carbonEvent = (EventRef)[theEvent eventRef];
|
||||||
|
const UInt32 carbonEventKind = carbonEvent ? ::GetEventKind(carbonEvent) : 0;
|
||||||
|
const bool scrollEvent = carbonEventKind == kEventMouseScroll;
|
||||||
|
|
||||||
|
if (scrollEvent) {
|
||||||
|
// The mouse device containts pixel scroll wheel support (Mighty Mouse, Trackpad).
|
||||||
|
// Since deviceDelta is delivered as pixels rather than degrees, we need to
|
||||||
|
// convert from pixels to degrees in a sensible manner.
|
||||||
|
// It looks like 1/4 degrees per pixel behaves most native.
|
||||||
|
// (NB: Qt expects the unit for delta to be 8 per degree):
|
||||||
|
const int pixelsToDegrees = 2; // 8 * 1/4
|
||||||
|
deltaX = [theEvent deviceDeltaX] * pixelsToDegrees;
|
||||||
|
deltaY = [theEvent deviceDeltaY] * pixelsToDegrees;
|
||||||
|
deltaZ = [theEvent deviceDeltaZ] * pixelsToDegrees;
|
||||||
|
} else {
|
||||||
|
// carbonEventKind == kEventMouseWheelMoved
|
||||||
|
// Remove acceleration, and use either -120 or 120 as delta:
|
||||||
|
deltaX = qBound(-120, int([theEvent deltaX] * 10000), 120);
|
||||||
|
deltaY = qBound(-120, int([theEvent deltaY] * 10000), 120);
|
||||||
|
deltaZ = qBound(-120, int([theEvent deltaZ] * 10000), 120);
|
||||||
|
}
|
||||||
|
|
||||||
|
NSPoint windowPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
|
||||||
|
QPoint qt_windowPoint(windowPoint.x, windowPoint.y);
|
||||||
|
NSTimeInterval timestamp = [theEvent timestamp];
|
||||||
|
ulong qt_timestamp = timestamp * 1000;
|
||||||
|
|
||||||
|
if (deltaX != 0)
|
||||||
|
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, deltaX, Qt::Horizontal);
|
||||||
|
|
||||||
|
if (deltaY != 0)
|
||||||
|
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, deltaY, Qt::Vertical);
|
||||||
|
|
||||||
|
if (deltaZ != 0)
|
||||||
|
// Qt doesn't explicitly support wheels with a Z component. In a misguided attempt to
|
||||||
|
// try to be ahead of the pack, I'm adding this extra value.
|
||||||
|
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, deltaY, (Qt::Orientation)3);
|
||||||
|
}
|
||||||
|
#endif //QT_NO_WHEELEVENT
|
||||||
|
|
||||||
- (int) convertKeyCode : (QChar)keyChar
|
- (int) convertKeyCode : (QChar)keyChar
|
||||||
{
|
{
|
||||||
if (keyChar.isLower())
|
if (keyChar.isLower())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user