summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@digia.com>2013-09-02 12:41:50 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-23 07:18:24 +0200
commitf370f77e48a06464af12d74d2ccb093c130726ed (patch)
treeeb8a867ce53013922fdfe00c85b1a7c48c449afa /src
parent05cd06cff378cecec071a2aa6f7cb4ee97a9ea6f (diff)
Port QMacNativeWidget to Qt 5
Also adds examples/widgets/mac subdir for Mac specific examples, starting with one for this feature. Change-Id: I4cc7d84ce3d7562259d6206faa5d6996c2392a3e Reviewed-by: Liang Qi <liang.qi@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/widgets/widgets/qmacnativewidget_mac.h7
-rw-r--r--src/widgets/widgets/qmacnativewidget_mac.mm69
-rw-r--r--src/widgets/widgets/widgets.pri11
3 files changed, 64 insertions, 23 deletions
diff --git a/src/widgets/widgets/qmacnativewidget_mac.h b/src/widgets/widgets/qmacnativewidget_mac.h
index 796d7b38d4..dd433a4ee3 100644
--- a/src/widgets/widgets/qmacnativewidget_mac.h
+++ b/src/widgets/widgets/qmacnativewidget_mac.h
@@ -44,20 +44,23 @@
#include <QtWidgets/QWidget>
-QT_BEGIN_NAMESPACE
+Q_FORWARD_DECLARE_OBJC_CLASS(NSView);
+QT_BEGIN_NAMESPACE
class QMacNativeWidgetPrivate;
class Q_WIDGETS_EXPORT QMacNativeWidget : public QWidget
{
Q_OBJECT
public:
- QMacNativeWidget(void *parentRef = 0);
+ QMacNativeWidget(NSView *parentView = 0);
~QMacNativeWidget();
QSize sizeHint() const;
+ NSView *nativeView() const;
protected:
+ void init(NSView *parentView);
bool event(QEvent *ev);
private:
diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm
index 50907b8dfc..1d36c389a6 100644
--- a/src/widgets/widgets/qmacnativewidget_mac.mm
+++ b/src/widgets/widgets/qmacnativewidget_mac.mm
@@ -40,15 +40,18 @@
****************************************************************************/
#import <Cocoa/Cocoa.h>
-#import <private/qcocoaview_mac_p.h>
#include "qmacnativewidget_mac.h"
-#include <private/qwidget_p.h>
+
+#include <QtCore/qdebug.h>
+#include <QtGui/qwindow.h>
+#include <QtGui/qguiapplication.h>
+#include <qpa/qplatformnativeinterface.h>
/*!
\class QMacNativeWidget
\since 4.5
- \brief The QMacNativeWidget class provides a widget for Mac OS X that provides a way to put Qt widgets into Carbon
- or Cocoa hierarchies depending on how Qt was configured.
+ \brief The QMacNativeWidget class provides a widget for Mac OS X that provides
+ a way to put Qt widgets into Cocoa hierarchies.
\ingroup advanced
\inmodule QtWidgets
@@ -80,26 +83,47 @@
QT_BEGIN_NAMESPACE
-class QMacNativeWidgetPrivate : public QWidgetPrivate
+namespace {
+// TODO use QtMacExtras copy of this function when available.
+inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePlatformFunction(const QByteArray &functionName)
{
-};
-
-extern OSViewRef qt_mac_create_widget(QWidget *widget, QWidgetPrivate *widgetPrivate, OSViewRef parent);
+ QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
+ QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
+ nativeInterface->nativeResourceFunctionForIntegration(functionName);
+ if (!function)
+ qWarning() << "Qt could not resolve function" << functionName
+ << "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()";
+ return function;
+}
+} //namespsace
+NSView *getEmbeddableView(QWindow *qtWindow)
+{
+ // Make sure the platform window is created
+ qtWindow->create();
+
+ // Inform the window that it's a subwindow of a non-Qt window. This must be
+ // done after create() because we need to have a QPlatformWindow instance.
+ // The corresponding NSWindow will not be shown and can be deleted later.
+ typedef void (*SetEmbeddedInForeignViewFunction)(QPlatformWindow *window, bool embedded);
+ reinterpret_cast<SetEmbeddedInForeignViewFunction>(resolvePlatformFunction("setEmbeddedInForeignView"))(qtWindow->handle(), true);
+
+ // Get the Qt content NSView for the QWindow from the Qt platform plugin
+ QPlatformNativeInterface *platformNativeInterface = QGuiApplication::platformNativeInterface();
+ NSView *qtView = (NSView *)platformNativeInterface->nativeResourceForWindow("nsview", qtWindow);
+ return qtView; // qtView is ready for use.
+}
/*!
Create a QMacNativeWidget with \a parentView as its "superview" (i.e.,
- parent). The \a parentView is either an HIViewRef if Qt is using Carbon or
- a NSView pointer if Qt is using Cocoa.
+ parent). The \a parentView is a NSView pointer.
*/
-QMacNativeWidget::QMacNativeWidget(void *parentView)
- : QWidget(*new QMacNativeWidgetPrivate, 0, Qt::Window)
+QMacNativeWidget::QMacNativeWidget(NSView *parentView)
+ : QWidget(0)
{
- Q_D(QMacNativeWidget);
- OSViewRef myView = qt_mac_create_widget(this, d, OSViewRef(parentView));
+ Q_UNUSED(parentView);
- d->topData()->embedded = true;
- create(WId(myView), false, false);
+ //d_func()->topData()->embedded = true;
setPalette(QPalette(Qt::transparent));
setAttribute(Qt::WA_SetPalette, false);
setAttribute(Qt::WA_LayoutUsesWidgetRect);
@@ -117,8 +141,19 @@ QMacNativeWidget::~QMacNativeWidget()
*/
QSize QMacNativeWidget::sizeHint() const
{
- return QSize(200, 200);
+ // QMacNativeWidget really does not have any other choice
+ // than to fill its designated area.
+ if (windowHandle())
+ return windowHandle()->size();
+ return QWidget::sizeHint();
}
+
+NSView *QMacNativeWidget::nativeView() const
+{
+ winId();
+ return getEmbeddableView(windowHandle());
+}
+
/*!
\reimp
*/
diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri
index e130827905..027654078f 100644
--- a/src/widgets/widgets/widgets.pri
+++ b/src/widgets/widgets/widgets.pri
@@ -142,20 +142,23 @@ SOURCES += \
widgets/qplaintextedit.cpp
macx {
+ HEADERS += \
+ widgets/qmacnativewidget_mac.h
+
OBJECTIVE_SOURCES += \
- widgets/qmenu_mac.mm
+ widgets/qmenu_mac.mm \
+ widgets/qmacnativewidget_mac.mm
}
# TODO
false:mac {
- HEADERS += widgets/qmacnativewidget_mac.h \
- widgets/qmaccocoaviewcontainer_mac.h
+ HEADERS += widgets/qmaccocoaviewcontainer_mac.h
OBJECTIVE_HEADERS += widgets/qcocoatoolbardelegate_mac_p.h \
widgets/qcocoamenu_mac_p.h
OBJECTIVE_SOURCES += widgets/qmaccocoaviewcontainer_mac.mm \
widgets/qcocoatoolbardelegate_mac.mm \
widgets/qmainwindowlayout_mac.mm \
- widgets/qmacnativewidget_mac.mm \
+
}
wince*: {