summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorAurélien Gâteau <agateau@kde.org>2011-06-14 18:04:26 +0200
committerQt by Nokia <qt-info@nokia.com>2011-08-31 13:12:43 +0200
commitbaeed7c6c35814e370edab5d9500cba651919d26 (patch)
treee199bb5282e07d9e37c0b21113deb80ed36f302c /src/gui
parent6c97b066a958d840c70d7b0b5417a015b710c4d7 (diff)
Introduce menubar plugin system
Merge-request: 1254 Reviewed-by: Gabriel de Dietrich <gabriel.dietrich-de@nokia.com> (cherry picked from commit 31ff55bbeb84f10e75e997c75a63deda83e62507) Change-Id: I0644514299c16cabe19d1e6d024dd652b2d7bc4e Reviewed-on: http://codereview.qt.nokia.com/3933 Reviewed-by: Gabriel de Dietrich <gabriel.dietrich-de@nokia.com>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/widgets/qabstractplatformmenubar_p.h12
-rw-r--r--src/gui/widgets/qmenubar.cpp5
-rw-r--r--src/gui/widgets/qmenubar_x11.cpp24
-rw-r--r--src/gui/widgets/qmenubar_x11_p.h2
4 files changed, 42 insertions, 1 deletions
diff --git a/src/gui/widgets/qabstractplatformmenubar_p.h b/src/gui/widgets/qabstractplatformmenubar_p.h
index 86e212be9d..cb4e5cba73 100644
--- a/src/gui/widgets/qabstractplatformmenubar_p.h
+++ b/src/gui/widgets/qabstractplatformmenubar_p.h
@@ -41,7 +41,9 @@
#ifndef QABSTRACTPLATFORMMENUBAR_P_H
#define QABSTRACTPLATFORMMENUBAR_P_H
+#include <qfactoryinterface.h>
#include <qglobal.h>
+#include <qplugin.h>
#ifndef QT_NO_MENUBAR
@@ -54,6 +56,16 @@ class QMenuBar;
class QObject;
class QWidget;
+class QAbstractPlatformMenuBar;
+
+struct QPlatformMenuBarFactoryInterface : public QFactoryInterface
+{
+ virtual QAbstractPlatformMenuBar *create() = 0;
+};
+
+#define QPlatformMenuBarFactoryInterface_iid "com.nokia.qt.QPlatformMenuBarFactoryInterface"
+Q_DECLARE_INTERFACE(QPlatformMenuBarFactoryInterface, QPlatformMenuBarFactoryInterface_iid)
+
/*!
The platform-specific implementation of a menubar
*/
diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp
index ff09b6e3e7..018d9f06a3 100644
--- a/src/gui/widgets/qmenubar.cpp
+++ b/src/gui/widgets/qmenubar.cpp
@@ -55,6 +55,9 @@
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qwhatsthis.h>
+#ifdef Q_WS_X11
+#include <qpluginloader.h>
+#endif
#ifndef QT_NO_MENUBAR
@@ -761,7 +764,7 @@ void QMenuBarPrivate::init()
}
#endif
#ifdef Q_WS_X11
- platformMenuBar = new QX11MenuBar;
+ platformMenuBar = qt_guiPlatformMenuBarFactory()->create();
platformMenuBar->init(q);
#endif
diff --git a/src/gui/widgets/qmenubar_x11.cpp b/src/gui/widgets/qmenubar_x11.cpp
index ca227a6c4c..37c085fc4a 100644
--- a/src/gui/widgets/qmenubar_x11.cpp
+++ b/src/gui/widgets/qmenubar_x11.cpp
@@ -48,6 +48,8 @@
#include "qmenu.h"
#include "qmenubar.h"
+#include <private/qfactoryloader_p.h>
+
QT_BEGIN_NAMESPACE
QX11MenuBar::~QX11MenuBar()
@@ -109,6 +111,28 @@ bool QX11MenuBar::menuBarEventFilter(QObject *, QEvent *)
return false;
}
+struct QX11MenuBarFactory : public QPlatformMenuBarFactoryInterface
+{
+ QAbstractPlatformMenuBar *create() { return new QX11MenuBar; }
+ virtual QStringList keys() const { return QStringList(); }
+};
+
+QPlatformMenuBarFactoryInterface *qt_guiPlatformMenuBarFactory()
+{
+ static QPlatformMenuBarFactoryInterface *factory = 0;
+ if (!factory) {
+#ifndef QT_NO_LIBRARY
+ QFactoryLoader loader(QPlatformMenuBarFactoryInterface_iid, QLatin1String("/menubar"));
+ factory = qobject_cast<QPlatformMenuBarFactoryInterface *>(loader.instance(QLatin1String("default")));
+#endif // QT_NO_LIBRARY
+ if(!factory) {
+ static QX11MenuBarFactory def;
+ factory = &def;
+ }
+ }
+ return factory;
+}
+
QT_END_NAMESPACE
#endif // QT_NO_MENUBAR
diff --git a/src/gui/widgets/qmenubar_x11_p.h b/src/gui/widgets/qmenubar_x11_p.h
index dbe0223255..1c43b04406 100644
--- a/src/gui/widgets/qmenubar_x11_p.h
+++ b/src/gui/widgets/qmenubar_x11_p.h
@@ -77,6 +77,8 @@ private:
int nativeMenuBar : 3; // Only has values -1, 0, and 1
};
+QPlatformMenuBarFactoryInterface *qt_guiPlatformMenuBarFactory();
+
QT_END_NAMESPACE
#endif // QT_NO_MENUBAR