Mac: QWizard default background pixmap works again

Task-number: QTBUG-26722
Change-Id: I579111b5d34f8e3cdc6bb016d9c0e42ec3ffb8c9
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Stephen Chu <stephen@ju-ju.com>
This commit is contained in:
Liang Qi 2013-09-26 13:37:08 +02:00 committed by The Qt Project
parent 5889b239b1
commit 5b70efb125
4 changed files with 56 additions and 45 deletions

View File

@ -45,6 +45,7 @@
#include <ApplicationServices/ApplicationServices.h>
#include <qpa/qplatformnativeinterface.h>
#include <QtGui/qpixmap.h>
QT_BEGIN_NAMESPACE
@ -91,6 +92,11 @@ private:
Needed by the native print dialog in the Qt Print Support module.
*/
Q_INVOKABLE void *NSPrintInfoForPrintEngine(QPrintEngine *printEngine);
/*
Function to return the default background pixmap.
Needed by QWizard in the Qt widget module.
*/
Q_INVOKABLE QPixmap defaultBackgroundPixmapForQWizard();
// QMacPastebardMime support. The mac pasteboard void pointers are
// QMacPastebardMime instances from the cocoa plugin or qtmacextras

View File

@ -50,6 +50,7 @@
#include <qbytearray.h>
#include <qwindow.h>
#include <qpixmap.h>
#include <qpa/qplatformwindow.h>
#include "qsurfaceformat.h"
#include <qpa/qplatformopenglcontext.h>
@ -154,6 +155,31 @@ void *QCocoaNativeInterface::NSPrintInfoForPrintEngine(QPrintEngine *printEngine
#endif
}
QPixmap QCocoaNativeInterface::defaultBackgroundPixmapForQWizard()
{
QCFType<CFURLRef> url;
const int ExpectedImageWidth = 242;
const int ExpectedImageHeight = 414;
if (LSFindApplicationForInfo(kLSUnknownCreator, CFSTR("com.apple.KeyboardSetupAssistant"),
0, 0, &url) == noErr) {
QCFType<CFBundleRef> bundle = CFBundleCreate(kCFAllocatorDefault, url);
if (bundle) {
url = CFBundleCopyResourceURL(bundle, CFSTR("Background"), CFSTR("png"), 0);
if (url) {
QCFType<CGImageSourceRef> imageSource = CGImageSourceCreateWithURL(url, 0);
QCFType<CGImageRef> image = CGImageSourceCreateImageAtIndex(imageSource, 0, 0);
if (image) {
int width = CGImageGetWidth(image);
int height = CGImageGetHeight(image);
if (width == ExpectedImageWidth && height == ExpectedImageHeight)
return QPixmap::fromImage(qt_mac_toQImage(image));
}
}
}
}
return QPixmap();
}
void QCocoaNativeInterface::onAppFocusWindowChanged(QWindow *window)
{
Q_UNUSED(window);

View File

@ -59,9 +59,10 @@
#include "qset.h"
#include "qstyle.h"
#include "qvarlengtharray.h"
#if defined(Q_WS_MAC)
#include "private/qt_mac_p.h"
#include "qlibrary.h"
#if defined(Q_OS_MACX)
#include <QtCore/QMetaMethod>
#include <QtGui/QGuiApplication>
#include <qpa/qplatformnativeinterface.h>
#elif !defined(QT_NO_STYLE_WINDOWSVISTA)
#include "qwizard_win_p.h"
#include "qtimer.h"
@ -604,7 +605,7 @@ public:
void _q_updateButtonStates();
void _q_handleFieldObjectDestroyed(QObject *);
void setStyle(QStyle *style);
#ifdef Q_WS_MAC
#ifdef Q_OS_MACX
static QPixmap findDefaultBackgroundPixmap();
#endif
@ -1368,7 +1369,7 @@ bool QWizardPrivate::ensureButton(QWizard::WizardButton which) const
}
break;
}
#ifdef Q_WS_MAC
#ifdef Q_OS_MACX
pushButton->setAutoDefault(false);
#endif
pushButton->hide();
@ -1706,32 +1707,22 @@ void QWizardPrivate::setStyle(QStyle *style)
it.value()->setStyle(style);
}
#ifdef Q_WS_MAC
#ifdef Q_OS_MACX
QPixmap QWizardPrivate::findDefaultBackgroundPixmap()
{
QCFType<CFURLRef> url;
const int ExpectedImageWidth = 242;
const int ExpectedImageHeight = 414;
if (LSFindApplicationForInfo(kLSUnknownCreator, CFSTR("com.apple.KeyboardSetupAssistant"),
0, 0, &url) == noErr) {
QCFType<CFBundleRef> bundle = CFBundleCreate(kCFAllocatorDefault, url);
if (bundle) {
url = CFBundleCopyResourceURL(bundle, CFSTR("Background"), CFSTR("tif"), 0);
if (url) {
QCFType<CGImageSourceRef> imageSource = CGImageSourceCreateWithURL(url, 0);
QCFType<CGImageRef> image = CGImageSourceCreateImageAtIndex(imageSource, 0, 0);
if (image) {
int width = CGImageGetWidth(image);
int height = CGImageGetHeight(image);
if (width == ExpectedImageWidth && height == ExpectedImageHeight)
return QPixmap::fromMacCGImageRef(image);
}
}
}
}
return QPixmap();
QGuiApplication *app = qobject_cast<QGuiApplication *>(QCoreApplication::instance());
if (!app)
return QPixmap();
QPlatformNativeInterface *platformNativeInterface = app->platformNativeInterface();
int at = platformNativeInterface->metaObject()->indexOfMethod("defaultBackgroundPixmapForQWizard()");
if (at == -1)
return QPixmap();
QMetaMethod defaultBackgroundPixmapForQWizard = platformNativeInterface->metaObject()->method(at);
QPixmap result;
if (!defaultBackgroundPixmapForQWizard.invoke(platformNativeInterface, Q_RETURN_ARG(QPixmap, result)))
return QPixmap();
return result;
}
#endif
@ -2842,7 +2833,7 @@ QPixmap QWizard::pixmap(WizardPixmap which) const
{
Q_D(const QWizard);
Q_ASSERT(uint(which) < NPixmaps);
#ifdef Q_WS_MAC
#ifdef Q_OS_MACX
if (which == BackgroundPixmap && d->defaultPixmaps[BackgroundPixmap].isNull())
d->defaultPixmaps[BackgroundPixmap] = d->findDefaultBackgroundPixmap();
#endif

View File

@ -439,14 +439,8 @@ void tst_QWizard::setPixmap()
QVERIFY(wizard.pixmap(QWizard::BannerPixmap).isNull());
QVERIFY(wizard.pixmap(QWizard::LogoPixmap).isNull());
QVERIFY(wizard.pixmap(QWizard::WatermarkPixmap).isNull());
#ifdef Q_OS_MAC
if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_3) {
QEXPECT_FAIL("", "QTBUG-23701", Continue);
QVERIFY(wizard.pixmap(QWizard::BackgroundPixmap).isNull() == false);
} else {
// fall through since the image doesn't exist on a 10.3 system.
QVERIFY(page->pixmap(QWizard::BackgroundPixmap).isNull());
}
#ifdef Q_OS_MACX
QVERIFY(wizard.pixmap(QWizard::BackgroundPixmap).isNull() == false);
#else
QVERIFY(wizard.pixmap(QWizard::BackgroundPixmap).isNull());
#endif
@ -454,14 +448,8 @@ void tst_QWizard::setPixmap()
QVERIFY(page->pixmap(QWizard::BannerPixmap).isNull());
QVERIFY(page->pixmap(QWizard::LogoPixmap).isNull());
QVERIFY(page->pixmap(QWizard::WatermarkPixmap).isNull());
#ifdef Q_OS_MAC
if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_3) {
QEXPECT_FAIL("", "QTBUG-23701", Continue);
QVERIFY(wizard.pixmap(QWizard::BackgroundPixmap).isNull() == false);
} else {
// fall through since the image doesn't exist on a 10.3 system.
QVERIFY(page->pixmap(QWizard::BackgroundPixmap).isNull());
}
#ifdef Q_OS_MACX
QVERIFY(wizard.pixmap(QWizard::BackgroundPixmap).isNull() == false);
#else
QVERIFY(page->pixmap(QWizard::BackgroundPixmap).isNull());
#endif