diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-22 16:35:41 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-22 16:35:43 +0200 |
commit | 4c231d5df3040dbf4545a9a77145ee0e1f9c380c (patch) | |
tree | 2cc5b71a5d2b464214cf5372776913fbe4622e1e /src/plugins/platforms/cocoa | |
parent | 7df16fb4ccbe0476bc34274a77e98eec4e8d2d93 (diff) | |
parent | d672ef07681a959d9559dd1e11e70db1f448a7f1 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I059725e3b7d7ffd5a16a0931e6c17200917172b5
Diffstat (limited to 'src/plugins/platforms/cocoa')
18 files changed, 141 insertions, 49 deletions
diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm index 0eb4edef72..6adcb27817 100644 --- a/src/plugins/platforms/cocoa/main.mm +++ b/src/plugins/platforms/cocoa/main.mm @@ -59,6 +59,9 @@ public: QPlatformIntegration * QCocoaIntegrationPlugin::create(const QString& system, const QStringList& paramList) { Q_UNUSED(paramList); + + QCocoaAutoReleasePool pool; + if (system.toLower() == "cocoa") return new QCocoaIntegration; diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm index 34192e85b0..25780e79f4 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm @@ -180,7 +180,8 @@ bool shouldBeIgnored(QAccessibleInterface *interface) // state. Ignore interfaces with those flags set. const QAccessible::State state = interface->state(); if (state.invisible || - state.offscreen) + state.offscreen || + state.invalid) return true; // Some roles are not interesting. In particular, container roles should be @@ -189,12 +190,13 @@ bool shouldBeIgnored(QAccessibleInterface *interface) if (role == QAccessible::Border || // QFrame role == QAccessible::Application || // We use the system-provided application element. role == QAccessible::MenuItem || // The system also provides the menu items. - role == QAccessible::ToolBar) // Access the tool buttons directly. + role == QAccessible::ToolBar || // Access the tool buttons directly. + role == QAccessible::Pane || // Scroll areas. + role == QAccessible::Client) // The default for QWidget. return true; NSString *mac_role = macRole(interface); if (mac_role == NSAccessibilityWindowRole || // We use the system-provided window elements. - mac_role == NSAccessibilityGroupRole || mac_role == NSAccessibilityUnknownRole) return true; diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index 1d6797e51a..f7c945c50d 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -151,6 +151,7 @@ [kids addObject: element]; [element release]; } + // ### maybe we should use NSAccessibilityUnignoredChildren(kids); this needs more profiling return kids; } else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) { @@ -256,7 +257,7 @@ // misc - (BOOL)accessibilityIsIgnored { - return false; //QCocoaAccessible::shouldBeIgnored(QAccessible::accessibleInterface(id)); + return QCocoaAccessible::shouldBeIgnored(QAccessible::accessibleInterface(axid)); } - (id)accessibilityHitTest:(NSPoint)point { diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm index 5c487b0bdd..2ac9a5dac9 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm @@ -741,11 +741,14 @@ void QCocoaEventDispatcherPrivate::endModalSession(QWindow *window) // when we stop the _current_ modal session (which is the session on top of // the stack, and might not belong to 'window'). int stackSize = cocoaModalSessionStack.size(); + int endedSessions = 0; for (int i=stackSize-1; i>=0; --i) { QCocoaModalSessionInfo &info = cocoaModalSessionStack[i]; + if (!info.window) + endedSessions++; if (info.window == window) { info.window = 0; - if (i == stackSize-1) { + if (i + endedSessions == stackSize-1) { // The top sessions ended. Interrupt the event dispatcher to // start spinning the correct session immediately. Like in // beginModalSession(), we call interrupt() before clearing diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index 7093d27efe..071edb5b60 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -61,6 +61,8 @@ #include <stdlib.h> #include <qabstracteventdispatcher.h> #include "qcocoaautoreleasepool.h" +#include <QFileSystemWatcher> +#include <QDir> #include <qpa/qplatformnativeinterface.h> @@ -72,6 +74,30 @@ QT_FORWARD_DECLARE_CLASS(QFileInfo) QT_FORWARD_DECLARE_CLASS(QWindow) QT_USE_NAMESPACE +class CachedEntries: public QObject { +public: + CachedEntries(QDir::Filters filters) : mFilters(filters) { + QObject::connect(&mFSWatcher, &QFileSystemWatcher::directoryChanged, this, &CachedEntries::updateDirCache); + } + QString directory() const { + const QStringList &dirs = mFSWatcher.directories(); + return (dirs.count() ? dirs[0] : QString()); + } + QStringList entries() const { + return mQDirFilterEntryList; + } + void updateDirCache(const QString &path) { + mFSWatcher.removePaths(mFSWatcher.directories()); + mFSWatcher.addPath(path); + mQDirFilterEntryList = QDir(path).entryList(mFilters); + } + +private: + QFileSystemWatcher mFSWatcher; + QStringList mQDirFilterEntryList; + QDir::Filters mFilters; +}; + typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; @class QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate); @@ -91,9 +117,8 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; int mReturnCode; SharedPointerFileDialogOptions mOptions; - QString *mLastFilterCheckPath; + CachedEntries *mCachedEntries; QString *mCurrentSelection; - QStringList *mQDirFilterEntryList; QStringList *mNameFilterDropDownList; QStringList *mSelectedNameFilter; } @@ -137,8 +162,7 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; [mSavePanel setDelegate:self]; mReturnCode = -1; mHelper = helper; - mLastFilterCheckPath = new QString; - mQDirFilterEntryList = new QStringList; + mCachedEntries = new CachedEntries(mOptions->filter()); mNameFilterDropDownList = new QStringList(mOptions->nameFilters()); QString selectedVisualNameFilter = mOptions->initiallySelectedNameFilter(); mSelectedNameFilter = new QStringList([self findStrippedFilterWithVisualFilterName:selectedVisualNameFilter]); @@ -171,8 +195,7 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; - (void)dealloc { - delete mLastFilterCheckPath; - delete mQDirFilterEntryList; + delete mCachedEntries; delete mNameFilterDropDownList; delete mSelectedNameFilter; delete mCurrentSelection; @@ -303,12 +326,11 @@ static QString strippedText(QString s) QString qtFileName = QT_PREPEND_NAMESPACE(QCFString::toQString)(filename); QFileInfo info(qtFileName.normalized(QT_PREPEND_NAMESPACE(QString::NormalizationForm_C))); QString path = info.absolutePath(); - if (path != *mLastFilterCheckPath){ - *mLastFilterCheckPath = path; - *mQDirFilterEntryList = info.dir().entryList(mOptions->filter()); + if (mCachedEntries->directory() != path) { + mCachedEntries->updateDirCache(path); } // Check if the QDir filter accepts the file: - if (!mQDirFilterEntryList->contains(info.fileName())) + if (!mCachedEntries->entries().contains(info.fileName())) return NO; // No filter means accept everything diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index e2d867e623..821e10de52 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -122,7 +122,9 @@ void QCocoaScreen::updateGeometry() m_physicalSize = QSizeF(size.width, size.height); m_logicalDpi.first = 72; m_logicalDpi.second = 72; - float refresh = CGDisplayModeGetRefreshRate(CGDisplayCopyDisplayMode(dpy)); + CGDisplayModeRef displayMode = CGDisplayCopyDisplayMode(dpy); + float refresh = CGDisplayModeGetRefreshRate(displayMode); + CGDisplayModeRelease(displayMode); if (refresh > 0) m_refreshRate = refresh; diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index 0fe4c48510..bde9ded14f 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -97,7 +97,6 @@ static inline QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *getMenuLoader() if (![menuItem tag]) return YES; - QCocoaMenuItem* cocoaItem = reinterpret_cast<QCocoaMenuItem *>([menuItem tag]); return cocoaItem->isEnabled(); } @@ -308,13 +307,54 @@ void QCocoaMenu::setVisible(bool visible) void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item) { + QCocoaAutoReleasePool pool; + QCocoaWindow *cocoaWindow = parentWindow ? static_cast<QCocoaWindow *>(parentWindow->handle()) : 0; NSView *view = cocoaWindow ? cocoaWindow->contentView() : nil; NSMenuItem *nsItem = item ? ((QCocoaMenuItem *)item)->nsItem() : nil; - NSPoint nsPos = NSMakePoint(pos.x(), pos.y()); - [m_nativeMenu popUpMenuPositioningItem:nsItem atLocation:nsPos inView:view]; - // The call above blocks, and also swallows any mouse release event, + // Ideally, we would call -popUpMenuPositioningItem:atLocation:inView:. + // However, this showed not to work with modal windows where the menu items + // would appear disabled. So, we resort to a more artisanal solution. Note + // that this implies several things. + if (nsItem) { + // If we want to position the menu popup so that a specific item lies under + // the mouse cursor, we resort to NSPopUpButtonCell to do that. This is the + // typical use-case for a choice list, or non-editable combobox. We can't + // re-use the popUpContextMenu:withEvent:forView: logic below since it won't + // respect the menu's minimum width. + NSPopUpButtonCell *popupCell = [[[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:NO] + autorelease]; + [popupCell setAltersStateOfSelectedItem:NO]; + [popupCell setTransparent:YES]; + [popupCell setMenu:m_nativeMenu]; + [popupCell selectItem:nsItem]; + NSRect cellFrame = NSMakeRect(pos.x(), pos.y(), m_nativeMenu.minimumWidth, 10); + [popupCell performClickWithFrame:cellFrame inView:view]; + } else { + // Else, we need to transform 'pos' to window or screen coordinates. + NSPoint nsPos = NSMakePoint(pos.x() - 1, pos.y()); + if (view) { + nsPos.y = view.frame.size.height - nsPos.y; + } else if (!QGuiApplication::screens().isEmpty()) { + QScreen *screen = QGuiApplication::screens().at(0); + nsPos.y = screen->availableVirtualSize().height() - nsPos.y; + } + + // Finally, we need to synthesize an event. + NSEvent *menuEvent = [NSEvent mouseEventWithType:NSRightMouseDown + location:nsPos + modifierFlags:0 + timestamp:0 + windowNumber:view ? view.window.windowNumber : 0 + context:nil + eventNumber:0 + clickCount:1 + pressure:1.0]; + [NSMenu popUpContextMenu:m_nativeMenu withEvent:menuEvent forView:view]; + } + + // The calls above block, and also swallow any mouse release event, // so we need to clear any mouse button that triggered the menu popup. if ([view isKindOfClass:[QNSView class]]) [(QNSView *)view resetMouseButtons]; @@ -356,6 +396,8 @@ QList<QCocoaMenuItem *> QCocoaMenu::merged() const void QCocoaMenu::syncModalState(bool modal) { + QCocoaAutoReleasePool pool; + if (!m_enabled) modal = true; diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index c0c8caed05..b880db16a2 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -114,6 +114,8 @@ void QCocoaMenuBar::insertMenu(QPlatformMenu *platformMenu, QPlatformMenu *befor void QCocoaMenuBar::removeMenu(QPlatformMenu *platformMenu) { + QCocoaAutoReleasePool pool; + QCocoaMenu *menu = static_cast<QCocoaMenu *>(platformMenu); if (!m_menus.contains(menu)) { qWarning() << Q_FUNC_INFO << "Trying to remove a menu that does not belong to the menubar"; diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index dd99a6f3bc..350ef8a16a 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -218,8 +218,6 @@ NSMenuItem *QCocoaMenuItem::sync() mergeItem = [loader aboutMenuItem]; else mergeItem = [loader aboutQtMenuItem]; - - m_merged = true; } else if (m_text.startsWith(tr("Config"), Qt::CaseInsensitive) || m_text.startsWith(tr("Preference"), Qt::CaseInsensitive) || m_text.startsWith(tr("Options"), Qt::CaseInsensitive) @@ -240,9 +238,9 @@ NSMenuItem *QCocoaMenuItem::sync() if (mergeItem) { m_merged = true; + [mergeItem retain]; [m_native release]; m_native = mergeItem; - [m_native retain]; // balance out release! [m_native setTag:reinterpret_cast<NSInteger>(this)]; } else if (m_merged) { // was previously merged, but no longer @@ -256,13 +254,12 @@ NSMenuItem *QCocoaMenuItem::sync() m_native = [[NSMenuItem alloc] initWithTitle:QCFString::toNSString(m_text) action:nil keyEquivalent:@""]; - [m_native retain]; [m_native setTag:reinterpret_cast<NSInteger>(this)]; } // [m_native setHidden:YES]; // [m_native setHidden:NO]; - [m_native setHidden: !m_isVisible]; + [m_native setHidden: !m_isVisible]; [m_native setEnabled: m_enabled]; QString text = m_text; QKeySequence accel = m_shortcut; diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index f0f1f56d90..84261ad273 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -85,10 +85,8 @@ void *QCocoaNativeInterface::nativeResourceForContext(const QByteArray &resource void *QCocoaNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) { - if (!window->handle()) { - qWarning("QCocoaNativeInterface::nativeResourceForWindow: Native window has not been created."); + if (!window->handle()) return 0; - } if (resourceString == "nsopenglcontext") { return static_cast<QCocoaWindow *>(window->handle())->currentContext()->nsOpenGLContext(); @@ -228,6 +226,11 @@ void QCocoaNativeInterface::setWindowContentView(QPlatformWindow *window, void * void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable) { + // Make sure the QCocoaWindow is created when enabling. Disabling might + // happen on window destruction, don't (re)create the QCocoaWindow then. + if (enable) + window->create(); + QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle()); if (cocoaWindow) cocoaWindow->registerTouch(enable); diff --git a/src/plugins/platforms/cocoa/qcocoasystemsettings.mm b/src/plugins/platforms/cocoa/qcocoasystemsettings.mm index e613dbbd1b..af817bd4c5 100644 --- a/src/plugins/platforms/cocoa/qcocoasystemsettings.mm +++ b/src/plugins/platforms/cocoa/qcocoasystemsettings.mm @@ -176,7 +176,7 @@ QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes() QHash<QPlatformTheme::Palette, QPalette*> palettes; QColor qc; for (int i = 0; mac_widget_colors[i].paletteRole != QPlatformTheme::NPalettes; i++) { - QPalette pal = *qt_mac_createSystemPalette(); + QPalette &pal = *qt_mac_createSystemPalette(); if (mac_widget_colors[i].active != 0) { qc = qt_mac_colorForThemeTextColor(mac_widget_colors[i].active); pal.setColor(QPalette::Active, QPalette::Text, qc); @@ -223,7 +223,7 @@ QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes() pal.setBrush(QPalette::Disabled, QPalette::Base, pal.brush(QPalette::Active, QPalette::Base)); } - palettes.insert(mac_widget_colors[i].paletteRole, new QPalette(pal)); + palettes.insert(mac_widget_colors[i].paletteRole, &pal); } return palettes; } diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm index f8eed0ebf1..8337e00eb6 100644 --- a/src/plugins/platforms/cocoa/qcocoatheme.mm +++ b/src/plugins/platforms/cocoa/qcocoatheme.mm @@ -290,6 +290,8 @@ QVariant QCocoaTheme::themeHint(ThemeHint hint) const sizes << 16 << 32 << 64 << 128; return QVariant::fromValue(sizes); } + case QPlatformTheme::PasswordMaskDelay: + return QVariant(QChar(kBulletUnicode)); default: break; } diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 4e567c6c63..5ff1bf83ae 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -283,6 +283,10 @@ void QCocoaWindow::setVisible(bool visible) parentCocoaWindow->m_activePopupWindow = window(); // QTBUG-30266: a window should not be resizable while a transient popup is open // Since this isn't a native popup, the window manager doesn't close the popup when you click outside +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7 + && !([parentCocoaWindow->m_nsWindow styleMask] & NSFullScreenWindowMask)) +#endif [parentCocoaWindow->m_nsWindow setStyleMask: (parentCocoaWindow->windowStyleMask(parentCocoaWindow->m_windowFlags) & ~NSResizableWindowMask)]; } @@ -346,7 +350,12 @@ void QCocoaWindow::setVisible(bool visible) } else { [m_contentView setHidden:YES]; } - if (parentCocoaWindow && window()->type() == Qt::Popup) + if (parentCocoaWindow && window()->type() == Qt::Popup +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + && QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7 + && !([parentCocoaWindow->m_nsWindow styleMask] & NSFullScreenWindowMask) +#endif + ) // QTBUG-30266: a window should not be resizable while a transient popup is open [parentCocoaWindow->m_nsWindow setStyleMask:parentCocoaWindow->windowStyleMask(parentCocoaWindow->m_windowFlags)]; } @@ -471,6 +480,8 @@ void QCocoaWindow::setWindowIcon(const QIcon &icon) NSButton *iconButton = [m_nsWindow standardWindowButton:NSWindowDocumentIconButton]; if (iconButton == nil) { + if (icon.isNull()) + return; NSString *title = QCFString::toNSString(window()->title()); [m_nsWindow setRepresentedURL:[NSURL fileURLWithPath:title]]; iconButton = [m_nsWindow standardWindowButton:NSWindowDocumentIconButton]; @@ -852,7 +863,7 @@ void QCocoaWindow::syncWindowState(Qt::WindowState newState) // if content view width or height is 0 then the window animations will crash so // do nothing except set the new state NSRect contentRect = [contentView() frame]; - if (contentRect.size.width <= 0 || contentRect.size.height <= 0) { + if (contentRect.size.width < 0 || contentRect.size.height < 0) { qWarning() << Q_FUNC_INFO << "invalid window content view size, check your window geometry"; m_synchedWindowState = newState; return; @@ -905,7 +916,7 @@ QCocoaMenuBar *QCocoaWindow::menubar() const void QCocoaWindow::registerTouch(bool enable) { m_registerTouchCount += enable ? 1 : -1; - if (m_registerTouchCount == 1) + if (enable && m_registerTouchCount == 1) [m_contentView setAcceptsTouchEvents:YES]; else if (m_registerTouchCount == 0) [m_contentView setAcceptsTouchEvents:NO]; diff --git a/src/plugins/platforms/cocoa/qmacmime.mm b/src/plugins/platforms/cocoa/qmacmime.mm index 89539de331..51c39357ea 100644 --- a/src/plugins/platforms/cocoa/qmacmime.mm +++ b/src/plugins/platforms/cocoa/qmacmime.mm @@ -553,10 +553,8 @@ QVariant QMacPasteboardMimeTiff::convertToMime(const QString &mime, QList<QByteA a.size(), kCFAllocatorNull); QCFType<CGImageSourceRef> imageSource = CGImageSourceCreateWithData(tiffData, 0); image = CGImageSourceCreateImageAtIndex(imageSource, 0, 0); - - // ### TODO (msorvig) QPixmap conversion - //if (image != 0) - // ret = QVariant(QPixmap::fromMacCGImageRef(image).toImage()); + if (image != 0) + ret = QVariant(qt_mac_toQImage(image)); return ret; } diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index e7ea3d8f8d..68145ec914 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -63,7 +63,6 @@ QT_END_NAMESPACE QWindow *m_window; QCocoaWindow *m_platformWindow; Qt::MouseButtons m_buttons; - QAccessibleInterface *m_accessibleRoot; QString m_composingText; bool m_sendKeyEvent; QStringList *currentCustomDragTypes; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 568cc4bebf..52e2d781ee 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -121,7 +121,6 @@ static QTouchDevice *touchDevice = 0; m_window = window; m_platformWindow = platformWindow; - m_accessibleRoot = 0; m_sendKeyEvent = false; #ifdef QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR @@ -130,15 +129,13 @@ static QTouchDevice *touchDevice = 0; static bool skipAccessibilityForInspectorWindows = false; if (!skipAccessibilityForInspectorWindows) { - m_accessibleRoot = window->accessibleRoot(); + // m_accessibleRoot = window->accessibleRoot(); AccessibilityInspector *inspector = new AccessibilityInspector(window); skipAccessibilityForInspectorWindows = true; inspector->inspectWindow(window); skipAccessibilityForInspectorWindows = false; } -#else - m_accessibleRoot = window->accessibleRoot(); #endif [self registerDragTypes]; diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm index e3b8cf6532..c43c0b5068 100644 --- a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm +++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm @@ -45,6 +45,7 @@ #include "qcocoahelpers.h" #include "qcocoaaccessibility.h" #include "qcocoaaccessibilityelement.h" +#include <qpa/qplatformintegration.h> #include <QtGui/private/qaccessible2_p.h> #include <QtCore/QDebug> @@ -60,22 +61,26 @@ } - (id)accessibilityAttributeValue:(NSString *)attribute { + + // activate accessibility updates + QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true); + if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) { - if (m_accessibleRoot) - return QCocoaAccessible::macRole(m_accessibleRoot); + if (m_window->accessibleRoot()) + return QCocoaAccessible::macRole(m_window->accessibleRoot()); return NSAccessibilityUnknownRole; } else if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) { return NSAccessibilityRoleDescriptionForUIElement(self); } else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) { - if (!m_accessibleRoot) + if (!m_window->accessibleRoot()) return [super accessibilityAttributeValue:attribute]; // Create QCocoaAccessibleElements for each child if the // root accessible interface. - int numKids = m_accessibleRoot->childCount(); + int numKids = m_window->accessibleRoot()->childCount(); NSMutableArray *kids = [NSMutableArray arrayWithCapacity:numKids]; for (int i = 0; i < numKids; ++i) { - QAccessibleInterface *child = m_accessibleRoot->child(i); + QAccessibleInterface *child = m_window->accessibleRoot()->child(i); Q_ASSERT(child); QAccessible::Id childAxid = QAccessible::uniqueId(child); QCocoaAccessibleElement *element = [QCocoaAccessibleElement createElementWithId:childAxid parent:self]; @@ -90,10 +95,10 @@ } - (id)accessibilityHitTest:(NSPoint)point { - if (!m_accessibleRoot) + if (!m_window->accessibleRoot()) return [super accessibilityHitTest:point]; - QAccessibleInterface *childInterface = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y)); + QAccessibleInterface *childInterface = m_window->accessibleRoot()->childAt(point.x, qt_mac_flipYCoordinate(point.y)); // No child found, meaning we hit the NSView if (!childInterface) { return [super accessibilityHitTest:point]; diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm index 4748005f1a..2dedf99582 100644 --- a/src/plugins/platforms/cocoa/qprintengine_mac.mm +++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm @@ -364,6 +364,9 @@ int QMacPrintEngine::metric(QPaintDevice::PaintDeviceMetric m) const case QPaintDevice::PdmDepth: val = 24; break; + case QPaintDevice::PdmDevicePixelRatio: + val = 1; + break; default: val = 0; qWarning("QPrinter::metric: Invalid metric command"); |