summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@digia.com>2013-09-02 12:25:17 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-21 05:09:33 +0200
commitdd7bfffa77c231296ca977d6c7d487962f7ebae9 (patch)
tree266d9416c273e271deae09169dbf29476d6c3d7e
parentf9365b0acc87808599ebf2e121abd67eac946743 (diff)
Add QMenu -> NSMenu conversion functions.
Add QMenu::toNSMenu() and QMenuBar()::toNSMenu(). Add QMenu::setAsDockMenu and qt_mac_set_doc_menu(QMenu *menu) These are all API wrappers around implementation in the Cocoa platform plugin. Change-Id: I927ed4fb5dc42cc577a41a80b531a4a2f7b8812c Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
-rw-r--r--src/widgets/widgets/qmenu.h12
-rw-r--r--src/widgets/widgets/qmenu_mac.mm140
-rw-r--r--src/widgets/widgets/qmenubar.h3
-rw-r--r--src/widgets/widgets/widgets.pri5
4 files changed, 160 insertions, 0 deletions
diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h
index 518771d846..7a128e871c 100644
--- a/src/widgets/widgets/qmenu.h
+++ b/src/widgets/widgets/qmenu.h
@@ -50,6 +50,9 @@
#ifdef Q_OS_WINCE
#include <windef.h> // for HMENU
#endif
+#ifdef Q_OS_OSX
+Q_FORWARD_DECLARE_OBJC_CLASS(NSMenu);
+#endif
QT_BEGIN_NAMESPACE
@@ -141,6 +144,10 @@ public:
#ifdef Q_OS_WINCE
HMENU wceMenu();
#endif
+#ifdef Q_OS_OSX
+ NSMenu* toNSMenu();
+ void setAsDockMenu();
+#endif
bool separatorsCollapsible() const;
void setSeparatorsCollapsible(bool collapse);
@@ -204,6 +211,11 @@ private:
friend void qt_mac_menu_emit_hovered(QMenu *menu, QAction *action);
};
+#ifdef Q_OS_OSX
+// ### Qt 4 compatibility; remove in Qt 6
+inline QT_DEPRECATED void qt_mac_set_dock_menu(QMenu *menu) { menu->setAsDockMenu(); }
+#endif
+
#endif // QT_NO_MENU
QT_END_NAMESPACE
diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm
new file mode 100644
index 0000000000..41c4481b74
--- /dev/null
+++ b/src/widgets/widgets/qmenu_mac.mm
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <Foundation/Foundation.h>
+#import <Cocoa/Cocoa.h>
+
+#include "qmenu.h"
+#include "qmenubar.h"
+
+#include <QtCore/QDebug>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QWindow>
+#include <qpa/qplatformnativeinterface.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_MENU
+
+namespace {
+// TODO use QtMacExtras copy of this function when available.
+inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePlatformFunction(const QByteArray &functionName)
+{
+ 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
+
+
+/*!
+ \since 5.2
+
+ Returns the native NSMenu for this menu. Available on OS X only.
+*/
+NSMenu* QMenu::toNSMenu()
+{
+ // Call into the cocoa platform plugin: qMenuToNSMenu(platformMenu())
+ QPlatformNativeInterface::NativeResourceForIntegrationFunction function = resolvePlatformFunction("qmenutonsmenu");
+ if (function) {
+ typedef void* (*QMenuToNSMenuFunction)(QPlatformMenu *platformMenu);
+ return reinterpret_cast<NSMenu *>(reinterpret_cast<QMenuToNSMenuFunction>(function)(platformMenu()));
+ }
+ return nil;
+}
+
+
+/*!
+ \since 5.2
+
+ Set this menu to be the dock menu available by option-clicking
+ on the application dock icon. Available on OS X only.
+*/
+void QMenu::setAsDockMenu()
+{
+ // Call into the cocoa platform plugin: setDockMenu(platformMenu())
+ QPlatformNativeInterface::NativeResourceForIntegrationFunction function = resolvePlatformFunction("setdockmenu");
+ if (function) {
+ typedef void (*SetDockMenuFunction)(QPlatformMenu *platformMenu);
+ reinterpret_cast<SetDockMenuFunction>(function)(platformMenu());
+ }
+}
+
+
+/*! \fn void qt_mac_set_dock_menu(QMenu *menu)
+ \since 5.2
+ \deprecated
+
+ Set this menu to be the dock menu available by option-clicking
+ on the application dock icon. Available on OS X only.
+
+ Deprecated; use QMenu:setAsDockMenu() instead.
+
+ \sa QMenu:setAsDockMenu()
+*/
+
+#endif //QT_NO_MENU
+
+#ifndef QT_NO_MENUBAR
+
+/*!
+ \since 5.2
+
+ Returns the native NSMenu for this menu bar. Available on OS X only.
+*/
+NSMenu* QMenuBar::toNSMenu()
+{
+ // Call into the cocoa platform plugin: qMenuBarToNSMenu(platformMenuBar())
+ QPlatformNativeInterface::NativeResourceForIntegrationFunction function = resolvePlatformFunction("qmenubartonsmenu");
+ if (function) {
+ typedef void* (*QMenuBarToNSMenuFunction)(QPlatformMenuBar *platformMenuBar);
+ return reinterpret_cast<NSMenu *>(reinterpret_cast<QMenuBarToNSMenuFunction>(function)(platformMenuBar()));
+ }
+ return nil;
+}
+#endif //QT_NO_MENUBAR
+
+QT_END_NAMESPACE
+
diff --git a/src/widgets/widgets/qmenubar.h b/src/widgets/widgets/qmenubar.h
index e88a0c07c0..60eebee4d4 100644
--- a/src/widgets/widgets/qmenubar.h
+++ b/src/widgets/widgets/qmenubar.h
@@ -108,6 +108,9 @@ public:
static void wceCommands(uint command);
static void wceRefresh();
#endif
+#ifdef Q_OS_OSX
+ NSMenu* toNSMenu();
+#endif
bool isNativeMenuBar() const;
void setNativeMenuBar(bool nativeMenuBar);
diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri
index 9780d3c24c..e130827905 100644
--- a/src/widgets/widgets/widgets.pri
+++ b/src/widgets/widgets/widgets.pri
@@ -141,6 +141,11 @@ SOURCES += \
widgets/qtoolbararealayout.cpp \
widgets/qplaintextedit.cpp
+macx {
+ OBJECTIVE_SOURCES += \
+ widgets/qmenu_mac.mm
+}
+
# TODO
false:mac {
HEADERS += widgets/qmacnativewidget_mac.h \