summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-03-24 07:37:43 +0100
committerLiang Qi <liang.qi@theqtcompany.com>2015-03-24 07:38:02 +0100
commit135ebe4f3d268121047fdbfee49f2dd52006165e (patch)
tree6b303103f36e69e29cfa860b8b7afc584c55d6f3 /src/plugins/platforms/cocoa
parente7feb956280105113b3e58f12e5f32f54199a95a (diff)
parent1e8f50a8d069c97ea6a4f00d664c12e594884f54 (diff)
Merge remote-tracking branch 'origin/5.5' into dev
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplication.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplication.mm10
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaautoreleasepool.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.mm56
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenubar.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm7
-rw-r--r--src/plugins/platforms/cocoa/qcocoaprintersupport.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaprintersupport.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm13
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm6
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;