diff options
author | Morten Johan Sørvig <morten.sorvig@digia.com> | 2013-09-02 12:25:17 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-21 05:09:33 +0200 |
commit | dd7bfffa77c231296ca977d6c7d487962f7ebae9 (patch) | |
tree | 266d9416c273e271deae09169dbf29476d6c3d7e | |
parent | f9365b0acc87808599ebf2e121abd67eac946743 (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.h | 12 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu_mac.mm | 140 | ||||
-rw-r--r-- | src/widgets/widgets/qmenubar.h | 3 | ||||
-rw-r--r-- | src/widgets/widgets/widgets.pri | 5 |
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 \ |