diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-03-24 07:37:43 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-03-24 07:38:02 +0100 |
commit | 135ebe4f3d268121047fdbfee49f2dd52006165e (patch) | |
tree | 6b303103f36e69e29cfa860b8b7afc584c55d6f3 /src/plugins/platforms/cocoa | |
parent | e7feb956280105113b3e58f12e5f32f54199a95a (diff) | |
parent | 1e8f50a8d069c97ea6a4f00d664c12e594884f54 (diff) |
Merge remote-tracking branch 'origin/5.5' into dev
Change-Id: If5d2e621c2fa5476c3ab687a3f4620c54fc3b32e
Diffstat (limited to 'src/plugins/platforms/cocoa')
19 files changed, 123 insertions, 17 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.h b/src/plugins/platforms/cocoa/qcocoaaccessibility.h index cad90b33f1..061dfac156 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibility.h +++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.h @@ -38,6 +38,8 @@ #include <QtGui> #include <qpa/qplatformaccessibility.h> +QT_BEGIN_NAMESPACE + class QCocoaAccessibility : public QPlatformAccessibility { public: @@ -81,4 +83,6 @@ id getValueAttribute(QAccessibleInterface *interface); } +QT_END_NAMESPACE + #endif diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm index e13a9c2b19..03f585d19d 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm @@ -35,6 +35,8 @@ #include <QtGui/qaccessible.h> #include <private/qcore_mac_p.h> +QT_BEGIN_NAMESPACE + QCocoaAccessibility::QCocoaAccessibility() { @@ -371,3 +373,6 @@ id getValueAttribute(QAccessibleInterface *interface) } } // namespace QCocoaAccessible + +QT_END_NAMESPACE + diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index 7349236455..84d60df3ef 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -40,6 +40,7 @@ #import <AppKit/NSAccessibility.h> +QT_USE_NAMESPACE static void convertLineOffset(QAccessibleTextInterface *text, int &line, int &offset, NSUInteger *start = 0, NSUInteger *end = 0) { diff --git a/src/plugins/platforms/cocoa/qcocoaapplication.h b/src/plugins/platforms/cocoa/qcocoaapplication.h index ab6a756001..bcb0d0ee48 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplication.h +++ b/src/plugins/platforms/cocoa/qcocoaapplication.h @@ -92,8 +92,8 @@ - (QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *)QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader); - (int)QT_MANGLE_NAMESPACE(qt_validModesForFontPanel):(NSFontPanel *)fontPanel; -- (void)qt_sendPostedMessage:(NSEvent *)event; -- (BOOL)qt_filterEvent:(NSEvent *)event; +- (void)QT_MANGLE_NAMESPACE(qt_sendPostedMessage):(NSEvent *)event; +- (BOOL)QT_MANGLE_NAMESPACE(qt_filterEvent):(NSEvent *)event; @end @interface QT_MANGLE_NAMESPACE(QNSApplication) : NSApplication { diff --git a/src/plugins/platforms/cocoa/qcocoaapplication.mm b/src/plugins/platforms/cocoa/qcocoaapplication.mm index adaabc3c15..79399e4183 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplication.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplication.mm @@ -98,7 +98,7 @@ QT_USE_NAMESPACE | NSFontPanelStrikethroughEffectModeMask; } -- (void)qt_sendPostedMessage:(NSEvent *)event +- (void)QT_MANGLE_NAMESPACE(qt_sendPostedMessage):(NSEvent *)event { // WARNING: data1 and data2 is truncated to from 64-bit to 32-bit on OS 10.5! // That is why we need to split the address in two parts: @@ -126,7 +126,7 @@ QT_USE_NAMESPACE static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSEvent"); -- (BOOL)qt_filterEvent:(NSEvent *)event +- (BOOL)QT_MANGLE_NAMESPACE(qt_filterEvent):(NSEvent *)event { if (qApp && qApp->eventDispatcher()-> filterNativeEvent(q_macLocalEventType, static_cast<void*>(event), 0)) @@ -135,7 +135,7 @@ static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSE if ([event type] == NSApplicationDefined) { switch ([event subtype]) { case QtCocoaEventSubTypePostMessage: - [NSApp qt_sendPostedMessage:event]; + [NSApp QT_MANGLE_NAMESPACE(qt_sendPostedMessage):event]; return true; default: break; @@ -163,7 +163,7 @@ static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSE // be called instead of sendEvent if redirection occurs. // 'self' will then be an instance of NSApplication // (and not QNSApplication) - if (![NSApp qt_filterEvent:event]) + if (![NSApp QT_MANGLE_NAMESPACE(qt_filterEvent):event]) [self qt_sendEvent_original:event]; } @@ -171,7 +171,7 @@ static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSE { // This method will be called if // no redirection occurs - if (![NSApp qt_filterEvent:event]) + if (![NSApp QT_MANGLE_NAMESPACE(qt_filterEvent):event]) [super sendEvent:event]; } diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index 2c71d07256..f3a0216870 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -80,12 +80,14 @@ QT_USE_NAMESPACE +QT_BEGIN_NAMESPACE static QCocoaApplicationDelegate *sharedCocoaApplicationDelegate = nil; static void cleanupCocoaApplicationDelegate() { [sharedCocoaApplicationDelegate release]; } +QT_END_NAMESPACE @implementation QCocoaApplicationDelegate diff --git a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h index 31f9ea3ae2..8b2a9f3788 100644 --- a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h +++ b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h @@ -35,9 +35,10 @@ #define QCOCOAAUTORELEASEPOOL_H #undef slots - +#include <qglobal.h> #include <Cocoa/Cocoa.h> +QT_BEGIN_NAMESPACE class QCocoaAutoReleasePool { public: @@ -47,5 +48,6 @@ public: private: NSAutoreleasePool *pool; }; +QT_END_NAMESPACE #endif // QCOCOAAUTORELEASEPOOL_H diff --git a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm index 2c240c2570..8f30365186 100644 --- a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm +++ b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm @@ -33,6 +33,8 @@ #include "qcocoaautoreleasepool.h" +QT_BEGIN_NAMESPACE + QCocoaAutoReleasePool::QCocoaAutoReleasePool() { pool = [[NSAutoreleasePool alloc] init]; @@ -42,3 +44,5 @@ QCocoaAutoReleasePool::~QCocoaAutoReleasePool() { [pool release]; } + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoadrag.h b/src/plugins/platforms/cocoa/qcocoadrag.h index 058941939c..e087fcee26 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.h +++ b/src/plugins/platforms/cocoa/qcocoadrag.h @@ -67,6 +67,8 @@ private: NSEvent *m_lastEvent; NSView *m_lastView; Qt::DropAction m_executed_drop_action; + + QPixmap dragPixmap(QDrag *drag, QPoint &hotSpot) const; }; class QCocoaDropData : public QInternalMimeData diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm index a80b32a0b8..4466d28128 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -37,6 +37,8 @@ QT_BEGIN_NAMESPACE +static const int dragImageMaxChars = 26; + QCocoaDrag::QCocoaDrag() : m_drag(0) { @@ -116,10 +118,8 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) m_drag = o; m_executed_drop_action = Qt::IgnoreAction; - QPixmap pm = m_drag->pixmap(); - if (pm.isNull()) - pm = defaultPixmap(); - + QPoint hotSpot = m_drag->hotSpot(); + QPixmap pm = dragPixmap(m_drag, hotSpot); NSImage *nsimage = qt_mac_create_nsimage(pm); QMacPasteboard dragBoard((CFStringRef) NSDragPboard, QMacInternalPasteboardMime::MIME_DND); @@ -128,8 +128,8 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) NSPoint event_location = [m_lastEvent locationInWindow]; NSPoint local_point = [m_lastView convertPoint:event_location fromView:nil]; - local_point.x -= m_drag->hotSpot().x(); - CGFloat flippedY = m_drag->pixmap().height() - m_drag->hotSpot().y(); + local_point.x -= hotSpot.x(); + CGFloat flippedY = pm.height() - hotSpot.y(); local_point.y += flippedY; NSSize mouseOffset = NSMakeSize(0.0, 0.0); NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; @@ -153,6 +153,50 @@ void QCocoaDrag::setAcceptedAction(Qt::DropAction act) m_executed_drop_action = act; } +QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const +{ + const QMimeData* data = drag->mimeData(); + QPixmap pm = drag->pixmap(); + + if (pm.isNull()) { + QFont f(qApp->font()); + f.setPointSize(12); + QFontMetrics fm(f); + + if (data->hasImage()) { + const QImage img = data->imageData().value<QImage>(); + if (!img.isNull()) { + pm = QPixmap::fromImage(img).scaledToWidth(dragImageMaxChars *fm.averageCharWidth()); + } + } + + if (pm.isNull() && (data->hasText() || data->hasUrls()) ) { + QString s = data->hasText() ? data->text() : data->urls().first().toString(); + if (s.length() > dragImageMaxChars) + s = s.left(dragImageMaxChars -3) + QChar(0x2026); + if (!s.isEmpty()) { + const int width = fm.width(s); + const int height = fm.height(); + if (width > 0 && height > 0) { + pm = QPixmap(width, height); + QPainter p(&pm); + p.fillRect(0, 0, pm.width(), pm.height(), Qt::color0); + p.setPen(Qt::color1); + p.setFont(f); + p.drawText(0, fm.ascent(), s); + p.end(); + hotSpot = QPoint(pm.width() / 2, pm.height() / 2); + } + } + } + } + + if (pm.isNull()) + pm = defaultPixmap(); + + return pm; +} + QCocoaDropData::QCocoaDropData(NSPasteboard *pasteboard) { dropPasteboard = reinterpret_cast<CFStringRef>(const_cast<const NSString *>([pasteboard name])); diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm index e89bc662b7..a3c72c58b9 100644 --- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm +++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm @@ -42,6 +42,8 @@ #import <Cocoa/Cocoa.h> +QT_BEGIN_NAMESPACE + static inline QByteArray getGlString(GLenum param) { if (const GLubyte *s = glGetString(param)) @@ -351,3 +353,6 @@ bool QCocoaGLContext::isSharing() const { return m_shareContext != nil; } + +QT_END_NAMESPACE + diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index 4fadc2f60a..867526ff52 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -45,6 +45,8 @@ #include "qcocoawindow.h" #import "qnsview.h" +QT_BEGIN_NAMESPACE + NSString *qt_mac_removePrivateUnicode(NSString* string) { int len = [string length]; @@ -71,6 +73,8 @@ static inline QCocoaMenuLoader *getMenuLoader() return [NSApp QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader)]; } +QT_END_NAMESPACE + @interface QT_MANGLE_NAMESPACE(QCocoaMenuDelegate) : NSObject <NSMenuDelegate> { QCocoaMenu *m_menu; } diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 5d8082d347..764a01370d 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -42,6 +42,8 @@ #include <QtGui/QGuiApplication> #include <QtCore/QDebug> +QT_BEGIN_NAMESPACE + static QList<QCocoaMenuBar*> static_menubars; static inline QCocoaMenuLoader *getMenuLoader() @@ -382,3 +384,5 @@ NSMenuItem *QCocoaMenuBar::itemForRole(QPlatformMenuItem::MenuRole r) return Q_NULLPTR; } +QT_END_NAMESPACE + diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index d6813749a4..bf12c0f2ce 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -44,6 +44,8 @@ #include <QtCore/QDebug> +QT_BEGIN_NAMESPACE + static inline QCocoaMenuLoader *getMenuLoader() { return [NSApp QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader)]; @@ -72,6 +74,9 @@ NSString *keySequenceToKeyEqivalent(const QKeySequence &accel) QChar cocoa_key = qt_mac_qtKey2CocoaKey(Qt::Key(accel_key)); if (cocoa_key.isNull()) cocoa_key = QChar(accel_key).toLower().unicode(); + // Similar to qt_mac_removePrivateUnicode change the delete key so the symbol is correctly seen in native menubar + if (cocoa_key.unicode() == NSDeleteFunctionKey) + cocoa_key = NSDeleteCharacter; return [NSString stringWithCharacters:&cocoa_key.unicode() length:1]; } @@ -420,3 +425,5 @@ void QCocoaMenuItem::setIconSize(int size) { m_iconSize = size; } + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoaprintersupport.h b/src/plugins/platforms/cocoa/qcocoaprintersupport.h index 8a986c52d2..037ae6ba1a 100644 --- a/src/plugins/platforms/cocoa/qcocoaprintersupport.h +++ b/src/plugins/platforms/cocoa/qcocoaprintersupport.h @@ -39,6 +39,8 @@ #include "qt_mac_p.h" +QT_BEGIN_NAMESPACE + class QCocoaPrinterSupport : public QPlatformPrinterSupport { public: @@ -53,5 +55,7 @@ public: QString defaultPrintDeviceId() const Q_DECL_OVERRIDE; }; +QT_END_NAMESPACE + #endif // QT_NO_PRINTER #endif // QCOCOAPRINTERSUPPORT_H diff --git a/src/plugins/platforms/cocoa/qcocoaprintersupport.mm b/src/plugins/platforms/cocoa/qcocoaprintersupport.mm index 602d0fb4bd..42ef084e16 100644 --- a/src/plugins/platforms/cocoa/qcocoaprintersupport.mm +++ b/src/plugins/platforms/cocoa/qcocoaprintersupport.mm @@ -40,6 +40,8 @@ #include <private/qprinterinfo_p.h> +QT_BEGIN_NAMESPACE + QCocoaPrinterSupport::QCocoaPrinterSupport() { } @@ -94,4 +96,6 @@ QString QCocoaPrinterSupport::defaultPrintDeviceId() const return QString(); } +QT_END_NAMESPACE + #endif //QT_NO_PRINTER diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index c87a871ad0..fba97c2629 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -265,6 +265,7 @@ public: // for QNSView QPointer<QWindow> m_enterLeaveTargetWindow; bool m_windowUnderMouse; + bool m_ignoreWindowShouldClose; bool m_inConstructor; bool m_inSetVisible; bool m_inSetGeometry; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 8aed9da9c5..6c90e99238 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -371,6 +371,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) , m_synchedWindowState(Qt::WindowActive) , m_windowModality(Qt::NonModal) , m_windowUnderMouse(false) + , m_ignoreWindowShouldClose(false) , m_inConstructor(true) , m_inSetVisible(false) , m_inSetGeometry(false) @@ -442,9 +443,12 @@ QCocoaWindow::~QCocoaWindow() m_parentCocoaWindow->removeChildWindow(this); } else if (parent()) { [m_contentView removeFromSuperview]; - } else if (m_qtView) { - [[NSNotificationCenter defaultCenter] removeObserver:m_qtView - name:nil object:m_nsWindow]; + } + + // Make sure to disconnect observer in all case if view is valid + // to avoid notifications received when deleting when using Qt::AA_NativeWindows attribute + if (m_qtView) { + [[NSNotificationCenter defaultCenter] removeObserver:m_qtView]; } // The QNSView object may outlive the corresponding QCocoaWindow object, @@ -1220,6 +1224,9 @@ void QCocoaWindow::windowDidEndLiveResize() bool QCocoaWindow::windowShouldClose() { + // might have been set from qnsview.mm + if (m_ignoreWindowShouldClose) + return false; bool accepted = false; QWindowSystemInterface::handleCloseEvent(window(), &accepted); QWindowSystemInterface::flushWindowSystemEvents(); diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 1c87b90450..fd989cb840 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -1443,6 +1443,10 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QObject *fo = QGuiApplication::focusObject(); if (m_sendKeyEvent && fo) { + // if escape is pressed we don't want interpretKeyEvents to close a dialog. This will be done via QWindowSystemInterface + if (keyCode == Qt::Key_Escape) + m_platformWindow->m_ignoreWindowShouldClose = true; + QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImHints); if (QCoreApplication::sendEvent(fo, &queryEvent)) { bool imEnabled = queryEvent.value(Qt::ImEnabled).toBool(); @@ -1452,6 +1456,8 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) [self interpretKeyEvents:[NSArray arrayWithObject:nsevent]]; } } + + m_platformWindow->m_ignoreWindowShouldClose = false;; } if (m_resendKeyEvent) m_sendKeyEvent = true; |